#include "corenetwork.h"
-
#include "core.h"
#include "coresession.h"
-#include "identity.h"
+#include "coreidentity.h"
#include "ircserverhandler.h"
#include "userinputhandler.h"
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)));
connect(&socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(socketStateChanged(QAbstractSocket::SocketState)));
connect(&socket, SIGNAL(readyRead()), this, SLOT(socketHasData()));
#ifdef HAVE_SSL
- connect(&socket, SIGNAL(connected()), this, SLOT(sslSocketConnected()));
connect(&socket, SIGNAL(encrypted()), this, SLOT(socketInitialized()));
connect(&socket, SIGNAL(sslErrors(const QList<QSslError> &)), this, SLOT(sslErrors(const QList<QSslError> &)));
-#else
- connect(&socket, SIGNAL(connected()), this, SLOT(socketInitialized()));
#endif
}
qWarning() << "Server list empty, ignoring connect request!";
return;
}
- Identity *identity = identityPtr();
+ CoreIdentity *identity = identityPtr();
if(!identity) {
qWarning() << "Invalid identity configures, ignoring connect request!";
return;
} 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;
}
}
Server server = usedServer();
displayStatusMsg(tr("Connecting to %1:%2...").arg(server.host).arg(server.port));
displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Connecting to %1:%2...").arg(server.host).arg(server.port));
+
+ if(server.useProxy) {
+ QNetworkProxy proxy((QNetworkProxy::ProxyType)server.proxyType, server.proxyHost, server.proxyPort, server.proxyUser, server.proxyPass);
+ socket.setProxy(proxy);
+ } else {
+ socket.setProxy(QNetworkProxy::NoProxy);
+ }
+
+#ifdef HAVE_SSL
+ socket.setProtocol((QSsl::SslProtocol)server.sslVersion);
+ if(server.useSsl) {
+ CoreIdentity *identity = identityPtr();
+ if(identity) {
+ socket.setLocalCertificate(identity->sslCert());
+ socket.setPrivateKey(identity->sslKey());
+ }
+ socket.connectToHostEncrypted(server.host, server.port);
+ } else {
+ socket.connectToHost(server.host, server.port);
+ }
+#else
socket.connectToHost(server.host, server.port);
+#endif
}
void CoreNetwork::disconnectFromIrc(bool requested, const QString &reason) {
}
}
-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());
}
}
+void CoreNetwork::socketInitialized() {
+ Server server = usedServer();
#ifdef HAVE_SSL
-void CoreNetwork::sslSocketConnected() {
- if(!usedServer().useSsl)
- socketInitialized();
- else
- socket.startClientEncryption();
-}
+ if(server.useSsl && !socket.isEncrypted())
+ return;
#endif
-void CoreNetwork::socketInitialized() {
- Identity *identity = identityPtr();
+ CoreIdentity *identity = identityPtr();
if(!identity) {
qCritical() << "Identity invalid!";
disconnectFromIrc();
_tokenBucket = 5; // init with a full bucket
_tokenBucketTimer.start(_messagesPerSecond * 1000);
- QString passwd = usedServer().password;
- if(!passwd.isEmpty()) {
- putRawLine(serverEncode(QString("PASS %1").arg(passwd)));
+ if(!server.password.isEmpty()) {
+ putRawLine(serverEncode(QString("PASS %1").arg(server.password)));
}
putRawLine(serverEncode(QString("NICK :%1").arg(identity->nicks()[0])));
putRawLine(serverEncode(QString("USER %1 8 * :%2").arg(identity->ident(), identity->realName())));
void CoreNetwork::networkInitialized() {
setConnectionState(Network::Initialized);
setConnected(true);
+ _quitRequested = false;
if(useAutoReconnect()) {
// reset counter
void CoreNetwork::sslErrors(const QList<QSslError> &sslErrors) {
Q_UNUSED(sslErrors)
socket.ignoreSslErrors();
- /* TODO errorhandling
- QVariantMap errmsg;
- QVariantList errnums;
- foreach(QSslError err, errors) errnums << err.error();
- errmsg["SslErrors"] = errnums;
- errmsg["SslCert"] = socket.peerCertificate().toPem();
- errmsg["PeerAddress"] = socket.peerAddress().toString();
- errmsg["PeerPort"] = socket.peerPort();
- errmsg["PeerName"] = socket.peerName();
- emit sslErrors(errmsg);
- disconnectFromIrc();
- */
+ // TODO errorhandling
}
#endif // HAVE_SSL
_tokenBucket--;
}
+Network::Server CoreNetwork::usedServer() const {
+ if(_lastUsedServerIndex < serverList().count())
+ return serverList()[_lastUsedServerIndex];
+
+ if(!serverList().isEmpty())
+ return serverList()[0];
+
+ return Network::Server();
+}
+
void CoreNetwork::requestConnect() const {
if(connectionState() != Disconnected) {
qWarning() << "Requesting connect while already being connected!";
}
void CoreNetwork::requestSetNetworkInfo(const NetworkInfo &info) {
+ Network::Server currentServer = usedServer();
setNetworkInfo(info);
Core::updateNetwork(coreSession()->user(), info);
+
+ // 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) {
+ _lastUsedServerIndex = i;
+ break;
+ }
+ }
}