Merge pull request #108 from hagabaka/master
authorManuel Nickschas <sputnick@quassel-irc.org>
Thu, 5 Feb 2015 22:46:54 +0000 (23:46 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Thu, 5 Feb 2015 22:46:54 +0000 (23:46 +0100)
Add QNetworkConfigurationManager-based connection detection

src/client/clientsettings.cpp
src/client/clientsettings.h
src/client/coreconnection.cpp
src/client/coreconnection.h
src/qtui/settingspages/coreconnectionsettingspage.cpp
src/qtui/settingspages/coreconnectionsettingspage.ui

index c27e03a..1023efb 100644 (file)
@@ -252,7 +252,7 @@ CoreConnectionSettings::NetworkDetectionMode CoreConnectionSettings::networkDete
 #ifdef HAVE_KDE4
     NetworkDetectionMode def = UseSolid;
 #else
-    NetworkDetectionMode def = UsePingTimeout;
+    NetworkDetectionMode def = UseQNetworkConfigurationManager;
 #endif
     return (NetworkDetectionMode)localValue("NetworkDetectionMode", def).toInt();
 }
index 755667d..ed02efd 100644 (file)
@@ -125,6 +125,7 @@ class CoreConnectionSettings : public ClientSettings
 public:
     enum NetworkDetectionMode {
         UseSolid,
+        UseQNetworkConfigurationManager,
         UsePingTimeout,
         NoActiveDetection
     };
index a4e24e0..735fab4 100644 (file)
@@ -43,7 +43,8 @@ CoreConnection::CoreConnection(QObject *parent)
     _progressMinimum(0),
     _progressMaximum(-1),
     _progressValue(-1),
-    _resetting(false)
+    _resetting(false),
+    _qNetworkConfigurationManager(0)
 {
     qRegisterMetaType<ConnectionState>("CoreConnection::ConnectionState");
 }
@@ -61,6 +62,8 @@ void CoreConnection::init()
     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);
@@ -136,6 +139,12 @@ void CoreConnection::reconnectTimeout()
                 }
             }
 #endif /* HAVE_KDE4 */
+            // If using QNetworkConfigurationManager, ditto
+            if (s.networkDetectionMode() == CoreConnectionSettings::UseQNetworkConfigurationManager) {
+               if (!_qNetworkConfigurationManager->isOnline()) {
+                    return;
+               }
+            }
 
             reconnectToCore();
         }
@@ -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();
index c6b2e26..3c21b79 100644 (file)
@@ -34,6 +34,8 @@
 #  include <Solid/Networking>
 #endif
 
+#include <QNetworkConfigurationManager>
+
 #include "coreaccount.h"
 #include "remotepeer.h"
 #include "types.h"
@@ -151,6 +153,7 @@ private slots:
 #ifdef HAVE_KDE4
     void solidNetworkStatusChanged(Solid::Networking::Status status);
 #endif
+    void onlineStateChanged(bool isOnline);
 
 private:
     QPointer<ClientAuthHandler> _authHandler;
@@ -171,6 +174,8 @@ private:
     CoreAccount _account;
     CoreAccountModel *accountModel() const;
 
+    QPointer<QNetworkConfigurationManager> _qNetworkConfigurationManager;
+
     friend class CoreConfigWizard;
 };
 
index a9d0bca..aeb732e 100644 (file)
@@ -31,6 +31,7 @@ CoreConnectionSettingsPage::CoreConnectionSettingsPage(QWidget *parent)
     initAutoWidgets();
 
     connect(ui.useSolid, SIGNAL(toggled(bool)), SLOT(widgetHasChanged()));
+    connect(ui.useQNetworkConfigurationManager, SIGNAL(toggled(bool)), SLOT(widgetHasChanged()));
     connect(ui.usePingTimeout, SIGNAL(toggled(bool)), SLOT(widgetHasChanged()));
     connect(ui.useNoTimeout, SIGNAL(toggled(bool)), SLOT(widgetHasChanged()));
 }
@@ -52,7 +53,7 @@ void CoreConnectionSettingsPage::defaults()
 #ifdef HAVE_KDE4
     setRadioButtons(CoreConnectionSettings::UseSolid);
 #else
-    setRadioButtons(CoreConnectionSettings::UsePingTimeout);
+    setRadioButtons(CoreConnectionSettings::UseQNetworkConfigurationManager);
 #endif
 
     SettingsPage::defaults();
@@ -85,6 +86,9 @@ void CoreConnectionSettingsPage::setRadioButtons(CoreConnectionSettings::Network
         ui.useSolid->setChecked(true);
         break;
 #endif
+    case CoreConnectionSettings::UseQNetworkConfigurationManager:
+        ui.useQNetworkConfigurationManager->setChecked(true);
+        break;
     case CoreConnectionSettings::UsePingTimeout:
         ui.usePingTimeout->setChecked(true);
         break;
@@ -100,6 +104,8 @@ CoreConnectionSettings::NetworkDetectionMode CoreConnectionSettingsPage::modeFro
     if (ui.useSolid->isChecked())
         return CoreConnectionSettings::UseSolid;
 #endif
+    if (ui.useQNetworkConfigurationManager->isChecked())
+        return CoreConnectionSettings::UseQNetworkConfigurationManager;
     if (ui.usePingTimeout->isChecked())
         return CoreConnectionSettings::UsePingTimeout;
 
index 0e0308d..d641bfa 100644 (file)
         </property>
        </widget>
       </item>
+      <item>
+       <widget class="QRadioButton" name="useQNetworkConfigurationManager">
+        <property name="toolTip">
+         <string>Rely on Qt's network configuration manager to detect if we're online.</string>
+        </property>
+        <property name="text">
+         <string>Use Qt's network status detection (via QNetworkConfigurationManager)</string>
+        </property>
+        <property name="checked">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
       <item>
        <layout class="QHBoxLayout" name="horizontalLayout">
         <item>