From 096ee16c2548cbbfb4c633d02ab7c38831e69a66 Mon Sep 17 00:00:00 2001 From: Jeremy Lainé Date: Tue, 24 Aug 2010 08:25:29 +0000 Subject: refactor element handling --- src/QXmppServer.cpp | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) (limited to 'src/QXmppServer.cpp') diff --git a/src/QXmppServer.cpp b/src/QXmppServer.cpp index 660ea3b2..a8915d22 100644 --- a/src/QXmppServer.cpp +++ b/src/QXmppServer.cpp @@ -39,7 +39,7 @@ public: QXmppServerPrivate(); QString domain; - QMap > subscribers; + QMap subscribers; QXmppLogger *logger; QXmppPasswordChecker *passwordChecker; @@ -278,29 +278,44 @@ QList QXmppServer::getStreams(const QString &to) void QXmppServer::handleStanza(QXmppStream *stream, const QDomElement &element) { const QString to = element.attribute("to"); - if (!to.isEmpty() && to != d->domain) + + // presence handling + if (element.tagName() == "presence") { - // presence handling - if (element.tagName() == "presence") + if (to.isEmpty() || to == d->domain) { + // presence to the local domain, broadcast it to subscribers + if (element.attribute("type").isEmpty() || element.attribute("type") == "unavailable") + { + const QString from = element.attribute("from"); + foreach (QString subscriber, subscribers(from)) + { + QDomElement changed(element); + changed.setAttribute("to", subscriber); + sendElement(changed); + + } + } + } else { QXmppPresence presence; presence.parse(element); const QString from = presence.from(); - QSet subscribers = d->subscribers.value(from); + QStringList subscribers = d->subscribers.value(from); if (presence.type() == QXmppPresence::Available) { - //qDebug() << to << "is subscribed to" << stream->jid(); - subscribers.insert(to); + subscribers.append(to); d->subscribers[from] = subscribers; } else if (presence.type() == QXmppPresence::Unavailable) { - //qDebug() << to << "is unsubscribed from" << stream->jid(); - subscribers.remove(to); + subscribers.removeAll(to); d->subscribers[from] = subscribers; } } + } - // route element or reply on behalf of missing peer + // route element or reply on behalf of missing peer + if (!to.isEmpty() && to != d->domain) + { if (!sendElement(element) && element.tagName() == "iq") { QXmppIq request; @@ -317,6 +332,11 @@ void QXmppServer::handleStanza(QXmppStream *stream, const QDomElement &element) } } +QStringList QXmppServer::subscribers(const QString &jid) +{ + return d->subscribers.value(jid); +} + /// Route an XMPP stanza. /// /// \param element -- cgit v1.2.3