Fix includes
[quassel.git] / src / client / coreconnection.cpp
index 59d3f8f..717fff3 100644 (file)
@@ -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<ConnectionState>("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);