Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qglibnetworkinformationbackend.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 Ilya Fedin <fedin-ilja2010@ya.ru>
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#include <QtNetwork/private/qnetworkinformation_p.h>
6
7#include <QtCore/qglobal.h>
8#include <QtCore/private/qobject_p.h>
9
10#include <gio/gio.h>
11
12QT_BEGIN_NAMESPACE
13
14using namespace Qt::StringLiterals;
15
16Q_DECLARE_LOGGING_CATEGORY(lcNetInfoGlib)
17Q_LOGGING_CATEGORY(lcNetInfoGlib, "qt.network.info.glib");
18
19namespace {
20QNetworkInformation::Reachability reachabilityFromGNetworkConnectivity(GNetworkConnectivity connectivity)
21{
22 switch (connectivity) {
23 case G_NETWORK_CONNECTIVITY_LOCAL:
24 return QNetworkInformation::Reachability::Disconnected;
25 case G_NETWORK_CONNECTIVITY_LIMITED:
26 case G_NETWORK_CONNECTIVITY_PORTAL:
27 return QNetworkInformation::Reachability::Site;
28 case G_NETWORK_CONNECTIVITY_FULL:
29 return QNetworkInformation::Reachability::Online;
30 }
31 return QNetworkInformation::Reachability::Unknown;
32}
33}
34
35static const QString &backendName()
36{
37 static auto name = u"glib"_s;
38 return name;
39}
40
42{
44public:
47
48 QString name() const override { return backendName(); }
50 {
51 if (!isValid())
52 return {};
53 return featuresSupportedStatic();
54 }
55
57 {
58 using Feature = QNetworkInformation::Feature;
59 return QNetworkInformation::Features(Feature::Reachability | Feature::CaptivePortal
60 | Feature::Metered);
61 }
62
63 bool isValid() const;
64
65private:
67
69 static void updateMetered(QGlibNetworkInformationBackend *backend);
70
71 GNetworkMonitor *networkMonitor = nullptr;
72 gulong connectivityHandlerId = 0;
73 gulong networkHandlerId = 0;
74 gulong meteredHandlerId = 0;
75};
76
78{
79 Q_OBJECT
80 Q_PLUGIN_METADATA(IID QNetworkInformationBackendFactory_iid)
82public:
85 QString name() const override { return backendName(); }
87 {
88 return QGlibNetworkInformationBackend::featuresSupportedStatic();
89 }
90
91 QNetworkInformationBackend *create(QNetworkInformation::Features requiredFeatures) const override
92 {
93 if ((requiredFeatures & featuresSupported()) != requiredFeatures)
94 return nullptr;
95 auto backend = new QGlibNetworkInformationBackend();
96 if (!backend->isValid())
97 delete std::exchange(backend, nullptr);
98 return backend;
99 }
100private:
102};
103
104QGlibNetworkInformationBackend::QGlibNetworkInformationBackend()
105: networkMonitor(g_network_monitor_get_default())
106{
107 updateConnectivity(this);
108 updateMetered(this);
109
110 connectivityHandlerId = g_signal_connect_swapped(networkMonitor, "notify::connectivity",
111 G_CALLBACK(updateConnectivity), this);
112
113 // needed until GLib 2.86 for netlink support
114 networkHandlerId = g_signal_connect_swapped(networkMonitor, "notify::network-available",
115 G_CALLBACK(updateConnectivity), this);
116
117 meteredHandlerId = g_signal_connect_swapped(networkMonitor, "notify::network-metered",
118 G_CALLBACK(updateMetered), this);
119}
120
122{
123 g_signal_handler_disconnect(networkMonitor, meteredHandlerId);
124 g_signal_handler_disconnect(networkMonitor, networkHandlerId);
125 g_signal_handler_disconnect(networkMonitor, connectivityHandlerId);
126}
127
129{
130 return QLatin1StringView(G_OBJECT_TYPE_NAME(networkMonitor)) != "GNetworkMonitorBase"_L1;
131}
132
133void QGlibNetworkInformationBackend::updateConnectivity(QGlibNetworkInformationBackend *backend)
134{
135 const auto connectivityState = g_network_monitor_get_connectivity(backend->networkMonitor);
136 const bool behindPortal = (connectivityState == G_NETWORK_CONNECTIVITY_PORTAL);
137 backend->setReachability(reachabilityFromGNetworkConnectivity(connectivityState));
138 backend->setBehindCaptivePortal(behindPortal);
139}
140
142{
143 backend->setMetered(g_network_monitor_get_network_metered(backend->networkMonitor));
144}
145
146QT_END_NAMESPACE
147
148#include "qglibnetworkinformationbackend.moc"
QNetworkInformation::Features featuresSupported() const override
Features supported, return the same in QNetworkInformationBackend::featuresSupported().
QString name() const override
Backend name, return the same in QNetworkInformationBackend::name().
QNetworkInformationBackend * create(QNetworkInformation::Features requiredFeatures) const override
Create and return an instance of QNetworkInformationBackend.
QNetworkInformation::Features featuresSupported() const override
Features supported, return the same in QNetworkInformationBackendFactory::featuresSupported().
static QNetworkInformation::Features featuresSupportedStatic()
QString name() const override
Backend name, return the same in QNetworkInformationBackendFactory::name().
static const QString & backendName()