diff options
| author | Linus Jahn <lnj@kaidan.im> | 2020-04-05 16:56:18 +0200 |
|---|---|---|
| committer | LNJ <lnj@kaidan.im> | 2020-04-05 21:25:54 +0200 |
| commit | b833a5ae93b00b973c06018b6615526e0a8e1719 (patch) | |
| tree | b58b429a852fb91b17fcfe208aa7c29bb600c282 | |
| parent | 1e2aba332b0a92a028045ffdd5c33fec2a944116 (diff) | |
| download | qxmpp-b833a5ae93b00b973c06018b6615526e0a8e1719.tar.gz | |
Add roster versioning stream feature
| -rw-r--r-- | src/base/QXmppConstants.cpp | 1 | ||||
| -rw-r--r-- | src/base/QXmppConstants_p.h | 1 | ||||
| -rw-r--r-- | src/base/QXmppStreamFeatures.cpp | 43 | ||||
| -rw-r--r-- | src/base/QXmppStreamFeatures.h | 3 | ||||
| -rw-r--r-- | tests/qxmppstreamfeatures/tst_qxmppstreamfeatures.cpp | 3 |
5 files changed, 43 insertions, 8 deletions
diff --git a/src/base/QXmppConstants.cpp b/src/base/QXmppConstants.cpp index a98a7ff0..94aec45a 100644 --- a/src/base/QXmppConstants.cpp +++ b/src/base/QXmppConstants.cpp @@ -33,6 +33,7 @@ const char* ns_bind = "urn:ietf:params:xml:ns:xmpp-bind"; const char* ns_session = "urn:ietf:params:xml:ns:xmpp-session"; const char* ns_stanza = "urn:ietf:params:xml:ns:xmpp-stanzas"; const char* ns_pre_approval = "urn:xmpp:features:pre-approval"; +const char* ns_rosterver = "urn:xmpp:features:rosterver"; // XEP-0009: Jabber-RPC const char* ns_rpc = "jabber:iq:rpc"; // XEP-0020: Feature Negotiation diff --git a/src/base/QXmppConstants_p.h b/src/base/QXmppConstants_p.h index 125e6d19..85d3eaa0 100644 --- a/src/base/QXmppConstants_p.h +++ b/src/base/QXmppConstants_p.h @@ -45,6 +45,7 @@ extern const char* ns_bind; extern const char* ns_session; extern const char* ns_stanza; extern const char* ns_pre_approval; +extern const char* ns_rosterver; // XEP-0009: Jabber-RPC extern const char* ns_rpc; // XEP-0020: Feature Negotiation diff --git a/src/base/QXmppStreamFeatures.cpp b/src/base/QXmppStreamFeatures.cpp index 25626aa0..70d4dc46 100644 --- a/src/base/QXmppStreamFeatures.cpp +++ b/src/base/QXmppStreamFeatures.cpp @@ -40,6 +40,7 @@ public: QXmppStreamFeatures::Mode csiMode; QXmppStreamFeatures::Mode registerMode; bool preApprovedSubscriptionsSupported; + bool rosterVersioningSupported; QStringList authMechanisms; QStringList compressionMethods; }; @@ -206,6 +207,26 @@ void QXmppStreamFeatures::setPreApprovedSubscriptionsSupported(bool supported) d->preApprovedSubscriptionsSupported = supported; } +/// +/// Returns whether roster versioning from RFC6121 is supported. +/// +/// \since QXmpp 1.3 +/// +bool QXmppStreamFeatures::rosterVersioningSupported() const +{ + return d->rosterVersioningSupported; +} + +/// +/// Sets whether roster versioning from RFC6121 is supported. +/// +/// \since QXmpp 1.3 +/// +void QXmppStreamFeatures::setRosterVersioningSupported(bool supported) +{ + d->rosterVersioningSupported = supported; +} + /// \cond bool QXmppStreamFeatures::isStreamFeatures(const QDomElement &element) { @@ -251,6 +272,7 @@ void QXmppStreamFeatures::parse(const QDomElement &element) d->csiMode = readFeature(element, "csi", ns_csi); d->registerMode = readFeature(element, "register", ns_register_feature); d->preApprovedSubscriptionsSupported = readBooleanFeature(element, QStringLiteral("sub"), ns_pre_approval); + d->rosterVersioningSupported = readBooleanFeature(element, QStringLiteral("ver"), ns_rosterver); // parse advertised compression methods QDomElement compression = element.firstChildElement(QStringLiteral("compression")); @@ -284,6 +306,15 @@ static void writeFeature(QXmlStreamWriter *writer, const char *tagName, const ch } } +static void writeBoolenFeature(QXmlStreamWriter *writer, const QString &tagName, const QString &xmlns, bool enabled) +{ + if (enabled) { + writer->writeStartElement(tagName); + writer->writeDefaultNamespace(xmlns); + writer->writeEndElement(); + } +} + void QXmppStreamFeatures::toXml(QXmlStreamWriter *writer) const { writer->writeStartElement(QStringLiteral("stream:features")); @@ -294,24 +325,20 @@ void QXmppStreamFeatures::toXml(QXmlStreamWriter *writer) const writeFeature(writer, "sm", ns_stream_management, d->streamManagementMode); writeFeature(writer, "csi", ns_csi, d->csiMode); writeFeature(writer, "register", ns_register_feature, d->registerMode); - - if (d->preApprovedSubscriptionsSupported) { - writer->writeStartElement(QStringLiteral("sub")); - writer->writeDefaultNamespace(ns_pre_approval); - writer->writeEndElement(); - } + writeBoolenFeature(writer, QStringLiteral("sub"), ns_pre_approval, d->preApprovedSubscriptionsSupported); + writeBoolenFeature(writer, QStringLiteral("ver"), ns_rosterver, d->rosterVersioningSupported); if (!d->compressionMethods.isEmpty()) { writer->writeStartElement(QStringLiteral("compression")); writer->writeDefaultNamespace(ns_compressFeature); - for (const auto &method : d->compressionMethods) + for (const auto &method : qAsConst(d->compressionMethods)) writer->writeTextElement(QStringLiteral("method"), method); writer->writeEndElement(); } if (!d->authMechanisms.isEmpty()) { writer->writeStartElement(QStringLiteral("mechanisms")); writer->writeDefaultNamespace(ns_sasl); - for (const auto &mechanism : d->authMechanisms) + for (const auto &mechanism : qAsConst(d->authMechanisms)) writer->writeTextElement(QStringLiteral("mechanism"), mechanism); writer->writeEndElement(); } diff --git a/src/base/QXmppStreamFeatures.h b/src/base/QXmppStreamFeatures.h index ed439788..d6e6f3ba 100644 --- a/src/base/QXmppStreamFeatures.h +++ b/src/base/QXmppStreamFeatures.h @@ -79,6 +79,9 @@ public: bool preApprovedSubscriptionsSupported() const; void setPreApprovedSubscriptionsSupported(bool); + bool rosterVersioningSupported() const; + void setRosterVersioningSupported(bool); + /// \cond void parse(const QDomElement &element) override; void toXml(QXmlStreamWriter *writer) const override; diff --git a/tests/qxmppstreamfeatures/tst_qxmppstreamfeatures.cpp b/tests/qxmppstreamfeatures/tst_qxmppstreamfeatures.cpp index 72a0e31d..fe011789 100644 --- a/tests/qxmppstreamfeatures/tst_qxmppstreamfeatures.cpp +++ b/tests/qxmppstreamfeatures/tst_qxmppstreamfeatures.cpp @@ -49,6 +49,7 @@ void tst_QXmppStreamFeatures::testEmpty() QCOMPARE(features.clientStateIndicationMode(), QXmppStreamFeatures::Disabled); QCOMPARE(features.registerMode(), QXmppStreamFeatures::Disabled); QCOMPARE(features.preApprovedSubscriptionsSupported(), false); + QCOMPARE(features.rosterVersioningSupported(), false); QCOMPARE(features.authMechanisms(), QStringList()); QCOMPARE(features.compressionMethods(), QStringList()); serializePacket(features, xml); @@ -79,6 +80,7 @@ void tst_QXmppStreamFeatures::testFull() "<csi xmlns=\"urn:xmpp:csi:0\"/>" "<register xmlns=\"http://jabber.org/features/iq-register\"/>" "<sub xmlns=\"urn:xmpp:features:pre-approval\"/>" + "<ver xmlns=\"urn:xmpp:features:rosterver\"/>" "<compression xmlns=\"http://jabber.org/features/compress\"><method>zlib</method></compression>" "<mechanisms xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\"><mechanism>PLAIN</mechanism></mechanisms>" "</stream:features>"); @@ -104,6 +106,7 @@ void tst_QXmppStreamFeatures::testFull() features.setClientStateIndicationMode(QXmppStreamFeatures::Enabled); features.setRegisterMode(QXmppStreamFeatures::Enabled); features.setPreApprovedSubscriptionsSupported(true); + features.setRosterVersioningSupported(true); features.setAuthMechanisms(QStringList { QStringLiteral("PLAIN") }); features.setCompressionMethods(QStringList { QStringLiteral("zlib") }); serializePacket(features, xml); |
