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 /src/client | |
| parent | 70a64f0d897413466777ef58e4bc9c93fceda0e6 (diff) | |
| download | qxmpp-0655b3eb3e2d110434b0d6f4d1ddee7697f1c0b6.tar.gz | |
PubSubManager: Add requestItemIds()
Uses a disco items request.
Diffstat (limited to 'src/client')
| -rw-r--r-- | src/client/QXmppPubSubManager.cpp | 37 | ||||
| -rw-r--r-- | src/client/QXmppPubSubManager.h | 2 |
2 files changed, 39 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> |
