aboutsummaryrefslogtreecommitdiff
path: root/src/QXmppServer.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-08-28 22:59:55 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-08-28 22:59:55 +0000
commit13b245f3bcc709b2a974b764bb209e1ea87768af (patch)
treeb3bbde11e5fd231bf059f09f308dddf776426a47 /src/QXmppServer.cpp
parent8b58bfd72ad5d8e28e325c6cea61db270b9e626b (diff)
downloadqxmpp-13b245f3bcc709b2a974b764bb209e1ea87768af.tar.gz
update QXmppServer extensions API
Diffstat (limited to 'src/QXmppServer.cpp')
-rw-r--r--src/QXmppServer.cpp42
1 files changed, 28 insertions, 14 deletions
diff --git a/src/QXmppServer.cpp b/src/QXmppServer.cpp
index 1ba4c46c..40ebe57f 100644
--- a/src/QXmppServer.cpp
+++ b/src/QXmppServer.cpp
@@ -41,6 +41,7 @@
Q_IMPORT_PLUGIN(mod_disco)
Q_IMPORT_PLUGIN(mod_ping)
Q_IMPORT_PLUGIN(mod_proxy65)
+Q_IMPORT_PLUGIN(mod_stats)
Q_IMPORT_PLUGIN(mod_version)
class QXmppServerPrivate
@@ -56,7 +57,7 @@ public:
QString domain;
QList<QXmppServerExtension*> extensions;
- QMap<QString, QStringList> subscribers;
+ QMap<QString, QSet<QString> > subscribers;
QXmppLogger *logger;
QXmppPasswordChecker *passwordChecker;
@@ -194,6 +195,19 @@ QList<QXmppServerExtension*> QXmppServer::loadedExtensions()
return d->extensions;
}
+/// Returns the list of available resources for the given local JID.
+///
+/// \param bareJid
+
+QStringList QXmppServer::availableResources(const QString &bareJid)
+{
+ QStringList fullJids;
+ foreach (QXmppIncomingClient *client, d->incomingClients)
+ if (client->isConnected() && jidToBareJid(client->jid()) == bareJid)
+ fullJids << client->jid();
+ return fullJids;
+}
+
/// Returns the server's domain.
///
@@ -464,15 +478,10 @@ void QXmppServer::handleStanza(QXmppStream *stream, const QDomElement &element)
presence.parse(element);
const QString from = presence.from();
- QStringList subscribers = d->subscribers.value(from);
if (presence.type() == QXmppPresence::Available)
- {
- subscribers.append(to);
- d->subscribers[from] = subscribers;
- } else if (presence.type() == QXmppPresence::Unavailable) {
- subscribers.removeAll(to);
- d->subscribers[from] = subscribers;
- }
+ d->subscribers[from].insert(to);
+ else if (presence.type() == QXmppPresence::Unavailable)
+ d->subscribers[from].remove(to);
}
// route element or reply on behalf of missing peer
@@ -495,13 +504,18 @@ void QXmppServer::handleStanza(QXmppStream *stream, const QDomElement &element)
QStringList QXmppServer::subscribers(const QString &jid)
{
- QStringList recipients = d->subscribers.value(jid);
+ // start with directed presences
+ QSet<QString> recipients = d->subscribers.value(jid);
- // try extensions
+ // query extensions
foreach (QXmppServerExtension *extension, d->extensions)
- recipients += extension->presenceSubscribers(jid);
+ {
+ const QStringList extras = extension->presenceSubscribers(jid);
+ foreach (const QString &extra, extras)
+ recipients.insert(extra);
+ }
- return recipients;
+ return recipients.toList();
}
/// Route an XMPP stanza.
@@ -693,7 +707,7 @@ void QXmppServer::slotStreamDisconnected()
// notify subscribed peers of disconnection
if (!stream->jid().isEmpty())
{
- foreach (QString subscriber, d->subscribers.value(stream->jid()))
+ foreach (QString subscriber, subscribers(stream->jid()))
{
QXmppPresence presence;
presence.setFrom(stream->jid());