From e656e68dfb2302cd2c8cb7d9f79b8ec36b2b0bea Mon Sep 17 00:00:00 2001 From: Jeremy Lainé Date: Thu, 15 Jul 2010 15:40:38 +0000 Subject: add XEP-0115 : Entity Capabilities to QXmppStream --- source/QXmppStream.cpp | 61 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 3 deletions(-) (limited to 'source/QXmppStream.cpp') 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 #include +static const QString capabilitiesNode = "http://code.google.com/p/qxmpp"; static const QByteArray streamRootElementStart = "\n"; static const QByteArray streamRootElementEnd = ""; @@ -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 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; +} + -- cgit v1.2.3