Always send disconnected() on socket errors
authorManuel Nickschas <sputnick@quassel-irc.org>
Thu, 7 Nov 2013 22:03:06 +0000 (23:03 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Thu, 7 Nov 2013 22:43:25 +0000 (23:43 +0100)
Some socket errors (e.g. connection refused) don't trigger a disconnected()
from the socket, mostly because the socket hadn't been opened in the
first place.

To simplify the logic elsewhere, let's always send (exactly) one disconnected()
from the AuthHandler in case of socket errors. That way, we don't have to
introduce the mess we used to have in the reconnection logic in CoreConnection.

src/common/authhandler.cpp
src/common/authhandler.h

index 9877145..792fcef 100644 (file)
@@ -23,7 +23,8 @@
 AuthHandler::AuthHandler(QObject *parent)
     : QObject(parent),
     _state(UnconnectedState),
-    _socket(0)
+    _socket(0),
+    _disconnectedSent(false)
 {
 
 }
@@ -54,14 +55,32 @@ void AuthHandler::setSocket(QTcpSocket *socket)
 {
     _socket = socket;
     connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), SIGNAL(socketStateChanged(QAbstractSocket::SocketState)));
-    connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(socketError(QAbstractSocket::SocketError)));
-    connect(socket, SIGNAL(disconnected()), SIGNAL(disconnected()));
+    connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(onSocketError(QAbstractSocket::SocketError)));
+    connect(socket, SIGNAL(disconnected()), SLOT(onSocketDisconnected()));
 }
 
 
-void AuthHandler::socketError(QAbstractSocket::SocketError error)
+// Some errors (e.g. connection refused) don't trigger a disconnected() from the socket, so send this explicitly
+// (but make sure it's only sent once!)
+void AuthHandler::onSocketError(QAbstractSocket::SocketError error)
 {
     emit socketError(error, _socket->errorString());
+
+    if (!socket()->isOpen() || !socket()->isValid()) {
+        if (!_disconnectedSent) {
+            _disconnectedSent = true;
+            emit disconnected();
+        }
+    }
+}
+
+
+void AuthHandler::onSocketDisconnected()
+{
+    if (!_disconnectedSent) {
+        _disconnectedSent = true;
+        emit disconnected();
+    }
 }
 
 
index 6330fa9..4f06840 100644 (file)
@@ -78,13 +78,15 @@ protected:
     void setState(State state);
 
 private slots:
-    void socketError(QAbstractSocket::SocketError error);
+    void onSocketError(QAbstractSocket::SocketError error);
+    void onSocketDisconnected();
 
 private:
     void invalidMessage();
 
     State _state;
     QTcpSocket *_socket; // FIXME: should be a QSharedPointer? -> premature disconnect before the peer has taken over
+    bool _disconnectedSent;
 };
 
 #endif