5#include <QtNetwork/private/qnetworkinformation_p.h>
9#include <QtCore/qglobal.h>
10#include <QtCore/private/qobject_p.h>
11#include <QtCore/qscopeguard.h>
13#include <QtCore/private/qfunctions_win_p.h>
18Q_LOGGING_CATEGORY(lcNetInfoNLM,
"qt.network.info.netlistmanager");
22 return QString::fromUtf16(QNetworkInformationBackend::PluginNames
23 [QNetworkInformationBackend::PluginNamesWindowsIndex]);
27bool testCONNECTIVITY(NLM_CONNECTIVITY connectivity, NLM_CONNECTIVITY flag)
29 return (connectivity & flag) == flag;
32QNetworkInformation::Reachability reachabilityFromNLM_CONNECTIVITY(NLM_CONNECTIVITY connectivity)
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;
40 if (testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV6_SUBNET)
41 || testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV4_SUBNET)) {
42 return QNetworkInformation::Reachability::Site;
44 if (testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV6_LOCALNETWORK)
45 || testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV4_LOCALNETWORK)) {
46 return QNetworkInformation::Reachability::Local;
48 if (testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV6_NOTRAFFIC)
49 || testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV4_NOTRAFFIC)) {
50 return QNetworkInformation::Reachability::Unknown;
53 return QNetworkInformation::Reachability::Unknown;
67 return featuresSupportedStatic();
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
85 bool event(QEvent *event)
override;
86 void setConnectivity(NLM_CONNECTIVITY newConnectivity);
87 void checkCaptivePortal();
91 ComPtr<QNetworkListManagerEvents> managerEvents;
95 bool monitoring =
false;
101 Q_PLUGIN_METADATA(IID QNetworkInformationBackendFactory_iid)
109 return QNetworkListManagerNetworkInformationBackend::featuresSupportedStatic();
113 create(QNetworkInformation::Features requiredFeatures)
const override
115 if ((requiredFeatures & featuresSupported()) != requiredFeatures)
119 qCWarning(lcNetInfoNLM) <<
"Failed to start listening to events";
129 if (!comHelper.isValid())
132 managerEvents =
new QNetworkListManagerEvents();
133 connect(managerEvents.Get(), &QNetworkListManagerEvents::connectivityChanged,
this,
134 &QNetworkListManagerNetworkInformationBackend::setConnectivity);
136 connect(managerEvents.Get(), &QNetworkListManagerEvents::transportMediumChanged,
this,
137 &QNetworkListManagerNetworkInformationBackend::setTransportMedium);
139 connect(managerEvents.Get(), &QNetworkListManagerEvents::isMeteredChanged,
this,
140 &QNetworkListManagerNetworkInformationBackend::setMetered);
150 if (reachabilityFromNLM_CONNECTIVITY(connectivity)
151 != reachabilityFromNLM_CONNECTIVITY(newConnectivity)) {
152 connectivity = newConnectivity;
153 setReachability(reachabilityFromNLM_CONNECTIVITY(newConnectivity));
156 checkCaptivePortal();
162 setBehindCaptivePortal(managerEvents->checkBehindCaptivePortal());
167 if (event->type() == QEvent::ThreadChange)
168 qFatal(
"Moving QNetworkListManagerNetworkInformationBackend to different thread is not supported");
170 return QObject::event(event);
175 Q_ASSERT(!monitoring);
177 if (!comHelper.isValid())
181 managerEvents =
new QNetworkListManagerEvents();
183 if (managerEvents->start())
191 Q_ASSERT(managerEvents);
192 managerEvents->stop();
194 managerEvents.Reset();
200#include "qnetworklistmanagernetworkinformationbackend.moc"