From 07268765f40e145ca292a32de6aeb367dc5169a1 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Thu, 24 Jul 2008 01:03:31 +0200 Subject: [PATCH] fixing BR #207 - you can now disconnect from an IRC server while in a connecting state --- src/core/networkconnection.cpp | 29 +++++++++++++++-------------- src/core/networkconnection.h | 5 +++-- src/uisupport/bufferview.cpp | 5 +++-- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/core/networkconnection.cpp b/src/core/networkconnection.cpp index 760dcb3c..617433f3 100644 --- a/src/core/networkconnection.cpp +++ b/src/core/networkconnection.cpp @@ -252,20 +252,19 @@ void NetworkConnection::sendPerform() { } void NetworkConnection::disconnectFromIrc(bool requested) { + _quitRequested = requested; // see socketDisconnected(); _autoReconnectTimer.stop(); - _autoReconnectCount = 0; + _autoReconnectCount = 0; // prohibiting auto reconnect displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Disconnecting.")); - if(socket.state() < QAbstractSocket::ConnectedState) { - setConnectionState(Network::Disconnected); + if(socket.state() == QAbstractSocket::UnconnectedState) { + socketDisconnected(); + } else if(socket.state() < QAbstractSocket::ConnectedState) { + socket.close(); + // we might be in a state waiting for a timeout... we don't care... set a disconnected state socketDisconnected(); } else { _socketCloseTimer.start(10000); // the irc server has 10 seconds to close the socket } - - // this flag triggers quitRequested() once the socket is closed - // it is needed to determine whether or not the connection needs to be - // in the automatic session restore. - _quitRequested = requested; } void NetworkConnection::socketHasData() { @@ -282,7 +281,6 @@ void NetworkConnection::socketError(QAbstractSocket::SocketError) { emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("Connection failure: %1").arg(socket.errorString())); network()->emitConnectionError(socket.errorString()); if(socket.state() < QAbstractSocket::ConnectedState) { - setConnectionState(Network::Disconnected); socketDisconnected(); } // mark last connection attempt as failed @@ -384,12 +382,15 @@ void NetworkConnection::socketDisconnected() { network()->setConnected(false); emit disconnected(networkId()); - if(_autoReconnectCount != 0) { - setConnectionState(Network::Reconnecting); - if(_autoReconnectCount == network()->autoReconnectRetries()) doAutoReconnect(); // first try is immediate - else _autoReconnectTimer.start(); - } else if(_quitRequested) { + if(_quitRequested) { + setConnectionState(Network::Disconnected); emit quitRequested(networkId()); + } else if(_autoReconnectCount != 0) { + setConnectionState(Network::Reconnecting); + if(_autoReconnectCount == network()->autoReconnectRetries()) + doAutoReconnect(); // first try is immediate + else + _autoReconnectTimer.start(); } } diff --git a/src/core/networkconnection.h b/src/core/networkconnection.h index a8e0b278..111ffe76 100644 --- a/src/core/networkconnection.h +++ b/src/core/networkconnection.h @@ -175,6 +175,9 @@ private: QTimer _socketCloseTimer; + /* this flag triggers quitRequested() once the socket is closed + * it is needed to determine whether or not the connection needs to be + *in the automatic session restore. */ bool _quitRequested; bool _previousConnectionAttemptFailed; @@ -198,8 +201,6 @@ private: void writeToSocket(QByteArray s); - - class ParseError : public Exception { public: ParseError(QString cmd, QString prefix, QStringList params); diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index 54221724..be08c313 100644 --- a/src/uisupport/bufferview.cpp +++ b/src/uisupport/bufferview.cpp @@ -431,8 +431,9 @@ void BufferView::contextMenuEvent(QContextMenuEvent *event) { _disconnectNetAction.setIcon(connectionStateIcon); _connectNetAction.setIcon(connectionStateIcon); addItemToMenu(showChannelList, contextMenu, index, ActiveState); - addItemToMenu(_disconnectNetAction, contextMenu, index, ActiveState); - addItemToMenu(_connectNetAction, contextMenu, index, InactiveState); + qDebug() << "state:" << network->connectionState() << Network::Disconnected << Network::Disconnecting; + addItemToMenu(_disconnectNetAction, contextMenu, network->connectionState() != Network::Disconnected); + addItemToMenu(_connectNetAction, contextMenu, network->connectionState() == Network::Disconnected); addSeparatorToMenu(contextMenu, index, ActiveState); addItemToMenu(_joinChannelAction, contextMenu, index, ActiveState); break; -- 2.20.1