1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the plugins of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
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 https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://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 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 
40 #ifndef QNETWORKMANAGERSERVICE_H
41 #define QNETWORKMANAGERSERVICE_H
42 
43 //
44 //  W A R N I N G
45 //  -------------
46 //
47 // This file is not part of the Qt API.  It exists purely as an
48 // implementation detail.  This header file may change from version to
49 // version without notice, or even be removed.
50 //
51 // We mean it.
52 //
53 
54 #include <QtDBus/QtDBus>
55 #include <QtDBus/QDBusConnection>
56 #include <QtDBus/QDBusError>
57 #include <QtDBus/QDBusInterface>
58 #include <QtDBus/QDBusMessage>
59 #include <QtDBus/QDBusReply>
60 
61 #include <QtDBus/QDBusPendingCallWatcher>
62 #include <QtDBus/QDBusObjectPath>
63 #include <QtDBus/QDBusContext>
64 #include <QtDBus/QDBusAbstractInterface>
65 #include <QMap>
66 
67 #ifndef QT_NO_DBUS
68 
69 #ifndef NETWORK_MANAGER_H
70 typedef enum NMDeviceType
71 {
72     DEVICE_TYPE_UNKNOWN = 0,
73     DEVICE_TYPE_ETHERNET,
74     DEVICE_TYPE_WIFI,
75     DEVICE_TYPE_MODEM = 8
76 } NMDeviceType;
77 
78 typedef enum
79 {
80     NM_DEVICE_STATE_UNKNOWN = 0,
81     NM_DEVICE_STATE_UNMANAGED = 10,
82     NM_DEVICE_STATE_UNAVAILABLE = 20,
83     NM_DEVICE_STATE_DISCONNECTED = 30,
84     NM_DEVICE_STATE_PREPARE = 40,
85     NM_DEVICE_STATE_CONFIG = 50,
86     NM_DEVICE_STATE_NEED_AUTH = 60,
87     NM_DEVICE_STATE_IP_CONFIG = 70,
88     NM_DEVICE_STATE_ACTIVATED = 100,
89     NM_DEVICE_STATE_DEACTIVATING = 110,
90     NM_DEVICE_STATE_FAILED = 120
91 } NMDeviceState;
92 
93 typedef enum
94 {
95     NM_ACTIVE_CONNECTION_STATE_UNKNOWN = 0,
96     NM_ACTIVE_CONNECTION_STATE_ACTIVATING,
97     NM_ACTIVE_CONNECTION_STATE_ACTIVATED,
98     NM_ACTIVE_CONNECTION_STATE_DEACTIVATED = 4
99 } NMActiveConnectionState;
100 
101 #define NM_DBUS_SERVICE                     "org.freedesktop.NetworkManager"
102 
103 #define NM_DBUS_PATH                        "/org/freedesktop/NetworkManager"
104 #define NM_DBUS_INTERFACE                   "org.freedesktop.NetworkManager"
105 #define NM_DBUS_INTERFACE_DEVICE            NM_DBUS_INTERFACE ".Device"
106 #define NM_DBUS_INTERFACE_DEVICE_WIRED      NM_DBUS_INTERFACE_DEVICE ".Wired"
107 #define NM_DBUS_INTERFACE_DEVICE_WIRELESS   NM_DBUS_INTERFACE_DEVICE ".Wireless"
108 #define NM_DBUS_INTERFACE_DEVICE_MODEM      NM_DBUS_INTERFACE_DEVICE ".Modem"
109 #define NM_DBUS_PATH_ACCESS_POINT           NM_DBUS_PATH "/AccessPoint"
110 #define NM_DBUS_INTERFACE_ACCESS_POINT      NM_DBUS_INTERFACE ".AccessPoint"
111 
112 #define NM_DBUS_PATH_SETTINGS               "/org/freedesktop/NetworkManager/Settings"
113 
114 #define NM_DBUS_IFACE_SETTINGS_CONNECTION   "org.freedesktop.NetworkManager.Settings.Connection"
115 #define NM_DBUS_IFACE_SETTINGS              "org.freedesktop.NetworkManager.Settings"
116 #define NM_DBUS_INTERFACE_ACTIVE_CONNECTION NM_DBUS_INTERFACE ".Connection.Active"
117 #define NM_DBUS_INTERFACE_IP4_CONFIG        NM_DBUS_INTERFACE ".IP4Config"
118 
119 #define NM_DBUS_SERVICE_USER_SETTINGS       "org.freedesktop.NetworkManagerUserSettings"
120 #define NM_DBUS_SERVICE_SYSTEM_SETTINGS     "org.freedesktop.NetworkManagerSystemSettings"
121 
122 #define NM_802_11_AP_FLAGS_NONE             0x00000000
123 #define NM_802_11_AP_FLAGS_PRIVACY          0x00000001
124 #endif
125 
126 QT_BEGIN_NAMESPACE
127 
128 typedef QMap< QString, QMap<QString,QVariant> > QNmSettingsMap;
129 typedef QList<quint32> ServerThing;
130 
131 QT_END_NAMESPACE
132 
Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE (QNmSettingsMap))133 Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(QNmSettingsMap))
134 Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(ServerThing))
135 
136 QT_BEGIN_NAMESPACE
137 
138 class QNetworkManagerInterface : public QDBusAbstractInterface
139 {
140     Q_OBJECT
141 
142 public:
143     typedef enum
144     {
145         NM_STATE_UNKNOWN = 0,
146         NM_STATE_ASLEEP = 10,
147         NM_STATE_DISCONNECTED = 20,
148         NM_STATE_DISCONNECTING = 30,
149         NM_STATE_CONNECTING = 40,
150         NM_STATE_CONNECTED_LOCAL = 50,
151         NM_STATE_CONNECTED_SITE = 60,
152         NM_STATE_CONNECTED_GLOBAL = 70
153     } NMState;
154 
155     QNetworkManagerInterface(QObject *parent = nullptr);
156     ~QNetworkManagerInterface();
157 
158     QList <QDBusObjectPath> getDevices();
159     void activateConnection(QDBusObjectPath connection,QDBusObjectPath device, QDBusObjectPath specificObject);
160     void deactivateConnection(QDBusObjectPath connectionPath);
161 
162     QDBusObjectPath path() const;
163 
164     bool wirelessEnabled() const;
165     bool wirelessHardwareEnabled() const;
166     QList <QDBusObjectPath> activeConnections() const;
167     NMState state();
168     QString version() const;
169     bool setConnections();
170 
171 Q_SIGNALS:
172     void deviceAdded(QDBusObjectPath);
173     void deviceRemoved(QDBusObjectPath);
174     void propertiesChanged(QMap<QString,QVariant>);
175     void stateChanged(quint32);
176     void activationFinished(QDBusPendingCallWatcher*);
177     void propertiesReady();
178     void devicesListReady();
179 
180 private Q_SLOTS:
181     void propertiesSwap(QMap<QString,QVariant>);
182 
183 private:
184     QVariantMap propertyMap;
185     QList<QDBusObjectPath> devicesPathList;
186 
187 };
188 
189 class QNetworkManagerInterfaceAccessPoint : public QDBusAbstractInterface
190 {
191     Q_OBJECT
192 
193 public:
194 
195     enum DeviceState {
196         Unknown = 0,
197         Unmanaged,
198         Unavailable,
199         Disconnected,
200         Prepare,
201         Config,
202         NeedAuthentication,
203         IpConfig,
204         Activated,
205         Failed
206     };
207 
208     enum ApFlag {
209         ApNone = 0x0,
210         Privacy = 0x1
211     };
212 
213     Q_DECLARE_FLAGS(ApFlags, ApFlag)
214 
215     enum ApSecurityFlag {
216         ApSecurityNone = 0x0,
217         PairWep40 = 0x1,
218         PairWep104 = 0x2,
219         PairTkip = 0x4,
220         PairCcmp = 0x8,
221         GroupWep40 = 0x10,
222         GroupWep104 = 0x20,
223         GroupTkip = 0x40,
224         GroupCcmp = 0x80,
225         KeyPsk = 0x100,
226         Key8021x = 0x200
227     };
228 
229     Q_DECLARE_FLAGS(ApSecurityFlags, ApSecurityFlag)
230 
231     explicit QNetworkManagerInterfaceAccessPoint(const QString &dbusPathName, QObject *parent = nullptr);
232     ~QNetworkManagerInterfaceAccessPoint();
233 
234     quint32 flags() const;
235     quint32 wpaFlags() const;
236     quint32 rsnFlags() const;
237     QString ssid() const;
238     quint32 frequency() const;
239     QString hwAddress() const;
240     quint32 mode() const;
241     quint32 maxBitrate() const;
242     quint32 strength() const;
243   //  bool setConnections();
244 
245 Q_SIGNALS:
246     void propertiesChanged(QMap<QString,QVariant>);
247     void propertiesReady();
248 
249 private Q_SLOTS:
250     void propertiesSwap(QMap<QString,QVariant>);
251 
252 private:
253     QVariantMap propertyMap;
254 };
255 
256 class QNetworkManagerInterfaceDevice : public QDBusAbstractInterface
257 {
258     Q_OBJECT
259 
260 public:
261 
262     explicit QNetworkManagerInterfaceDevice(const QString &deviceObjectPath, QObject *parent = nullptr);
263     ~QNetworkManagerInterfaceDevice();
264 
265     QString udi() const;
266     QString networkInterface() const;
267     quint32 ip4Address() const;
268     quint32 state() const;
269     quint32 deviceType() const;
270 
271     QDBusObjectPath ip4config() const;
272 
273 Q_SIGNALS:
274     void stateChanged(const QString &, quint32);
275     void propertiesChanged(QMap<QString,QVariant>);
276     void connectionsChanged(QStringList);
277     void propertiesReady();
278 private Q_SLOTS:
279     void propertiesSwap(QMap<QString,QVariant>);
280 private:
281     QVariantMap propertyMap;
282 };
283 
284 class QNetworkManagerInterfaceDeviceWired : public QDBusAbstractInterface
285 {
286     Q_OBJECT
287 
288 public:
289 
290     explicit QNetworkManagerInterfaceDeviceWired(const QString &ifaceDevicePath,
291                                                  QObject *parent = nullptr);
292     ~QNetworkManagerInterfaceDeviceWired();
293 
294     QString hwAddress() const;
295     quint32 speed() const;
296     bool carrier() const;
297     QStringList availableConnections();
298 
299 Q_SIGNALS:
300     void propertiesChanged(QMap<QString,QVariant>);
301     void propertiesReady();
302     void carrierChanged(bool);
303 
304 private Q_SLOTS:
305     void propertiesSwap(QMap<QString,QVariant>);
306 
307 private:
308     QVariantMap propertyMap;
309 };
310 
311 class QNetworkManagerInterfaceDeviceWireless : public QDBusAbstractInterface
312 {
313     Q_OBJECT
314 
315 public:
316 
317     enum DeviceCapability {
318         None = 0x0,
319         Wep40 = 0x1,
320         Wep104 = 0x2,
321         Tkip = 0x4,
322         Ccmp = 0x8,
323         Wpa = 0x10,
324         Rsn = 0x20
325        };
326 
327     explicit QNetworkManagerInterfaceDeviceWireless(const QString &ifaceDevicePath,
328                                                     QObject *parent = nullptr);
329     ~QNetworkManagerInterfaceDeviceWireless();
330 
331     QList <QDBusObjectPath> getAccessPoints();
332 
333     QString hwAddress() const;
334     quint32 mode() const;
335     quint32 bitrate() const;
336     QDBusObjectPath activeAccessPoint() const;
337     quint32 wirelessCapabilities() const;
338     bool setConnections();
339 
340     void requestScan();
341 Q_SIGNALS:
342     void propertiesChanged(QMap<QString,QVariant>);
343     void propertiesReady();
344 
345 private Q_SLOTS:
346     void propertiesSwap(QMap<QString,QVariant>);
347 
348 private:
349     QVariantMap propertyMap;
350     QList <QDBusObjectPath> accessPointsList;
351     QString interfacePath;
352 };
353 
354 class QNetworkManagerInterfaceDeviceModem : public QDBusAbstractInterface
355 {
356     Q_OBJECT
357 
358 public:
359 
360     enum ModemCapability {
361         None = 0x0,
362         Pots = 0x1,
363         Cmda_Edvo = 0x2,
364         Gsm_Umts = 0x4,
365         Lte = 0x08
366        };
367     Q_DECLARE_FLAGS(ModemCapabilities, ModemCapability)
368 
369     explicit QNetworkManagerInterfaceDeviceModem(const QString &ifaceDevicePath,
370                                                     QObject *parent = nullptr);
371     ~QNetworkManagerInterfaceDeviceModem();
372 
373     ModemCapabilities modemCapabilities() const;
374     ModemCapabilities currentCapabilities() const;
375 
376 Q_SIGNALS:
377     void propertiesChanged(QMap<QString,QVariant>);
378     void propertiesReady();
379 
380 private Q_SLOTS:
381     void propertiesSwap(QMap<QString,QVariant>);
382 
383 private:
384     QVariantMap propertyMap;
385 };
386 
Q_DECLARE_OPERATORS_FOR_FLAGS(QNetworkManagerInterfaceDeviceModem::ModemCapabilities)387 Q_DECLARE_OPERATORS_FOR_FLAGS(QNetworkManagerInterfaceDeviceModem::ModemCapabilities)
388 
389 class QNetworkManagerSettings : public QDBusAbstractInterface
390 {
391     Q_OBJECT
392 
393 public:
394 
395     explicit QNetworkManagerSettings(const QString &settingsService, QObject *parent = nullptr);
396     ~QNetworkManagerSettings();
397 
398     QList <QDBusObjectPath> listConnections();
399     QString getConnectionByUuid(const QString &uuid);
400     bool setConnections();
401 
402 Q_SIGNALS:
403     void newConnection(QDBusObjectPath);
404     void connectionsListReady();
405 private:
406     QList <QDBusObjectPath> connectionsList;
407     QString interfacePath;
408 };
409 
410 class QNetworkManagerSettingsConnection : public QDBusAbstractInterface
411 {
412     Q_OBJECT
413 
414 public:
415 
416     QNetworkManagerSettingsConnection(const QString &settingsService, const QString &connectionObjectPath, QObject *parent = nullptr);
417     ~QNetworkManagerSettingsConnection();
418 
419     QNmSettingsMap getSettings();
420     bool setConnections();
421     NMDeviceType getType();
422     bool isAutoConnect();
423     quint64 getTimestamp();
424     QString getId();
425     QString getUuid();
426     QString getSsid();
427     QString getMacAddress();
428     QStringList getSeenBssids();
429 
430 Q_SIGNALS:
431     void updated();
432     void removed(const QString &path);
433     void settingsReady();
434 
435 private Q_SLOTS:
436     void slotSettingsRemoved();
437 private:
438     QNmSettingsMap settingsMap;
439     QString interfacepath;
440 };
441 
442 class QNetworkManagerConnectionActive : public QDBusAbstractInterface
443 {
444     Q_OBJECT
445 
446 public:
447 
448     enum ActiveConnectionState {
449         Unknown = 0,
450         Activating = 1,
451         Activated = 2
452        };
453 
454     explicit QNetworkManagerConnectionActive(const QString &dbusPathName, QObject *parent = nullptr);
455     ~ QNetworkManagerConnectionActive();
456 
457     QDBusObjectPath connection() const;
458     QDBusObjectPath specificObject() const;
459     QStringList devices() const;
460     quint32 state() const;
461     bool defaultRoute() const;
462     bool default6Route() const;
463 
464 
465 Q_SIGNALS:
466     void propertiesChanged(QMap<QString,QVariant>);
467     void propertiesReady();
468 
469 private Q_SLOTS:
470     void propertiesSwap(QMap<QString,QVariant>);
471 
472 private:
473     QVariantMap propertyMap;
474 };
475 
476 class QNetworkManagerIp4Config : public QDBusAbstractInterface
477 {
478     Q_OBJECT
479 
480 public:
481     explicit QNetworkManagerIp4Config(const QString &dbusPathName, QObject *parent = nullptr);
482     ~QNetworkManagerIp4Config();
483 
484     QStringList domains() const;
485 };
486 
487 class PropertiesDBusInterface : public QDBusAbstractInterface
488 {
489 public:
490     PropertiesDBusInterface(const QString &service, const QString &path,
491                             const QString &interface, const QDBusConnection &connection,
492                             QObject *parent = nullptr)
493         : QDBusAbstractInterface(service, path, interface.toLatin1().data(), connection, parent)
494     {}
495 };
496 
497 QT_END_NAMESPACE
498 
499 #endif // QT_NO_DBUS
500 #endif //QNETWORKMANAGERSERVICE_H
501