diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-07-15 15:40:38 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-07-15 15:40:38 +0000 |
| commit | e656e68dfb2302cd2c8cb7d9f79b8ec36b2b0bea (patch) | |
| tree | 95fadd735360adf88ded44d91b55a083319e563b | |
| parent | 7077786fa916076f2427cef89588e6b835976f0e (diff) | |
| download | qxmpp-e656e68dfb2302cd2c8cb7d9f79b8ec36b2b0bea.tar.gz | |
add XEP-0115 : Entity Capabilities to QXmppStream
| -rw-r--r-- | source/QXmppStream.cpp | 61 | ||||
| -rw-r--r-- | source/QXmppStream.h | 3 |
2 files changed, 61 insertions, 3 deletions
diff --git a/source/QXmppStream.cpp b/source/QXmppStream.cpp index 25286e8a..5be25d5a 100644 --- a/source/QXmppStream.cpp +++ b/source/QXmppStream.cpp @@ -33,7 +33,6 @@ #include "QXmppConstants.h" #include "QXmppStream.h" #include "QXmppNonSASLAuth.h" -#include "QXmppInformationRequestResult.h" // IQ types #include "QXmppArchiveIq.h" @@ -56,6 +55,7 @@ #include <QXmlStreamWriter> #include <QTimer> +static const QString capabilitiesNode = "http://code.google.com/p/qxmpp"; static const QByteArray streamRootElementStart = "<?xml version=\"1.0\"?><stream:stream xmlns:stream=\"http://etherx.jabber.org/streams\" version=\"1.0\" xmlns=\"jabber:client\" xml:lang=\"en\" xmlns:xml=\"http://www.w3.org/XML/1998/namespace\">\n"; static const QByteArray streamRootElementEnd = "</stream:stream>"; @@ -528,12 +528,13 @@ void QXmppStream::parser(const QByteArray& data) if (discoIq.type() == QXmppIq::Get && discoIq.queryType() == QXmppDiscoveryIq::InfoQuery && - discoIq.queryNode().isEmpty()) + (discoIq.queryNode().isEmpty() || discoIq.queryNode().startsWith(capabilitiesNode))) { // respond to info query - QXmppInformationRequestResult qxmppFeatures; + QXmppDiscoveryIq qxmppFeatures = capabilities(); qxmppFeatures.setId(discoIq.id()); qxmppFeatures.setTo(discoIq.from()); + qxmppFeatures.setQueryNode(discoIq.queryNode()); sendPacket(qxmppFeatures); } else { emit discoveryIqReceived(discoIq); @@ -1045,3 +1046,57 @@ void QXmppStream::flushDataBuffer() m_dataBuffer.clear(); } +QXmppDiscoveryIq QXmppStream::capabilities() const +{ + QXmppDiscoveryIq iq; + iq.setType(QXmppIq::Result); + iq.setQueryType(QXmppDiscoveryIq::InfoQuery); + + // features + QStringList features; + features + << ns_rpc // XEP-0009: Jabber-RPC + << ns_disco_info // XEP-0030: Service Discovery + << ns_ibb // XEP-0047: In-Band Bytestreams + << ns_vcard // XEP-0054: vcard-temp + << ns_bytestreams // XEP-0065: SOCKS5 Bytestreams + << ns_chat_states // XEP-0085: Chat State Notifications + << ns_version // XEP-0092: Software Version + << ns_stream_initiation // XEP-0095: Stream Initiation + << ns_stream_initiation_file_transfer // XEP-0096: SI File Transfer + << ns_capabilities // XEP-0115 : Entity Capabilities + << ns_ping; // XEP-0199: XMPP Ping + iq.setFeatures(features); + + // identities + QList<QXmppDiscoveryIq::Identity> identities; + QXmppDiscoveryIq::Identity identity; + + identity.setCategory("automation"); + identity.setType("rpc"); + identities.append(identity); + + identity.setCategory("client"); + identity.setType("pc"); + identity.setName(QString("%1 %2").arg(qApp->applicationName(), qApp->applicationVersion())); + identities.append(identity); + + iq.setIdentities(identities); + return iq; +} + +QXmppElementList QXmppStream::presenceExtensions() const +{ + QXmppElementList extensions; + + QXmppElement caps; + caps.setTagName("c"); + caps.setAttribute("xmlns", ns_capabilities); + caps.setAttribute("hash", "sha-1"); + caps.setAttribute("node", capabilitiesNode); + caps.setAttribute("ver", capabilities().verificationString().toBase64()); + extensions << caps; + + return extensions; +} + diff --git a/source/QXmppStream.h b/source/QXmppStream.h index 6b4a5f9f..acfcf1b4 100644 --- a/source/QXmppStream.h +++ b/source/QXmppStream.h @@ -80,6 +80,8 @@ public: QXmppLogger *logger(); void setLogger(QXmppLogger *logger); + QXmppElementList presenceExtensions() const; + signals: // socket host found void hostFound(); @@ -157,6 +159,7 @@ private: int m_authStep; + QXmppDiscoveryIq capabilities() const; void debug(const QString&); void info(const QString&); void warning(const QString&); |
