aboutsummaryrefslogtreecommitdiff
path: root/src/server
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
parent9235370c59f46e5e73936f9ccd907ee51603e70b (diff)
downloadqxmpp-60756b31285d65add73efaad39a44617ecce76db.tar.gz
add plugins for:
- ping - service discovery
Diffstat (limited to 'src/server')
-rw-r--r--src/server/mod_disco.cpp116
-rw-r--r--src/server/mod_disco.h50
-rw-r--r--src/server/mod_ping.cpp87
-rw-r--r--src/server/mod_ping.h46
4 files changed, 299 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)
+
diff --git a/src/server/mod_disco.h b/src/server/mod_disco.h
new file mode 100644
index 00000000..d5640a5b
--- /dev/null
+++ b/src/server/mod_disco.h
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef QXMPP_SERVER_DISCOVERY_H
+#define QXMPP_SERVER_DISCOVERY_H
+
+#include <QStringList>
+
+#include "QXmppServerExtension.h"
+
+class QXmppServerDiscovery : public QXmppServerExtension
+{
+ Q_OBJECT
+ Q_CLASSINFO("ExtensionName", "discovery");
+ Q_PROPERTY(QStringList discoveryItems READ discoveryItems WRITE setDiscoveryItems);
+
+public:
+ QStringList discoveryFeatures() const;
+ QStringList discoveryItems() const;
+ void setDiscoveryItems(const QStringList &items);
+
+ bool handleStanza(QXmppStream *incoming, const QDomElement &element);
+ bool start(QXmppServer *server);
+
+private:
+ QXmppServer *m_server;
+ QStringList m_discoveryItems;
+};
+
+#endif
diff --git a/src/server/mod_ping.cpp b/src/server/mod_ping.cpp
new file mode 100644
index 00000000..fcc4d259
--- /dev/null
+++ b/src/server/mod_ping.cpp
@@ -0,0 +1,87 @@
+/*
+ * 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 "QXmppPingIq.h"
+#include "QXmppServer.h"
+#include "QXmppServerPlugin.h"
+#include "QXmppStream.h"
+
+#include "mod_ping.h"
+
+QStringList QXmppServerPing::discoveryFeatures() const
+{
+ return QStringList() << ns_ping;
+}
+
+bool QXmppServerPing::handleStanza(QXmppStream *stream, const QDomElement &element)
+{
+ if (element.attribute("to") != m_jid)
+ return false;
+
+ // XEP-0199: XMPP Ping
+ if (element.tagName() == "iq" && QXmppPingIq::isPingIq(element))
+ {
+ QXmppPingIq request;
+ request.parse(element);
+
+ QXmppIq response(QXmppIq::Result);
+ response.setId(request.id());
+ response.setFrom(request.to());
+ response.setTo(request.from());
+ stream->sendPacket(response);
+ return true;
+ }
+
+ return false;
+}
+
+bool QXmppServerPing::start(QXmppServer *server)
+{
+ m_jid = server->domain();
+ return true;
+}
+
+// PLUGIN
+
+class QXmppServerPingPlugin : public QXmppServerPlugin
+{
+public:
+ QXmppServerExtension *create(const QString &key)
+ {
+ if (key == QLatin1String("ping"))
+ return new QXmppServerPing;
+ else
+ return 0;
+ };
+
+ QStringList keys() const
+ {
+ return QStringList() << QLatin1String("ping");
+ };
+};
+
+Q_EXPORT_STATIC_PLUGIN2(mod_ping, QXmppServerPingPlugin)
+
diff --git a/src/server/mod_ping.h b/src/server/mod_ping.h
new file mode 100644
index 00000000..99f77a60
--- /dev/null
+++ b/src/server/mod_ping.h
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef QXMPP_SERVER_PING_H
+#define QXMPP_SERVER_PING_H
+
+#include "QXmppServerExtension.h"
+
+/// \brief QXmppServer extension for XEP-0199: XMPP Ping.
+///
+
+class QXmppServerPing : public QXmppServerExtension
+{
+ Q_OBJECT
+ Q_CLASSINFO("ExtensionName", "ping");
+
+public:
+ QStringList discoveryFeatures() const;
+ bool handleStanza(QXmppStream *stream, const QDomElement &element);
+ bool start(QXmppServer *server);
+
+private:
+ QString m_jid;
+};
+
+#endif