mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-27 17:37:36 +03:00
233 lines
10 KiB
Diff
233 lines
10 KiB
Diff
From bb281eea179d50a413f4ec1ff172d27ee48d3a41 Mon Sep 17 00:00:00 2001
|
|
From: Lorn Potter <lorn.potter@gmail.com>
|
|
Date: Fri, 17 Jul 2015 15:32:23 +1000
|
|
Subject: [PATCH] Make sure networkAccessibilityChanged is emitted
|
|
|
|
Task-number: QTBUG-46323
|
|
Change-Id: I8297072b62763136f457ca6ae15282d1c22244f4
|
|
Reviewed-by: Timo Jyrinki <timo.jyrinki@canonical.com>
|
|
Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
|
|
---
|
|
src/network/access/qnetworkaccessmanager.cpp | 70 +++++++++++++++-------
|
|
src/network/access/qnetworkaccessmanager_p.h | 14 ++++-
|
|
.../tst_qnetworkaccessmanager.cpp | 31 +++++-----
|
|
3 files changed, 77 insertions(+), 38 deletions(-)
|
|
|
|
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
|
|
index 84931cb..f9e9513 100644
|
|
--- a/src/network/access/qnetworkaccessmanager.cpp
|
|
+++ b/src/network/access/qnetworkaccessmanager.cpp
|
|
@@ -278,7 +278,8 @@ static void ensureInitialized()
|
|
|
|
\snippet code/src_network_access_qnetworkaccessmanager.cpp 4
|
|
|
|
- Network requests can be reenabled again by calling
|
|
+ Network requests can be re-enabled again, and this property will resume to
|
|
+ reflect the actual device state by calling
|
|
|
|
\snippet code/src_network_access_qnetworkaccessmanager.cpp 5
|
|
|
|
@@ -467,16 +468,12 @@ QNetworkAccessManager::QNetworkAccessManager(QObject *parent)
|
|
qRegisterMetaType<QSharedPointer<char> >();
|
|
|
|
#ifndef QT_NO_BEARERMANAGEMENT
|
|
- if (!d->networkSessionRequired) {
|
|
- // if a session is required, we track online state through
|
|
- // the QNetworkSession's signals
|
|
- connect(&d->networkConfigurationManager, SIGNAL(onlineStateChanged(bool)),
|
|
- SLOT(_q_onlineStateChanged(bool)));
|
|
- }
|
|
- // we would need all active configurations to check for
|
|
- // d->networkConfigurationManager.isOnline(), which is asynchronous
|
|
- // and potentially expensive. We can just check the configuration here
|
|
- d->online = (d->networkConfiguration.state() & QNetworkConfiguration::Active);
|
|
+ // if a session is required, we track online state through
|
|
+ // the QNetworkSession's signals if a request is already made.
|
|
+ // we need to track current accessibility state by default
|
|
+ //
|
|
+ connect(&d->networkConfigurationManager, SIGNAL(onlineStateChanged(bool)),
|
|
+ SLOT(_q_onlineStateChanged(bool)));
|
|
#endif
|
|
}
|
|
|
|
@@ -946,7 +943,8 @@ QNetworkConfiguration QNetworkAccessManager::activeConfiguration() const
|
|
void QNetworkAccessManager::setNetworkAccessible(QNetworkAccessManager::NetworkAccessibility accessible)
|
|
{
|
|
Q_D(QNetworkAccessManager);
|
|
- d->defaultAccessControl = false;
|
|
+
|
|
+ d->defaultAccessControl = accessible == NotAccessible ? false : true;
|
|
|
|
if (d->networkAccessible != accessible) {
|
|
NetworkAccessibility previous = networkAccessible();
|
|
@@ -965,6 +963,10 @@ void QNetworkAccessManager::setNetworkAccessible(QNetworkAccessManager::NetworkA
|
|
QNetworkAccessManager::NetworkAccessibility QNetworkAccessManager::networkAccessible() const
|
|
{
|
|
Q_D(const QNetworkAccessManager);
|
|
+
|
|
+ if (d->networkConfiguration.state().testFlag(QNetworkConfiguration::Undefined))
|
|
+ return UnknownAccessibility;
|
|
+
|
|
if (d->networkSessionRequired) {
|
|
QSharedPointer<QNetworkSession> networkSession(d->getNetworkSession());
|
|
if (networkSession) {
|
|
@@ -1622,32 +1624,56 @@ void QNetworkAccessManagerPrivate::_q_networkSessionStateChanged(QNetworkSession
|
|
if (online) {
|
|
if (state != QNetworkSession::Connected && state != QNetworkSession::Roaming) {
|
|
online = false;
|
|
- networkAccessible = QNetworkAccessManager::NotAccessible;
|
|
- emit q->networkAccessibleChanged(networkAccessible);
|
|
+ if (networkAccessible != QNetworkAccessManager::NotAccessible) {
|
|
+ networkAccessible = QNetworkAccessManager::NotAccessible;
|
|
+ emit q->networkAccessibleChanged(networkAccessible);
|
|
+ }
|
|
}
|
|
} else {
|
|
if (state == QNetworkSession::Connected || state == QNetworkSession::Roaming) {
|
|
online = true;
|
|
if (defaultAccessControl)
|
|
- networkAccessible = QNetworkAccessManager::Accessible;
|
|
- emit q->networkAccessibleChanged(networkAccessible);
|
|
+ if (networkAccessible != QNetworkAccessManager::Accessible) {
|
|
+ networkAccessible = QNetworkAccessManager::Accessible;
|
|
+ emit q->networkAccessibleChanged(networkAccessible);
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
|
|
void QNetworkAccessManagerPrivate::_q_onlineStateChanged(bool isOnline)
|
|
{
|
|
- // if the user set a config, we only care whether this one is active.
|
|
+ Q_Q(QNetworkAccessManager);
|
|
+ // if the user set a config, we only care whether this one is active.
|
|
// Otherwise, this QNAM is online if there is an online config.
|
|
if (customNetworkConfiguration) {
|
|
online = (networkConfiguration.state() & QNetworkConfiguration::Active);
|
|
} else {
|
|
- if (isOnline && online != isOnline) {
|
|
- networkSessionStrongRef.clear();
|
|
- networkSessionWeakRef.clear();
|
|
+ if (online != isOnline) {
|
|
+ if (isOnline) {
|
|
+ networkSessionStrongRef.clear();
|
|
+ networkSessionWeakRef.clear();
|
|
+ }
|
|
+ online = isOnline;
|
|
+ }
|
|
+ }
|
|
+ if (online) {
|
|
+ if (defaultAccessControl) {
|
|
+ if (networkAccessible != QNetworkAccessManager::Accessible) {
|
|
+ networkAccessible = QNetworkAccessManager::Accessible;
|
|
+ emit q->networkAccessibleChanged(networkAccessible);
|
|
+ }
|
|
+ }
|
|
+ } else if (networkConfiguration.state().testFlag(QNetworkConfiguration::Undefined)) {
|
|
+ if (networkAccessible != QNetworkAccessManager::UnknownAccessibility) {
|
|
+ networkAccessible = QNetworkAccessManager::UnknownAccessibility;
|
|
+ emit q->networkAccessibleChanged(networkAccessible);
|
|
+ }
|
|
+ } else {
|
|
+ if (networkAccessible != QNetworkAccessManager::NotAccessible) {
|
|
+ networkAccessible = QNetworkAccessManager::NotAccessible;
|
|
+ emit q->networkAccessibleChanged(networkAccessible);
|
|
}
|
|
-
|
|
- online = isOnline;
|
|
}
|
|
}
|
|
|
|
diff --git a/src/network/access/qnetworkaccessmanager_p.h b/src/network/access/qnetworkaccessmanager_p.h
|
|
index c715da0..54ae114 100644
|
|
--- a/src/network/access/qnetworkaccessmanager_p.h
|
|
+++ b/src/network/access/qnetworkaccessmanager_p.h
|
|
@@ -78,7 +78,6 @@ public:
|
|
customNetworkConfiguration(false),
|
|
networkSessionRequired(networkConfigurationManager.capabilities()
|
|
& QNetworkConfigurationManager::NetworkSessionRequired),
|
|
- networkAccessible(QNetworkAccessManager::Accessible),
|
|
activeReplyCount(0),
|
|
online(false),
|
|
initializeSession(true),
|
|
@@ -86,7 +85,18 @@ public:
|
|
cookieJarCreated(false),
|
|
defaultAccessControl(true),
|
|
authenticationManager(QSharedPointer<QNetworkAccessAuthenticationManager>::create())
|
|
- { }
|
|
+ {
|
|
+#ifndef QT_NO_BEARERMANAGEMENT
|
|
+ // we would need all active configurations to check for
|
|
+ // d->networkConfigurationManager.isOnline(), which is asynchronous
|
|
+ // and potentially expensive. We can just check the configuration here
|
|
+ online = (networkConfiguration.state().testFlag(QNetworkConfiguration::Active));
|
|
+ if (online)
|
|
+ networkAccessible = QNetworkAccessManager::Accessible;
|
|
+ else
|
|
+ networkAccessible = QNetworkAccessManager::NotAccessible;
|
|
+#endif
|
|
+ }
|
|
~QNetworkAccessManagerPrivate();
|
|
|
|
void _q_replyFinished();
|
|
diff --git a/tests/auto/network/access/qnetworkaccessmanager/tst_qnetworkaccessmanager.cpp b/tests/auto/network/access/qnetworkaccessmanager/tst_qnetworkaccessmanager.cpp
|
|
index b4e4b9c..8ecb57d 100644
|
|
--- a/tests/auto/network/access/qnetworkaccessmanager/tst_qnetworkaccessmanager.cpp
|
|
+++ b/tests/auto/network/access/qnetworkaccessmanager/tst_qnetworkaccessmanager.cpp
|
|
@@ -74,6 +74,10 @@ void tst_QNetworkAccessManager::networkAccessible()
|
|
// if there is no session, we cannot know in which state we are in
|
|
QNetworkAccessManager::NetworkAccessibility initialAccessibility =
|
|
manager.networkAccessible();
|
|
+
|
|
+ if (initialAccessibility == QNetworkAccessManager::UnknownAccessibility)
|
|
+ QSKIP("Unknown accessibility", SkipAll);
|
|
+
|
|
QCOMPARE(manager.networkAccessible(), initialAccessibility);
|
|
|
|
manager.setNetworkAccessible(QNetworkAccessManager::NotAccessible);
|
|
@@ -94,29 +98,28 @@ void tst_QNetworkAccessManager::networkAccessible()
|
|
QCOMPARE(manager.networkAccessible(), initialAccessibility);
|
|
|
|
QNetworkConfigurationManager configManager;
|
|
- bool sessionRequired = (configManager.capabilities()
|
|
- & QNetworkConfigurationManager::NetworkSessionRequired);
|
|
QNetworkConfiguration defaultConfig = configManager.defaultConfiguration();
|
|
if (defaultConfig.isValid()) {
|
|
manager.setConfiguration(defaultConfig);
|
|
|
|
- // the accessibility has not changed if no session is required
|
|
- if (sessionRequired) {
|
|
+ QCOMPARE(spy.count(), 0);
|
|
+
|
|
+ if (defaultConfig.state().testFlag(QNetworkConfiguration::Active))
|
|
+ QCOMPARE(manager.networkAccessible(), QNetworkAccessManager::Accessible);
|
|
+ else
|
|
+ QCOMPARE(manager.networkAccessible(), QNetworkAccessManager::NotAccessible);
|
|
+
|
|
+ manager.setNetworkAccessible(QNetworkAccessManager::NotAccessible);
|
|
+
|
|
+ if (defaultConfig.state().testFlag(QNetworkConfiguration::Active)) {
|
|
QCOMPARE(spy.count(), 1);
|
|
- QCOMPARE(spy.takeFirst().at(0).value<QNetworkAccessManager::NetworkAccessibility>(),
|
|
- QNetworkAccessManager::Accessible);
|
|
+ QCOMPARE(QNetworkAccessManager::NetworkAccessibility(spy.takeFirst().at(0).toInt()),
|
|
+ QNetworkAccessManager::NotAccessible);
|
|
} else {
|
|
QCOMPARE(spy.count(), 0);
|
|
}
|
|
- QCOMPARE(manager.networkAccessible(), QNetworkAccessManager::Accessible);
|
|
-
|
|
- manager.setNetworkAccessible(QNetworkAccessManager::NotAccessible);
|
|
-
|
|
- QCOMPARE(spy.count(), 1);
|
|
- QCOMPARE(QNetworkAccessManager::NetworkAccessibility(spy.takeFirst().at(0).toInt()),
|
|
- QNetworkAccessManager::NotAccessible);
|
|
- QCOMPARE(manager.networkAccessible(), QNetworkAccessManager::NotAccessible);
|
|
}
|
|
+ QCOMPARE(manager.networkAccessible(), QNetworkAccessManager::NotAccessible);
|
|
#endif
|
|
}
|
|
|
|
--
|
|
1.9.1
|
|
|