aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2012-03-24 15:46:27 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2012-03-24 15:46:27 +0000
commit6f82cf3c3aab28903dc80034505f3b75c84ce7ac (patch)
tree7982242914456ef5870679d0a02c9a99a7ef7c8f /src/server
parentfa29b3d1f69426c18c05e0fc710482d662d038ba (diff)
downloadqxmpp-6f82cf3c3aab28903dc80034505f3b75c84ce7ac.tar.gz
add a priority to QXmppServerExtension
Diffstat (limited to 'src/server')
-rw-r--r--src/server/QXmppServer.cpp26
-rw-r--r--src/server/QXmppServerExtension.cpp12
-rw-r--r--src/server/QXmppServerExtension.h1
-rw-r--r--src/server/mod_presence.cpp7
-rw-r--r--src/server/mod_presence.h1
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();