1414
1515namespace qs ::network {
1616
17+ // /! A tracked access point on the network
18+ class NetworkAccessPoint : public QObject {
19+ Q_OBJECT;
20+ QML_ELEMENT;
21+ QML_UNCREATABLE (" WirelessNetwork can only be acquired through Network" );
22+ // clang-format off
23+ // / The service set identifier of the access point.
24+ Q_PROPERTY (QString ssid READ default NOTIFY ssidChanged BINDABLE bindableSsid);
25+ // The current signal quality of the access point, in percent.
26+ Q_PROPERTY (quint8 signal READ default NOTIFY signalChanged BINDABLE bindableSignal);
27+ // clang-format on
28+
29+ signals:
30+ void ssidChanged ();
31+ void signalChanged ();
32+
33+ public slots:
34+ void setSsid (const QString& ssid);
35+ void setSignal (quint8 signal);
36+
37+ public:
38+ explicit NetworkAccessPoint (QObject* parent = nullptr );
39+
40+ [[nodiscard]] QBindable<QString> bindableSsid () const { return &this ->bSsid ; };
41+ [[nodiscard]] QBindable<quint8> bindableSignal () const { return &this ->bSignal ; };
42+
43+ private:
44+ Q_OBJECT_BINDABLE_PROPERTY (NetworkAccessPoint, QString, bSsid, &NetworkAccessPoint::ssidChanged);
45+ Q_OBJECT_BINDABLE_PROPERTY (NetworkAccessPoint, quint8, bSignal, &NetworkAccessPoint::signalChanged);
46+ };
1747
1848// /! Type of network device.
1949class NetworkDeviceType : public QObject {
@@ -79,11 +109,9 @@ class NetworkDevice: public QObject {
79109 void addressChanged ();
80110 void stateChanged ();
81111
82- // For backend slots
83112 void signalDisconnect ();
84113
85114public slots:
86- // For backend signals
87115 void setName (const QString& name);
88116 void setAddress (const QString& address);
89117 void setState (NetworkDeviceState::Enum state);
@@ -102,7 +130,12 @@ public slots:
102130private:
103131 Q_OBJECT_BINDABLE_PROPERTY (NetworkDevice, QString, bName, &NetworkDevice::nameChanged);
104132 Q_OBJECT_BINDABLE_PROPERTY (NetworkDevice, QString, bAddress, &NetworkDevice::addressChanged);
105- Q_OBJECT_BINDABLE_PROPERTY (NetworkDevice, NetworkDeviceState::Enum, bState, &NetworkDevice::stateChanged);
133+ Q_OBJECT_BINDABLE_PROPERTY (
134+ NetworkDevice,
135+ NetworkDeviceState::Enum,
136+ bState,
137+ &NetworkDevice::stateChanged
138+ );
106139};
107140
108141// /! Wireless variant of a tracked network device.
@@ -114,18 +147,21 @@ class WirelessNetworkDevice: public NetworkDevice {
114147 Q_PROPERTY (qint64 lastScan READ default NOTIFY lastScanChanged BINDABLE bindableLastScan);
115148 // / True if the wireless device is currently scanning for available wifi networks.
116149 Q_PROPERTY (bool scanning READ default NOTIFY scanningChanged BINDABLE bindableScanning);
150+ // / A list of all available access points
151+ Q_PROPERTY (UntypedObjectModel* accessPoints READ accessPoints CONSTANT);
152+ QSDOC_TYPE_OVERRIDE (ObjectModel<NetworkAccessPoint>*)
117153 // clang-format on
118154
119155signals:
120156 void signalScan ();
121157
122- // Frontend-facing signals
123158 void lastScanChanged ();
124159 void scanningChanged ();
125160
126161public slots:
127- // For backend signals
128162 void scanComplete (qint64 lastScan);
163+ void addAccessPoint (NetworkAccessPoint* ap);
164+ void removeAccessPoint (NetworkAccessPoint* ap);
129165
130166public:
131167 explicit WirelessNetworkDevice (QObject* parent = nullptr );
@@ -137,11 +173,12 @@ public slots:
137173 [[nodiscard]] QBindable<bool > bindableScanning () { return &this ->bScanning ; };
138174 [[nodiscard]] QBindable<qint64> bindableLastScan () { return &this ->bLastScan ; };
139175
176+ UntypedObjectModel* accessPoints () { return &this ->mAccessPoints ; };
177+
140178private:
141- // clang-format off
179+ ObjectModel<NetworkAccessPoint> mAccessPoints { this };
142180 Q_OBJECT_BINDABLE_PROPERTY (WirelessNetworkDevice, bool , bScanning, &WirelessNetworkDevice::scanningChanged);
143181 Q_OBJECT_BINDABLE_PROPERTY (WirelessNetworkDevice, qint64, bLastScan, &WirelessNetworkDevice::lastScanChanged);
144- // clang-format on
145182};
146183
147184// -- Network --
@@ -150,29 +187,36 @@ class NetworkBackend: public QObject {
150187
151188public:
152189 [[nodiscard]] virtual bool isAvailable () const = 0;
153- virtual UntypedObjectModel* devices () = 0;
154- virtual WirelessNetworkDevice* defaultWifiDevice () = 0;
155190
156191protected:
157192 explicit NetworkBackend (QObject* parent = nullptr ): QObject(parent) {};
158193};
159194
195+ // /! Network manager
196+ // / Provides access to network devices.
160197class Network : public QObject {
161198 Q_OBJECT;
162199 QML_NAMED_ELEMENT (Network);
163200 QML_SINGLETON;
164201
165- Q_PROPERTY (WirelessNetworkDevice* defaultWifiNetworkDevice READ defaultWifiNetworkDevice CONSTANT);
202+ // clang-format off
203+ // / The default wifi device. Usually there is only one. This defaults to the first wifi device registered.
204+ // Q_PROPERTY(WirelessNetworkDevice* defaultWifiDevice READ defaultWifiDevice CONSTANT);
205+ // / A list of all network devices.
166206 Q_PROPERTY (UntypedObjectModel* devices READ devices CONSTANT);
207+ QSDOC_TYPE_OVERRIDE (ObjectModel<qs::network::NetworkDevice>*);
208+ // clang-format on
209+
210+ public slots:
211+ void addDevice (NetworkDevice* device);
212+ void removeDevice (NetworkDevice* device);
167213
168214public:
169215 explicit Network (QObject* parent = nullptr );
170- [[nodiscard]] UntypedObjectModel* devices () { return backend ? backend->devices () : nullptr ; };
171- [[nodiscard]] WirelessNetworkDevice* defaultWifiNetworkDevice () {
172- return backend ? backend->defaultWifiDevice () : nullptr ;
173- };
216+ [[nodiscard]] UntypedObjectModel* devices () { return backend ? &this ->mDevices : nullptr ; };
174217
175218private:
219+ ObjectModel<NetworkDevice> mDevices {this };
176220 class NetworkBackend * backend = nullptr ;
177221};
178222
0 commit comments