summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar@trolltech.com>2009-09-04 11:35:17 (GMT)
committerGunnar Sletta <gunnar@trolltech.com>2009-09-04 11:35:17 (GMT)
commitb576bca55f88ed749a0a2b409be986dbf6b96b0a (patch)
tree69789d636ff2328cfc4101851f9a28de4a2a825e /src/network
parent0b8062f5fbd7622a528ce61b767d00fbcdfc74a0 (diff)
parent9d85dcf10d580a45c261e3e1a8d8df7d41cb9437 (diff)
downloadQt-b576bca55f88ed749a0a2b409be986dbf6b96b0a.zip
Qt-b576bca55f88ed749a0a2b409be986dbf6b96b0a.tar.gz
Qt-b576bca55f88ed749a0a2b409be986dbf6b96b0a.tar.bz2
Merge branch '4.6' of git@scm.dev.nokia.troll.no:qt/qt into 4.6
Diffstat (limited to 'src/network')
-rw-r--r--src/network/access/qnetworkaccessmanager.cpp1
-rw-r--r--src/network/kernel/qhostinfo_p.h5
-rw-r--r--src/network/socket/qabstractsocket.cpp4
-rw-r--r--src/network/socket/qabstractsocket_p.h2
-rw-r--r--src/network/socket/qlocalsocket_p.h2
-rw-r--r--src/network/socket/qlocalsocket_win.cpp43
6 files changed, 43 insertions, 14 deletions
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index bc01e82..2b2504f 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -306,6 +306,7 @@ static QByteArray proxyAuthenticationKey(const QNetworkProxy &proxy, const QStri
case QNetworkProxy::FtpCachingProxy:
key.setScheme(QLatin1String("proxy-ftp"));
+ break;
case QNetworkProxy::DefaultProxy:
case QNetworkProxy::NoProxy:
diff --git a/src/network/kernel/qhostinfo_p.h b/src/network/kernel/qhostinfo_p.h
index 000de07..ee741aa 100644
--- a/src/network/kernel/qhostinfo_p.h
+++ b/src/network/kernel/qhostinfo_p.h
@@ -47,7 +47,7 @@
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
-// of the QLibrary class. This header file may change from
+// of the QHostInfo class. This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
@@ -180,7 +180,8 @@ class QHostInfoPrivate
public:
inline QHostInfoPrivate()
: err(QHostInfo::NoError),
- errorStr(QLatin1String(QT_TRANSLATE_NOOP("QHostInfo", "Unknown error")))
+ errorStr(QLatin1String(QT_TRANSLATE_NOOP("QHostInfo", "Unknown error"))),
+ lookupId(0)
{
}
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index b85a9d2..98740ba 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -453,6 +453,9 @@ QAbstractSocketPrivate::QAbstractSocketPrivate()
peerPort(0),
socketEngine(0),
cachedSocketDescriptor(-1),
+#ifdef Q_OS_LINUX
+ addToBytesAvailable(0),
+#endif
readBufferMaxSize(0),
readBuffer(QABSTRACTSOCKET_BUFFERSIZE),
writeBuffer(QABSTRACTSOCKET_BUFFERSIZE),
@@ -461,6 +464,7 @@ QAbstractSocketPrivate::QAbstractSocketPrivate()
connectTimer(0),
connectTimeElapsed(0),
hostLookupId(-1),
+ socketType(QAbstractSocket::UnknownSocketType),
state(QAbstractSocket::UnconnectedState),
socketError(QAbstractSocket::UnknownSocketError)
{
diff --git a/src/network/socket/qabstractsocket_p.h b/src/network/socket/qabstractsocket_p.h
index 3e292f9..49605c5 100644
--- a/src/network/socket/qabstractsocket_p.h
+++ b/src/network/socket/qabstractsocket_p.h
@@ -47,7 +47,7 @@
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
-// of the QLibrary class. This header file may change from
+// of the QAbstractSocket class. This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
diff --git a/src/network/socket/qlocalsocket_p.h b/src/network/socket/qlocalsocket_p.h
index a774cbf..a7248f6 100644
--- a/src/network/socket/qlocalsocket_p.h
+++ b/src/network/socket/qlocalsocket_p.h
@@ -139,7 +139,7 @@ public:
void _q_emitReadyRead();
DWORD bytesAvailable();
void startAsyncRead();
- void completeAsyncRead();
+ bool completeAsyncRead();
void checkReadyRead();
HANDLE handle;
OVERLAPPED overlapped;
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();