X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fnetworkconnection.cpp;h=69ce036939361bd1d10878ad654a58e49aeedbc2;hp=f5e6a367b04a3d58973b03a3c7a209a8bfd9b8c9;hb=f2329ae63c2e0c986be9f91e676b33b202ec592a;hpb=c30f8eb1f1d360284b38016655cdb6a3e40db8ed diff --git a/src/core/networkconnection.cpp b/src/core/networkconnection.cpp index f5e6a367..69ce0369 100644 --- a/src/core/networkconnection.cpp +++ b/src/core/networkconnection.cpp @@ -29,13 +29,14 @@ #include "ircchannel.h" #include "ircuser.h" -#include "network.h" #include "identity.h" #include "ircserverhandler.h" #include "userinputhandler.h" #include "ctcphandler.h" +#include "logger.h" + NetworkConnection::NetworkConnection(Network *network, CoreSession *session) : QObject(network), _connectionState(Network::Disconnected), @@ -64,7 +65,10 @@ NetworkConnection::NetworkConnection(Network *network, CoreSession *session) _autoReconnectTimer.setSingleShot(true); _socketCloseTimer.setSingleShot(true); connect(&_socketCloseTimer, SIGNAL(timeout()), this, SLOT(socketCloseTimeout())); - + + _pingTimer.setInterval(60000); + connect(&_pingTimer, SIGNAL(timeout()), this, SLOT(sendPing())); + _autoWhoTimer.setInterval(_autoWhoDelay * 1000); _autoWhoCycleTimer.setInterval(_autoWhoInterval * 1000); @@ -175,11 +179,11 @@ void NetworkConnection::connectToIrc(bool reconnecting) { QVariantList serverList = network()->serverList(); Identity *identity = coreSession()->identity(network()->identity()); if(!serverList.count()) { - qWarning() << "Server list empty, ignoring connect request!"; + quWarning() << "Server list empty, ignoring connect request!"; return; } if(!identity) { - qWarning() << "Invalid identity configures, ignoring connect request!"; + quWarning() << "Invalid identity configures, ignoring connect request!"; return; } // use a random server? @@ -215,6 +219,8 @@ void NetworkConnection::networkInitialized(const QString ¤tServer) { network()->setConnected(true); emit connected(networkId()); + _pingTimer.start(); + if(_autoWhoEnabled) { _autoWhoCycleTimer.start(); _autoWhoTimer.start(); @@ -248,20 +254,19 @@ void NetworkConnection::sendPerform() { } void NetworkConnection::disconnectFromIrc(bool requested) { + _quitRequested = requested; // see socketDisconnected(); _autoReconnectTimer.stop(); - _autoReconnectCount = 0; + _autoReconnectCount = 0; // prohibiting auto reconnect displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Disconnecting.")); - if(socket.state() < QAbstractSocket::ConnectedState) { - setConnectionState(Network::Disconnected); + if(socket.state() == QAbstractSocket::UnconnectedState) { + socketDisconnected(); + } else if(socket.state() < QAbstractSocket::ConnectedState) { + socket.close(); + // we might be in a state waiting for a timeout... we don't care... set a disconnected state socketDisconnected(); } else { _socketCloseTimer.start(10000); // the irc server has 10 seconds to close the socket } - - // this flag triggers quitRequested() once the socket is closed - // it is needed to determine whether or not the connection needs to be - // in the automatic session restore. - _quitRequested = requested; } void NetworkConnection::socketHasData() { @@ -273,12 +278,11 @@ void NetworkConnection::socketHasData() { void NetworkConnection::socketError(QAbstractSocket::SocketError) { _previousConnectionAttemptFailed = true; - qDebug() << qPrintable(tr("Could not connect to %1 (%2)").arg(network()->networkName(), socket.errorString())); + quWarning() << 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())); network()->emitConnectionError(socket.errorString()); if(socket.state() < QAbstractSocket::ConnectedState) { - setConnectionState(Network::Disconnected); socketDisconnected(); } // mark last connection attempt as failed @@ -331,7 +335,7 @@ void NetworkConnection::socketInitialized() { //emit connected(networkId()); initialize first! Identity *identity = coreSession()->identity(network()->identity()); if(!identity) { - qWarning() << "Identity invalid!"; + quError() << "Identity invalid!"; disconnectFromIrc(); return; } @@ -370,6 +374,7 @@ void NetworkConnection::socketCloseTimeout() { } void NetworkConnection::socketDisconnected() { + _pingTimer.stop(); _autoWhoCycleTimer.stop(); _autoWhoTimer.stop(); _autoWhoQueue.clear(); @@ -379,18 +384,21 @@ void NetworkConnection::socketDisconnected() { network()->setConnected(false); emit disconnected(networkId()); - if(_autoReconnectCount != 0) { - setConnectionState(Network::Reconnecting); - if(_autoReconnectCount == network()->autoReconnectRetries()) doAutoReconnect(); // first try is immediate - else _autoReconnectTimer.start(); - } else if(_quitRequested) { + if(_quitRequested) { + setConnectionState(Network::Disconnected); emit quitRequested(networkId()); + } else if(_autoReconnectCount != 0) { + setConnectionState(Network::Reconnecting); + if(_autoReconnectCount == network()->autoReconnectRetries()) + doAutoReconnect(); // first try is immediate + else + _autoReconnectTimer.start(); } } void NetworkConnection::doAutoReconnect() { if(connectionState() != Network::Disconnected && connectionState() != Network::Reconnecting) { - qWarning() << "NetworkConnection::doAutoReconnect(): Cannot reconnect while not being disconnected!"; + quWarning() << "NetworkConnection::doAutoReconnect(): Cannot reconnect while not being disconnected!"; return; } if(_autoReconnectCount > 0) _autoReconnectCount--; @@ -462,12 +470,9 @@ void NetworkConnection::putCmd(const QString &cmd, const QList ¶ if(cmd == "PRIVMSG" && params.count() > 1) { int overrun = lastParamOverrun(cmd, params); if(overrun) { - QList paramCopy1; - QList paramCopy2; - for(int i = 0; i < params.count() - 1; i++) { - paramCopy1 << params[i]; - paramCopy2 << params[i]; - } + QList paramCopy1 = params; + paramCopy1.removeLast(); + QList paramCopy2 = paramCopy1; QByteArray lastPart = params.last(); QByteArray splitter(" .,-"); @@ -476,8 +481,7 @@ void NetworkConnection::putCmd(const QString &cmd, const QList ¶ for(int i = 0; i < splitter.size(); i++) { splitPos = qMax(splitPos, lastPart.lastIndexOf(splitter[i], maxSplitPos)); } - - if(splitPos == -1) { + if(splitPos <= 0) { splitPos = maxSplitPos; } @@ -502,6 +506,10 @@ void NetworkConnection::putCmd(const QString &cmd, const QList ¶ putRawLine(msg); } +void NetworkConnection::sendPing() { + userInputHandler()->handlePing(BufferInfo(), QString()); +} + void NetworkConnection::sendAutoWho() { while(!_autoWhoQueue.isEmpty()) { QString chan = _autoWhoQueue.takeFirst();