-void CoreNetwork::setAutoReconnectRetries(quint16 retries) {
- Network::setAutoReconnectRetries(retries);
- if(_autoReconnectCount != 0) {
- if(unlimitedReconnectRetries())
- _autoReconnectCount = -1;
- else
- _autoReconnectCount = autoReconnectRetries();
- }
-}
-
-void CoreNetwork::doAutoReconnect() {
- if(connectionState() != Network::Disconnected && connectionState() != Network::Reconnecting) {
- qWarning() << "CoreNetwork::doAutoReconnect(): Cannot reconnect while not being disconnected!";
- return;
- }
- if(_autoReconnectCount > 0)
- _autoReconnectCount--;
- connectToIrc(true);
-}
-
-void CoreNetwork::sendPing() {
- 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 {
- _lastPingTime = now;
- userInputHandler()->handlePing(BufferInfo(), QString());
- }
-}
-
-void CoreNetwork::enablePingTimeout() {
- resetPingTimeout();
- _pingTimer.start();
-}
-
-void CoreNetwork::disablePingTimeout() {
- _pingTimer.stop();
- resetPingTimeout();
-}
-
-void CoreNetwork::sendAutoWho() {
- // Don't send autowho if there are still some pending
- if(_autoWhoPending.count())
- return;
-
- while(!_autoWhoQueue.isEmpty()) {
- QString chan = _autoWhoQueue.takeFirst();
- IrcChannel *ircchan = ircChannel(chan);
- if(!ircchan) continue;
- if(_autoWhoNickLimit > 0 && ircchan->ircUsers().count() > _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;
- }
- _autoWhoQueue = channels();
+
+void CoreNetwork::setAutoReconnectInterval(quint32 interval)
+{
+ Network::setAutoReconnectInterval(interval);
+ _autoReconnectTimer.setInterval(interval * 1000);
+}
+
+
+void CoreNetwork::setAutoReconnectRetries(quint16 retries)
+{
+ Network::setAutoReconnectRetries(retries);
+ if (_autoReconnectCount != 0) {
+ if (unlimitedReconnectRetries())
+ _autoReconnectCount = -1;
+ else
+ _autoReconnectCount = autoReconnectRetries();
+ }
+}
+
+
+void CoreNetwork::doAutoReconnect()
+{
+ if (connectionState() != Network::Disconnected && connectionState() != Network::Reconnecting) {
+ qWarning() << "CoreNetwork::doAutoReconnect(): Cannot reconnect while not being disconnected!";
+ return;
+ }
+ if (_autoReconnectCount > 0 || _autoReconnectCount == -1)
+ _autoReconnectCount--; // -2 means we delay the next reconnect
+ connectToIrc(true);
+}
+
+
+void CoreNetwork::sendPing()
+{
+ uint now = QDateTime::currentDateTime().toTime_t();
+ if (_pingCount != 0) {
+ qDebug() << "UserId:" << userId() << "Network:" << networkName() << "missed" << _pingCount << "pings."
+ << "BA:" << socket.bytesAvailable() << "BTW:" << socket.bytesToWrite();
+ }
+ 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(_pingCount * _pingTimer.interval() / 1000), true /* withReconnect */);
+ }
+ else {
+ _lastPingTime = now;
+ _pingCount++;
+ userInputHandler()->handlePing(BufferInfo(), QString());
+ }
+}
+
+
+void CoreNetwork::enablePingTimeout(bool enable)
+{
+ if (!enable)
+ disablePingTimeout();
+ else {
+ resetPingTimeout();
+ if (networkConfig()->pingTimeoutEnabled())
+ _pingTimer.start();
+ }
+}
+
+
+void CoreNetwork::disablePingTimeout()
+{
+ _pingTimer.stop();
+ 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())
+ return;
+
+ while (!_autoWhoQueue.isEmpty()) {
+ QString chan = _autoWhoQueue.takeFirst();
+ IrcChannel *ircchan = ircChannel(chan);
+ if (!ircchan) continue;
+ if (networkConfig()->autoWhoNickLimit() > 0 && ircchan->ircUsers().count() >= networkConfig()->autoWhoNickLimit())
+ continue;
+ _autoWhoPending[chan]++;
+ putRawLine("WHO " + serverEncode(chan));
+ break;
+ }
+ if (_autoWhoQueue.isEmpty() && networkConfig()->autoWhoEnabled() && !_autoWhoCycleTimer.isActive()) {
+ // Timer was stopped, means a new cycle is due immediately
+ _autoWhoCycleTimer.start();
+ startAutoWhoCycle();
+ }