aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-08-28 13:28:37 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-08-28 13:28:37 +0000
commit2de9fa8c747bb481fd48c35c6b2a116e84d6929c (patch)
tree717e6e0554547d9560bde1b28e9ec155b2c3edca /src
parent97adcfb517528e257fd256761d31dc7524293724 (diff)
downloadqxmpp-2de9fa8c747bb481fd48c35c6b2a116e84d6929c.tar.gz
rework QXmppServerExtension initialisation
Diffstat (limited to 'src')
-rw-r--r--src/QXmppServer.cpp13
-rw-r--r--src/QXmppServerExtension.cpp40
-rw-r--r--src/QXmppServerExtension.h13
-rw-r--r--src/server/mod_disco.cpp23
-rw-r--r--src/server/mod_disco.h3
-rw-r--r--src/server/mod_ping.cpp8
-rw-r--r--src/server/mod_ping.h4
-rw-r--r--src/server/mod_proxy65.cpp50
-rw-r--r--src/server/mod_proxy65.h2
9 files changed, 91 insertions, 65 deletions
diff --git a/src/QXmppServer.cpp b/src/QXmppServer.cpp
index 7a31713e..bb327916 100644
--- a/src/QXmppServer.cpp
+++ b/src/QXmppServer.cpp
@@ -47,7 +47,7 @@ class QXmppServerPrivate
public:
QXmppServerPrivate();
void loadExtensions(QXmppServer *server);
- void startExtensions(QXmppServer *server);
+ void startExtensions();
void stopExtensions();
void info(const QString &message);
@@ -117,15 +117,13 @@ void QXmppServerPrivate::loadExtensions(QXmppServer *server)
}
/// Start the server's extensions.
-///
-/// \param server
-void QXmppServerPrivate::startExtensions(QXmppServer *server)
+void QXmppServerPrivate::startExtensions()
{
if (!started)
{
foreach (QXmppServerExtension *extension, extensions)
- if (!extension->start(server))
+ if (!extension->start())
warning(QString("Could not start extension %1").arg(extension->extensionName()));
started = true;
}
@@ -182,6 +180,7 @@ void QXmppServer::addExtension(QXmppServerExtension *extension)
return;
d->info(QString("Added extension %1").arg(extension->extensionName()));
extension->setParent(this);
+ extension->setServer(this);
d->extensions << extension;
}
@@ -296,7 +295,7 @@ bool QXmppServer::listenForClients(const QHostAddress &address, quint16 port)
// start extensions
d->loadExtensions(this);
- d->startExtensions(this);
+ d->startExtensions();
return true;
}
@@ -336,7 +335,7 @@ bool QXmppServer::listenForServers(const QHostAddress &address, quint16 port)
// start extensions
d->loadExtensions(this);
- d->startExtensions(this);
+ d->startExtensions();
return true;
}
diff --git a/src/QXmppServerExtension.cpp b/src/QXmppServerExtension.cpp
index 76638397..e17304e9 100644
--- a/src/QXmppServerExtension.cpp
+++ b/src/QXmppServerExtension.cpp
@@ -26,6 +26,23 @@
#include "QXmppServerExtension.h"
+class QXmppServerExtensionPrivate
+{
+public:
+ QXmppServer *server;
+};
+
+QXmppServerExtension::QXmppServerExtension()
+ : d(new QXmppServerExtensionPrivate)
+{
+ d->server = 0;
+}
+
+QXmppServerExtension::~QXmppServerExtension()
+{
+ delete d;
+}
+
/// Returns the discovery features to add to the server.
///
@@ -79,15 +96,12 @@ QStringList QXmppServerExtension::presenceSubscribers(const QString &jid)
return QStringList();
}
-/// Starts the extension for the given server.
+/// Starts the extension.
///
/// Return true if the extension was started, false otherwise.
-///
-/// \param server The QXmppServer which started the extension.
-bool QXmppServerExtension::start(QXmppServer *server)
+bool QXmppServerExtension::start()
{
- Q_UNUSED(server);
return true;
}
@@ -97,3 +111,19 @@ void QXmppServerExtension::stop()
{
}
+/// Returns the server which loaded this extension.
+
+QXmppServer *QXmppServerExtension::server()
+{
+ return d->server;
+}
+
+/// Sets the server which loaded this extension.
+///
+/// \param server
+
+void QXmppServerExtension::setServer(QXmppServer *server)
+{
+ d->server = server;
+}
+
diff --git a/src/QXmppServerExtension.h b/src/QXmppServerExtension.h
index 0b1e6e56..7f860286 100644
--- a/src/QXmppServerExtension.h
+++ b/src/QXmppServerExtension.h
@@ -30,6 +30,7 @@ class QDomElement;
class QStringList;
class QXmppServer;
+class QXmppServerExtensionPrivate;
class QXmppStream;
/// \brief The QXmppServerExtension class is the base class for QXmppServer
@@ -41,14 +42,24 @@ class QXmppServerExtension : public QObject
Q_OBJECT
public:
+ QXmppServerExtension();
+ ~QXmppServerExtension();
QString extensionName() const;
+ QXmppServer *server();
virtual QStringList discoveryFeatures() const;
virtual QStringList discoveryItems() const;
virtual bool handleStanza(QXmppStream *stream, const QDomElement &stanza);
virtual QStringList presenceSubscribers(const QString &jid);
- virtual bool start(QXmppServer *server);
+
+ virtual bool start();
virtual void stop();
+
+private:
+ void setServer(QXmppServer *server);
+ QXmppServerExtensionPrivate * const d;
+
+ friend class QXmppServer;
};
#endif
diff --git a/src/server/mod_disco.cpp b/src/server/mod_disco.cpp
index fe257cf6..961f1f91 100644
--- a/src/server/mod_disco.cpp
+++ b/src/server/mod_disco.cpp
@@ -21,6 +21,7 @@
*
*/
+#include <QCoreApplication>
#include <QDomElement>
#include "QXmppConstants.h"
@@ -48,7 +49,7 @@ void QXmppServerDiscovery::setDiscoveryItems(const QStringList &items)
bool QXmppServerDiscovery::handleStanza(QXmppStream *incoming, const QDomElement &element)
{
- if (element.attribute("to") != m_server->domain())
+ if (element.attribute("to") != server()->domain())
return false;
// XEP-0030: Service Discovery
@@ -68,7 +69,7 @@ bool QXmppServerDiscovery::handleStanza(QXmppStream *incoming, const QDomElement
if (request.queryType() == QXmppDiscoveryIq::ItemsQuery)
{
QList<QXmppDiscoveryIq::Item> items;
- foreach (QXmppServerExtension *extension, m_server->loadedExtensions())
+ foreach (QXmppServerExtension *extension, server()->loadedExtensions())
{
foreach (const QString &jid, extension->discoveryItems())
{
@@ -79,8 +80,18 @@ bool QXmppServerDiscovery::handleStanza(QXmppStream *incoming, const QDomElement
}
response.setItems(items);
} else {
+ // identities
+ QList<QXmppDiscoveryIq::Identity> identities;
+ QXmppDiscoveryIq::Identity identity;
+ identity.setCategory("server");
+ identity.setType("im");
+ identity.setName(qApp->applicationName());
+ identities.append(identity);
+ response.setIdentities(identities);
+
+ // features
QStringList features;
- foreach (QXmppServerExtension *extension, m_server->loadedExtensions())
+ foreach (QXmppServerExtension *extension, server()->loadedExtensions())
features += extension->discoveryFeatures();
response.setFeatures(features);
}
@@ -90,12 +101,6 @@ bool QXmppServerDiscovery::handleStanza(QXmppStream *incoming, const QDomElement
return false;
}
-bool QXmppServerDiscovery::start(QXmppServer *server)
-{
- m_server = server;
- return true;
-}
-
// PLUGIN
class QXmppServerDiscoveryPlugin : public QXmppServerPlugin
diff --git a/src/server/mod_disco.h b/src/server/mod_disco.h
index d5640a5b..6816293a 100644
--- a/src/server/mod_disco.h
+++ b/src/server/mod_disco.h
@@ -36,14 +36,13 @@ class QXmppServerDiscovery : public QXmppServerExtension
public:
QStringList discoveryFeatures() const;
+
QStringList discoveryItems() const;
void setDiscoveryItems(const QStringList &items);
bool handleStanza(QXmppStream *incoming, const QDomElement &element);
- bool start(QXmppServer *server);
private:
- QXmppServer *m_server;
QStringList m_discoveryItems;
};
diff --git a/src/server/mod_ping.cpp b/src/server/mod_ping.cpp
index fcc4d259..82837123 100644
--- a/src/server/mod_ping.cpp
+++ b/src/server/mod_ping.cpp
@@ -38,7 +38,7 @@ QStringList QXmppServerPing::discoveryFeatures() const
bool QXmppServerPing::handleStanza(QXmppStream *stream, const QDomElement &element)
{
- if (element.attribute("to") != m_jid)
+ if (element.attribute("to") != server()->domain())
return false;
// XEP-0199: XMPP Ping
@@ -58,12 +58,6 @@ bool QXmppServerPing::handleStanza(QXmppStream *stream, const QDomElement &eleme
return false;
}
-bool QXmppServerPing::start(QXmppServer *server)
-{
- m_jid = server->domain();
- return true;
-}
-
// PLUGIN
class QXmppServerPingPlugin : public QXmppServerPlugin
diff --git a/src/server/mod_ping.h b/src/server/mod_ping.h
index 99f77a60..71d08801 100644
--- a/src/server/mod_ping.h
+++ b/src/server/mod_ping.h
@@ -37,10 +37,6 @@ class QXmppServerPing : public QXmppServerExtension
public:
QStringList discoveryFeatures() const;
bool handleStanza(QXmppStream *stream, const QDomElement &element);
- bool start(QXmppServer *server);
-
-private:
- QString m_jid;
};
#endif
diff --git a/src/server/mod_proxy65.cpp b/src/server/mod_proxy65.cpp
index 3eac9bfb..a5ce0744 100644
--- a/src/server/mod_proxy65.cpp
+++ b/src/server/mod_proxy65.cpp
@@ -144,7 +144,6 @@ struct TransferStats
class QXmppServerProxy65Private
{
public:
- QString domain;
QString jid;
QHostAddress host;
quint16 port;
@@ -167,17 +166,6 @@ QXmppServerProxy65::QXmppServerProxy65()
d->server = new QXmppSocksServer(this);
-#if 0
- // connect signals
- bool check = connect(client, SIGNAL(connected()),
- this, SLOT(slotConnected()));
- Q_ASSERT(check);
-
- check = connect(client, SIGNAL(disconnected()),
- this, SLOT(slotDisconnected()));
- Q_ASSERT(check);
-#endif
-
bool check = connect(d->server, SIGNAL(newConnection(QTcpSocket*, const QString&, quint16)),
this, SLOT(slotSocketConnected(QTcpSocket*, const QString &, quint16)));
Q_ASSERT(check);
@@ -207,7 +195,7 @@ bool QXmppServerProxy65::handleStanza(QXmppStream *stream, const QDomElement &el
QXmppDiscoveryIq discoIq;
discoIq.parse(element);
- if (discoIq.type() == QXmppIq::Get && discoIq.queryType() == QXmppDiscoveryIq::InfoQuery)
+ if (discoIq.type() == QXmppIq::Get)
{
QXmppDiscoveryIq responseIq;
responseIq.setTo(discoIq.from());
@@ -216,17 +204,20 @@ bool QXmppServerProxy65::handleStanza(QXmppStream *stream, const QDomElement &el
responseIq.setType(QXmppIq::Result);
responseIq.setQueryType(discoIq.queryType());
- QStringList features = QStringList() << ns_disco_info << ns_disco_items << ns_bytestreams;
+ if (discoIq.queryType() == QXmppDiscoveryIq::InfoQuery)
+ {
+ QStringList features = QStringList() << ns_disco_info << ns_disco_items << ns_bytestreams;
- QList<QXmppDiscoveryIq::Identity> identities;
- QXmppDiscoveryIq::Identity identity;
- identity.setCategory("proxy");
- identity.setType("bytestreams");
- identity.setName("SOCKS5 Bytestreams");
- identities.append(identity);
+ QList<QXmppDiscoveryIq::Identity> identities;
+ QXmppDiscoveryIq::Identity identity;
+ identity.setCategory("proxy");
+ identity.setType("bytestreams");
+ identity.setName("SOCKS5 Bytestreams");
+ identities.append(identity);
- responseIq.setFeatures(features);
- responseIq.setIdentities(identities);
+ responseIq.setFeatures(features);
+ responseIq.setIdentities(identities);
+ }
stream->sendPacket(responseIq);
return true;
@@ -268,7 +259,7 @@ bool QXmppServerProxy65::handleStanza(QXmppStream *stream, const QDomElement &el
// FIXME : make it possible to specify permissions
if (pair &&
- jidToDomain(bsIq.from()) == d->domain)
+ jidToDomain(bsIq.from()) == server()->domain())
{
qDebug() << "Activating connection" << hash << "by" << bsIq.from();
pair->activate();
@@ -314,16 +305,14 @@ void QXmppServerProxy65::setStatisticsFile(const QString &statisticsFile)
}
}
-bool QXmppServerProxy65::start(QXmppServer *server)
+bool QXmppServerProxy65::start()
{
- d->domain = server->domain();
-
// determine jid
if (d->jid.isEmpty())
- d->jid = "proxy." + server->domain();
+ d->jid = "proxy." + server()->domain();
// determine address
- const QString hostName = server->domain();
+ const QString hostName = server()->domain();
QHostAddress hostAddress;
if (!hostAddress.setAddress(hostName))
{
@@ -347,6 +336,10 @@ bool QXmppServerProxy65::start(QXmppServer *server)
void QXmppServerProxy65::stop()
{
+ d->server->close();
+ foreach (QTcpSocketPair *pair, d->pairs)
+ delete pair;
+ d->pairs.clear();
}
void QXmppServerProxy65::slotSocketConnected(QTcpSocket *socket, const QString &hostName, quint16 port)
@@ -355,7 +348,6 @@ void QXmppServerProxy65::slotSocketConnected(QTcpSocket *socket, const QString &
QTcpSocketPair *pair = d->pairs.value(hostName);
if (!pair)
{
- qDebug() << "SOCKET CONNECTED" << hostName << port;
pair = new QTcpSocketPair(hostName);
check = connect(pair, SIGNAL(finished()), this, SLOT(slotPairFinished()));
Q_ASSERT(check);
diff --git a/src/server/mod_proxy65.h b/src/server/mod_proxy65.h
index 32d15cf4..e9557383 100644
--- a/src/server/mod_proxy65.h
+++ b/src/server/mod_proxy65.h
@@ -80,7 +80,7 @@ public:
QStringList discoveryItems() const;
bool handleStanza(QXmppStream *stream, const QDomElement &element);
- bool start(QXmppServer *server);
+ bool start();
void stop();
private slots: