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
qnetworkmanagernetworkinformationbackend.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
6
7#include <QtCore/qglobal.h>
8#include <QtCore/private/qobject_p.h>
9
10#include <QtDBus/qdbusmessage.h>
11
13Q_DECLARE_LOGGING_CATEGORY(lcNetInfoNLM)
14Q_LOGGING_CATEGORY(lcNetInfoNM, "qt.network.info.networkmanager");
15
16namespace {
17QNetworkInformation::Reachability reachabilityFromNMState(QNetworkManagerInterface::NMState state)
18{
19 switch (state) {
20 case QNetworkManagerInterface::NM_STATE_UNKNOWN:
21 case QNetworkManagerInterface::NM_STATE_ASLEEP:
22 case QNetworkManagerInterface::NM_STATE_CONNECTING:
23 return QNetworkInformation::Reachability::Unknown;
24 case QNetworkManagerInterface::NM_STATE_DISCONNECTING: // No point in starting new connections:
25 case QNetworkManagerInterface::NM_STATE_DISCONNECTED:
26 return QNetworkInformation::Reachability::Disconnected;
27 case QNetworkManagerInterface::NM_STATE_CONNECTED_LOCAL:
28 return QNetworkInformation::Reachability::Local;
29 case QNetworkManagerInterface::NM_STATE_CONNECTED_SITE:
30 return QNetworkInformation::Reachability::Site;
31 case QNetworkManagerInterface::NM_STATE_CONNECTED_GLOBAL:
32 return QNetworkInformation::Reachability::Online;
33 }
34 return QNetworkInformation::Reachability::Unknown;
35}
36
37QNetworkInformation::TransportMedium
38transportMediumFromDeviceType(QNetworkManagerInterface::NMDeviceType type)
39{
40 switch (type) {
41 case QNetworkManagerInterface::NM_DEVICE_TYPE_ETHERNET:
42 return QNetworkInformation::TransportMedium::Ethernet;
43 case QNetworkManagerInterface::NM_DEVICE_TYPE_WIFI:
44 return QNetworkInformation::TransportMedium::WiFi;
45 case QNetworkManagerInterface::NM_DEVICE_TYPE_BT:
46 return QNetworkInformation::TransportMedium::Bluetooth;
47 case QNetworkManagerInterface::NM_DEVICE_TYPE_MODEM:
48 return QNetworkInformation::TransportMedium::Cellular;
49
50 case QNetworkManagerInterface::NM_DEVICE_TYPE_UNKNOWN:
51 case QNetworkManagerInterface::NM_DEVICE_TYPE_GENERIC:
52 case QNetworkManagerInterface::NM_DEVICE_TYPE_UNUSED1:
53 case QNetworkManagerInterface::NM_DEVICE_TYPE_UNUSED2:
54 case QNetworkManagerInterface::NM_DEVICE_TYPE_OLPC_MESH:
55 case QNetworkManagerInterface::NM_DEVICE_TYPE_WIMAX:
56 case QNetworkManagerInterface::NM_DEVICE_TYPE_INFINIBAND:
57 case QNetworkManagerInterface::NM_DEVICE_TYPE_BOND:
58 case QNetworkManagerInterface::NM_DEVICE_TYPE_VLAN:
59 case QNetworkManagerInterface::NM_DEVICE_TYPE_ADSL:
60 case QNetworkManagerInterface::NM_DEVICE_TYPE_BRIDGE:
61 case QNetworkManagerInterface::NM_DEVICE_TYPE_TEAM:
62 case QNetworkManagerInterface::NM_DEVICE_TYPE_TUN:
63 case QNetworkManagerInterface::NM_DEVICE_TYPE_IP_TUNNEL:
64 case QNetworkManagerInterface::NM_DEVICE_TYPE_MACVLAN:
65 case QNetworkManagerInterface::NM_DEVICE_TYPE_VXLAN:
66 case QNetworkManagerInterface::NM_DEVICE_TYPE_VETH:
67 case QNetworkManagerInterface::NM_DEVICE_TYPE_MACSEC:
68 case QNetworkManagerInterface::NM_DEVICE_TYPE_DUMMY:
69 case QNetworkManagerInterface::NM_DEVICE_TYPE_PPP:
70 case QNetworkManagerInterface::NM_DEVICE_TYPE_OVS_INTERFACE:
71 case QNetworkManagerInterface::NM_DEVICE_TYPE_OVS_PORT:
72 case QNetworkManagerInterface::NM_DEVICE_TYPE_OVS_BRIDGE:
73 case QNetworkManagerInterface::NM_DEVICE_TYPE_WPAN:
74 case QNetworkManagerInterface::NM_DEVICE_TYPE_6LOWPAN:
75 case QNetworkManagerInterface::NM_DEVICE_TYPE_WIREGUARD:
76 case QNetworkManagerInterface::NM_DEVICE_TYPE_WIFI_P2P:
77 case QNetworkManagerInterface::NM_DEVICE_TYPE_VRF:
78 break;
79 }
80 // While the list is exhaustive of the enum there can be additional
81 // entries added in NetworkManager that isn't listed here
82 return QNetworkInformation::TransportMedium::Unknown;
83}
84
85bool isMeteredFromNMMetered(QNetworkManagerInterface::NMMetered metered)
86{
87 switch (metered) {
90 return true;
94 return false;
95 }
96 Q_UNREACHABLE_RETURN(false);
97}
98} // unnamed namespace
99
101{
102 return QStringView(QNetworkInformationBackend::PluginNames
103 [QNetworkInformationBackend::PluginNamesLinuxIndex]).toString();
104}
105
107{
108 return backendName();
109}
110
112{
113 Q_OBJECT
114 Q_PLUGIN_METADATA(IID QNetworkInformationBackendFactory_iid)
116public:
119 QString name() const override { return backendName(); }
121 {
123 return {};
124 return QNetworkManagerNetworkInformationBackend::featuresSupportedStatic();
125 }
126
127 QNetworkInformationBackend *create(QNetworkInformation::Features requiredFeatures) const override
128 {
129 if ((requiredFeatures & featuresSupported()) != requiredFeatures)
130 return nullptr;
132 return nullptr;
133 auto backend = new QNetworkManagerNetworkInformationBackend();
134 if (!backend->isValid())
135 delete std::exchange(backend, nullptr);
136 return backend;
137 }
138private:
140};
141
142QNetworkManagerNetworkInformationBackend::QNetworkManagerNetworkInformationBackend()
143{
144 if (!iface.isValid())
145 return;
146 iface.setBackend(this);
147 onStateChanged(iface.state());
148 onConnectivityChanged(iface.connectivityState());
149 onDeviceTypeChanged(iface.deviceType());
150 onMeteredChanged(iface.meteredState());
151}
152
154 QNetworkManagerInterface::NMState newState)
155{
156 setReachability(reachabilityFromNMState(newState));
157}
158
160 QNetworkManagerInterface::NMConnectivityState connectivityState)
161{
162 const bool behindPortal =
163 (connectivityState == QNetworkManagerInterface::NM_CONNECTIVITY_PORTAL);
164 setBehindCaptivePortal(behindPortal);
165}
166
168 QNetworkManagerInterface::NMDeviceType newDevice)
169{
170 setTransportMedium(transportMediumFromDeviceType(newDevice));
171}
172
175{
176 setMetered(isMeteredFromNMMetered(metered));
177};
178
179QT_END_NAMESPACE
180
181#include "qnetworkmanagernetworkinformationbackend.moc"
182#include "moc_qnetworkmanagernetworkinformationbackend.cpp"
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 QNetworkInformationBackend::featuresSupported().
QString name() const override
Backend name, return the same in QNetworkInformationBackendFactory::name().
void onMeteredChanged(QNetworkManagerInterface::NMMetered metered)
void onDeviceTypeChanged(QNetworkManagerInterface::NMDeviceType deviceType)