From: Manuel Nickschas Date: Thu, 7 Nov 2013 22:03:06 +0000 (+0100) Subject: Always send disconnected() on socket errors X-Git-Tag: 0.10-beta1~106 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=baacb468d9e2da5ed57cd064045dd9ddf1f7fbc9 Always send disconnected() on socket errors 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. --- diff --git a/src/common/authhandler.cpp b/src/common/authhandler.cpp index 9877145e..792fcef1 100644 --- a/src/common/authhandler.cpp +++ b/src/common/authhandler.cpp @@ -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(); + } } diff --git a/src/common/authhandler.h b/src/common/authhandler.h index 6330fa99..4f068400 100644 --- a/src/common/authhandler.h +++ b/src/common/authhandler.h @@ -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