diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-08-26 07:30:37 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-08-26 07:30:37 +0000 |
| commit | 61fc4bfeafa958d7def9aeb14b50f79f672a3df3 (patch) | |
| tree | 85915e65a006a26482030592cd44b0646d4a85f3 /src | |
| parent | 5a3bbfb46bda7fdba89b3dbfe205b44404720878 (diff) | |
| download | qxmpp-61fc4bfeafa958d7def9aeb14b50f79f672a3df3.tar.gz | |
start preparing for QXmppServer plugins
Diffstat (limited to 'src')
| -rw-r--r-- | src/QXmppServer.cpp | 70 | ||||
| -rw-r--r-- | src/QXmppServer.h | 22 | ||||
| -rw-r--r-- | src/QXmppServerPlugin.h | 53 | ||||
| -rw-r--r-- | src/src.pro | 1 |
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 \ |
