5#include <QtNetwork/private/qnetworkinformation_p.h>
7#include <QtCore/qglobal.h>
8#include <QtCore/private/qobject_p.h>
14using namespace Qt::StringLiterals;
16Q_DECLARE_LOGGING_CATEGORY(lcNetInfoGlib)
17Q_LOGGING_CATEGORY(lcNetInfoGlib,
"qt.network.info.glib");
20QNetworkInformation::Reachability reachabilityFromGNetworkConnectivity(GNetworkConnectivity connectivity)
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;
31 return QNetworkInformation::Reachability::Unknown;
37 static auto name = u"glib"_s;
53 return featuresSupportedStatic();
58 using Feature = QNetworkInformation::Feature;
59 return QNetworkInformation::Features(Feature::Reachability | Feature::CaptivePortal
71 GNetworkMonitor *networkMonitor =
nullptr;
72 gulong connectivityHandlerId = 0;
73 gulong networkHandlerId = 0;
74 gulong meteredHandlerId = 0;
80 Q_PLUGIN_METADATA(IID QNetworkInformationBackendFactory_iid)
88 return QGlibNetworkInformationBackend::featuresSupportedStatic();
93 if ((requiredFeatures & featuresSupported()) != requiredFeatures)
96 if (!backend->isValid())
97 delete std::exchange(backend,
nullptr);
105: networkMonitor(g_network_monitor_get_default())
107 updateConnectivity(
this);
110 connectivityHandlerId = g_signal_connect_swapped(networkMonitor,
"notify::connectivity",
111 G_CALLBACK(updateConnectivity),
this);
113 networkHandlerId = g_signal_connect_swapped(networkMonitor,
"network-changed",
114 G_CALLBACK(updateConnectivity),
this);
116 meteredHandlerId = g_signal_connect_swapped(networkMonitor,
"notify::network-metered",
117 G_CALLBACK(updateMetered),
this);
122 g_signal_handler_disconnect(networkMonitor, meteredHandlerId);
123 g_signal_handler_disconnect(networkMonitor, networkHandlerId);
124 g_signal_handler_disconnect(networkMonitor, connectivityHandlerId);
129 return QLatin1StringView(G_OBJECT_TYPE_NAME(networkMonitor)) !=
"GNetworkMonitorBase"_L1;
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);
142 backend->setMetered(g_network_monitor_get_network_metered(backend->networkMonitor));
147#include "qglibnetworkinformationbackend.moc"