aboutsummaryrefslogtreecommitdiff
path: root/src/server/mod_disco.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-08-27 15:26:59 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-08-27 15:26:59 +0000
commit60756b31285d65add73efaad39a44617ecce76db (patch)
treeb1c1ac034c65c944307695951b8713a55d2198ec /src/server/mod_disco.cpp
parent9235370c59f46e5e73936f9ccd907ee51603e70b (diff)
downloadqxmpp-60756b31285d65add73efaad39a44617ecce76db.tar.gz
add plugins for:
- ping - service discovery
Diffstat (limited to 'src/server/mod_disco.cpp')
-rw-r--r--src/server/mod_disco.cpp116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/server/mod_disco.cpp b/src/server/mod_disco.cpp
new file mode 100644
index 00000000..c6377f99
--- /dev/null
+++ b/src/server/mod_disco.cpp
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2008-2010 The QXmpp developers
+ *
+ * Author:
+ * Jeremy Lainé
+ *
+ * Source:
+ * http://code.google.com/p/qxmpp
+ *
+ * This file is a part of QXmpp library.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ */
+
+#include <QDomElement>
+
+#include "QXmppConstants.h"
+#include "QXmppDiscoveryIq.h"
+#include "QXmppServer.h"
+#include "QXmppServerPlugin.h"
+#include "QXmppStream.h"
+
+#include "mod_disco.h"
+
+QStringList QXmppServerDiscovery::discoveryFeatures() const
+{
+ return QStringList() << ns_disco_info << ns_disco_items;
+}
+
+QStringList QXmppServerDiscovery::discoveryItems() const
+{
+ return m_discoveryItems;
+}
+
+void QXmppServerDiscovery::setDiscoveryItems(const QStringList &items)
+{
+ m_discoveryItems = items;
+}
+
+bool QXmppServerDiscovery::handleStanza(QXmppStream *incoming, const QDomElement &element)
+{
+ if (element.attribute("to") != m_server->domain())
+ return false;
+
+ // XEP-0030: Service Discovery
+ const QString type = element.attribute("type");
+ if (element.tagName() == "iq" && QXmppDiscoveryIq::isDiscoveryIq(element) && type == "get")
+ {
+ QXmppDiscoveryIq request;
+ request.parse(element);
+
+ QXmppDiscoveryIq response;
+ response.setType(QXmppIq::Result);
+ response.setId(request.id());
+ response.setFrom(request.to());
+ response.setTo(request.from());
+ response.setQueryType(request.queryType());
+
+ if (request.queryType() == QXmppDiscoveryIq::ItemsQuery)
+ {
+ QList<QXmppDiscoveryIq::Item> items;
+ foreach (const QString &jid, m_discoveryItems)
+ {
+ QXmppDiscoveryIq::Item item;
+ item.setJid(jid);
+ items.append(item);
+ }
+ response.setItems(items);
+ } else {
+ QStringList features;
+ foreach (QXmppServerExtension *extension, m_server->loadedExtensions())
+ features += extension->discoveryFeatures();
+ response.setFeatures(features);
+ }
+ incoming->sendPacket(response);
+ return true;
+ }
+ return false;
+}
+
+bool QXmppServerDiscovery::start(QXmppServer *server)
+{
+ m_server = server;
+ return true;
+}
+
+// PLUGIN
+
+class QXmppServerDiscoveryPlugin : public QXmppServerPlugin
+{
+public:
+ QXmppServerExtension *create(const QString &key)
+ {
+ if (key == QLatin1String("ping"))
+ return new QXmppServerDiscovery;
+ else
+ return 0;
+ };
+
+ QStringList keys() const
+ {
+ return QStringList() << QLatin1String("ping");
+ };
+};
+
+Q_EXPORT_STATIC_PLUGIN2(mod_disco, QXmppServerDiscoveryPlugin)
+