From b4442cdcf163d96bbf0d893eddf59a5bee0c64b6 Mon Sep 17 00:00:00 2001 From: Jeremy Lainé Date: Wed, 10 Mar 2010 11:06:53 +0000 Subject: add support for keep alive --- source/QXmppStream.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) (limited to 'source/QXmppStream.cpp') diff --git a/source/QXmppStream.cpp b/source/QXmppStream.cpp index 0fa9c24b..bbe3e35c 100644 --- a/source/QXmppStream.cpp +++ b/source/QXmppStream.cpp @@ -54,6 +54,7 @@ #include #include #include +#include static const QByteArray streamRootElementStart = "\n"; static const QByteArray streamRootElementEnd = ""; @@ -155,6 +156,22 @@ QXmppStream::QXmppStream(QXmppClient* client) check = QObject::connect(this, SIGNAL(streamInitiationIqReceived(const QXmppStreamInitiationIq&)), &m_transferManager, SLOT(streamInitiationIqReceived(const QXmppStreamInitiationIq&))); Q_ASSERT(check); + + // XEP-0199: XMPP Ping + m_pingTimer = new QTimer(); + check = QObject::connect(m_pingTimer, SIGNAL(timeout()), this, SLOT(pingSend())); + Q_ASSERT(check); + + m_timeoutTimer = new QTimer(); + m_timeoutTimer->setSingleShot(true); + check = QObject::connect(m_timeoutTimer, SIGNAL(timeout()), this, SLOT(pingTimeout())); + Q_ASSERT(check); + + check = QObject::connect(this, SIGNAL(xmppConnected()), this, SLOT(pingStart())); + Q_ASSERT(check); + + check = QObject::connect(this, SIGNAL(disconnected()), this, SLOT(pingStop())); + Q_ASSERT(check); } QXmppStream::~QXmppStream() @@ -307,6 +324,10 @@ void QXmppStream::parser(const QByteArray& data) QString ns = nodeRecv.namespaceURI(); debug("Namespace: " + ns + " Tag: " + nodeRecv.tagName() ); + + // if we receive any kind of data, stop the timeout timer + m_timeoutTimer->stop(); + if(m_client->handleStreamElement(nodeRecv)) { // already handled by client, do nothing @@ -1115,6 +1136,48 @@ void QXmppStream::processRosterIq(const QXmppRosterIq& rosterIq) } } +void QXmppStream::pingStart() +{ + const int interval = getConfiguration().keepAliveInterval(); + // start ping timer + if (interval > 0) + { + m_pingTimer->setInterval(interval * 1000); + m_pingTimer->start(); + } +} + +void QXmppStream::pingStop() +{ + // stop all timers + m_pingTimer->stop(); + m_timeoutTimer->stop(); +} + +void QXmppStream::pingSend() +{ + // send ping packet + QXmppPingIq ping; + ping.setFrom(getConfiguration().jid()); + ping.setTo(getConfiguration().domain()); + sendPacket(ping); + + // start timeout timer + const int timeout = getConfiguration().keepAliveTimeout(); + if (timeout > 0) + { + m_timeoutTimer->setInterval(timeout * 1000); + m_timeoutTimer->start(); + } +} + +void QXmppStream::pingTimeout() +{ + warning("Ping timeout"); + disconnect(); + emit error(QXmppClient::KeepAliveError); +} + QAbstractSocket::SocketError QXmppStream::getSocketError() { return m_socketError; -- cgit v1.2.3