X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fcoreconnection.cpp;h=717fff39fea0391ea74ccd6c04b33cf1d300ae30;hp=59d3f8fffcb35c01ac7560a284afa22d18bea505;hb=4ae8f86c1ce452582d6fe576956c7c1bc1460adf;hpb=d9f4d3f0eabd3767b4d25438319116f77c158c52 diff --git a/src/client/coreconnection.cpp b/src/client/coreconnection.cpp index 59d3f8ff..717fff39 100644 --- a/src/client/coreconnection.cpp +++ b/src/client/coreconnection.cpp @@ -42,9 +42,17 @@ CoreConnection::CoreConnection(CoreAccountModel *model, QObject *parent) _wantReconnect(false), _progressMinimum(0), _progressMaximum(-1), - _progressValue(-1) + _progressValue(-1), + _wasReconnect(false), + _requestedDisconnect(false) { qRegisterMetaType("CoreConnection::ConnectionState"); +} + +void CoreConnection::init() { + Client::signalProxy()->setHeartBeatInterval(30); + connect(Client::signalProxy(), SIGNAL(disconnected()), SLOT(coreSocketDisconnected())); + connect(Client::signalProxy(), SIGNAL(lagUpdated(int)), SIGNAL(lagUpdated(int))); _reconnectTimer.setSingleShot(true); connect(&_reconnectTimer, SIGNAL(timeout()), SLOT(reconnectTimeout())); @@ -53,11 +61,6 @@ CoreConnection::CoreConnection(CoreAccountModel *model, QObject *parent) connect(Solid::Networking::notifier(), SIGNAL(statusChanged(Solid::Networking::Status)), SLOT(solidNetworkStatusChanged(Solid::Networking::Status))); #endif -} - -void CoreConnection::init() { - Client::signalProxy()->setHeartBeatInterval(30); - connect(Client::signalProxy(), SIGNAL(disconnected()), SLOT(coreSocketDisconnected())); CoreConnectionSettings s; s.initAndNotify("PingTimeoutInterval", this, SLOT(pingTimeoutIntervalChanged(QVariant)), 60); @@ -152,16 +155,16 @@ void CoreConnection::solidNetworkStatusChanged(Solid::Networking::Status status) switch(status) { case Solid::Networking::Unknown: case Solid::Networking::Connected: - qDebug() << "Solid: Network status changed to connected or unknown"; + //qDebug() << "Solid: Network status changed to connected or unknown"; if(state() == Disconnected) { if(_wantReconnect && s.autoReconnect()) { reconnectToCore(); } } break; + case Solid::Networking::Disconnecting: case Solid::Networking::Unconnected: - qDebug() << "Solid: Disconnected"; - if(!isLocalConnection()) + if(state() != Disconnected && !isLocalConnection()) disconnectFromCore(tr("Network is down"), true); break; default: @@ -254,7 +257,8 @@ void CoreConnection::coreSocketError(QAbstractSocket::SocketError) { } void CoreConnection::coreSocketDisconnected() { - qDebug() << Q_FUNC_INFO; + // qDebug() << Q_FUNC_INFO; + _wasReconnect = !_requestedDisconnect; resetConnection(true); // FIXME handle disconnects gracefully } @@ -303,6 +307,7 @@ void CoreConnection::coreHasData() { } void CoreConnection::disconnectFromCore() { + _requestedDisconnect = true; disconnectFromCore(QString(), false); // requested disconnect, so don't try to reconnect } @@ -310,6 +315,8 @@ void CoreConnection::disconnectFromCore(const QString &errorString, bool wantRec if(!wantReconnect) _reconnectTimer.stop(); + _wasReconnect = wantReconnect; // store if disconnect was requested + if(errorString.isEmpty()) emit connectionError(tr("Disconnected")); else @@ -327,6 +334,7 @@ void CoreConnection::resetConnection(bool wantReconnect) { _socket->deleteLater(); _socket = 0; } + _requestedDisconnect = false; _blockSize = 0; _coreMsgBuffer.clear(); @@ -336,6 +344,7 @@ void CoreConnection::resetConnection(bool wantReconnect) { setProgressMaximum(-1); // disable setState(Disconnected); + emit lagUpdated(-1); emit connectionMsg(tr("Disconnected from core.")); emit encrypted(false); @@ -472,6 +481,8 @@ void CoreConnection::clientInitAck(const QVariantMap &msg) { return; } + Client::setCoreFeatures((Quassel::Features)msg["CoreFeatures"].toUInt()); + #ifndef QT_NO_COMPRESS if(msg["SupportsCompression"].toBool()) { _socket->setProperty("UseCompression", true); @@ -631,6 +642,9 @@ void CoreConnection::internalSessionStateReceived(const QVariant &packedState) { } void CoreConnection::syncToCore(const QVariantMap &sessionState) { + if(sessionState.contains("CoreFeatures")) + Client::setCoreFeatures((Quassel::Features)sessionState["CoreFeatures"].toUInt()); + setProgressText(tr("Receiving network states")); updateProgress(0, 100);