summaryrefslogtreecommitdiffstats
path: root/src/network/socket
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/socket')
-rw-r--r--src/network/socket/qabstractsocket.cpp38
-rw-r--r--src/network/socket/qabstractsocket_p.h2
-rw-r--r--src/network/socket/qabstractsocketengine.cpp6
-rw-r--r--src/network/socket/qabstractsocketengine_p.h2
-rw-r--r--src/network/socket/qnativesocketengine.cpp3
-rw-r--r--src/network/socket/qtcpserver.cpp1
6 files changed, 52 insertions, 0 deletions
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index 6b4e48fe62..7c91022759 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -746,6 +746,44 @@ bool QAbstractSocketPrivate::canReadNotification()
/*! \internal
+ Slot connected to the close socket notifier. It's called when the
+ socket is closed.
+*/
+void QAbstractSocketPrivate::canCloseNotification()
+{
+ Q_Q(QAbstractSocket);
+
+#if defined (QABSTRACTSOCKET_DEBUG)
+ qDebug("QAbstractSocketPrivate::canCloseNotification()");
+#endif
+
+ qint64 newBytes = 0;
+ if (isBuffered) {
+ // Try to read to the buffer, if the read fail we can close the socket.
+ newBytes = buffer.size();
+ if (!readFromSocket()) {
+ q->disconnectFromHost();
+ return;
+ }
+ newBytes = buffer.size() - newBytes;
+ if (newBytes) {
+ // If there was still some data to be read from the socket
+ // then we could get another FD_READ. The disconnect will
+ // then occur when we read from the socket again and fail
+ // in canReadNotification or by the manually created
+ // closeNotification below.
+ emit q->readyRead();
+
+ QMetaObject::invokeMethod(socketEngine, "closeNotification", Qt::QueuedConnection);
+ }
+ } else if (socketType == QAbstractSocket::TcpSocket && socketEngine) {
+ emit q->readyRead();
+ }
+}
+
+
+/*! \internal
+
Slot connected to the write socket notifier. It's called during a
delayed connect or when the socket is ready for writing.
*/
diff --git a/src/network/socket/qabstractsocket_p.h b/src/network/socket/qabstractsocket_p.h
index 21d85f74fe..b19801882e 100644
--- a/src/network/socket/qabstractsocket_p.h
+++ b/src/network/socket/qabstractsocket_p.h
@@ -77,6 +77,7 @@ public:
inline void readNotification() { canReadNotification(); }
inline void writeNotification() { canWriteNotification(); }
inline void exceptionNotification() {}
+ inline void closeNotification() { canCloseNotification(); }
void connectionNotification();
#ifndef QT_NO_NETWORKPROXY
inline void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator) {
@@ -87,6 +88,7 @@ public:
bool canReadNotification();
bool canWriteNotification();
+ void canCloseNotification();
// slots
void _q_connectToNextAddress();
diff --git a/src/network/socket/qabstractsocketengine.cpp b/src/network/socket/qabstractsocketengine.cpp
index e9e49d41ec..f05fa98a96 100644
--- a/src/network/socket/qabstractsocketengine.cpp
+++ b/src/network/socket/qabstractsocketengine.cpp
@@ -168,6 +168,12 @@ void QAbstractSocketEngine::exceptionNotification()
receiver->exceptionNotification();
}
+void QAbstractSocketEngine::closeNotification()
+{
+ if (QAbstractSocketEngineReceiver *receiver = d_func()->receiver)
+ receiver->closeNotification();
+}
+
void QAbstractSocketEngine::connectionNotification()
{
if (QAbstractSocketEngineReceiver *receiver = d_func()->receiver)
diff --git a/src/network/socket/qabstractsocketengine_p.h b/src/network/socket/qabstractsocketengine_p.h
index 92d795408f..5264bc4479 100644
--- a/src/network/socket/qabstractsocketengine_p.h
+++ b/src/network/socket/qabstractsocketengine_p.h
@@ -71,6 +71,7 @@ public:
virtual ~QAbstractSocketEngineReceiver(){}
virtual void readNotification()= 0;
virtual void writeNotification()= 0;
+ virtual void closeNotification()= 0;
virtual void exceptionNotification()= 0;
virtual void connectionNotification()= 0;
#ifndef QT_NO_NETWORKPROXY
@@ -173,6 +174,7 @@ public:
public Q_SLOTS:
void readNotification();
void writeNotification();
+ void closeNotification();
void exceptionNotification();
void connectionNotification();
#ifndef QT_NO_NETWORKPROXY
diff --git a/src/network/socket/qnativesocketengine.cpp b/src/network/socket/qnativesocketengine.cpp
index f2e2f692ac..3dca7aa9ee 100644
--- a/src/network/socket/qnativesocketengine.cpp
+++ b/src/network/socket/qnativesocketengine.cpp
@@ -1142,6 +1142,9 @@ bool QReadNotifier::event(QEvent *e)
if (e->type() == QEvent::SockAct) {
engine->readNotification();
return true;
+ } else if (e->type() == QEvent::SockClose) {
+ engine->closeNotification();
+ return true;
}
return QSocketNotifier::event(e);
}
diff --git a/src/network/socket/qtcpserver.cpp b/src/network/socket/qtcpserver.cpp
index 4d8aad0dba..7955928727 100644
--- a/src/network/socket/qtcpserver.cpp
+++ b/src/network/socket/qtcpserver.cpp
@@ -134,6 +134,7 @@ public:
// from QAbstractSocketEngineReceiver
void readNotification();
+ void closeNotification() { readNotification(); }
inline void writeNotification() {}
inline void exceptionNotification() {}
inline void connectionNotification() {}