diff options
| author | Linus Jahn <lnj@kaidan.im> | 2021-09-29 15:45:52 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2021-09-29 16:37:41 +0200 |
| commit | 1654f24a1af4f96f2f1a06a2308bd05ad6f9c978 (patch) | |
| tree | 898701a74cc1977cb0d1781beb75a8c86ef1dddb | |
| parent | 9b21bef379d94876908cbb706c9ba2438779bf54 (diff) | |
| download | qxmpp-1654f24a1af4f96f2f1a06a2308bd05ad6f9c978.tar.gz | |
PubSubManager: Add create node requests with config
| -rw-r--r-- | src/client/QXmppPubSubManager.cpp | 67 | ||||
| -rw-r--r-- | src/client/QXmppPubSubManager.h | 3 | ||||
| -rw-r--r-- | tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp | 47 |
3 files changed, 116 insertions, 1 deletions
diff --git a/src/client/QXmppPubSubManager.cpp b/src/client/QXmppPubSubManager.cpp index 08fe75e7..c4a9107f 100644 --- a/src/client/QXmppPubSubManager.cpp +++ b/src/client/QXmppPubSubManager.cpp @@ -234,6 +234,30 @@ auto QXmppPubSubManager::createNode(const QString &jid, const QString &nodeName) } /// +/// Creates an empty pubsub node with a custom configuration. +/// +/// Calling this before QXmppPubSubManager::publishItems is usually not +/// necessary when publishing to a node for the first time if the service +/// suppports the auto-create feature (Section 7.1.4 of \xep{0060}). +/// +/// \param jid Jabber ID of the entity hosting the pubsub service +/// \param nodeName the name of the node to be created +/// \param config The configuration for the node +/// \return +/// +auto QXmppPubSubManager::createNode(const QString &jid, const QString &nodeName, const QXmppPubSubNodeConfig &config) -> QFuture<Result> +{ + QXmppPubSubIq request; + request.setType(QXmppIq::Set); + request.setQueryType(QXmppPubSubIq<>::Create); + request.setQueryNode(nodeName); + request.setTo(jid); + request.setDataForm(config); + + return client()->sendGenericIq(std::move(request)); +} + +/// /// Creates an instant pubsub node with the default configuration. /// /// The pubsub service automatically generates a random node name. On success @@ -256,6 +280,30 @@ QFuture<QXmppPubSubManager::InstantNodeResult> QXmppPubSubManager::createInstant } /// +/// Creates an instant pubsub node with a custom configuration. +/// +/// The pubsub service automatically generates a random node name. On success +/// it is returned via the QFuture. +/// +/// \param jid Jabber ID of the entity hosting the pubsub service +/// \param config The configuration for the node +/// \return +/// +auto QXmppPubSubManager::createInstantNode(const QString &jid, const QXmppPubSubNodeConfig &config) -> QFuture<InstantNodeResult> +{ + QXmppPubSubIq request; + request.setType(QXmppIq::Set); + request.setQueryType(QXmppPubSubIq<>::Create); + request.setTo(jid); + request.setDataForm(config); + + return chainIq(client()->sendIq(std::move(request)), this, + [](const QXmppPubSubIq<> &iq) -> InstantNodeResult { + return iq.queryNode(); + }); +} + +/// /// Deletes a pubsub node. /// /// \param jid Jabber ID of the entity hosting the pubsub service @@ -561,7 +609,7 @@ QFuture<QXmppPubSubManager::Result> QXmppPubSubManager::cancelNodeConfiguration( } /// -/// \fn QXmppPubSubManager::createPepNode +/// \fn QFuture<Result> QXmppPubSubManager::createPepNode(const QString &nodeName) /// /// Creates an empty PEP node with the default configuration. /// @@ -577,6 +625,23 @@ QFuture<QXmppPubSubManager::Result> QXmppPubSubManager::cancelNodeConfiguration( /// /// +/// \fn QFuture<Result> QXmppPubSubManager::createPepNode(const QString &nodeName, const QXmppPubSubNodeConfig &config) +/// +/// Creates an empty PEP node with a custom configuration. +/// +/// This is a convenience method equivalent to calling +/// QXmppPubSubManager::createNode on the current account's bare JID. +/// +/// Calling this before QXmppPubSubManager::publishPepItems is usually not +/// necessary when publishing to a node for the first time if the service +/// suppports the auto-create feature (Section 7.1.4 of \xep{0060}). +/// +/// \param nodeName the name of the PEP node to be created +/// \param config The configuration for the node +/// \return +/// + +/// /// \fn QXmppPubSubManager::deletePepNode /// /// Deletes a PEP node. diff --git a/src/client/QXmppPubSubManager.h b/src/client/QXmppPubSubManager.h index f3798a3f..6a21c0e4 100644 --- a/src/client/QXmppPubSubManager.h +++ b/src/client/QXmppPubSubManager.h @@ -70,7 +70,9 @@ public: // Generic PubSub (the PubSub service is the given entity) QFuture<NodesResult> fetchNodes(const QString &jid); QFuture<Result> createNode(const QString &jid, const QString &nodeName); + QFuture<Result> createNode(const QString &jid, const QString &nodeName, const QXmppPubSubNodeConfig &config); QFuture<InstantNodeResult> createInstantNode(const QString &jid); + QFuture<InstantNodeResult> createInstantNode(const QString &jid, const QXmppPubSubNodeConfig &config); QFuture<Result> deleteNode(const QString &jid, const QString &nodeName); template<typename T = QXmppPubSubItem> QFuture<ItemResult<T>> requestItem(const QString &jid, const QString &nodeName, const QString &itemId); @@ -103,6 +105,7 @@ public: // PEP-specific (the PubSub service is the current account) 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> QFuture<PublishItemResult> publishPepItem(const QString &nodeName, const T &item, const QXmppPubSubPublishOptions &publishOptions); diff --git a/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp b/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp index 9c80a1b8..4bbcdf77 100644 --- a/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp +++ b/tests/qxmpppubsubmanager/tst_qxmpppubsubmanager.cpp @@ -82,7 +82,9 @@ private: Q_SLOT void testFetchNodes(); Q_SLOT void testCreateNodes_data(); Q_SLOT void testCreateNodes(); + Q_SLOT void testCreateNodeWithConfig(); Q_SLOT void testCreateInstantNode(); + Q_SLOT void testCreateInstantNodeWithConfig(); Q_SLOT void testDeleteNodes_data(); Q_SLOT void testDeleteNodes(); Q_SLOT void testPublishItems_data(); @@ -170,6 +172,27 @@ void tst_QXmppPubSubManager::testCreateNodes() expectFutureVariant<QXmpp::Success>(future); } +void tst_QXmppPubSubManager::testCreateNodeWithConfig() +{ + auto [test, psManager] = Client(); + QXmppPubSubNodeConfig config; + config.setTitle("Princely Musings (Atom)"); + auto future = psManager->createNode("pubsub.qxmpp.org", "princely_musings", config); + test.expect("<iq id='qxmpp1' to='pubsub.qxmpp.org' type='set'>" + "<pubsub xmlns='http://jabber.org/protocol/pubsub'>" + "<create node='princely_musings'/>" + "<configure>" + "<x xmlns='jabber:x:data' type='submit'>" + "<field type='hidden' var='FORM_TYPE'><value>http://jabber.org/protocol/pubsub#node_config</value></field>" + "<field type='text-single' var='pubsub#title'><value>Princely Musings (Atom)</value></field>" + "</x>" + "</configure>" + "</pubsub>" + "</iq>"); + test.inject<QString>("<iq id='qxmpp1' type='result'/>"); + expectFutureVariant<QXmpp::Success>(future); +} + void tst_QXmppPubSubManager::testCreateInstantNode() { TestClient test; @@ -187,6 +210,30 @@ void tst_QXmppPubSubManager::testCreateInstantNode() QCOMPARE(nodeId, QString("25e3d37dabbab9541f7523321421edc5bfeb2dae")); } +void tst_QXmppPubSubManager::testCreateInstantNodeWithConfig() +{ + auto [test, psManager] = Client(); + QXmppPubSubNodeConfig config; + config.setTitle("Princely Musings (Atom)"); + auto future = psManager->createInstantNode("pubsub.qxmpp.org", config); + test.expect("<iq id='qxmpp1' to='pubsub.qxmpp.org' type='set'>" + "<pubsub xmlns='http://jabber.org/protocol/pubsub'>" + "<create/>" + "<configure>" + "<x xmlns='jabber:x:data' type='submit'>" + "<field type='hidden' var='FORM_TYPE'><value>http://jabber.org/protocol/pubsub#node_config</value></field>" + "<field type='text-single' var='pubsub#title'><value>Princely Musings (Atom)</value></field>" + "</x>" + "</configure>" + "</pubsub>" + "</iq>"); + test.inject<QString>("<iq type='result' from='pubsub.qxmpp.org' id='qxmpp1'>" + "<pubsub xmlns='http://jabber.org/protocol/pubsub'>" + "<create node='25e3d37dabbab9541f7523321421edc5bfeb2dae'/>" + "</pubsub></iq>"); + QCOMPARE(expectFutureVariant<QString>(future), QStringLiteral("25e3d37dabbab9541f7523321421edc5bfeb2dae")); +} + void tst_QXmppPubSubManager::testDeleteNodes_data() { QTest::addColumn<bool>("isPep"); |
