X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fnetworkconnection.cpp;h=fd7e2ba50deb8588ca7fa6d0d85b5cdc0f70bcb4;hp=84eabeec6ca1d175114cbdacff4d3c2cafa65453;hb=236e70030428e5b85309d6ddb97b772fa3efe61a;hpb=3ed7d3bb6e9123ff0aa77023b264a39d1f63bd90 diff --git a/src/core/networkconnection.cpp b/src/core/networkconnection.cpp index 84eabeec..fd7e2ba5 100644 --- a/src/core/networkconnection.cpp +++ b/src/core/networkconnection.cpp @@ -46,7 +46,8 @@ NetworkConnection::NetworkConnection(Network *network, CoreSession *session) : Q _autoReconnectCount(0) { _autoReconnectTimer.setSingleShot(true); - + _previousConnectionAttemptFailed = false; + _lastUsedServerlistIndex = 0; // TODO make configurable _whoTimer.setInterval(60 * 1000); _whoTimer.setSingleShot(false); @@ -194,9 +195,20 @@ void NetworkConnection::connectToIrc(bool reconnecting) { qWarning() << "Invalid identity configures, ignoring connect request!"; return; } - // TODO implement cycling / random servers - QString host = serverList[0].toMap()["Host"].toString(); - quint16 port = serverList[0].toMap()["Port"].toUInt(); + // use a random server? + if(network()->useRandomServer()) { + _lastUsedServerlistIndex = qrand() % serverList.size(); + } else if(_previousConnectionAttemptFailed) { + // cycle to next server if previous connection attempt failed + displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Connection failed. Cycling to next Server")); + if(++_lastUsedServerlistIndex == serverList.size()) { + _lastUsedServerlistIndex = 0; + } + } + _previousConnectionAttemptFailed = false; + + QString host = serverList[_lastUsedServerlistIndex].toMap()["Host"].toString(); + quint16 port = serverList[_lastUsedServerlistIndex].toMap()["Port"].toUInt(); displayStatusMsg(tr("Connecting to %1:%2...").arg(host).arg(port)); displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Connecting to %1:%2...").arg(host).arg(port)); socket.connectToHost(host, port); @@ -245,15 +257,17 @@ void NetworkConnection::sendPerform() { } void NetworkConnection::disconnectFromIrc(bool requested) { - if(requested) { - _autoReconnectTimer.stop(); - _autoReconnectCount = 0; - } + _autoReconnectTimer.stop(); + _autoReconnectCount = 0; displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Disconnecting.")); if(socket.state() < QAbstractSocket::ConnectedState) { setConnectionState(Network::Disconnected); socketDisconnected(); } else socket.disconnectFromHost(); + + if(requested) { + emit quitRequested(networkId()); + } } void NetworkConnection::socketHasData() { @@ -264,6 +278,7 @@ void NetworkConnection::socketHasData() { } void NetworkConnection::socketError(QAbstractSocket::SocketError) { + _previousConnectionAttemptFailed = true; qDebug() << qPrintable(tr("Could not connect to %1 (%2)").arg(network()->networkName(), socket.errorString())); emit connectionError(socket.errorString()); emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("Connection failure: %1").arg(socket.errorString())); @@ -272,6 +287,8 @@ void NetworkConnection::socketError(QAbstractSocket::SocketError) { setConnectionState(Network::Disconnected); socketDisconnected(); } + // mark last connection attempt as failed + //qDebug() << "exiting..."; //exit(1); } @@ -314,8 +331,7 @@ void NetworkConnection::socketDisconnected() { _whoTimer.stop(); network()->setConnected(false); emit disconnected(networkId()); - if(_autoReconnectCount == 0) emit quitRequested(networkId()); - else { + if(_autoReconnectCount != 0) { setConnectionState(Network::Reconnecting); if(_autoReconnectCount == network()->autoReconnectRetries()) doAutoReconnect(); // first try is immediate else _autoReconnectTimer.start();