X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcorenetwork.cpp;h=72aff92bc85d65b48f3a3d430aa45158d6eed101;hp=8911cb0e45f1f302cf4fe4747ee20c1411175656;hb=4b8f9366a69d0bdb037c527740773c5c35716a72;hpb=ac21cc48d22f0cf58a98b74754fa94564a8e3f45 diff --git a/src/core/corenetwork.cpp b/src/core/corenetwork.cpp index 8911cb0e..72aff92b 100644 --- a/src/core/corenetwork.cpp +++ b/src/core/corenetwork.cpp @@ -20,7 +20,6 @@ #include "corenetwork.h" - #include "core.h" #include "coresession.h" #include "coreidentity.h" @@ -144,7 +143,7 @@ void CoreNetwork::connectToIrc(bool reconnecting) { } 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(++_lastUsedServerIndex == serverList().size()) { + if(++_lastUsedServerIndex >= serverList().size()) { _lastUsedServerIndex = 0; } } @@ -163,10 +162,16 @@ void CoreNetwork::connectToIrc(bool reconnecting) { #ifdef HAVE_SSL socket.setProtocol((QSsl::SslProtocol)server.sslVersion); - if(server.useSsl) + if(server.useSsl) { + CoreIdentity *identity = identityPtr(); + if(identity) { + socket.setLocalCertificate(identity->sslCert()); + socket.setPrivateKey(identity->sslKey()); + } socket.connectToHostEncrypted(server.host, server.port); - else + } else { socket.connectToHost(server.host, server.port); + } #else socket.connectToHost(server.host, server.port); #endif @@ -267,7 +272,10 @@ void CoreNetwork::socketHasData() { } } -void CoreNetwork::socketError(QAbstractSocket::SocketError) { +void CoreNetwork::socketError(QAbstractSocket::SocketError error) { + if(_quitRequested && error == QAbstractSocket::RemoteHostClosedError) + return; + _previousConnectionAttemptFailed = true; qWarning() << qPrintable(tr("Could not connect to %1 (%2)").arg(networkName(), socket.errorString())); emit connectionError(socket.errorString()); @@ -361,6 +369,7 @@ void CoreNetwork::socketStateChanged(QAbstractSocket::SocketState socketState) { void CoreNetwork::networkInitialized() { setConnectionState(Network::Initialized); setConnected(true); + _quitRequested = false; if(useAutoReconnect()) { // reset counter @@ -497,8 +506,11 @@ void CoreNetwork::writeToSocket(const QByteArray &data) { Network::Server CoreNetwork::usedServer() const { if(_lastUsedServerIndex < serverList().count()) return serverList()[_lastUsedServerIndex]; - else - return Network::Server(); + + if(!serverList().isEmpty()) + return serverList()[0]; + + return Network::Server(); } void CoreNetwork::requestConnect() const { @@ -522,7 +534,9 @@ void CoreNetwork::requestSetNetworkInfo(const NetworkInfo &info) { setNetworkInfo(info); Core::updateNetwork(coreSession()->user(), info); - // update _lastUsedServerIndex; + // the order of the servers might have changed, + // so we try to find the previously used server + _lastUsedServerIndex = 0; for(int i = 0; i < serverList().count(); i++) { Network::Server server = serverList()[i]; if(server.host == currentServer.host && server.port == currentServer.port) {