summaryrefslogtreecommitdiffstats
path: root/src/network/socket/qlocalsocket_win.cpp
diff options
context:
space:
mode:
authorSarah Smith <sarah.j.smith@nokia.com>2009-09-07 00:23:22 (GMT)
committerSarah Smith <sarah.j.smith@nokia.com>2009-09-07 00:23:22 (GMT)
commitf4fa50c25aea68b7696ad7de289d93facac9f3e5 (patch)
tree8e1057a29f163383b2dd21d7e21ec231c550cd56 /src/network/socket/qlocalsocket_win.cpp
parent2f8ad3dad31ee96798cb17d8a782b78ae4c1eabc (diff)
parent6d908473ec1a8c72f4bbb9d772e801024c3a62a0 (diff)
downloadQt-f4fa50c25aea68b7696ad7de289d93facac9f3e5.zip
Qt-f4fa50c25aea68b7696ad7de289d93facac9f3e5.tar.gz
Qt-f4fa50c25aea68b7696ad7de289d93facac9f3e5.tar.bz2
Merge branch '4.6' of git@scm.dev.nokia.troll.no:qt/qt into 4.6
Diffstat (limited to 'src/network/socket/qlocalsocket_win.cpp')
-rw-r--r--src/network/socket/qlocalsocket_win.cpp43
1 files changed, 33 insertions, 10 deletions
diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp
index f70a0aa..96dfa6e 100644
--- a/src/network/socket/qlocalsocket_win.cpp
+++ b/src/network/socket/qlocalsocket_win.cpp
@@ -199,9 +199,13 @@ qint64 QLocalSocket::readData(char *data, qint64 maxSize)
}
}
- if (!d->readSequenceStarted)
- d->startAsyncRead();
- d->checkReadyRead();
+ if (d->pipeClosed) {
+ QTimer::singleShot(0, this, SLOT(_q_pipeClosed()));
+ } else {
+ if (!d->readSequenceStarted)
+ d->startAsyncRead();
+ d->checkReadyRead();
+ }
return readSoFar;
}
@@ -251,9 +255,22 @@ void QLocalSocketPrivate::startAsyncRead()
readSequenceStarted = true;
if (ReadFile(handle, ptr, bytesToRead, NULL, &overlapped)) {
completeAsyncRead();
- } else if (GetLastError() != ERROR_IO_PENDING) {
- setErrorString(QLatin1String("QLocalSocketPrivate::startAsyncRead"));
- return;
+ } else {
+ switch (GetLastError()) {
+ case ERROR_IO_PENDING:
+ // This is not an error. We're getting notified, when data arrives.
+ return;
+ case ERROR_PIPE_NOT_CONNECTED:
+ {
+ // It may happen, that the other side closes the connection directly
+ // after writing data. Then we must set the appropriate socket state.
+ pipeClosed = true;
+ return;
+ }
+ default:
+ setErrorString(QLatin1String("QLocalSocketPrivate::startAsyncRead"));
+ return;
+ }
}
} while (!readSequenceStarted);
}
@@ -261,20 +278,23 @@ void QLocalSocketPrivate::startAsyncRead()
/*!
\internal
Sets the correct size of the read buffer after a read operation.
+ Returns false, if an error occured or the connection dropped.
*/
-void QLocalSocketPrivate::completeAsyncRead()
+bool QLocalSocketPrivate::completeAsyncRead()
{
ResetEvent(overlapped.hEvent);
readSequenceStarted = false;
DWORD bytesRead;
if (!GetOverlappedResult(handle, &overlapped, &bytesRead, TRUE)) {
- setErrorString(QLatin1String("QLocalSocketPrivate::completeAsyncRead"));
- return;
+ if (GetLastError() != ERROR_PIPE_NOT_CONNECTED)
+ setErrorString(QLatin1String("QLocalSocketPrivate::completeAsyncRead"));
+ return false;
}
actualReadBufferSize += bytesRead;
readBuffer.truncate(actualReadBufferSize);
+ return true;
}
qint64 QLocalSocket::writeData(const char *data, qint64 maxSize)
@@ -425,7 +445,10 @@ void QLocalSocketPrivate::_q_canWrite()
void QLocalSocketPrivate::_q_notified()
{
Q_Q(QLocalSocket);
- completeAsyncRead();
+ if (!completeAsyncRead()) {
+ pipeClosed = true;
+ return;
+ }
startAsyncRead();
pendingReadyRead = false;
emit q->readyRead();