1414
1515namespace qs ::network {
1616
17- // -- Device --
1817
19- class DeviceState : public QObject {
18+ // /! Type of network device.
19+ class NetworkDeviceType : public QObject {
20+ Q_OBJECT;
21+ QML_ELEMENT;
22+ QML_SINGLETON;
23+
24+ public:
25+ enum Enum : quint8 {
26+ // /! A generic device.
27+ Other = 0 ,
28+ // /! An 802.11 Wi-Fi device.
29+ Wireless = 1 ,
30+ // /! A wired ethernet device.
31+ Ethernet = 2
32+ };
33+ Q_ENUM (Enum);
34+ Q_INVOKABLE static QString toString (NetworkDeviceType::Enum type);
35+ };
36+
37+ // /! State of a network device.
38+ class NetworkDeviceState : public QObject {
2039 Q_OBJECT;
2140 QML_ELEMENT;
2241 QML_SINGLETON;
@@ -35,91 +54,104 @@ class DeviceState: public QObject {
3554 Connecting = 4 ,
3655 };
3756 Q_ENUM (Enum);
38- Q_INVOKABLE static QString toString (DeviceState ::Enum state);
57+ Q_INVOKABLE static QString toString (NetworkDeviceState ::Enum state);
3958};
4059
4160// /! A tracked network device.
42- class Device : public QObject {
61+ class NetworkDevice : public QObject {
4362 Q_OBJECT;
4463 QML_ELEMENT;
45- QML_UNCREATABLE (" Devices can only be acquired through Network" );
64+ QML_UNCREATABLE (" NetworkDevices can only be acquired through Network" );
4665
4766 // clang-format off
4867 // / The name of the device's interface.
4968 Q_PROPERTY (QString name READ default NOTIFY nameChanged BINDABLE bindableName);
5069 // / The hardware address of the device's interface in the XX:XX:XX:XX:XX:XX format.
5170 Q_PROPERTY (QString address READ default NOTIFY addressChanged BINDABLE bindableAddress);
5271 // / Connection state of the device.
53- Q_PROPERTY (DeviceState::Enum state READ default NOTIFY stateChanged BINDABLE bindableState);
72+ Q_PROPERTY (NetworkDeviceState::Enum state READ default NOTIFY stateChanged BINDABLE bindableState);
73+ // / Type of device.
74+ Q_PROPERTY (NetworkDeviceType::Enum type READ type CONSTANT);
5475 // clang-format on
5576
5677signals:
57- void signalDisconnect ();
58-
59- // Frontend-facing signals
6078 void nameChanged ();
6179 void addressChanged ();
6280 void stateChanged ();
6381
82+ // For backend slots
83+ void signalDisconnect ();
84+
6485public slots:
65- // Slots for the backend to connect signals to
86+ // For backend signals
6687 void setName (const QString& name);
6788 void setAddress (const QString& address);
68- void setState (DeviceState ::Enum state);
89+ void setState (NetworkDeviceState ::Enum state);
6990
7091public:
71- explicit Device (QObject* parent = nullptr );
92+ explicit NetworkDevice (QObject* parent = nullptr );
7293
7394 // / Disconnects the device and prevents it from automatically activating further connections.
7495 Q_INVOKABLE void disconnect ();
96+ [[nodiscard]] virtual NetworkDeviceType::Enum type () const { return NetworkDeviceType::Other; };
7597
7698 [[nodiscard]] QBindable<QString> bindableName () const { return &this ->bName ; };
7799 [[nodiscard]] QBindable<QString> bindableAddress () const { return &this ->bAddress ; };
78- [[nodiscard]] QBindable<DeviceState ::Enum> bindableState () const { return &this ->bState ; };
100+ [[nodiscard]] QBindable<NetworkDeviceState ::Enum> bindableState () const { return &this ->bState ; };
79101
80102private:
81- Q_OBJECT_BINDABLE_PROPERTY (Device , QString, bName, &Device ::nameChanged);
82- Q_OBJECT_BINDABLE_PROPERTY (Device , QString, bAddress, &Device ::addressChanged);
83- Q_OBJECT_BINDABLE_PROPERTY (Device, DeviceState ::Enum, bState, &Device ::stateChanged);
103+ Q_OBJECT_BINDABLE_PROPERTY (NetworkDevice , QString, bName, &NetworkDevice ::nameChanged);
104+ Q_OBJECT_BINDABLE_PROPERTY (NetworkDevice , QString, bAddress, &NetworkDevice ::addressChanged);
105+ Q_OBJECT_BINDABLE_PROPERTY (NetworkDevice, NetworkDeviceState ::Enum, bState, &NetworkDevice ::stateChanged);
84106};
85107
86- // -- Wireless Device --
87- class WirelessDevice : public Device {
108+ // /! Wireless variant of a tracked network device.
109+ class WirelessNetworkDevice : public NetworkDevice {
88110 Q_OBJECT;
89111
90112 // clang-format off
113+ // / The timestamp (in CLOCK_BOOTTIME milliseconds) for the last finished network scan.
91114 Q_PROPERTY (qint64 lastScan READ default NOTIFY lastScanChanged BINDABLE bindableLastScan);
115+ // / True if the wireless device is currently scanning for available wifi networks.
116+ Q_PROPERTY (bool scanning READ default NOTIFY scanningChanged BINDABLE bindableScanning);
92117 // clang-format on
93118
94119signals:
120+ void signalScan ();
121+
122+ // Frontend-facing signals
95123 void lastScanChanged ();
124+ void scanningChanged ();
96125
97126public slots:
98- void setLastScan (qint64 lastScan);
127+ // For backend signals
128+ void scanComplete (qint64 lastScan);
99129
100130public:
101- explicit WirelessDevice (QObject* parent = nullptr );
131+ explicit WirelessNetworkDevice (QObject* parent = nullptr );
132+ [[nodiscard]] NetworkDeviceType::Enum type () const override { return NetworkDeviceType::Wireless; };
102133
103- // Q_INVOKABLE void disconnect();
104- // Q_INVOKABLE void scan();
134+ // / Request the wireless device to scan for available WiFi networks.
135+ Q_INVOKABLE void scan ();
105136
137+ [[nodiscard]] QBindable<bool > bindableScanning () { return &this ->bScanning ; };
106138 [[nodiscard]] QBindable<qint64> bindableLastScan () { return &this ->bLastScan ; };
107139
108140private:
109141 // clang-format off
110- Q_OBJECT_BINDABLE_PROPERTY (WirelessDevice, qint64, bLastScan, &WirelessDevice::lastScanChanged);
142+ Q_OBJECT_BINDABLE_PROPERTY (WirelessNetworkDevice, bool , bScanning, &WirelessNetworkDevice::scanningChanged);
143+ Q_OBJECT_BINDABLE_PROPERTY (WirelessNetworkDevice, qint64, bLastScan, &WirelessNetworkDevice::lastScanChanged);
111144 // clang-format on
112145};
113146
114147// -- Network --
115-
116148class NetworkBackend : public QObject {
117149 Q_OBJECT;
118150
119151public:
120152 [[nodiscard]] virtual bool isAvailable () const = 0;
121153 virtual UntypedObjectModel* devices () = 0;
122- virtual WirelessDevice * defaultWifiDevice () = 0;
154+ virtual WirelessNetworkDevice * defaultWifiDevice () = 0;
123155
124156protected:
125157 explicit NetworkBackend (QObject* parent = nullptr ): QObject(parent) {};
@@ -130,13 +162,13 @@ class Network: public QObject {
130162 QML_NAMED_ELEMENT (Network);
131163 QML_SINGLETON;
132164
133- Q_PROPERTY (WirelessDevice* defaultWifiDevice READ defaultWifiDevice CONSTANT);
165+ Q_PROPERTY (WirelessNetworkDevice* defaultWifiNetworkDevice READ defaultWifiNetworkDevice CONSTANT);
134166 Q_PROPERTY (UntypedObjectModel* devices READ devices CONSTANT);
135167
136168public:
137169 explicit Network (QObject* parent = nullptr );
138170 [[nodiscard]] UntypedObjectModel* devices () { return backend ? backend->devices () : nullptr ; };
139- [[nodiscard]] WirelessDevice* defaultWifiDevice () {
171+ [[nodiscard]] WirelessNetworkDevice* defaultWifiNetworkDevice () {
140172 return backend ? backend->defaultWifiDevice () : nullptr ;
141173 };
142174
0 commit comments