diff options
| author | Melvin Keskin <melvo@olomono.de> | 2022-04-07 18:38:22 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2022-04-09 22:27:10 +0200 |
| commit | f78931350a05c950a7e650805d5db02ae7b9ac86 (patch) | |
| tree | 17f0ac4f7952ef0d017eea57931e265a0c4bf14a | |
| parent | 0655b3eb3e2d110434b0d6f4d1ddee7697f1c0b6 (diff) | |
| download | qxmpp-f78931350a05c950a7e650805d5db02ae7b9ac86.tar.gz | |
PubSubManager: Add subscribeToNode()/unsubscribeFromNode()
| -rw-r--r-- | src/client/QXmppPubSubManager.cpp | 40 | ||||
| -rw-r--r-- | src/client/QXmppPubSubManager.h | 2 | ||||
| -rw-r--r-- | tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp | 36 |
3 files changed, 78 insertions, 0 deletions
diff --git a/src/client/QXmppPubSubManager.cpp b/src/client/QXmppPubSubManager.cpp index aba9f72f..66c2d345 100644 --- a/src/client/QXmppPubSubManager.cpp +++ b/src/client/QXmppPubSubManager.cpp @@ -643,6 +643,46 @@ QFuture<QXmppPubSubManager::Result> QXmppPubSubManager::cancelNodeConfiguration( } /// +/// Subscribes to a node. +/// +/// \warning THIS API IS NOT FINALIZED YET! +/// +/// \param serviceJid JID of the pubsub service +/// \param nodeName name of the pubsub node being subscribed +/// \param subscriberJid bare or full JID of the subscriber +/// +QFuture<QXmppPubSubManager::Result> QXmppPubSubManager::subscribeToNode(const QString &serviceJid, const QString &nodeName, const QString &subscriberJid) +{ + QXmppPubSubIq request; + request.setType(QXmppIq::Set); + request.setTo(serviceJid); + request.setQueryNode(nodeName); + request.setQueryType(QXmppPubSubIq<>::Subscribe); + request.setQueryJid(subscriberJid); + return client()->sendGenericIq(std::move(request)); +} + +/// +/// Unsubscribes from a node. +/// +/// \warning THIS API IS NOT FINALIZED YET! +/// +/// \param serviceJid JID of the pubsub service +/// \param nodeName name of the pubsub node being subscribed +/// \param subscriberJid bare or full JID of the subscriber +/// +QFuture<QXmppPubSubManager::Result> QXmppPubSubManager::unsubscribeFromNode(const QString &serviceJid, const QString &nodeName, const QString &subscriberJid) +{ + QXmppPubSubIq request; + request.setType(QXmppIq::Set); + request.setTo(serviceJid); + request.setQueryNode(nodeName); + request.setQueryType(QXmppPubSubIq<>::Unsubscribe); + request.setQueryJid(subscriberJid); + return client()->sendGenericIq(std::move(request)); +} + +/// /// \fn QFuture<Result> QXmppPubSubManager::createPepNode(const QString &nodeName) /// /// Creates an empty PEP node with the default configuration. diff --git a/src/client/QXmppPubSubManager.h b/src/client/QXmppPubSubManager.h index a78774bd..f5116be4 100644 --- a/src/client/QXmppPubSubManager.h +++ b/src/client/QXmppPubSubManager.h @@ -96,6 +96,8 @@ public: QFuture<NodeConfigResult> requestNodeConfiguration(const QString &service, const QString &nodeName); QFuture<Result> configureNode(const QString &service, const QString &nodeName, const QXmppPubSubNodeConfig &config); QFuture<Result> cancelNodeConfiguration(const QString &service, const QString &nodeName); + QFuture<Result> subscribeToNode(const QString &serviceJid, const QString &nodeName, const QString &subscriberJid); + QFuture<Result> unsubscribeFromNode(const QString &serviceJid, const QString &nodeName, const QString &subscriberJid); // PEP-specific (the PubSub service is the current account) inline QFuture<Result> createPepNode(const QString &nodeName) { return createNode(client()->configuration().jidBare(), nodeName); } diff --git a/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp b/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp index e4cb09e4..f7f91ec3 100644 --- a/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp +++ b/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp @@ -97,6 +97,8 @@ private: Q_SLOT void testRequestNodeConfig(); Q_SLOT void testConfigureNode(); Q_SLOT void testCancelConfig(); + Q_SLOT void testSubscribeToNode(); + Q_SLOT void testUnsubscribeFromNode(); Q_SLOT void testEventNotifications_data(); Q_SLOT void testEventNotifications(); }; @@ -985,6 +987,40 @@ void tst_QXmppPubSubManager::testCancelConfig() expectFutureVariant<QXmpp::Success>(future); } +void tst_QXmppPubSubManager::testSubscribeToNode() +{ + auto [test, psManager] = Client(); + + auto future = psManager->subscribeToNode(QStringLiteral("pubsub.shakespeare.lit"), QStringLiteral("princely_musings"), QStringLiteral("francisco@denmark.lit")); + test.expect(QStringLiteral("<iq id='qxmpp1' to='pubsub.shakespeare.lit' type='set'>" + "<pubsub xmlns='http://jabber.org/protocol/pubsub'>" + "<subscribe jid='francisco@denmark.lit' node='princely_musings'/>" + "</pubsub></iq>")); + test.inject(QStringLiteral("<iq id='qxmpp1' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' type='result'>" + "<pubsub xmlns='http://jabber.org/protocol/pubsub'>" + "<subscription jid='francisco@denmark.lit' node='princely_musings' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' subscription='subscribed'/>" + "</pubsub></iq>")); + + expectFutureVariant<QXmpp::Success>(future); +} + +void tst_QXmppPubSubManager::testUnsubscribeFromNode() +{ + auto [test, psManager] = Client(); + + auto future = psManager->unsubscribeFromNode(QStringLiteral("pubsub.shakespeare.lit"), QStringLiteral("princely_musings"), QStringLiteral("francisco@denmark.lit")); + test.expect(QStringLiteral("<iq id='qxmpp1' to='pubsub.shakespeare.lit' type='set'>" + "<pubsub xmlns='http://jabber.org/protocol/pubsub'>" + "<unsubscribe jid='francisco@denmark.lit' node='princely_musings'/>" + "</pubsub></iq>")); + test.inject(QStringLiteral("<iq id='qxmpp1' from='pubsub.shakespeare.lit' to='francisco@denmark.lit/barracks' type='result'>" + "<pubsub xmlns='http://jabber.org/protocol/pubsub'>" + "<subscription jid='francisco@denmark.lit' node='princely_musings' subid='ba49252aaa4f5d320c24d3766f0bdcade78c78d3' subscription='none'/>" + "</pubsub></iq>")); + + expectFutureVariant<QXmpp::Success>(future); +} + void tst_QXmppPubSubManager::testEventNotifications_data() { QTest::addColumn<QString>("xml"); |
