aboutsummaryrefslogtreecommitdiff
path: root/src/QXmppServer.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-08-23 13:32:28 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-08-23 13:32:28 +0000
commitae6b93fc56d8084fb5a0dfea62d540003cfc97d9 (patch)
treecbff80b3e3332799dd99499da642f6a3fdc2171a /src/QXmppServer.cpp
parent8b9e630718d4abcf2677448120cc80c1791a444e (diff)
downloadqxmpp-ae6b93fc56d8084fb5a0dfea62d540003cfc97d9.tar.gz
refactor server element handling
Diffstat (limited to 'src/QXmppServer.cpp')
-rw-r--r--src/QXmppServer.cpp52
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.