From a6947853ee0181098d963dab315c59b926187c42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Mon, 18 Oct 2021 17:48:36 +0200 Subject: QNI: transportMedium support for iOS It can only differentiate between cellular and not cellular and then we can determine if it's disconnected or (presumably) using wifi. It is also explicitly not supported on macOS, which adds to the confusion. Task-number: QTBUG-91023 Change-Id: I1d002ba06dd9acf1a0daabfb2a4193c07871e9b4 Reviewed-by: Timur Pocheptsov Reviewed-by: Edward Welbourne Reviewed-by: Qt CI Bot --- src/network/kernel/qnetconmonitor_darwin.mm | 39 +++++++++++++++++++++++++++++ src/network/kernel/qnetconmonitor_p.h | 10 +++++++- 2 files changed, 48 insertions(+), 1 deletion(-) (limited to 'src/network/kernel') diff --git a/src/network/kernel/qnetconmonitor_darwin.mm b/src/network/kernel/qnetconmonitor_darwin.mm index 42540c38ee..a899d3b98d 100644 --- a/src/network/kernel/qnetconmonitor_darwin.mm +++ b/src/network/kernel/qnetconmonitor_darwin.mm @@ -124,6 +124,9 @@ public: void updateState(SCNetworkReachabilityFlags newState); void reset(); bool isReachable() const; +#ifdef QT_PLATFORM_UIKIT + bool isWwan() const; +#endif static void probeCallback(SCNetworkReachabilityRef probe, SCNetworkReachabilityFlags flags, void *info); @@ -139,9 +142,19 @@ void QNetworkConnectionMonitorPrivate::updateState(SCNetworkReachabilityFlags ne // is set. There are more possible flags that require more tests/some special // setup. So in future this part and related can change/be extended. const bool wasReachable = isReachable(); + +#ifdef QT_PLATFORM_UIKIT + const bool hadWwan = isWwan(); +#endif + state = newState; if (wasReachable != isReachable()) emit q->reachabilityChanged(isReachable()); + +#ifdef QT_PLATFORM_UIKIT + if (hadWwan != isWwan()) + emit q->isWwanChanged(isWwan()); +#endif } void QNetworkConnectionMonitorPrivate::reset() @@ -160,6 +173,13 @@ bool QNetworkConnectionMonitorPrivate::isReachable() const return !!(state & kSCNetworkReachabilityFlagsReachable); } +#ifdef QT_PLATFORM_UIKIT // The IsWWAN flag is not available on macOS +bool QNetworkConnectionMonitorPrivate::isWwan() const +{ + return !!(state & kSCNetworkReachabilityFlagsIsWWAN); +} +#endif + void QNetworkConnectionMonitorPrivate::probeCallback(SCNetworkReachabilityRef probe, SCNetworkReachabilityFlags flags, void *info) { // To be executed only on the reachability queue. @@ -301,6 +321,25 @@ bool QNetworkConnectionMonitor::isReachable() return d->isReachable(); } +#ifdef QT_PLATFORM_UIKIT +bool QNetworkConnectionMonitor::isWwan() const +{ + Q_D(const QNetworkConnectionMonitor); + + if (isMonitoring()) { + qCWarning(lcNetMon, "Calling isReachable() is unsafe after the monitoring started"); + return false; + } + + if (!d->probe) { + qCWarning(lcNetMon, "Reachability is unknown, set the target first"); + return false; + } + + return d->isWwan(); +} +#endif + bool QNetworkConnectionMonitor::isEnabled() { return true; diff --git a/src/network/kernel/qnetconmonitor_p.h b/src/network/kernel/qnetconmonitor_p.h index c6d44ae559..99acbf4dea 100644 --- a/src/network/kernel/qnetconmonitor_p.h +++ b/src/network/kernel/qnetconmonitor_p.h @@ -73,7 +73,11 @@ public: bool setTargets(const QHostAddress &local, const QHostAddress &remote); bool isReachable(); - // Important: on Darwin you should not call isReachable() after +#ifdef QT_PLATFORM_UIKIT + bool isWwan() const; +#endif + + // Important: on Darwin you should not call isReachable/isWwan() after // startMonitoring(), you have to listen to reachabilityChanged() // signal instead. bool startMonitoring(); @@ -87,6 +91,10 @@ Q_SIGNALS: // callback is coming on a special dispatch queue. void reachabilityChanged(bool isOnline); +#ifdef QT_PLATFORM_UIKIT + void isWwanChanged(bool isWwan); +#endif + private: Q_DECLARE_PRIVATE(QNetworkConnectionMonitor) Q_DISABLE_COPY_MOVE(QNetworkConnectionMonitor) -- cgit v1.2.3