X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcorenetwork.cpp;h=c02338532a5c5e845aad70f7a43c0e39c49e9018;hp=3dc0cc2720a76b9c65433989880ce8ca80f60f92;hb=f4693532403c2bcba592d322d0b5dbceaf76e758;hpb=32c550d8f25392616de13fe761285ac13cf5e0d9 diff --git a/src/core/corenetwork.cpp b/src/core/corenetwork.cpp index 3dc0cc27..c0233853 100644 --- a/src/core/corenetwork.cpp +++ b/src/core/corenetwork.cpp @@ -40,7 +40,7 @@ CoreNetwork::CoreNetwork(const NetworkId &networkid, CoreSession *session) _previousConnectionAttemptFailed(false), _lastUsedServerIndex(0), - _gotPong(true), + _lastPingTime(0), // TODO make autowho configurable (possibly per-network) _autoWhoEnabled(true), @@ -189,6 +189,7 @@ void CoreNetwork::disconnectFromIrc(bool requested, const QString &reason, bool _autoReconnectTimer.stop(); _autoReconnectCount = 0; // prohibiting auto reconnect } + disablePingTimeout(); IrcUser *me_ = me(); if(me_) { @@ -204,21 +205,18 @@ void CoreNetwork::disconnectFromIrc(bool requested, const QString &reason, bool else _quitReason = reason; - displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Disconnecting.")); + displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Disconnecting. (%1)").arg((!requested && !withReconnect) ? tr("Core Shutdown") : reason)); switch(socket.state()) { - case QAbstractSocket::UnconnectedState: - socketDisconnected(); - break; case QAbstractSocket::ConnectedState: userInputHandler()->issueQuit(_quitReason); - default: - if(!requested) { - socket.close(); - socketDisconnected(); - } else { + if(requested || withReconnect) { // the irc server has 10 seconds to close the socket _socketCloseTimer.start(10000); + break; } + default: + socket.close(); + socketDisconnected(); } } @@ -338,8 +336,7 @@ void CoreNetwork::socketInitialized() { } void CoreNetwork::socketDisconnected() { - _pingTimer.stop(); - resetPong(); + disablePingTimeout(); _autoWhoCycleTimer.stop(); _autoWhoTimer.stop(); @@ -403,7 +400,9 @@ void CoreNetwork::networkInitialized() { } // restore away state - userInputHandler()->handleAway(BufferInfo(), Core::awayMessage(userId(), networkId())); + QString awayMsg = Core::awayMessage(userId(), networkId()); + if(!awayMsg.isEmpty()) + userInputHandler()->handleAway(BufferInfo(), Core::awayMessage(userId(), networkId())); // restore old user modes if server default mode is set. IrcUser *me_ = me(); @@ -418,8 +417,7 @@ void CoreNetwork::networkInitialized() { sendPerform(); - resetPong(); - _pingTimer.start(); + enablePingTimeout(); if(_autoWhoEnabled) { _autoWhoCycleTimer.start(); @@ -515,14 +513,28 @@ void CoreNetwork::doAutoReconnect() { } void CoreNetwork::sendPing() { - if(!gotPong()) { + uint now = QDateTime::currentDateTime().toTime_t(); + if(_lastPingTime != 0 && now - _lastPingTime <= (uint)(_pingTimer.interval() / 1000) + 1) { + // the second check compares the actual elapsed time since the last ping and the pingTimer interval + // if the interval is shorter then the actual elapsed time it means that this thread was somehow blocked + // and unable to even handle a ping answer. So we ignore those misses. disconnectFromIrc(false, QString("No Ping reply in %1 seconds.").arg(_pingTimer.interval() / 1000), true /* withReconnect */); } else { - _gotPong = false; + _lastPingTime = now; userInputHandler()->handlePing(BufferInfo(), QString()); } } +void CoreNetwork::enablePingTimeout() { + resetPingTimeout(); + _pingTimer.start(); +} + +void CoreNetwork::disablePingTimeout() { + _pingTimer.stop(); + resetPingTimeout(); +} + void CoreNetwork::sendAutoWho() { while(!_autoWhoQueue.isEmpty()) { QString chan = _autoWhoQueue.takeFirst();