diff options
Diffstat (limited to 'src/network/kernel/qnetconmonitor_darwin.mm')
-rw-r--r-- | src/network/kernel/qnetconmonitor_darwin.mm | 186 |
1 files changed, 37 insertions, 149 deletions
diff --git a/src/network/kernel/qnetconmonitor_darwin.mm b/src/network/kernel/qnetconmonitor_darwin.mm index 9c0c4a55f4..60b3cd6581 100644 --- a/src/network/kernel/qnetconmonitor_darwin.mm +++ b/src/network/kernel/qnetconmonitor_darwin.mm @@ -1,43 +1,7 @@ -/**************************************************************************** -** -** Copyright (C) 2019 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtNetwork module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "private/qnativesocketengine_p.h" +// Copyright (C) 2019 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "private/qnativesocketengine_p_p.h" #include "private/qnetconmonitor_p.h" #include "private/qobject_p.h" @@ -124,6 +88,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 +106,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 +137,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. @@ -208,7 +192,7 @@ bool QNetworkConnectionMonitor::setTargets(const QHostAddress &local, const QHos qt_sockaddr client = qt_hostaddress_to_sockaddr(local); if (remote.isNull()) { - // That's a special case our QNetworkStatusMonitor is using (AnyIpv4/6 address to check an overall status). + // That's a special case our QNetworkInformation backend is using (AnyIpv4/6 address to check an overall status). d->probe = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, reinterpret_cast<sockaddr *>(&client)); } else { qt_sockaddr target = qt_hostaddress_to_sockaddr(remote); @@ -301,124 +285,28 @@ bool QNetworkConnectionMonitor::isReachable() return d->isReachable(); } -class QNetworkStatusMonitorPrivate : public QObjectPrivate +#ifdef QT_PLATFORM_UIKIT +bool QNetworkConnectionMonitor::isWwan() const { -public: - QNetworkConnectionMonitor ipv4Probe; - bool isOnlineIpv4 = false; - QNetworkConnectionMonitor ipv6Probe; - bool isOnlineIpv6 = false; -}; - -QNetworkStatusMonitor::QNetworkStatusMonitor(QObject *parent) - : QObject(*new QNetworkStatusMonitorPrivate, parent) -{ - Q_D(QNetworkStatusMonitor); - - if (d->ipv4Probe.setTargets(QHostAddress::AnyIPv4, {})) { - // We manage to create SCNetworkReachabilityRef for IPv4, let's - // read the last known state then! - d->isOnlineIpv4 = d->ipv4Probe.isReachable(); - } - - if (d->ipv6Probe.setTargets(QHostAddress::AnyIPv6, {})) { - // We manage to create SCNetworkReachability ref for IPv6, let's - // read the last known state then! - d->isOnlineIpv6 = d->ipv6Probe.isReachable(); - } - - - connect(&d->ipv4Probe, &QNetworkConnectionMonitor::reachabilityChanged, this, - &QNetworkStatusMonitor::reachabilityChanged, Qt::QueuedConnection); - connect(&d->ipv6Probe, &QNetworkConnectionMonitor::reachabilityChanged, this, - &QNetworkStatusMonitor::reachabilityChanged, Qt::QueuedConnection); -} - -QNetworkStatusMonitor::~QNetworkStatusMonitor() -{ - Q_D(QNetworkStatusMonitor); - - d->ipv4Probe.disconnect(); - d->ipv4Probe.stopMonitoring(); - d->ipv6Probe.disconnect(); - d->ipv6Probe.stopMonitoring(); -} - -bool QNetworkStatusMonitor::start() -{ - Q_D(QNetworkStatusMonitor); + Q_D(const QNetworkConnectionMonitor); if (isMonitoring()) { - qCWarning(lcNetMon, "Network status monitor is already active"); - return true; + qCWarning(lcNetMon, "Calling isWwan() is unsafe after the monitoring started"); + return false; } - d->ipv4Probe.startMonitoring(); - d->ipv6Probe.startMonitoring(); - - return isMonitoring(); -} - -void QNetworkStatusMonitor::stop() -{ - Q_D(QNetworkStatusMonitor); - - if (d->ipv4Probe.isMonitoring()) - d->ipv4Probe.stopMonitoring(); - if (d->ipv6Probe.isMonitoring()) - d->ipv6Probe.stopMonitoring(); -} - -bool QNetworkStatusMonitor::isMonitoring() const -{ - Q_D(const QNetworkStatusMonitor); - - return d->ipv4Probe.isMonitoring() || d->ipv6Probe.isMonitoring(); -} - -bool QNetworkStatusMonitor::isNetworkAccessible() -{ - // This function is to be executed on the thread that created - // and uses 'this'. - Q_D(QNetworkStatusMonitor); - - return d->isOnlineIpv4 || d->isOnlineIpv6; -} + if (!d->probe) { + qCWarning(lcNetMon, "Medium is unknown, set the target first"); + return false; + } -bool QNetworkStatusMonitor::event(QEvent *event) -{ - return QObject::event(event); + return d->isWwan(); } +#endif -bool QNetworkStatusMonitor::isEnabled() +bool QNetworkConnectionMonitor::isEnabled() { return true; } -void QNetworkStatusMonitor::reachabilityChanged(bool online) -{ - // This function is executed on the thread that created/uses 'this', - // not on the reachability queue. - Q_D(QNetworkStatusMonitor); - - auto probe = qobject_cast<QNetworkConnectionMonitor *>(sender()); - if (!probe) - return; - - const bool isIpv4 = probe == &d->ipv4Probe; - bool &probeOnline = isIpv4 ? d->isOnlineIpv4 : d->isOnlineIpv6; - bool otherOnline = isIpv4 ? d->isOnlineIpv6 : d->isOnlineIpv4; - - if (probeOnline == online) { - // We knew this already? - return; - } - - probeOnline = online; - if (!otherOnline) { - // We either just lost or got a network access. - emit onlineStateChanged(probeOnline); - } -} - QT_END_NAMESPACE |