From 0f12fdbecb361e80d87fa1f00b98a4fc8ab55996 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Thu, 3 Mar 2022 16:32:01 +0100 Subject: Add (private) helpers for PEP managers The code for PEP managers is often very similiar, this should make it a bit easier. --- src/client/QXmppPep_p.h | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/client/QXmppPep_p.h (limited to 'src/client') diff --git a/src/client/QXmppPep_p.h b/src/client/QXmppPep_p.h new file mode 100644 index 00000000..f525fdef --- /dev/null +++ b/src/client/QXmppPep_p.h @@ -0,0 +1,54 @@ +// 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 QFuture> request(QXmppPubSubManager *pubSub, const QString &jid, const QString &nodeName, QObject *parent) +{ + using PubSub = QXmppPubSubManager; + using Error = QXmppStanza::Error; + + auto process = [](PubSub::ItemsResult &&result) -> GetResult { + if (const auto itemsResult = std::get_if>(&result)) { + if (!itemsResult->items.isEmpty()) { + return itemsResult->items.takeFirst(); + } + return Error(Error::Cancel, Error::ItemNotFound, QStringLiteral("User has no published items.")); + } else { + return std::get(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; + } + } + return false; +} + +} -- cgit v1.2.3