Add Qt-based connection detection
[quassel.git] / src / client / coreconnection.cpp
index 4928a8b..735fab4 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2014 by the Quassel Project                        *
+ *   Copyright (C) 2005-2015 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -43,7 +43,8 @@ CoreConnection::CoreConnection(QObject *parent)
     _progressMinimum(0),
     _progressMaximum(-1),
     _progressValue(-1),
-    _resetting(false)
+    _resetting(false),
+    _qNetworkConfigurationManager(0)
 {
     qRegisterMetaType<ConnectionState>("CoreConnection::ConnectionState");
 }
@@ -57,10 +58,12 @@ void CoreConnection::init()
     _reconnectTimer.setSingleShot(true);
     connect(&_reconnectTimer, SIGNAL(timeout()), SLOT(reconnectTimeout()));
 
-#ifdef HAVE_KDE
+#ifdef HAVE_KDE4
     connect(Solid::Networking::notifier(), SIGNAL(statusChanged(Solid::Networking::Status)),
         SLOT(solidNetworkStatusChanged(Solid::Networking::Status)));
 #endif
+    _qNetworkConfigurationManager = new QNetworkConfigurationManager(this);
+    connect(_qNetworkConfigurationManager, SIGNAL(onlineStateChanged(bool)), SLOT(onlineStateChanged(bool)));
 
     CoreConnectionSettings s;
     s.initAndNotify("PingTimeoutInterval", this, SLOT(pingTimeoutIntervalChanged(QVariant)), 60);
@@ -127,7 +130,7 @@ void CoreConnection::reconnectTimeout()
     if (!_peer) {
         CoreConnectionSettings s;
         if (_wantReconnect && s.autoReconnect()) {
-#ifdef HAVE_KDE
+#ifdef HAVE_KDE4
             // If using Solid, we don't want to reconnect if we're offline
             if (s.networkDetectionMode() == CoreConnectionSettings::UseSolid) {
                 if (Solid::Networking::status() != Solid::Networking::Connected
@@ -135,7 +138,13 @@ void CoreConnection::reconnectTimeout()
                     return;
                 }
             }
-#endif /* HAVE_KDE */
+#endif /* HAVE_KDE4 */
+            // If using QNetworkConfigurationManager, ditto
+            if (s.networkDetectionMode() == CoreConnectionSettings::UseQNetworkConfigurationManager) {
+               if (!_qNetworkConfigurationManager->isOnline()) {
+                    return;
+               }
+            }
 
             reconnectToCore();
         }
@@ -169,7 +178,7 @@ void CoreConnection::reconnectIntervalChanged(const QVariant &interval)
 }
 
 
-#ifdef HAVE_KDE
+#ifdef HAVE_KDE4
 
 void CoreConnection::solidNetworkStatusChanged(Solid::Networking::Status status)
 {
@@ -199,6 +208,26 @@ void CoreConnection::solidNetworkStatusChanged(Solid::Networking::Status status)
 
 #endif
 
+void CoreConnection::onlineStateChanged(bool isOnline)
+{
+    CoreConnectionSettings s;
+    if (s.networkDetectionMode() != CoreConnectionSettings::UseQNetworkConfigurationManager)
+        return;
+
+    if(isOnline) {
+        // qDebug() << "QNetworkConfigurationManager reports Online";
+        if (state() == Disconnected) {
+            if (_wantReconnect && s.autoReconnect()) {
+                reconnectToCore();
+            }
+        }
+    } else {
+        // qDebug() << "QNetworkConfigurationManager reports Offline";
+        if (state() != Disconnected && !isLocalConnection())
+            disconnectFromCore(tr("Network is down"), true);
+    }
+}
+
 bool CoreConnection::isEncrypted() const
 {
     return _peer && _peer->isSecure();