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 networkHandlerId = g_signal_connect_swapped(networkMonitor, "network-changed",
114 G_CALLBACK(updateConnectivity), this);
115
116 meteredHandlerId = g_signal_connect_swapped(networkMonitor, "notify::network-metered",
117 G_CALLBACK(updateMetered), this);
118}
119
121{
122 g_signal_handler_disconnect(networkMonitor, meteredHandlerId);
123 g_signal_handler_disconnect(networkMonitor, networkHandlerId);
124 g_signal_handler_disconnect(networkMonitor, connectivityHandlerId);
125}
126
128{
129 return QLatin1StringView(G_OBJECT_TYPE_NAME(networkMonitor)) != "GNetworkMonitorBase"_L1;
130}
131
132void QGlibNetworkInformationBackend::updateConnectivity(QGlibNetworkInformationBackend *backend)
133{
134 const auto connectivityState = g_network_monitor_get_connectivity(backend->networkMonitor);
135 const bool behindPortal = (connectivityState == G_NETWORK_CONNECTIVITY_PORTAL);
136 backend->setReachability(reachabilityFromGNetworkConnectivity(connectivityState));
137 backend->setBehindCaptivePortal(behindPortal);
138}
139
141{
142 backend->setMetered(g_network_monitor_get_network_metered(backend->networkMonitor));
143}
144
145QT_END_NAMESPACE
146
147#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()