aboutsummaryrefslogtreecommitdiff
path: root/src/base/QXmppStream.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2015-08-27 09:49:05 +0200
committerJeremy Lainé <jeremy.laine@m4x.org>2015-08-27 09:49:05 +0200
commitb81d7a8550c78915c7e526e4a4e542c7787677b0 (patch)
tree92389fa1faa2a6f3d07aec50209e6cc057fea1b7 /src/base/QXmppStream.cpp
parent0947e36e3d1e63920e4b1fa9193d6f1d1690eae7 (diff)
downloadqxmpp-b81d7a8550c78915c7e526e4a4e542c7787677b0.tar.gz
QXmppStream : handle end of incoming stream (fixes issue #70)
Diffstat (limited to 'src/base/QXmppStream.cpp')
-rw-r--r--src/base/QXmppStream.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/base/QXmppStream.cpp b/src/base/QXmppStream.cpp
index 4feb266c..d497dbb5 100644
--- a/src/base/QXmppStream.cpp
+++ b/src/base/QXmppStream.cpp
@@ -49,7 +49,7 @@ public:
QByteArray dataBuffer;
QSslSocket* socket;
- // stream state
+ // incoming stream state
QByteArray streamStart;
};
@@ -219,6 +219,9 @@ void QXmppStream::_q_socketReadyRead()
endStreamRegex.setMinimal(true);
// check whether we need to add stream start / end elements
+ //
+ // NOTE: as we may only have partial XML content, do not alter the stream's
+ // state until we have a valid XML document!
QByteArray completeXml = d->dataBuffer;
const QString strData = QString::fromUtf8(d->dataBuffer);
bool streamStart = false;
@@ -226,7 +229,10 @@ void QXmppStream::_q_socketReadyRead()
streamStart = true;
else
completeXml.prepend(d->streamStart);
- if (!strData.contains(endStreamRegex))
+ bool streamEnd = false;
+ if (strData.contains(endStreamRegex))
+ streamEnd = true;
+ else
completeXml.append(streamRootElementEnd);
// check whether we have a valid XML document
@@ -237,12 +243,12 @@ void QXmppStream::_q_socketReadyRead()
// remove data from buffer
logReceived(strData);
d->dataBuffer.clear();
- if (streamStart)
- d->streamStart = startStreamRegex.cap(0).toUtf8();
// process stream start
- if (streamStart)
+ if (streamStart) {
+ d->streamStart = startStreamRegex.cap(0).toUtf8();
handleStream(doc.documentElement());
+ }
// process stanzas
QDomElement nodeRecv = doc.documentElement().firstChildElement();
@@ -250,6 +256,10 @@ void QXmppStream::_q_socketReadyRead()
handleStanza(nodeRecv);
nodeRecv = nodeRecv.nextSiblingElement();
}
+
+ // process stream end
+ if (streamEnd)
+ disconnectFromHost();
}