diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2012-03-24 15:46:27 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2012-03-24 15:46:27 +0000 |
| commit | 6f82cf3c3aab28903dc80034505f3b75c84ce7ac (patch) | |
| tree | 7982242914456ef5870679d0a02c9a99a7ef7c8f /src/server | |
| parent | fa29b3d1f69426c18c05e0fc710482d662d038ba (diff) | |
| download | qxmpp-6f82cf3c3aab28903dc80034505f3b75c84ce7ac.tar.gz | |
add a priority to QXmppServerExtension
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/QXmppServer.cpp | 26 | ||||
| -rw-r--r-- | src/server/QXmppServerExtension.cpp | 12 | ||||
| -rw-r--r-- | src/server/QXmppServerExtension.h | 1 | ||||
| -rw-r--r-- | src/server/mod_presence.cpp | 7 | ||||
| -rw-r--r-- | src/server/mod_presence.h | 1 |
5 files changed, 35 insertions, 12 deletions
diff --git a/src/server/QXmppServer.cpp b/src/server/QXmppServer.cpp index e8c6403b..c8343d2c 100644 --- a/src/server/QXmppServer.cpp +++ b/src/server/QXmppServer.cpp @@ -46,6 +46,7 @@ // Core plugins Q_IMPORT_PLUGIN(mod_disco) Q_IMPORT_PLUGIN(mod_ping) +Q_IMPORT_PLUGIN(mod_presence) Q_IMPORT_PLUGIN(mod_proxy65) Q_IMPORT_PLUGIN(mod_stats) Q_IMPORT_PLUGIN(mod_time) @@ -237,11 +238,9 @@ void QXmppServerPrivate::warning(const QString &message) void QXmppServerPrivate::loadExtensions(QXmppServer *server) { - if (!loaded) - { + if (!loaded) { QObjectList plugins = QPluginLoader::staticInstances(); - foreach (QObject *object, plugins) - { + foreach (QObject *object, plugins) { QXmppServerPlugin *plugin = qobject_cast<QXmppServerPlugin*>(object); if (!plugin) continue; @@ -249,10 +248,6 @@ void QXmppServerPrivate::loadExtensions(QXmppServer *server) foreach (const QString &key, plugin->keys()) server->addExtension(plugin->create(key)); } - - // FIXME: until we can handle presence errors, we need to - // keep this extension last. - server->addExtension(new QXmppServerPresence); loaded = true; } } @@ -261,8 +256,7 @@ void QXmppServerPrivate::loadExtensions(QXmppServer *server) void QXmppServerPrivate::startExtensions() { - if (!started) - { + if (!started) { foreach (QXmppServerExtension *extension, extensions) if (!extension->start()) warning(QString("Could not start extension %1").arg(extension->extensionName())); @@ -275,8 +269,7 @@ void QXmppServerPrivate::startExtensions() void QXmppServerPrivate::stopExtensions() { - if (started) - { + if (started) { for (int i = extensions.size() - 1; i >= 0; --i) extensions[i]->stop(); started = false; @@ -327,6 +320,15 @@ void QXmppServer::addExtension(QXmppServerExtension *extension) d->info(QString("Added extension %1").arg(extension->extensionName())); extension->setParent(this); extension->setServer(this); + + // keep extensions sorted by priority + for (int i = 0; i < d->extensions.size(); ++i) { + QXmppServerExtension *other = d->extensions[i]; + if (other->extensionPriority() < extension->extensionPriority()) { + d->extensions.insert(i, extension); + return; + } + } d->extensions << extension; } diff --git a/src/server/QXmppServerExtension.cpp b/src/server/QXmppServerExtension.cpp index eb87963a..68916b56 100644 --- a/src/server/QXmppServerExtension.cpp +++ b/src/server/QXmppServerExtension.cpp @@ -74,6 +74,18 @@ QString QXmppServerExtension::extensionName() const return QString::fromLatin1(name); } +/// Returns the extension's priority. +/// +/// Higher priority extensions are called first when handling +/// incoming stanzas. +/// +/// The default implementation returns 0. + +int QXmppServerExtension::extensionPriority() const +{ + return 0; +} + /// Handles an incoming XMPP stanza. /// /// Return true if no further processing should occur, false otherwise. diff --git a/src/server/QXmppServerExtension.h b/src/server/QXmppServerExtension.h index c5f9a80d..04e7658b 100644 --- a/src/server/QXmppServerExtension.h +++ b/src/server/QXmppServerExtension.h @@ -53,6 +53,7 @@ public: QXmppServerExtension(); ~QXmppServerExtension(); QString extensionName() const; + virtual int extensionPriority() const; virtual QStringList discoveryFeatures() const; virtual QStringList discoveryItems() const; diff --git a/src/server/mod_presence.cpp b/src/server/mod_presence.cpp index 33e7aa26..41c06379 100644 --- a/src/server/mod_presence.cpp +++ b/src/server/mod_presence.cpp @@ -95,6 +95,13 @@ QList<QXmppPresence> QXmppServerPresence::availablePresences(const QString &bare return d->presences.value(bareJid).values(); } +int QXmppServerPresence::extensionPriority() const +{ + // FIXME: until we can handle presence errors, we need to + // keep this extension last. + return -1000; +} + bool QXmppServerPresence::handleStanza(const QDomElement &element) { if (element.tagName() != QLatin1String("presence")) diff --git a/src/server/mod_presence.h b/src/server/mod_presence.h index 4424f17d..7d32e652 100644 --- a/src/server/mod_presence.h +++ b/src/server/mod_presence.h @@ -42,6 +42,7 @@ public: ~QXmppServerPresence(); QList<QXmppPresence> availablePresences(const QString &bareJid) const; + int extensionPriority() const; bool handleStanza(const QDomElement &element); QSet<QString> presenceSubscribers(const QString &jid); bool start(); |
