1 | /**************************************************************************** |
2 | ** |
3 | ** Copyright (C) 2015 The Qt Company Ltd and/or its subsidiary(-ies). |
4 | ** Contact: http://www.qt-project.org/legal |
5 | ** |
6 | ** This file is part of the QtSystems module of the Qt Toolkit. |
7 | ** |
8 | ** $QT_BEGIN_LICENSE:LGPL21$ |
9 | ** Commercial License Usage |
10 | ** Licensees holding valid commercial Qt licenses may use this file in |
11 | ** accordance with the commercial license agreement provided with the |
12 | ** Software or, alternatively, in accordance with the terms contained in |
13 | ** a written agreement between you and The Qt Company. For licensing terms |
14 | ** and conditions see http://www.qt.io/terms-conditions. For further |
15 | ** information use the contact form at http://www.qt.io/contact-us. |
16 | ** |
17 | ** GNU Lesser General Public License Usage |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser |
19 | ** General Public License version 2.1 or version 3 as published by the Free |
20 | ** Software Foundation and appearing in the file LICENSE.LGPLv21 and |
21 | ** LICENSE.LGPLv3 included in the packaging of this file. Please review the |
22 | ** following information to ensure the GNU Lesser General Public License |
23 | ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and |
24 | ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
25 | ** |
26 | ** As a special exception, The Qt Company gives you certain additional |
27 | ** rights. These rights are described in The Qt Company LGPL Exception |
28 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
29 | ** |
30 | ** $QT_END_LICENSE$ |
31 | ** |
32 | ****************************************************************************/ |
33 | |
34 | #include "qnetworkinfo.h" |
35 | |
36 | #if defined(QT_SIMULATOR) |
37 | # include "simulator/qsysteminfo_simulator_p.h" |
38 | #elif defined(Q_OS_LINUX) |
39 | # include "linux/qnetworkinfo_linux_p.h" |
40 | #elif defined(Q_OS_WIN) |
41 | # include "windows/qnetworkinfo_win_p.h" |
42 | #elif defined(Q_OS_MAC) |
43 | # include "mac/qnetworkinfo_mac_p.h" |
44 | #else |
45 | QT_BEGIN_NAMESPACE |
46 | class QNetworkInfoPrivate |
47 | { |
48 | public: |
49 | QNetworkInfoPrivate(QNetworkInfo *) {} |
50 | |
51 | int networkInterfaceCount(QNetworkInfo::NetworkMode) { return -1; } |
52 | int networkSignalStrength(QNetworkInfo::NetworkMode, int) { return -1; } |
53 | QNetworkInfo::CellDataTechnology currentCellDataTechnology(int) { return QNetworkInfo::UnknownDataTechnology; } |
54 | QNetworkInfo::NetworkMode currentNetworkMode() { return QNetworkInfo::UnknownMode; } |
55 | QNetworkInfo::NetworkStatus networkStatus(QNetworkInfo::NetworkMode, int) { return QNetworkInfo::UnknownStatus; } |
56 | #ifndef QT_NO_NETWORKINTERFACE |
57 | QNetworkInterface interfaceForMode(QNetworkInfo::NetworkMode, int) { return QNetworkInterface(); } |
58 | #endif // QT_NO_NETWORKINTERFACE |
59 | QString cellId(int) { return QString(); } |
60 | QString currentMobileCountryCode(int) { return QString(); } |
61 | QString currentMobileNetworkCode(int) { return QString(); } |
62 | QString homeMobileCountryCode(int) { return QString(); } |
63 | QString homeMobileNetworkCode(int) { return QString(); } |
64 | QString imsi(int) { return QString(); } |
65 | QString locationAreaCode(int) { return QString(); } |
66 | QString macAddress(QNetworkInfo::NetworkMode, int) { return QString(); } |
67 | QString networkName(QNetworkInfo::NetworkMode, int) { return QString(); } |
68 | }; |
69 | QT_END_NAMESPACE |
70 | #endif |
71 | |
72 | #include <QtCore/qmetaobject.h> |
73 | |
74 | QT_BEGIN_NAMESPACE |
75 | |
76 | /*! |
77 | \class QNetworkInfo |
78 | \inmodule QtSystemInfo |
79 | \brief The QNetworkInfo class provides various information about the network status. |
80 | |
81 | \ingroup systeminfo |
82 | |
83 | To support the cases where one has multiple interfaces / modems for the same network mode, you |
84 | can specify which interface you refer to. For those cases, the 'interface' parameter is the index |
85 | of the interface, starting from 0. |
86 | */ |
87 | |
88 | /*! |
89 | \enum QNetworkInfo::CellDataTechnology |
90 | This enum describes the type of cellular technology. |
91 | |
92 | \value UnknownDataTechnology The cellular technology is unknown or an error occured. |
93 | \value GprsDataTechnology General Packet Radio Service (GPRS) data service. |
94 | \value EdgeDataTechnology Enhanced Data Rates for GSM Evolution (EDGE) data service. |
95 | \value UmtsDataTechnology Universal Mobile Telecommunications System (UMTS) data service. |
96 | \value HspaDataTechnology High Speed Packet Access (HSPA) data service. |
97 | */ |
98 | |
99 | /*! |
100 | \enum QNetworkInfo::NetworkMode |
101 | This enumeration describes the type of the network. |
102 | |
103 | \value UnknownMode The network is unknown or an error occured. |
104 | \value GsmMode Global System for Mobile (GSM) network. |
105 | \value CdmaMode Code Division Multiple Access (CDMA) network. |
106 | \value WcdmaMode Wideband Code Division Multiple Access (WCDMA) network. |
107 | \value WlanMode Wireless local area network (WLAN) network. |
108 | \value EthernetMode Local area network (LAN), or Ethernet network. |
109 | \value BluetoothMode Bluetooth network. |
110 | \value WimaxMode Worldwide Interoperability for Microwave Access (WiMAX) network. |
111 | \value LteMode 3GPP Long Term Evolution (LTE) network. |
112 | \value TdscdmaMode Time Division Synchronous Code Division Multiple Access (TD-SCDMA) network. |
113 | */ |
114 | |
115 | /*! |
116 | \enum QNetworkInfo::NetworkStatus |
117 | This enumeration describes the status of the network. |
118 | |
119 | \value UnknownStatus The status is unknown or an error occured. |
120 | \value NoNetworkAvailable There is no network available. |
121 | \value EmergencyOnly The network only allows emergency calls. |
122 | \value Searching The device is searching or connecting to the network. |
123 | \value Busy The network is too busy to be connected. |
124 | \value Denied The connection to the network has been denied. |
125 | \value HomeNetwork The device is connected to the home network. |
126 | \value Roaming The device is connected to some roaming network. |
127 | */ |
128 | |
129 | /*! |
130 | \fn void QNetworkInfo::cellIdChanged(int interface, const QString &id) |
131 | |
132 | This signal is emitted whenever the cell ID for \a interface has changed to \a id. |
133 | */ |
134 | |
135 | /*! |
136 | \fn void QNetworkInfo::currentCellDataTechnologyChanged(int interface, QNetworkInfo::CellDataTechnology tech) |
137 | |
138 | This signal is emitted whenever the current cell data technology for \a interface has changed to \a tech. |
139 | */ |
140 | |
141 | /*! |
142 | \fn void QNetworkInfo::currentMobileCountryCodeChanged(int interface, const QString &mcc) |
143 | |
144 | This signal is emitted whenever the current Mobile Country Code (MCC) for \a interface has changed |
145 | to \a mcc. |
146 | */ |
147 | |
148 | /*! |
149 | \fn void QNetworkInfo::currentMobileNetworkCodeChanged(int interface, const QString &mnc) |
150 | |
151 | This signal is emitted whenever the current Mobile Network Code (MNC) for \a interface has changed |
152 | to \a mnc. |
153 | */ |
154 | |
155 | /*! |
156 | \fn void QNetworkInfo::currentNetworkModeChanged(QNetworkInfo::NetworkMode mode) |
157 | |
158 | This signal is emitted whenever the current network has changed to \a mode. |
159 | */ |
160 | |
161 | /*! |
162 | \fn void QNetworkInfo::locationAreaCodeChanged(int interface, const QString &lac) |
163 | |
164 | This signal is emitted whenever the location area code for \a interface has changed to \a lac. |
165 | */ |
166 | |
167 | /*! |
168 | \fn void QNetworkInfo::networkInterfaceCountChanged(QNetworkInfo::NetworkMode mode, int count) |
169 | |
170 | This signal is emitted whenever the number of interfaces for the \a mode has changed to \a count. |
171 | */ |
172 | |
173 | /*! |
174 | \fn void QNetworkInfo::networkNameChanged(QNetworkInfo::NetworkMode mode, int interface, const QString &name) |
175 | |
176 | This signal is emitted whenever the name for the \a interface of \a mode has changed to \a name. |
177 | */ |
178 | |
179 | /*! |
180 | \fn void QNetworkInfo::networkSignalStrengthChanged(QNetworkInfo::NetworkMode mode, int interface, int strength) |
181 | |
182 | This signal is emitted whenever the signal strength for the \a interface of \a mode has changed |
183 | to \a strength. |
184 | */ |
185 | |
186 | /*! |
187 | \fn void QNetworkInfo::networkStatusChanged(QNetworkInfo::NetworkMode mode, int interface, QNetworkInfo::NetworkStatus status) |
188 | |
189 | This signal is emitted whenever the status for the \a interface of \a mode has changed to \a status. |
190 | */ |
191 | |
192 | /*! |
193 | Constructs a QNetworkInfo object with the given \a parent. |
194 | */ |
195 | QNetworkInfo::QNetworkInfo(QObject *parent) |
196 | : QObject(parent) |
197 | #if !defined(QT_SIMULATOR) |
198 | , d_ptr(new QNetworkInfoPrivate(this)) |
199 | #else |
200 | , d_ptr(new QNetworkInfoSimulator(this)) |
201 | #endif // QT_SIMULATOR |
202 | { |
203 | } |
204 | |
205 | /*! |
206 | Destroys the object |
207 | */ |
208 | QNetworkInfo::~QNetworkInfo() |
209 | { |
210 | delete d_ptr; |
211 | } |
212 | |
213 | /*! |
214 | Returns the number of interfaces for the \a mode. If the information is not available, or error |
215 | occurs, -1 is returned. |
216 | */ |
217 | int QNetworkInfo::networkInterfaceCount(QNetworkInfo::NetworkMode mode) const |
218 | { |
219 | return d_ptr->networkInterfaceCount(mode); |
220 | } |
221 | |
222 | /*! |
223 | Returns the signal strength for \a interfaceDevice of \a mode, in 0 - 100 scale. If the information |
224 | is not available, or error occurs, -1 is returned. |
225 | */ |
226 | int QNetworkInfo::networkSignalStrength(QNetworkInfo::NetworkMode mode, int interfaceDevice) const |
227 | { |
228 | return d_ptr->networkSignalStrength(mode, interface: interfaceDevice); |
229 | } |
230 | |
231 | /*! |
232 | Returns the current cell data technology used for \a interfaceDevice. |
233 | */ |
234 | QNetworkInfo::CellDataTechnology QNetworkInfo::currentCellDataTechnology(int interfaceDevice) const |
235 | { |
236 | return d_ptr->currentCellDataTechnology(interface: interfaceDevice); |
237 | } |
238 | |
239 | /*! |
240 | Returns the current active network mode. If there are more than one modes activated, the preferred |
241 | one is returned. |
242 | */ |
243 | QNetworkInfo::NetworkMode QNetworkInfo::currentNetworkMode() const |
244 | { |
245 | return d_ptr->currentNetworkMode(); |
246 | } |
247 | |
248 | /*! |
249 | Returns the current status for \a interfaceDevice of \a mode. |
250 | */ |
251 | QNetworkInfo::NetworkStatus QNetworkInfo::networkStatus(QNetworkInfo::NetworkMode mode, int interfaceDevice) const |
252 | { |
253 | return d_ptr->networkStatus(mode, interface: interfaceDevice); |
254 | } |
255 | |
256 | #ifndef QT_NO_NETWORKINTERFACE |
257 | /*! |
258 | Returns the first found interface for \a interfaceDevice of \a mode. If none is found, or it can't be |
259 | represented by QNetworkInterface (e.g. Bluetooth), and empty object is returned. |
260 | */ |
261 | QNetworkInterface QNetworkInfo::interfaceForMode(QNetworkInfo::NetworkMode mode, int interfaceDevice) const |
262 | { |
263 | return d_ptr->interfaceForMode(mode, interface: interfaceDevice); |
264 | } |
265 | #endif // QT_NO_NETWORKINTERFACE |
266 | |
267 | /*! |
268 | Returns the cell ID of the connected tower or based station for \a interfaceDevice. If this information |
269 | is not available or error occurs, an empty string is returned. |
270 | */ |
271 | QString QNetworkInfo::cellId(int interfaceDevice) const |
272 | { |
273 | return d_ptr->cellId(interface: interfaceDevice); |
274 | } |
275 | |
276 | /*! |
277 | Returns the current Mobile Country Code (MCC) for \a interfaceDevice. An empty string is returned if the |
278 | information is not available or an error occurs. |
279 | */ |
280 | QString QNetworkInfo::currentMobileCountryCode(int interfaceDevice) const |
281 | { |
282 | return d_ptr->currentMobileCountryCode(interface: interfaceDevice); |
283 | } |
284 | |
285 | /*! |
286 | Returns the current Mobile Network Code (MNC) for \a interfaceDevice. An empty string is returned if the |
287 | information is not available or an error occurs. |
288 | */ |
289 | QString QNetworkInfo::currentMobileNetworkCode(int interfaceDevice) const |
290 | { |
291 | return d_ptr->currentMobileNetworkCode(interface: interfaceDevice); |
292 | } |
293 | |
294 | /*! |
295 | Returns the home Mobile Country Code (MCC) for \a interfaceDevice. An empty string is returned if the |
296 | information is not available or an error occurs. |
297 | */ |
298 | QString QNetworkInfo::homeMobileCountryCode(int interfaceDevice) const |
299 | { |
300 | return d_ptr->homeMobileCountryCode(interface: interfaceDevice); |
301 | } |
302 | |
303 | /*! |
304 | Returns the home Mobile Network Code (MNC) for \a interfaceDevice. An empty string is returned if the |
305 | information is not available or an error occurs. |
306 | */ |
307 | QString QNetworkInfo::homeMobileNetworkCode(int interfaceDevice) const |
308 | { |
309 | return d_ptr->homeMobileNetworkCode(interface: interfaceDevice); |
310 | } |
311 | |
312 | /*! |
313 | Returns the International Mobile Subscriber Identity (IMSI) for \a interfaceDevice. If this information is |
314 | not available, or error occurs, an empty string is returned. |
315 | */ |
316 | QString QNetworkInfo::imsi(int interfaceDevice) const |
317 | { |
318 | return d_ptr->imsi(interface: interfaceDevice); |
319 | } |
320 | |
321 | /*! |
322 | Returns the location area code of the current cellular radio network for \a interfaceDevice. If this information |
323 | is not available or error occurs, an empty string is returned. |
324 | */ |
325 | QString QNetworkInfo::locationAreaCode(int interfaceDevice) const |
326 | { |
327 | return d_ptr->locationAreaCode(interface: interfaceDevice); |
328 | } |
329 | |
330 | /*! |
331 | Returns the MAC address for \a interfaceDevice of \a mode. If the MAC address is not available or error |
332 | occurs, an empty string is returned. |
333 | */ |
334 | QString QNetworkInfo::macAddress(QNetworkInfo::NetworkMode mode, int interfaceDevice) const |
335 | { |
336 | return d_ptr->macAddress(mode, interface: interfaceDevice); |
337 | } |
338 | |
339 | /*! |
340 | Returns the name of the operator for \a interfaceDevice of \a mode. If the information is not available, |
341 | or an error occurs, an empty string is returned. |
342 | |
343 | In case of WLAN, the SSID is returned; for Ethernet, the domain name is returned if available. |
344 | */ |
345 | QString QNetworkInfo::networkName(QNetworkInfo::NetworkMode mode, int interfaceDevice) const |
346 | { |
347 | return d_ptr->networkName(mode, interface: interfaceDevice); |
348 | } |
349 | |
350 | extern QMetaMethod proxyToSourceSignal(const QMetaMethod &, QObject *); |
351 | |
352 | /*! |
353 | \internal |
354 | */ |
355 | void QNetworkInfo::connectNotify(const QMetaMethod &signal) |
356 | { |
357 | #if defined(Q_OS_LINUX) || defined(Q_OS_WIN) || defined(QT_SIMULATOR) || defined(Q_OS_MAC) |
358 | QMetaMethod sourceSignal = proxyToSourceSignal(signal, d_ptr); |
359 | connect(sender: d_ptr, signal: sourceSignal, receiver: this, method: signal, type: Qt::UniqueConnection); |
360 | #else |
361 | Q_UNUSED(signal) |
362 | #endif |
363 | } |
364 | |
365 | /*! |
366 | \internal |
367 | */ |
368 | void QNetworkInfo::disconnectNotify(const QMetaMethod &signal) |
369 | { |
370 | #if defined(Q_OS_LINUX) || defined(Q_OS_WIN) || defined(QT_SIMULATOR) || defined(Q_OS_MAC) |
371 | // We can only disconnect with the private implementation, when there is no receivers for the signal. |
372 | if (isSignalConnected(signal)) |
373 | return; |
374 | |
375 | QMetaMethod sourceSignal = proxyToSourceSignal(signal, d_ptr); |
376 | disconnect(sender: d_ptr, signal: sourceSignal, receiver: this, member: signal); |
377 | #else |
378 | Q_UNUSED(signal) |
379 | #endif |
380 | } |
381 | |
382 | QT_END_NAMESPACE |
383 | |