summaryrefslogtreecommitdiffstats
path: root/src/network/kernel/qnetconmonitor_darwin.mm
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/kernel/qnetconmonitor_darwin.mm')
-rw-r--r--src/network/kernel/qnetconmonitor_darwin.mm186
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