aboutsummaryrefslogtreecommitdiff
path: root/src/QXmppServer.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-08-24 13:27:59 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-08-24 13:27:59 +0000
commitbe8cbbda831ead579f40e87fe9d103a9c6394521 (patch)
tree74ff4a9f2ce873b18d4d02c2d503d4d694f0f792 /src/QXmppServer.cpp
parentb9af3dd5b26ec6cea7d61399722a6c41ccf9e9ed (diff)
downloadqxmpp-be8cbbda831ead579f40e87fe9d103a9c6394521.tar.gz
* add handling of ping IQs
* reply to unknown IQs
Diffstat (limited to 'src/QXmppServer.cpp')
-rw-r--r--src/QXmppServer.cpp50
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()))
{