diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-08-24 13:27:59 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-08-24 13:27:59 +0000 |
| commit | be8cbbda831ead579f40e87fe9d103a9c6394521 (patch) | |
| tree | 74ff4a9f2ce873b18d4d02c2d503d4d694f0f792 /src/QXmppServer.cpp | |
| parent | b9af3dd5b26ec6cea7d61399722a6c41ccf9e9ed (diff) | |
| download | qxmpp-be8cbbda831ead579f40e87fe9d103a9c6394521.tar.gz | |
* add handling of ping IQs
* reply to unknown IQs
Diffstat (limited to 'src/QXmppServer.cpp')
| -rw-r--r-- | src/QXmppServer.cpp | 50 |
1 files changed, 41 insertions, 9 deletions
diff --git a/src/QXmppServer.cpp b/src/QXmppServer.cpp index a8915d22..5baa1820 100644 --- a/src/QXmppServer.cpp +++ b/src/QXmppServer.cpp @@ -30,6 +30,7 @@ #include "QXmppIncomingClient.h" #include "QXmppIncomingServer.h" #include "QXmppOutgoingServer.h" +#include "QXmppPingIq.h" #include "QXmppServer.h" #include "QXmppUtils.h" @@ -279,10 +280,9 @@ void QXmppServer::handleStanza(QXmppStream *stream, const QDomElement &element) { const QString to = element.attribute("to"); - // presence handling - if (element.tagName() == "presence") + if (to == d->domain) { - if (to.isEmpty() || to == d->domain) + if (element.tagName() == "presence") { // presence to the local domain, broadcast it to subscribers if (element.attribute("type").isEmpty() || element.attribute("type") == "unavailable") @@ -293,10 +293,45 @@ void QXmppServer::handleStanza(QXmppStream *stream, const QDomElement &element) QDomElement changed(element); changed.setAttribute("to", subscriber); sendElement(changed); + } + } + } + else if (element.tagName() == "iq") + { + // XEP-0199: XMPP Ping + if (QXmppPingIq::isPingIq(element)) + { + QXmppPingIq request; + request.parse(element); + + QXmppIq response(QXmppIq::Result); + response.setId(element.attribute("id")); + response.setFrom(d->domain); + response.setTo(request.from()); + stream->sendPacket(response); + } + // Other IQs + else + { + QXmppIq request; + request.parse(element); + if (request.type() != QXmppIq::Error && request.type() != QXmppIq::Result) + { + QXmppIq response(QXmppIq::Error); + response.setId(request.id()); + response.setFrom(domain()); + response.setTo(request.from()); + stream->sendPacket(response); } } - } else { + } + + } else { + + if (element.tagName() == "presence") + { + // directed presence, update subscribers QXmppPresence presence; presence.parse(element); @@ -311,11 +346,8 @@ void QXmppServer::handleStanza(QXmppStream *stream, const QDomElement &element) d->subscribers[from] = subscribers; } } - } - // route element or reply on behalf of missing peer - if (!to.isEmpty() && to != d->domain) - { + // route element or reply on behalf of missing peer if (!sendElement(element) && element.tagName() == "iq") { QXmppIq request; @@ -427,7 +459,7 @@ void QXmppServer::slotClientDisconnected() return; // notify subscribed peers of disconnection - if (stream->isConnected()) + if (!stream->jid().isEmpty()) { foreach (QString subscriber, d->subscribers.value(stream->jid())) { |
