From: Yaohan Chen Date: Sat, 24 Jan 2015 23:50:12 +0000 (-0500) Subject: Add Qt-based connection detection X-Git-Tag: 0.12-beta1~34^2 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=bd2fb9596ddd44d486a3ff4914bcac045210c498 Add Qt-based connection detection A new network detection mode is added to use QNetworkConfigurationManager, available in Qt4.7+ including Qt5. This becomes the default mode when KDE4 integration is not available. --- diff --git a/src/client/clientsettings.cpp b/src/client/clientsettings.cpp index c27e03a3..1023efb0 100644 --- a/src/client/clientsettings.cpp +++ b/src/client/clientsettings.cpp @@ -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(); } diff --git a/src/client/clientsettings.h b/src/client/clientsettings.h index 755667da..ed02efd1 100644 --- a/src/client/clientsettings.h +++ b/src/client/clientsettings.h @@ -125,6 +125,7 @@ class CoreConnectionSettings : public ClientSettings public: enum NetworkDetectionMode { UseSolid, + UseQNetworkConfigurationManager, UsePingTimeout, NoActiveDetection }; diff --git a/src/client/coreconnection.cpp b/src/client/coreconnection.cpp index a4e24e02..735fab46 100644 --- a/src/client/coreconnection.cpp +++ b/src/client/coreconnection.cpp @@ -43,7 +43,8 @@ CoreConnection::CoreConnection(QObject *parent) _progressMinimum(0), _progressMaximum(-1), _progressValue(-1), - _resetting(false) + _resetting(false), + _qNetworkConfigurationManager(0) { qRegisterMetaType("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(); diff --git a/src/client/coreconnection.h b/src/client/coreconnection.h index c6b2e261..3c21b797 100644 --- a/src/client/coreconnection.h +++ b/src/client/coreconnection.h @@ -34,6 +34,8 @@ # include #endif +#include + #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 _authHandler; @@ -171,6 +174,8 @@ private: CoreAccount _account; CoreAccountModel *accountModel() const; + QPointer _qNetworkConfigurationManager; + friend class CoreConfigWizard; }; diff --git a/src/qtui/settingspages/coreconnectionsettingspage.cpp b/src/qtui/settingspages/coreconnectionsettingspage.cpp index a9d0bca7..aeb732e5 100644 --- a/src/qtui/settingspages/coreconnectionsettingspage.cpp +++ b/src/qtui/settingspages/coreconnectionsettingspage.cpp @@ -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; diff --git a/src/qtui/settingspages/coreconnectionsettingspage.ui b/src/qtui/settingspages/coreconnectionsettingspage.ui index 0e0308d4..d641bfa1 100644 --- a/src/qtui/settingspages/coreconnectionsettingspage.ui +++ b/src/qtui/settingspages/coreconnectionsettingspage.ui @@ -33,6 +33,19 @@ + + + + Rely on Qt's network configuration manager to detect if we're online. + + + Use Qt's network status detection (via QNetworkConfigurationManager) + + + false + + +