// SPDX-FileCopyrightText: 2021 Linus Jahn // // SPDX-License-Identifier: LGPL-2.1-or-later #include #include namespace QXmpp::Private::Pep { template using GetResult = std::variant; using PublishResult = std::variant; template inline QXmppTask> request(QXmppPubSubManager *pubSub, const QString &jid, const QString &nodeName, QObject *parent) { using PubSub = QXmppPubSubManager; auto process = [](PubSub::ItemsResult &&result) -> GetResult { if (const auto itemsResult = std::get_if>(&result)) { if (!itemsResult->items.isEmpty()) { return itemsResult->items.takeFirst(); } return QXmppError { QStringLiteral("User has no published items."), {} }; } else { return std::get(std::move(result)); } }; return chain>(pubSub->requestItems(jid, nodeName), parent, process); } // NodeName is a template parameter, so the right qstring comparison overload is used // (if we used 'const QString &' as type, a 'const char *' string would be converted) template inline bool handlePubSubEvent(const QDomElement &element, const QString &pubSubService, const QString &eventNode, NodeName nodeName, Manager *manager, ReceivedSignal itemReceived) { if (eventNode == nodeName && QXmppPubSubEvent::isPubSubEvent(element)) { QXmppPubSubEvent event; event.parse(element); if (event.eventType() == QXmppPubSubEventBase::Items) { if (!event.items().isEmpty()) { (manager->*itemReceived)(pubSubService, event.items().constFirst()); } else { (manager->*itemReceived)(pubSubService, {}); } return true; } else if (event.eventType() == QXmppPubSubEventBase::Retract) { (manager->*itemReceived)(pubSubService, {}); return true; } } return false; } } // namespace QXmpp::Private::Pep