diff options
author | Alex Trotsenko <alex1973tr@gmail.com> | 2015-03-05 10:52:17 +0200 |
---|---|---|
committer | Alex Trotsenko <alex1973tr@gmail.com> | 2016-01-13 16:31:33 +0000 |
commit | 184d66caa5f7f93b7383319c5c8985524e0dc824 (patch) | |
tree | 272ce3f066d3c80f77dfca50fd0914b341c2f9da /examples/network/doc/src/blockingfortuneclient.qdoc | |
parent | ca6f11dcf207aa51ce32c9813ad1ab3790bb31ee (diff) |
QDataStream: handle incomplete reads from QIODevice
This adds a way to resume reading from a stream after a ReadPastEnd error.
This is done by introducing a stream read transaction mechanism that keeps
read data in an internal buffer and rolls it back on failure.
[ChangeLog][QtCore] Added QDataStream startTransaction(),
commitTransaction(), rollbackTransaction(), abortTransaction()
functions to support read transactions.
Task-number: QTBUG-44418
Change-Id: Ibf946e1939a5573c4182fea7e26608947218c2d9
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Diffstat (limited to 'examples/network/doc/src/blockingfortuneclient.qdoc')
-rw-r--r-- | examples/network/doc/src/blockingfortuneclient.qdoc | 33 |
1 files changed, 8 insertions, 25 deletions
diff --git a/examples/network/doc/src/blockingfortuneclient.qdoc b/examples/network/doc/src/blockingfortuneclient.qdoc index fbbfd466a5..12062fbe33 100644 --- a/examples/network/doc/src/blockingfortuneclient.qdoc +++ b/examples/network/doc/src/blockingfortuneclient.qdoc @@ -125,39 +125,22 @@ other \c waitFor...() functions, is part of QTcpSocket's \e{blocking API}. - After this statement, we have a connected socket to work with. Now it's - time to see what the fortune server has sent us. - - \snippet blockingfortuneclient/fortunethread.cpp 9 - \snippet blockingfortuneclient/fortunethread.cpp 10 - - This step is to read the size of the packet. Although we are only reading - two bytes here, and the \c while loop may seem to overdo it, we present this - code to demonstrate a good pattern for waiting for data using - QTcpSocket::waitForReadyRead(). It goes like this: For as long as we still - need more data, we call waitForReadyRead(). If it returns false, - we abort the operation. After this statement, we know that we have received - enough data. + After this statement, we have a connected socket to work with. \snippet blockingfortuneclient/fortunethread.cpp 11 Now we can create a QDataStream object, passing the socket to QDataStream's constructor, and as in the other client examples we set - the stream protocol version to QDataStream::Qt_4_0, and read the size - of the packet. + the stream protocol version to QDataStream::Qt_4_0. \snippet blockingfortuneclient/fortunethread.cpp 12 - \snippet blockingfortuneclient/fortunethread.cpp 13 - - Again, we'll use a loop that waits for more data by calling - QTcpSocket::waitForReadyRead(). In this loop, we're waiting until - QTcpSocket::bytesAvailable() returns the full packet size. - - \snippet blockingfortuneclient/fortunethread.cpp 14 - Now that we have all the data that we need, we can use QDataStream to - read the fortune string from the packet. The resulting fortune is - delivered by emitting newFortune(). + We proceed by initiating a loop that waits for the fortune string data by + calling QTcpSocket::waitForReadyRead(). If it returns false, we abort the + operation. After this statement, we start a stream read transaction. We + exit the loop when QDataStream::commitTransaction() returns true, which + means successful fortune string loading. The resulting fortune is + delivered by emitting newFortune(): \snippet blockingfortuneclient/fortunethread.cpp 15 |