aboutsummaryrefslogtreecommitdiff
path: root/src/QXmppServer.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-08-27 13:20:48 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-08-27 13:20:48 +0000
commita8203708313675c20e341681acd673ab2ac497f1 (patch)
tree6a70706d0aefbf970a9f1dbf4536c7b1015c16cf /src/QXmppServer.cpp
parent1284e4f4efa9a810445e6cf34fa15d325f26a79e (diff)
downloadqxmpp-a8203708313675c20e341681acd673ab2ac497f1.tar.gz
refactor server extension loading
Diffstat (limited to 'src/QXmppServer.cpp')
-rw-r--r--src/QXmppServer.cpp80
1 files changed, 56 insertions, 24 deletions
diff --git a/src/QXmppServer.cpp b/src/QXmppServer.cpp
index 9c9e0a45..47412610 100644
--- a/src/QXmppServer.cpp
+++ b/src/QXmppServer.cpp
@@ -41,7 +41,10 @@ class QXmppServerPrivate
{
public:
QXmppServerPrivate();
- void start(QXmppServer *server);
+ void loadExtensions(QXmppServer *server);
+ void startExtensions(QXmppServer *server);
+ void stopExtensions();
+
void info(const QString &message);
void warning(const QString &message);
@@ -60,12 +63,15 @@ public:
QList<QXmppOutgoingServer*> outgoingServers;
QXmppSslServer *serverForServers;
+private:
+ bool loaded;
bool started;
};
QXmppServerPrivate::QXmppServerPrivate()
: logger(0),
passwordChecker(0),
+ loaded(false),
started(false)
{
}
@@ -82,10 +88,36 @@ void QXmppServerPrivate::warning(const QString &message)
logger->log(QXmppLogger::WarningMessage, message);
}
+/// Load the server's extensions.
+///
+/// \param server
+
+void QXmppServerPrivate::loadExtensions(QXmppServer *server)
+{
+ if (!loaded)
+ {
+ QObjectList plugins = QPluginLoader::staticInstances();
+ foreach (QObject *object, plugins)
+ {
+ QXmppServerPlugin *plugin = qobject_cast<QXmppServerPlugin*>(object);
+ if (!plugin)
+ continue;
+
+ foreach (const QString &key, plugin->keys())
+ {
+ QXmppServerExtension *extension;
+ server->addExtension(plugin->create(key));
+ }
+ }
+ loaded = true;
+ }
+}
+
/// Start the server's extensions.
///
+/// \param server
-void QXmppServerPrivate::start(QXmppServer *server)
+void QXmppServerPrivate::startExtensions(QXmppServer *server)
{
if (!started)
{
@@ -96,6 +128,19 @@ void QXmppServerPrivate::start(QXmppServer *server)
}
}
+/// Stop the server's extensions (in reverse order).
+///
+
+void QXmppServerPrivate::stopExtensions()
+{
+ if (started)
+ {
+ for (int i = extensions.size() - 1; i >= 0; --i)
+ extensions[i]->stop();
+ started = false;
+ }
+}
+
/// Constructs a new XMPP server instance.
///
/// \param parent
@@ -113,18 +158,6 @@ QXmppServer::QXmppServer(QObject *parent)
check = connect(d->serverForServers, SIGNAL(newConnection(QSslSocket*)),
this, SLOT(slotServerConnection(QSslSocket*)));
Q_ASSERT(check);
-
- // load static plugins
- 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));
- }
- }
}
/// Destroys an XMPP server instance.
@@ -142,8 +175,9 @@ QXmppServer::~QXmppServer()
void QXmppServer::addExtension(QXmppServerExtension *extension)
{
- if (d->extensions.contains(extension))
+ if (!extension || d->extensions.contains(extension))
return;
+ d->info(QString("Added extension %1").arg(extension->extensionName()));
extension->setParent(this);
d->extensions << extension;
}
@@ -153,6 +187,7 @@ void QXmppServer::addExtension(QXmppServerExtension *extension)
QList<QXmppServerExtension*> QXmppServer::loadedExtensions()
{
+ d->loadExtensions(this);
return d->extensions;
}
@@ -257,7 +292,8 @@ bool QXmppServer::listenForClients(const QHostAddress &address, quint16 port)
}
// start extensions
- d->start(this);
+ d->loadExtensions(this);
+ d->startExtensions(this);
return true;
}
@@ -270,13 +306,8 @@ void QXmppServer::close()
d->serverForClients->close();
d->serverForServers->close();
- // stop extensions in reverse order
- if (d->started)
- {
- for (int i = d->extensions.size() - 1; i >= 0; --i)
- d->extensions[i]->stop();
- d->started = false;
- }
+ // stop extensions
+ d->stopExtensions();
// close XMPP streams
foreach (QXmppIncomingClient *stream, d->incomingClients)
@@ -301,7 +332,8 @@ bool QXmppServer::listenForServers(const QHostAddress &address, quint16 port)
}
// start extensions
- d->start(this);
+ d->loadExtensions(this);
+ d->startExtensions(this);
return true;
}