diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2015-08-27 09:49:05 +0200 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2015-08-27 09:49:05 +0200 |
| commit | b81d7a8550c78915c7e526e4a4e542c7787677b0 (patch) | |
| tree | 92389fa1faa2a6f3d07aec50209e6cc057fea1b7 /src/base/QXmppStream.cpp | |
| parent | 0947e36e3d1e63920e4b1fa9193d6f1d1690eae7 (diff) | |
| download | qxmpp-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.cpp | 20 |
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(); } |
