diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-08-23 13:32:28 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-08-23 13:32:28 +0000 |
| commit | ae6b93fc56d8084fb5a0dfea62d540003cfc97d9 (patch) | |
| tree | cbff80b3e3332799dd99499da642f6a3fdc2171a /src/QXmppServer.cpp | |
| parent | 8b9e630718d4abcf2677448120cc80c1791a444e (diff) | |
| download | qxmpp-ae6b93fc56d8084fb5a0dfea62d540003cfc97d9.tar.gz | |
refactor server element handling
Diffstat (limited to 'src/QXmppServer.cpp')
| -rw-r--r-- | src/QXmppServer.cpp | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/src/QXmppServer.cpp b/src/QXmppServer.cpp index ec0e3195..54dcb9bc 100644 --- a/src/QXmppServer.cpp +++ b/src/QXmppServer.cpp @@ -26,6 +26,7 @@ #include <QSslSocket> #include "QXmppDialback.h" +#include "QXmppIq.h" #include "QXmppIncomingClient.h" #include "QXmppIncomingServer.h" #include "QXmppOutgoingServer.h" @@ -274,6 +275,53 @@ QList<QXmppStream*> QXmppServer::getStreams(const QString &to) return found; } +/// Handles an incoming XML element. +/// +/// \param stream +/// \param element + +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") + { + QXmppPresence presence; + presence.parse(element); + + const QString from = presence.from(); + QSet<QString> subscribers = d->subscribers.value(from); + if (presence.type() == QXmppPresence::Available) + { + //qDebug() << to << "is subscribed to" << stream->jid(); + subscribers.insert(to); + d->subscribers[from] = subscribers; + } else if (presence.type() == QXmppPresence::Unavailable) { + //qDebug() << to << "is unsubscribed from" << stream->jid(); + subscribers.remove(to); + d->subscribers[from] = subscribers; + } + } + + // route element or reply on behalf of missing peer + if (!sendElement(element) && element.tagName() == "iq") + { + QXmppIq request; + request.parse(element); + + QXmppIq response(QXmppIq::Error); + QXmppStanza::Error error(QXmppStanza::Error::Cancel, QXmppStanza::Error::ServiceUnavailable); + response.setError(error); + response.setId(request.id()); + response.setFrom(request.to()); + response.setTo(request.from()); + stream->sendPacket(response); + } + } +} + /// Route an XMPP stanza. /// /// \param element @@ -411,12 +459,12 @@ void QXmppServer::slotDialbackRequestReceived(const QXmppDialback &dialback) /// Handle an incoming XML element. -void QXmppServer::slotElementReceived(const QDomElement &origElement, bool &handled) +void QXmppServer::slotElementReceived(const QDomElement &element, bool &handled) { QXmppStream *incoming = qobject_cast<QXmppStream *>(sender()); if (!incoming) return; - handleStanza(incoming, origElement); + handleStanza(incoming, element); } /// Handle a new incoming TCP connection from a server. |
