aboutsummaryrefslogtreecommitdiff
path: root/source/QXmppStream.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-07-15 15:40:38 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-07-15 15:40:38 +0000
commite656e68dfb2302cd2c8cb7d9f79b8ec36b2b0bea (patch)
tree95fadd735360adf88ded44d91b55a083319e563b /source/QXmppStream.cpp
parent7077786fa916076f2427cef89588e6b835976f0e (diff)
downloadqxmpp-e656e68dfb2302cd2c8cb7d9f79b8ec36b2b0bea.tar.gz
add XEP-0115 : Entity Capabilities to QXmppStream
Diffstat (limited to 'source/QXmppStream.cpp')
-rw-r--r--source/QXmppStream.cpp61
1 files changed, 58 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;
+}
+