4#include <QtNetwork/private/qnetworkinformation_p.h>
8#include <QtCore/qglobal.h>
9#include <QtCore/private/qobject_p.h>
10#include <QtCore/qscopeguard.h>
12#include <QtCore/private/qfunctions_win_p.h>
17Q_LOGGING_CATEGORY(lcNetInfoNLM,
"qt.network.info.netlistmanager");
21 return QString::fromUtf16(QNetworkInformationBackend::PluginNames
22 [QNetworkInformationBackend::PluginNamesWindowsIndex]);
26bool testCONNECTIVITY(NLM_CONNECTIVITY connectivity, NLM_CONNECTIVITY flag)
28 return (connectivity & flag) == flag;
31QNetworkInformation::Reachability reachabilityFromNLM_CONNECTIVITY(NLM_CONNECTIVITY connectivity)
33 if (connectivity == NLM_CONNECTIVITY_DISCONNECTED)
34 return QNetworkInformation::Reachability::Disconnected;
35 if (testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV6_INTERNET)
36 || testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV4_INTERNET)) {
37 return QNetworkInformation::Reachability::Online;
39 if (testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV6_SUBNET)
40 || testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV4_SUBNET)) {
41 return QNetworkInformation::Reachability::Site;
43 if (testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV6_LOCALNETWORK)
44 || testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV4_LOCALNETWORK)) {
45 return QNetworkInformation::Reachability::Local;
47 if (testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV6_NOTRAFFIC)
48 || testCONNECTIVITY(connectivity, NLM_CONNECTIVITY_IPV4_NOTRAFFIC)) {
49 return QNetworkInformation::Reachability::Unknown;
52 return QNetworkInformation::Reachability::Unknown;
66 return featuresSupportedStatic();
71 return QNetworkInformation::Features(QNetworkInformation::Feature::Reachability
72 | QNetworkInformation::Feature::CaptivePortal
73#if QT_CONFIG(cpp_winrt)
74 | QNetworkInformation::Feature::TransportMedium
75 | QNetworkInformation::Feature::Metered
84 bool event(QEvent *event)
override;
85 void setConnectivity(NLM_CONNECTIVITY newConnectivity);
86 void checkCaptivePortal();
90 ComPtr<QNetworkListManagerEvents> managerEvents;
94 bool monitoring =
false;
100 Q_PLUGIN_METADATA(IID QNetworkInformationBackendFactory_iid)
108 return QNetworkListManagerNetworkInformationBackend::featuresSupportedStatic();
112 create(QNetworkInformation::Features requiredFeatures)
const override
114 if ((requiredFeatures & featuresSupported()) != requiredFeatures)
118 qCWarning(lcNetInfoNLM) <<
"Failed to start listening to events";
128 if (!comHelper.isValid())
131 managerEvents =
new QNetworkListManagerEvents();
132 connect(managerEvents.Get(), &QNetworkListManagerEvents::connectivityChanged,
this,
133 &QNetworkListManagerNetworkInformationBackend::setConnectivity);
135 connect(managerEvents.Get(), &QNetworkListManagerEvents::transportMediumChanged,
this,
136 &QNetworkListManagerNetworkInformationBackend::setTransportMedium);
138 connect(managerEvents.Get(), &QNetworkListManagerEvents::isMeteredChanged,
this,
139 &QNetworkListManagerNetworkInformationBackend::setMetered);
149 if (reachabilityFromNLM_CONNECTIVITY(connectivity)
150 != reachabilityFromNLM_CONNECTIVITY(newConnectivity)) {
151 connectivity = newConnectivity;
152 setReachability(reachabilityFromNLM_CONNECTIVITY(newConnectivity));
155 checkCaptivePortal();
161 setBehindCaptivePortal(managerEvents->checkBehindCaptivePortal());
166 if (event->type() == QEvent::ThreadChange)
167 qFatal(
"Moving QNetworkListManagerNetworkInformationBackend to different thread is not supported");
169 return QObject::event(event);
174 Q_ASSERT(!monitoring);
176 if (!comHelper.isValid())
180 managerEvents =
new QNetworkListManagerEvents();
182 if (managerEvents->start())
190 Q_ASSERT(managerEvents);
191 managerEvents->stop();
193 managerEvents.Reset();
199#include "qnetworklistmanagernetworkinformationbackend.moc"
Combined button and popup list for selecting options.