aboutsummaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
authorMelvin Keskin <melvo@olomono.de>2022-04-07 17:48:59 +0200
committerLinus Jahn <lnj@kaidan.im>2022-04-09 22:27:10 +0200
commit0655b3eb3e2d110434b0d6f4d1ddee7697f1c0b6 (patch)
tree700c017246cf5a3d7c5b91cd50c101551aa3958e /src/client
parent70a64f0d897413466777ef58e4bc9c93fceda0e6 (diff)
downloadqxmpp-0655b3eb3e2d110434b0d6f4d1ddee7697f1c0b6.tar.gz
PubSubManager: Add requestItemIds()
Uses a disco items request.
Diffstat (limited to 'src/client')
-rw-r--r--src/client/QXmppPubSubManager.cpp37
-rw-r--r--src/client/QXmppPubSubManager.h2
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>