diff options
| author | Melvin Keskin <melvo@olomono.de> | 2022-04-07 17:48:59 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2022-04-09 22:27:10 +0200 |
| commit | 0655b3eb3e2d110434b0d6f4d1ddee7697f1c0b6 (patch) | |
| tree | 700c017246cf5a3d7c5b91cd50c101551aa3958e | |
| parent | 70a64f0d897413466777ef58e4bc9c93fceda0e6 (diff) | |
| download | qxmpp-0655b3eb3e2d110434b0d6f4d1ddee7697f1c0b6.tar.gz | |
PubSubManager: Add requestItemIds()
Uses a disco items request.
| -rw-r--r-- | src/client/QXmppPubSubManager.cpp | 37 | ||||
| -rw-r--r-- | src/client/QXmppPubSubManager.h | 2 | ||||
| -rw-r--r-- | tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp | 19 |
3 files changed, 58 insertions, 0 deletions
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 @@ -105,6 +105,13 @@ using namespace QXmpp::Private; /// /// +/// \typedef QXmppPubSubManager::ItemIdsResult +/// +/// Contains all item IDs that have been found (QVector<QString>) or the +/// returned IQ error (QXmppStanza::Error). +/// + +/// /// \typedef QXmppPubSubManager::PublishItemResult /// /// Contains the ID of the item, if no ID was set in the request (QString) or @@ -304,6 +311,36 @@ auto QXmppPubSubManager::deleteNode(const QString &jid, const QString &nodeName) } /// +/// 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::ItemIdsResult> 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<QString> itemIds; + itemIds.reserve(queryItems.size()); + for (const auto &queryItem : queryItems) { + itemIds << queryItem.name(); + } + return itemIds; + }); +} + +/// /// Deletes an item from a pubsub node. /// /// \param jid Jabber ID of the entity hosting the pubsub service 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<T, QXmppStanza::Error>; template<typename T> using ItemsResult = std::variant<Items<T>, QXmppStanza::Error>; + using ItemIdsResult = std::variant<QVector<QString>, QXmppStanza::Error>; using PublishItemResult = std::variant<QString, QXmppStanza::Error>; using PublishItemsResult = std::variant<QVector<QString>, QXmppStanza::Error>; using SubscriptionsResult = std::variant<QVector<QXmppPubSubSubscription>, QXmppStanza::Error>; @@ -63,6 +64,7 @@ public: QFuture<InstantNodeResult> createInstantNode(const QString &jid); QFuture<InstantNodeResult> createInstantNode(const QString &jid, const QXmppPubSubNodeConfig &config); QFuture<Result> deleteNode(const QString &jid, const QString &nodeName); + QFuture<ItemIdsResult> requestItemIds(const QString &serviceJid, const QString &nodeName); template<typename T = QXmppPubSubItem> QFuture<ItemResult<T>> requestItem(const QString &jid, const QString &nodeName, const QString &itemId); template<typename T = QXmppPubSubItem> 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<QXmpp::Success>(future); } +void tst_QXmppPubSubManager::testRequestItemIds() +{ + auto [test, psManager] = Client(); + + auto future = psManager->requestItemIds(QStringLiteral("pubsub.shakespeare.lit"), QStringLiteral("princely_musings")); + test.expect(QStringLiteral("<iq id='qxmpp1' to='pubsub.shakespeare.lit' type='get'>" + "<query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'/>" + "</iq>")); + test.inject(QStringLiteral("<iq id='qxmpp1' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' type='result'>" + "<query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'>" + "<item jid='pubsub.shakespeare.lit' name='368866411b877c30064a5f62b917cffe'/>" + "<item jid='pubsub.shakespeare.lit' name='3300659945416e274474e469a1f0154c'/>" + "</query></iq>")); + + auto itemIds = expectFutureVariant<QVector<QString>>(future); + QCOMPARE(itemIds, (QVector<QString> { QStringLiteral("368866411b877c30064a5f62b917cffe"), QStringLiteral("3300659945416e274474e469a1f0154c") })); +} + void tst_QXmppPubSubManager::testRequestCurrentItem() { auto [test, psManager] = Client(); |
