From fb7ff81285b0d42071b4b211bd15c43800f7d180 Mon Sep 17 00:00:00 2001 From: Jeremy Lainé Date: Sun, 2 Sep 2012 19:48:43 +0200 Subject: Add support for see-other-host server change. --- src/client/QXmppOutgoingClient.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'src/client/QXmppOutgoingClient.cpp') diff --git a/src/client/QXmppOutgoingClient.cpp b/src/client/QXmppOutgoingClient.cpp index 9b379272..50d2d110 100644 --- a/src/client/QXmppOutgoingClient.cpp +++ b/src/client/QXmppOutgoingClient.cpp @@ -73,6 +73,10 @@ public: QString streamFrom; QString streamVersion; + // Redirection + QString redirectHost; + quint16 redirectPort; + // Session QString bindId; QString sessionId; @@ -92,7 +96,8 @@ private: }; QXmppOutgoingClientPrivate::QXmppOutgoingClientPrivate(QXmppOutgoingClient *qq) - : sessionAvailable(false) + : redirectPort(0) + , sessionAvailable(false) , saslClient(0) , q(qq) { @@ -225,7 +230,13 @@ bool QXmppOutgoingClient::isConnected() const void QXmppOutgoingClient::_q_socketDisconnected() { debug("Socket disconnected"); - emit disconnected(); + if (!d->redirectHost.isEmpty() && d->redirectPort > 0) { + d->connectToHost(d->redirectHost, d->redirectPort); + d->redirectHost = QString(); + d->redirectPort = 0; + } else { + emit disconnected(); + } } void QXmppOutgoingClient::socketSslErrors(const QList & error) @@ -415,6 +426,15 @@ void QXmppOutgoingClient::handleStanza(const QDomElement &nodeRecv) } else if(ns == ns_stream && nodeRecv.tagName() == "error") { + // handle redirects + QRegExp redirectRegex("([^:]+)(:[0-9]+)?"); + if (redirectRegex.exactMatch(nodeRecv.firstChildElement("see-other-host").text())) { + d->redirectHost = redirectRegex.cap(0); + d->redirectPort = 5222; //hostPort.size() > 1 ? hostPort[1].toUShort() : 5222; + disconnectFromHost(); + return; + } + if (!nodeRecv.firstChildElement("conflict").isNull()) d->xmppStreamError = QXmppStanza::Error::Conflict; else -- cgit v1.2.3