X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcorenetwork.cpp;h=21415aed8ec94b82d485478e4986e9b9027b11e9;hp=b1278ca961aad59b7768b9f3d77fdb55c4e04617;hb=6245a8d29e893eaff25a12b0be2f47b64f0f7bcd;hpb=ab16c77fe03b73a863d9b52b11919bcbac903f58 diff --git a/src/core/corenetwork.cpp b/src/core/corenetwork.cpp index b1278ca9..21415aed 100644 --- a/src/core/corenetwork.cpp +++ b/src/core/corenetwork.cpp @@ -23,6 +23,7 @@ #include "core.h" #include "coresession.h" #include "coreidentity.h" +#include "corenetworkconfig.h" #include "ircserverhandler.h" #include "userinputhandler.h" @@ -41,37 +42,36 @@ CoreNetwork::CoreNetwork(const NetworkId &networkid, CoreSession *session) _lastUsedServerIndex(0), _lastPingTime(0), - _maxPingCount(3), - _pingCount(0), - - // TODO make autowho configurable (possibly per-network) - _autoWhoEnabled(true), - _autoWhoInterval(90), - _autoWhoNickLimit(0), // unlimited - _autoWhoDelay(5) + _pingCount(0) + { _autoReconnectTimer.setSingleShot(true); _socketCloseTimer.setSingleShot(true); connect(&_socketCloseTimer, SIGNAL(timeout()), this, SLOT(socketCloseTimeout())); - _pingTimer.setInterval(30000); + setPingInterval(networkConfig()->pingInterval()); connect(&_pingTimer, SIGNAL(timeout()), this, SLOT(sendPing())); - _autoWhoTimer.setInterval(_autoWhoDelay * 1000); - _autoWhoCycleTimer.setInterval(_autoWhoInterval * 1000); + setAutoWhoDelay(networkConfig()->autoWhoDelay()); + setAutoWhoInterval(networkConfig()->autoWhoInterval()); QHash channels = coreSession()->persistentChannels(networkId()); foreach(QString chan, channels.keys()) { _channelKeys[chan.toLower()] = channels[chan]; } + connect(networkConfig(), SIGNAL(pingTimeoutEnabledSet(bool)), SLOT(enablePingTimeout(bool))); + connect(networkConfig(), SIGNAL(pingIntervalSet(int)), SLOT(setPingInterval(int))); + connect(networkConfig(), SIGNAL(autoWhoEnabledSet(bool)), SLOT(setAutoWhoEnabled(bool))); + connect(networkConfig(), SIGNAL(autoWhoIntervalSet(int)), SLOT(setAutoWhoInterval(int))); + connect(networkConfig(), SIGNAL(autoWhoDelaySet(int)), SLOT(setAutoWhoDelay(int))); + connect(&_autoReconnectTimer, SIGNAL(timeout()), this, SLOT(doAutoReconnect())); connect(&_autoWhoTimer, SIGNAL(timeout()), this, SLOT(sendAutoWho())); connect(&_autoWhoCycleTimer, SIGNAL(timeout()), this, SLOT(startAutoWhoCycle())); connect(&_tokenBucketTimer, SIGNAL(timeout()), this, SLOT(fillBucketAndProcessQueue())); connect(this, SIGNAL(connectRequested()), this, SLOT(connectToIrc())); - connect(&socket, SIGNAL(connected()), this, SLOT(socketInitialized())); connect(&socket, SIGNAL(disconnected()), this, SLOT(socketDisconnected())); connect(&socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError))); @@ -373,7 +373,7 @@ void CoreNetwork::socketDisconnected() { Core::setNetworkConnected(userId(), networkId(), false); } else if(_autoReconnectCount != 0) { setConnectionState(Network::Reconnecting); - if(_autoReconnectCount == autoReconnectRetries()) + if(_autoReconnectCount == -1 || _autoReconnectCount == autoReconnectRetries()) doAutoReconnect(); // first try is immediate else _autoReconnectTimer.start(); @@ -409,7 +409,7 @@ void CoreNetwork::networkInitialized() { if(useAutoReconnect()) { // reset counter - _autoReconnectCount = autoReconnectRetries(); + _autoReconnectCount = unlimitedReconnectRetries() ? -1 : autoReconnectRetries(); } // restore away state @@ -432,7 +432,7 @@ void CoreNetwork::networkInitialized() { enablePingTimeout(); - if(_autoWhoEnabled) { + if(networkConfig()->autoWhoEnabled()) { _autoWhoCycleTimer.start(); _autoWhoTimer.start(); startAutoWhoCycle(); // FIXME wait for autojoin to be completed @@ -520,8 +520,8 @@ void CoreNetwork::doAutoReconnect() { qWarning() << "CoreNetwork::doAutoReconnect(): Cannot reconnect while not being disconnected!"; return; } - if(_autoReconnectCount > 0) - _autoReconnectCount--; + if(_autoReconnectCount > 0 || _autoReconnectCount == -1) + _autoReconnectCount--; // -2 means we delay the next reconnect connectToIrc(true); } @@ -531,11 +531,11 @@ void CoreNetwork::sendPing() { qDebug() << "UserId:" << userId() << "Network:" << networkName() << "missed" << _pingCount << "pings." << "BA:" << socket.bytesAvailable() << "BTW:" << socket.bytesToWrite(); } - if(_pingCount >= _maxPingCount && now - _lastPingTime <= (uint)(_pingTimer.interval() / 1000) + 1) { + if((int)_pingCount >= networkConfig()->maxPingCount() && 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(_maxPingCount * _pingTimer.interval() / 1000), true /* withReconnect */); + disconnectFromIrc(false, QString("No Ping reply in %1 seconds.").arg(_pingCount * _pingTimer.interval() / 1000), true /* withReconnect */); } else { _lastPingTime = now; _pingCount++; @@ -543,9 +543,14 @@ void CoreNetwork::sendPing() { } } -void CoreNetwork::enablePingTimeout() { - resetPingTimeout(); - _pingTimer.start(); +void CoreNetwork::enablePingTimeout(bool enable) { + if(!enable) + disablePingTimeout(); + else { + resetPingTimeout(); + if(networkConfig()->pingTimeoutEnabled()) + _pingTimer.start(); + } } void CoreNetwork::disablePingTimeout() { @@ -553,6 +558,37 @@ void CoreNetwork::disablePingTimeout() { resetPingTimeout(); } +void CoreNetwork::setPingInterval(int interval) { + _pingTimer.setInterval(interval * 1000); +} + +/******** AutoWHO ********/ + +void CoreNetwork::startAutoWhoCycle() { + if(!_autoWhoQueue.isEmpty()) { + _autoWhoCycleTimer.stop(); + return; + } + _autoWhoQueue = channels(); +} + +void CoreNetwork::setAutoWhoDelay(int delay) { + _autoWhoTimer.setInterval(delay * 1000); +} + +void CoreNetwork::setAutoWhoInterval(int interval) { + _autoWhoCycleTimer.setInterval(interval * 1000); +} + +void CoreNetwork::setAutoWhoEnabled(bool enabled) { + if(enabled && isConnected() && !_autoWhoTimer.isActive()) + _autoWhoTimer.start(); + else if(!enabled) { + _autoWhoTimer.stop(); + _autoWhoCycleTimer.stop(); + } +} + void CoreNetwork::sendAutoWho() { // Don't send autowho if there are still some pending if(_autoWhoPending.count()) @@ -562,24 +598,17 @@ void CoreNetwork::sendAutoWho() { QString chan = _autoWhoQueue.takeFirst(); IrcChannel *ircchan = ircChannel(chan); if(!ircchan) continue; - if(_autoWhoNickLimit > 0 && ircchan->ircUsers().count() > _autoWhoNickLimit) continue; + if(networkConfig()->autoWhoNickLimit() > 0 && ircchan->ircUsers().count() >= networkConfig()->autoWhoNickLimit()) + continue; _autoWhoPending[chan]++; putRawLine("WHO " + serverEncode(chan)); - if(_autoWhoQueue.isEmpty() && _autoWhoEnabled && !_autoWhoCycleTimer.isActive()) { - // Timer was stopped, means a new cycle is due immediately - _autoWhoCycleTimer.start(); - startAutoWhoCycle(); - } break; } -} - -void CoreNetwork::startAutoWhoCycle() { - if(!_autoWhoQueue.isEmpty()) { - _autoWhoCycleTimer.stop(); - return; + if(_autoWhoQueue.isEmpty() && networkConfig()->autoWhoEnabled() && !_autoWhoCycleTimer.isActive()) { + // Timer was stopped, means a new cycle is due immediately + _autoWhoCycleTimer.start(); + startAutoWhoCycle(); } - _autoWhoQueue = channels(); } #ifdef HAVE_SSL