From 0655b3eb3e2d110434b0d6f4d1ddee7697f1c0b6 Mon Sep 17 00:00:00 2001 From: Melvin Keskin Date: Thu, 7 Apr 2022 17:48:59 +0200 Subject: PubSubManager: Add requestItemIds() Uses a disco items request. --- src/client/QXmppPubSubManager.cpp | 37 +++++++++++++++++++++++++++++++++++++ src/client/QXmppPubSubManager.h | 2 ++ 2 files changed, 39 insertions(+) (limited to 'src/client') diff --git a/src/client/QXmppPubSubManager.cpp b/src/client/QXmppPubSubManager.cpp index fe265061..aba9f72f 100644 --- a/src/client/QXmppPubSubManager.cpp +++ b/src/client/QXmppPubSubManager.cpp @@ -104,6 +104,13 @@ using namespace QXmpp::Private; /// error (QXmppStanza::Error). /// +/// +/// \typedef QXmppPubSubManager::ItemIdsResult +/// +/// Contains all item IDs that have been found (QVector) or the +/// returned IQ error (QXmppStanza::Error). +/// + /// /// \typedef QXmppPubSubManager::PublishItemResult /// @@ -303,6 +310,36 @@ auto QXmppPubSubManager::deleteNode(const QString &jid, const QString &nodeName) return client()->sendGenericIq(std::move(request)); } +/// +/// Requests the IDs of all items of a pubsub service node via service +/// discovery. +/// +/// This uses a \xep{0030, Service Discovery} items request to get a list of +/// items. +/// +/// \param serviceJid JID of the entity hosting the pubsub service +/// \param nodeName the name of the node whose items are requested +/// \return +/// +QFuture QXmppPubSubManager::requestItemIds(const QString &serviceJid, const QString &nodeName) +{ + QXmppDiscoveryIq request; + request.setType(QXmppIq::Get); + request.setQueryType(QXmppDiscoveryIq::ItemsQuery); + request.setQueryNode(nodeName); + request.setTo(serviceJid); + + return chainIq(client()->sendIq(std::move(request)), this, [](QXmppDiscoveryIq &&iq) -> ItemIdsResult { + const auto queryItems = iq.items(); + QVector itemIds; + itemIds.reserve(queryItems.size()); + for (const auto &queryItem : queryItems) { + itemIds << queryItem.name(); + } + return itemIds; + }); +} + /// /// Deletes an item from a pubsub node. /// diff --git a/src/client/QXmppPubSubManager.h b/src/client/QXmppPubSubManager.h index d817c30c..a78774bd 100644 --- a/src/client/QXmppPubSubManager.h +++ b/src/client/QXmppPubSubManager.h @@ -46,6 +46,7 @@ public: using ItemResult = std::variant; template using ItemsResult = std::variant, QXmppStanza::Error>; + using ItemIdsResult = std::variant, QXmppStanza::Error>; using PublishItemResult = std::variant; using PublishItemsResult = std::variant, QXmppStanza::Error>; using SubscriptionsResult = std::variant, QXmppStanza::Error>; @@ -63,6 +64,7 @@ public: QFuture createInstantNode(const QString &jid); QFuture createInstantNode(const QString &jid, const QXmppPubSubNodeConfig &config); QFuture deleteNode(const QString &jid, const QString &nodeName); + QFuture requestItemIds(const QString &serviceJid, const QString &nodeName); template QFuture> requestItem(const QString &jid, const QString &nodeName, const QString &itemId); template -- cgit v1.2.3