aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-08-26 07:30:37 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-08-26 07:30:37 +0000
commit61fc4bfeafa958d7def9aeb14b50f79f672a3df3 (patch)
tree85915e65a006a26482030592cd44b0646d4a85f3 /src
parent5a3bbfb46bda7fdba89b3dbfe205b44404720878 (diff)
downloadqxmpp-61fc4bfeafa958d7def9aeb14b50f79f672a3df3.tar.gz
start preparing for QXmppServer plugins
Diffstat (limited to 'src')
-rw-r--r--src/QXmppServer.cpp70
-rw-r--r--src/QXmppServer.h22
-rw-r--r--src/QXmppServerPlugin.h53
-rw-r--r--src/src.pro1
4 files changed, 133 insertions, 13 deletions
diff --git a/src/QXmppServer.cpp b/src/QXmppServer.cpp
index 55f2ef5e..a367dcf0 100644
--- a/src/QXmppServer.cpp
+++ b/src/QXmppServer.cpp
@@ -23,6 +23,7 @@
#include <QDomElement>
#include <QFileInfo>
+#include <QPluginLoader>
#include <QSslSocket>
#include "QXmppDialback.h"
@@ -32,6 +33,7 @@
#include "QXmppOutgoingServer.h"
#include "QXmppPingIq.h"
#include "QXmppServer.h"
+#include "QXmppServerPlugin.h"
#include "QXmppUtils.h"
class QXmppServerPrivate
@@ -40,6 +42,7 @@ public:
QXmppServerPrivate();
QString domain;
+ QList<QXmppServerExtension*> extensions;
QMap<QString, QStringList> subscribers;
QXmppLogger *logger;
QXmppPasswordChecker *passwordChecker;
@@ -76,6 +79,17 @@ QXmppServer::QXmppServer(QObject *parent)
check = connect(d->serverForServers, SIGNAL(newConnection(QSslSocket*)),
this, SLOT(slotServerConnection(QSslSocket*)));
Q_ASSERT(check);
+
+ QObjectList plugins = QPluginLoader::staticInstances();
+ foreach (QObject *object, plugins)
+ {
+ QXmppServerPlugin *plugin = qobject_cast<QXmppServerPlugin*>(object);
+ if (plugin)
+ {
+ foreach (const QString &key, plugin->keys())
+ addExtension(plugin->create(key, this));
+ }
+ }
}
/// Destroys an XMPP server instance.
@@ -83,9 +97,20 @@ QXmppServer::QXmppServer(QObject *parent)
QXmppServer::~QXmppServer()
{
+ foreach (QXmppServerExtension *extension, d->extensions)
+ delete extension;
delete d;
}
+/// Registers a new extension with the server.
+///
+/// \param extension
+
+void QXmppServer::addExtension(QXmppServerExtension *extension)
+{
+ d->extensions << extension;
+}
+
/// Returns the server's domain.
///
@@ -278,8 +303,13 @@ QList<QXmppStream*> QXmppServer::getStreams(const QString &to)
void QXmppServer::handleStanza(QXmppStream *stream, const QDomElement &element)
{
- const QString to = element.attribute("to");
+ // try extensions
+ foreach (QXmppServerExtension *extension, d->extensions)
+ if (extension->handleStanza(stream, element))
+ return;
+ // default handlers
+ const QString to = element.attribute("to");
if (to == d->domain)
{
if (element.tagName() == "presence")
@@ -370,7 +400,13 @@ void QXmppServer::handleStanza(QXmppStream *stream, const QDomElement &element)
QStringList QXmppServer::subscribers(const QString &jid)
{
- return d->subscribers.value(jid);
+ QStringList recipients = d->subscribers.value(jid);
+
+ // try extensions
+ foreach (QXmppServerExtension *extension, d->extensions)
+ recipients += extension->presenceSubscribers(jid);
+
+ return recipients;
}
/// Route an XMPP stanza.
@@ -449,8 +485,7 @@ void QXmppServer::slotClientConnected()
}
}
- // update statistics
- updateStatistics();
+ // FIXME : update statistics
}
/// Handle a disconnection from a client.
@@ -477,8 +512,7 @@ void QXmppServer::slotClientDisconnected()
d->incomingClients.removeAll(stream);
stream->deleteLater();
- // update statistics
- updateStatistics();
+ // FIXME : update statistics
}
void QXmppServer::slotDialbackRequestReceived(const QXmppDialback &dialback)
@@ -512,6 +546,8 @@ void QXmppServer::slotDialbackRequestReceived(const QXmppDialback &dialback)
void QXmppServer::slotElementReceived(const QDomElement &element, bool &handled)
{
+ Q_UNUSED(handled);
+
QXmppStream *incoming = qobject_cast<QXmppStream *>(sender());
if (!incoming)
return;
@@ -541,8 +577,28 @@ void QXmppServer::slotServerConnection(QSslSocket *socket)
Q_ASSERT(check);
}
-void QXmppServer::updateStatistics()
+/// Handles an incoming XMPP stanza.
+///
+/// Return true if no further processing should occur, false otherwise.
+///
+/// \param stream The QXmppStream on which the stanza was received.
+/// \param stanza The received stanza.
+
+bool handleStanza(QXmppStream *stream, const QDomElement &stanza)
+{
+ Q_UNUSED(stream);
+ Q_UNUSED(stanza);
+ return false;
+}
+
+/// Returns the list of subscribers for the given JID.
+///
+/// \param jid
+
+QStringList QXmppServerExtension::presenceSubscribers(const QString &jid)
{
+ Q_UNUSED(jid);
+ return QStringList();
}
class QXmppSslServerPrivate
diff --git a/src/QXmppServer.h b/src/QXmppServer.h
index 24cabb64..68a85e99 100644
--- a/src/QXmppServer.h
+++ b/src/QXmppServer.h
@@ -33,6 +33,7 @@ class QXmppDialback;
class QXmppLogger;
class QXmppOutgoingServer;
class QXmppPasswordChecker;
+class QXmppServerExtension;
class QXmppServerPrivate;
class QXmppSslServer;
class QXmppStanza;
@@ -50,6 +51,8 @@ public:
QXmppServer(QObject *parent = 0);
~QXmppServer();
+ void addExtension(QXmppServerExtension *extension);
+
QString domain() const;
void setDomain(const QString &domain);
@@ -77,18 +80,25 @@ private slots:
void slotElementReceived(const QDomElement &element, bool &handled);
void slotServerConnection(QSslSocket *socket);
-protected:
- // overridable methods
- virtual void handleStanza(QXmppStream *stream, const QDomElement &element);
- virtual QStringList subscribers(const QString &jid);
- virtual void updateStatistics();
-
private:
QXmppOutgoingServer *connectToDomain(const QString &domain);
QList<QXmppStream*> getStreams(const QString &to);
+ virtual void handleStanza(QXmppStream *stream, const QDomElement &element);
+ virtual QStringList subscribers(const QString &jid);
QXmppServerPrivate * const d;
};
+/// \brief The QXmppServerExtension is the base class for QXmppServer
+/// extensions.
+///
+
+class QXmppServerExtension
+{
+public:
+ virtual bool handleStanza(QXmppStream *stream, const QDomElement &stanza);
+ virtual QStringList presenceSubscribers(const QString &jid);
+};
+
class QXmppSslServerPrivate;
/// \brief The QXmppSslServer class represents an SSL-enabled TCP server.
diff --git a/src/QXmppServerPlugin.h b/src/QXmppServerPlugin.h
new file mode 100644
index 00000000..f139c654
--- /dev/null
+++ b/src/QXmppServerPlugin.h
@@ -0,0 +1,53 @@
+/*
+ * 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 QXMPPSERVERPLUGIN_H
+#define QXMPPSERVERPLUGIN_H
+
+#include <QtPlugin>
+
+class QXmppServer;
+class QXmppServerExtension;
+
+/// Interface for all QXmppServer plugins.
+///
+
+class QXmppServerPluginInterface
+{
+public:
+ virtual QXmppServerExtension *create(const QString &key, QXmppServer *server) = 0;
+ virtual QStringList keys() const = 0;
+};
+
+Q_DECLARE_INTERFACE(QXmppServerPluginInterface, "com.googlecode.qxmpp.ServerPlugin/1.0")
+
+/// The QXmppServerPlugin class is the base class for all QXmppServer plugins.
+///
+
+class QXmppServerPlugin : public QObject, public QXmppServerPluginInterface
+{
+ Q_OBJECT
+ Q_INTERFACES(QXmppServerPluginInterface)
+};
+
+#endif
diff --git a/src/src.pro b/src/src.pro
index c9eb05b3..d8bb5ed4 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -52,6 +52,7 @@ HEADERS += QXmppUtils.h \
QXmppRosterIq.h \
QXmppRosterManager.h \
QXmppServer.h \
+ QXmppServerPlugin.h \
QXmppSessionIq.h \
QXmppSocks.h \
QXmppStanza.h \