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
qnetworklistmanagernetworkinformationbackend.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
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
8
9#include <QtCore/qglobal.h>
10#include <QtCore/private/qobject_p.h>
11#include <QtCore/qscopeguard.h>
12
13#include <QtCore/private/qfunctions_win_p.h>
14
16
17// Declared in qnetworklistmanagerevents.h
18Q_LOGGING_CATEGORY(lcNetInfoNLM, "qt.network.info.netlistmanager");
19
21{
22 return QString::fromUtf16(QNetworkInformationBackend::PluginNames
23 [QNetworkInformationBackend::PluginNamesWindowsIndex]);
24}
25
26namespace {
27bool testCONNECTIVITY(NLM_CONNECTIVITY connectivity, NLM_CONNECTIVITY flag)
28{
29 return (connectivity & flag) == flag;
30}
31
32QNetworkInformation::Reachability reachabilityFromNLM_CONNECTIVITY(NLM_CONNECTIVITY connectivity)
33{
34 if (connectivity == NLM_CONNECTIVITY_DISCONNECTED)
35 return QNetworkInformation::Reachability::Disconnected;
36 if (testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV6_INTERNET)
37 || testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV4_INTERNET)) {
38 return QNetworkInformation::Reachability::Online;
39 }
40 if (testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV6_SUBNET)
41 || testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV4_SUBNET)) {
42 return QNetworkInformation::Reachability::Site;
43 }
44 if (testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV6_LOCALNETWORK)
45 || testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV4_LOCALNETWORK)) {
46 return QNetworkInformation::Reachability::Local;
47 }
48 if (testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV6_NOTRAFFIC)
49 || testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV4_NOTRAFFIC)) {
50 return QNetworkInformation::Reachability::Unknown;
51 }
52
53 return QNetworkInformation::Reachability::Unknown;
54}
55}
56
58{
60public:
63
64 QString name() const override { return backendName(); }
66 {
67 return featuresSupportedStatic();
68 }
69
71 {
72 return QNetworkInformation::Features(QNetworkInformation::Feature::Reachability
73 | QNetworkInformation::Feature::CaptivePortal
74#if QT_CONFIG(cpp_winrt)
75 | QNetworkInformation::Feature::TransportMedium
76 | QNetworkInformation::Feature::Metered
77#endif
78 );
79 }
80
81 [[nodiscard]] bool start();
82 void stop();
83
84private:
85 bool event(QEvent *event) override;
86 void setConnectivity(NLM_CONNECTIVITY newConnectivity);
87 void checkCaptivePortal();
88
89 QComHelper comHelper;
90
91 ComPtr<QNetworkListManagerEvents> managerEvents;
92
93 NLM_CONNECTIVITY connectivity = NLM_CONNECTIVITY_DISCONNECTED;
94
95 bool monitoring = false;
96};
97
99{
100 Q_OBJECT
101 Q_PLUGIN_METADATA(IID QNetworkInformationBackendFactory_iid)
103public:
106 QString name() const override { return backendName(); }
108 {
109 return QNetworkListManagerNetworkInformationBackend::featuresSupportedStatic();
110 }
111
113 create(QNetworkInformation::Features requiredFeatures) const override
114 {
115 if ((requiredFeatures & featuresSupported()) != requiredFeatures)
116 return nullptr;
118 if (!backend->start()) {
119 qCWarning(lcNetInfoNLM) << "Failed to start listening to events";
120 delete backend;
121 backend = nullptr;
122 }
123 return backend;
124 }
125};
126
127QNetworkListManagerNetworkInformationBackend::QNetworkListManagerNetworkInformationBackend()
128{
129 if (!comHelper.isValid())
130 return;
131
132 managerEvents = new QNetworkListManagerEvents();
133 connect(managerEvents.Get(), &QNetworkListManagerEvents::connectivityChanged, this,
134 &QNetworkListManagerNetworkInformationBackend::setConnectivity);
135
136 connect(managerEvents.Get(), &QNetworkListManagerEvents::transportMediumChanged, this,
137 &QNetworkListManagerNetworkInformationBackend::setTransportMedium);
138
139 connect(managerEvents.Get(), &QNetworkListManagerEvents::isMeteredChanged, this,
140 &QNetworkListManagerNetworkInformationBackend::setMetered);
141}
142
147
148void QNetworkListManagerNetworkInformationBackend::setConnectivity(NLM_CONNECTIVITY newConnectivity)
149{
150 if (reachabilityFromNLM_CONNECTIVITY(connectivity)
151 != reachabilityFromNLM_CONNECTIVITY(newConnectivity)) {
152 connectivity = newConnectivity;
153 setReachability(reachabilityFromNLM_CONNECTIVITY(newConnectivity));
154
155 // @future: only check if signal is connected
156 checkCaptivePortal();
157 }
158}
159
160void QNetworkListManagerNetworkInformationBackend::checkCaptivePortal()
161{
162 setBehindCaptivePortal(managerEvents->checkBehindCaptivePortal());
163}
164
166{
167 if (event->type() == QEvent::ThreadChange)
168 qFatal("Moving QNetworkListManagerNetworkInformationBackend to different thread is not supported");
169
170 return QObject::event(event);
171}
172
174{
175 Q_ASSERT(!monitoring);
176
177 if (!comHelper.isValid())
178 return false;
179
180 if (!managerEvents)
181 managerEvents = new QNetworkListManagerEvents();
182
183 if (managerEvents->start())
184 monitoring = true;
185 return monitoring;
186}
187
189{
190 if (monitoring) {
191 Q_ASSERT(managerEvents);
192 managerEvents->stop();
193 monitoring = false;
194 managerEvents.Reset();
195 }
196}
197
198QT_END_NAMESPACE
199
200#include "qnetworklistmanagernetworkinformationbackend.moc"
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 QNetworkInformationBackend::featuresSupported().
QString name() const override
Backend name, return the same in QNetworkInformationBackend::name().
QString name() const override
Backend name, return the same in QNetworkInformationBackendFactory::name().
bool event(QEvent *event) override
This virtual function receives events to an object and should return true if the event e was recogniz...
QNetworkInformation::Features featuresSupported() const override
Features supported, return the same in QNetworkInformationBackendFactory::featuresSupported().