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 ++ .../qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp | 19 +++++++++++ 3 files changed, 58 insertions(+) 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 diff --git a/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp b/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp index 98db3d90..e4cb09e4 100644 --- a/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp +++ b/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp @@ -83,6 +83,7 @@ private: Q_SLOT void testRetractCurrentPepItem(); Q_SLOT void testPurgeItems(); Q_SLOT void testPurgePepItems(); + Q_SLOT void testRequestItemIds(); Q_SLOT void testRequestCurrentItem(); Q_SLOT void testRequestItems_data(); Q_SLOT void testRequestItems(); @@ -524,6 +525,24 @@ void tst_QXmppPubSubManager::testPurgePepItems() expectFutureVariant(future); } +void tst_QXmppPubSubManager::testRequestItemIds() +{ + auto [test, psManager] = Client(); + + auto future = psManager->requestItemIds(QStringLiteral("pubsub.shakespeare.lit"), QStringLiteral("princely_musings")); + test.expect(QStringLiteral("" + "" + "")); + test.inject(QStringLiteral("" + "" + "" + "" + "")); + + auto itemIds = expectFutureVariant>(future); + QCOMPARE(itemIds, (QVector { QStringLiteral("368866411b877c30064a5f62b917cffe"), QStringLiteral("3300659945416e274474e469a1f0154c") })); +} + void tst_QXmppPubSubManager::testRequestCurrentItem() { auto [test, psManager] = Client(); -- cgit v1.2.3