aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMelvin Keskin <melvo@olomono.de>2022-01-27 15:50:07 +0100
committerLinus Jahn <lnj@kaidan.im>2022-04-09 22:27:11 +0200
commitd306ed08aa9d681a0b51ebbf2ec2a00b70b61018 (patch)
tree1648841a121582bd68b9d1b70df1ac92fdc69af8
parent0db9b42c59864d771f5269c54884862fa897437e (diff)
downloadqxmpp-d306ed08aa9d681a0b51ebbf2ec2a00b70b61018.tar.gz
PubSubManager: Add PEP overloads for requestItem and similar
-rw-r--r--src/client/QXmppPubSubManager.cpp50
-rw-r--r--src/client/QXmppPubSubManager.h7
-rw-r--r--tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp88
3 files changed, 145 insertions, 0 deletions
diff --git a/src/client/QXmppPubSubManager.cpp b/src/client/QXmppPubSubManager.cpp
index 52cb5de8..8e2a1b6f 100644
--- a/src/client/QXmppPubSubManager.cpp
+++ b/src/client/QXmppPubSubManager.cpp
@@ -741,6 +741,56 @@ QFuture<QXmppPubSubManager::Result> QXmppPubSubManager::unsubscribeFromNode(cons
///
///
+/// \fn QXmppPubSubManager::requestPepItem(const QString &nodeName, const QString &itemId)
+///
+/// Requests a specific item of a PEP node.
+///
+/// This is a convenience method equivalent to calling
+/// QXmppPubSubManager::requestItem on the current account's bare JID.
+///
+/// \param nodeName name of the PEP node whose item is requested
+/// \param itemId ID of the requested item
+///
+
+///
+/// \fn QXmppPubSubManager::requestPepItem(const QString &nodeName, StandardItemId itemId)
+///
+/// Requests a specific item of a PEP node.
+///
+/// The default value of itemId is used for singleton nodes (i.e., the node's
+/// single item is requested).
+///
+/// This is a convenience method equivalent to calling
+/// QXmppPubSubManager::requestItem on the current account's bare JID.
+///
+/// \param nodeName name of the PEP node whose item is requested
+/// \param itemId ID of the requested item
+///
+
+///
+/// \fn QXmppPubSubManager::requestPepItems(const QString &nodeName)
+///
+/// Requests all items of a PEP node.
+///
+/// This is a convenience method equivalent to calling
+/// QXmppPubSubManager::requestItems on the current account's bare JID.
+///
+/// \param nodeName name of the PEP node whose items are requested
+///
+
+///
+/// \fn QXmppPubSubManager::requestPepItemIds(const QString &nodeName)
+///
+/// Requests the IDs of all items of a pubsub service node via service
+/// discovery.
+///
+/// This is a convenience method equivalent to calling
+/// QXmppPubSubManager::requestItemIds on the current account's bare JID.
+///
+/// \param nodeName name of the PEP node whose item IDs are requested
+///
+
+///
/// \fn QXmppPubSubManager::retractPepItem(const QString &nodeName, const QString &itemId)
///
/// Deletes an item from a PEP node.
diff --git a/src/client/QXmppPubSubManager.h b/src/client/QXmppPubSubManager.h
index 63c14f22..8e02f801 100644
--- a/src/client/QXmppPubSubManager.h
+++ b/src/client/QXmppPubSubManager.h
@@ -104,6 +104,13 @@ public:
inline QFuture<Result> createPepNode(const QString &nodeName) { return createNode(client()->configuration().jidBare(), nodeName); }
inline QFuture<Result> createPepNode(const QString &nodeName, const QXmppPubSubNodeConfig &config) { return createNode(client()->configuration().jidBare(), nodeName, config); }
inline QFuture<Result> deletePepNode(const QString &nodeName) { return deleteNode(client()->configuration().jidBare(), nodeName); }
+ template<typename T = QXmppPubSubItem>
+ inline QFuture<ItemResult<T>> requestPepItem(const QString &nodeName, const QString &itemId) { return requestItem<T>(client()->configuration().jidBare(), nodeName, itemId); }
+ template<typename T = QXmppPubSubItem>
+ inline QFuture<ItemResult<T>> requestPepItem(const QString &nodeName, StandardItemId itemId = Current) { return requestItem<T>(client()->configuration().jidBare(), nodeName, itemId); }
+ template<typename T = QXmppPubSubItem>
+ inline QFuture<ItemsResult<T>> requestPepItems(const QString &nodeName) { return requestItems(client()->configuration().jidBare(), nodeName); }
+ inline QFuture<ItemIdsResult> requestPepItemIds(const QString &nodeName) { return requestItemIds(client()->configuration().jidBare(), nodeName); }
template<typename T>
QFuture<PublishItemResult> publishPepItem(const QString &nodeName, const T &item, const QXmppPubSubPublishOptions &publishOptions);
template<typename T>
diff --git a/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp b/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp
index b3678f89..602e9c39 100644
--- a/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp
+++ b/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp
@@ -85,9 +85,13 @@ private:
Q_SLOT void testPurgeItems();
Q_SLOT void testPurgePepItems();
Q_SLOT void testRequestItemIds();
+ Q_SLOT void testRequestPepItemIds();
Q_SLOT void testRequestCurrentItem();
Q_SLOT void testRequestItems_data();
Q_SLOT void testRequestItems();
+ Q_SLOT void testRequestCurrentPepItem();
+ Q_SLOT void testRequestPepItem();
+ Q_SLOT void testRequestPepItems();
Q_SLOT void testRequestItemNotFound();
Q_SLOT void testRequestNodeAffiliations();
Q_SLOT void testRequestAffiliations();
@@ -564,6 +568,24 @@ void tst_QXmppPubSubManager::testRequestItemIds()
QCOMPARE(itemIds, (QVector<QString> { QStringLiteral("368866411b877c30064a5f62b917cffe"), QStringLiteral("3300659945416e274474e469a1f0154c") }));
}
+void tst_QXmppPubSubManager::testRequestPepItemIds()
+{
+ auto [test, psManager] = Client();
+
+ auto future = psManager->requestPepItemIds(QStringLiteral("princely_musings"));
+ test.expect(QStringLiteral("<iq id='qxmpp1' type='get'>"
+ "<query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'/>"
+ "</iq>"));
+ test.inject(QStringLiteral("<iq id='qxmpp1' from='juliet@capulet.lit' to='juliet@capulet.lit/balcony' type='result'>"
+ "<query xmlns='http://jabber.org/protocol/disco#items' node='princely_musings'>"
+ "<item jid='juliet@capulet.lit' name='368866411b877c30064a5f62b917cffe'/>"
+ "<item jid='juliet@capulet.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();
@@ -719,6 +741,72 @@ void tst_QXmppPubSubManager::testRequestItems()
QVERIFY2(itemsEqual, "The items returned from the manager don't match the item IDs from the XML response");
}
+void tst_QXmppPubSubManager::testRequestCurrentPepItem()
+{
+ auto [test, psManager] = Client();
+
+ auto future = psManager->requestPepItem(QStringLiteral("princely_musings"));
+ test.expect(QStringLiteral("<iq id='qxmpp1' type='get'>"
+ "<pubsub xmlns='http://jabber.org/protocol/pubsub'>"
+ "<items node='princely_musings'>"
+ "<item id='current'/>"
+ "</items>"
+ "</pubsub></iq>"));
+ test.inject(QStringLiteral("<iq id='qxmpp1' from='juliet@capulet.lit' to='juliet@capulet.lit/balcony' type='result'>"
+ "<pubsub xmlns='http://jabber.org/protocol/pubsub'>"
+ "<items node='princely_musings'>"
+ "<item id='current'/>"
+ "</items>"
+ "</pubsub></iq>"));
+
+ const auto item = expectFutureVariant<QXmppPubSubItem>(future);
+ QCOMPARE(item.id(), QStringLiteral("current"));
+}
+
+void tst_QXmppPubSubManager::testRequestPepItem()
+{
+ auto [test, psManager] = Client();
+
+ auto future = psManager->requestPepItem(QStringLiteral("princely_musings"), QStringLiteral("ae890ac52d0df67ed7cfdf51b644e901"));
+ test.expect(QStringLiteral("<iq id='qxmpp1' type='get'>"
+ "<pubsub xmlns='http://jabber.org/protocol/pubsub'>"
+ "<items node='princely_musings'>"
+ "<item id='ae890ac52d0df67ed7cfdf51b644e901'/>"
+ "</items>"
+ "</pubsub></iq>"));
+ test.inject(QStringLiteral("<iq id='qxmpp1' from='juliet@capulet.lit' to='juliet@capulet.lit/balcony' type='result'>"
+ "<pubsub xmlns='http://jabber.org/protocol/pubsub'>"
+ "<items node='princely_musings'>"
+ "<item id='ae890ac52d0df67ed7cfdf51b644e901'/>"
+ "</items>"
+ "</pubsub></iq>"));
+
+ const auto item = expectFutureVariant<QXmppPubSubItem>(future);
+ QCOMPARE(item.id(), QStringLiteral("ae890ac52d0df67ed7cfdf51b644e901"));
+}
+
+void tst_QXmppPubSubManager::testRequestPepItems()
+{
+ auto [test, psManager] = Client();
+
+ auto future = psManager->requestPepItems(QStringLiteral("princely_musings"));
+ test.expect(QStringLiteral("<iq id='qxmpp1' type='get'>"
+ "<pubsub xmlns='http://jabber.org/protocol/pubsub'>"
+ "<items node='princely_musings'/>"
+ "</pubsub></iq>"));
+ test.inject(QStringLiteral("<iq id='qxmpp1' from='juliet@capulet.lit' to='juliet@capulet.lit/balcony' type='result'>"
+ "<pubsub xmlns='http://jabber.org/protocol/pubsub'>"
+ "<items node='princely_musings'>"
+ "<item id='368866411b877c30064a5f62b917cffe'/>"
+ "<item id='3300659945416e274474e469a1f0154c'/>"
+ "</items>"
+ "</pubsub></iq>"));
+
+ const auto items = expectFutureVariant<QXmppPubSubManager::Items<QXmppPubSubItem>>(future);
+ QCOMPARE(items.items.first().id(), QStringLiteral("368866411b877c30064a5f62b917cffe"));
+ QCOMPARE(items.items.last().id(), QStringLiteral("3300659945416e274474e469a1f0154c"));
+}
+
void tst_QXmppPubSubManager::testRequestItemNotFound()
{
auto [test, psManager] = Client();