Skip to content

Commit 997f45b

Browse files
committed
feat: scan, lastScan, NetworkDeviceType
1 parent c9ece29 commit 997f45b

File tree

7 files changed

+184
-84
lines changed

7 files changed

+184
-84
lines changed

src/network/api.cpp

Lines changed: 47 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,62 +13,86 @@
1313
namespace qs::network {
1414

1515
namespace {
16-
Q_LOGGING_CATEGORY(logNetworkDevice, "quickshell.network.device", QtWarningMsg);
16+
Q_LOGGING_CATEGORY(logNetworkNetworkDevice, "quickshell.network.device", QtWarningMsg);
1717
Q_LOGGING_CATEGORY(logNetwork, "quickshell.network", QtWarningMsg);
18-
}
18+
} // namespace
1919

20-
Device::Device(QObject* parent): QObject(parent) {};
21-
WirelessDevice::WirelessDevice(QObject* parent): Device(parent) {};
20+
NetworkDevice::NetworkDevice(QObject* parent): QObject(parent) {};
21+
WirelessNetworkDevice::WirelessNetworkDevice(QObject* parent): NetworkDevice(parent) {};
2222

23-
QString DeviceState::toString(DeviceState::Enum state) {
23+
QString NetworkDeviceState::toString(NetworkDeviceState::Enum state) {
2424
switch (state) {
25-
case DeviceState::Unknown: return QStringLiteral("Unknown");
26-
case DeviceState::Disconnected: return QStringLiteral("Disconnected");
27-
case DeviceState::Connecting: return QStringLiteral("Connecting");
28-
case DeviceState::Connected: return QStringLiteral("Connected");
29-
case DeviceState::Disconnecting: return QStringLiteral("Disconnecting");
25+
case NetworkDeviceState::Unknown: return QStringLiteral("Unknown");
26+
case NetworkDeviceState::Disconnected: return QStringLiteral("Disconnected");
27+
case NetworkDeviceState::Connecting: return QStringLiteral("Connecting");
28+
case NetworkDeviceState::Connected: return QStringLiteral("Connected");
29+
case NetworkDeviceState::Disconnecting: return QStringLiteral("Disconnecting");
30+
default: return QStringLiteral("Unknown");
31+
}
32+
}
33+
34+
QString NetworkDeviceType::toString(NetworkDeviceType::Enum type) {
35+
switch (type) {
36+
case NetworkDeviceType::Other: return QStringLiteral("Other");
37+
case NetworkDeviceType::Wireless: return QStringLiteral("Wireless");
38+
case NetworkDeviceType::Ethernet: return QStringLiteral("Ethernet");
3039
default: return QStringLiteral("Unknown");
3140
}
3241
}
3342

34-
void Device::setName(const QString& name) {
43+
void NetworkDevice::setName(const QString& name) {
3544
if (name != this->bName) {
3645
this->bName = name;
3746
}
3847
}
3948

40-
void Device::setAddress(const QString& address) {
49+
void NetworkDevice::setAddress(const QString& address) {
4150
if (address != this->bAddress) {
4251
this->bAddress = address;
4352
}
4453
}
4554

46-
void Device::setState(DeviceState::Enum state) {
55+
void NetworkDevice::setState(NetworkDeviceState::Enum state) {
4756
if (state != this->bState) {
4857
this->bState = state;
4958
}
5059
}
5160

52-
void Device::disconnect() {
53-
if (this->bState == DeviceState::Disconnected) {
54-
qCCritical(logNetworkDevice) << "Device" << this << "is already disconnected";
61+
void NetworkDevice::disconnect() {
62+
if (this->bState == NetworkDeviceState::Disconnected) {
63+
qCCritical(logNetworkNetworkDevice) << "NetworkDevice" << this << "is already disconnected";
5564
return;
5665
}
5766

58-
if (this->bState == DeviceState::Disconnecting) {
59-
qCCritical(logNetworkDevice) << "Device" << this << "is already disconnecting";
67+
if (this->bState == NetworkDeviceState::Disconnecting) {
68+
qCCritical(logNetworkNetworkDevice) << "NetworkDevice" << this << "is already disconnecting";
6069
return;
6170
}
6271

63-
qCDebug(logNetworkDevice) << "Disconnecting from device" << this;
64-
72+
qCDebug(logNetworkNetworkDevice) << "Disconnecting from device" << this;
73+
6574
signalDisconnect();
6675
}
6776

68-
void WirelessDevice::setLastScan(qint64 lastScan) {
69-
if (lastScan != this->bLastScan) {
70-
this->bLastScan = lastScan;
77+
void WirelessNetworkDevice::scanComplete(qint64 lastScan) {
78+
this->bLastScan = lastScan;
79+
emit this->lastScanChanged();
80+
81+
if (this->bScanning) {
82+
this->bScanning = false;
83+
emit this->scanningChanged();
84+
}
85+
}
86+
87+
void WirelessNetworkDevice::scan() {
88+
if (this->bScanning) {
89+
qCCritical(logNetworkNetworkDevice) << "NetworkDevice" << this << "is already scanning";
90+
return;
7191
}
92+
93+
qCDebug(logNetworkNetworkDevice) << "Requesting scan on wireless device" << this;
94+
this->bScanning = true;
95+
signalScan();
7296
}
7397

7498
Network::Network(QObject* parent): QObject(parent) {

src/network/api.hpp

Lines changed: 59 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,28 @@
1414

1515
namespace 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

5677
signals:
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+
6485
public 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

7091
public:
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

80102
private:
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

94119
signals:
120+
void signalScan();
121+
122+
// Frontend-facing signals
95123
void lastScanChanged();
124+
void scanningChanged();
96125

97126
public slots:
98-
void setLastScan(qint64 lastScan);
127+
// For backend signals
128+
void scanComplete(qint64 lastScan);
99129

100130
public:
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

108140
private:
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-
116148
class NetworkBackend: public QObject {
117149
Q_OBJECT;
118150

119151
public:
120152
[[nodiscard]] virtual bool isAvailable() const = 0;
121153
virtual UntypedObjectModel* devices() = 0;
122-
virtual WirelessDevice* defaultWifiDevice() = 0;
154+
virtual WirelessNetworkDevice* defaultWifiDevice() = 0;
123155

124156
protected:
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

136168
public:
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

src/network/nm_adapters.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ QString NMDeviceAdapter::address() const {
4545
}
4646
QString NMDeviceAdapter::path() const { return this->proxy ? this->proxy->path() : QString(); }
4747

48-
DeviceState::Enum NMDeviceState::translate(NMDeviceState::Enum state) {
48+
NetworkDeviceState::Enum NMDeviceState::translate(NMDeviceState::Enum state) {
4949
switch(state) {
50-
case 0 ... 20: return DeviceState::Unknown;
51-
case 30: return DeviceState::Disconnected;
52-
case 40 ... 90: return DeviceState::Connecting;
53-
case 100: return DeviceState::Connected;
54-
case 110 ... 120: return DeviceState::Disconnecting;
50+
case 0 ... 20: return NetworkDeviceState::Unknown;
51+
case 30: return NetworkDeviceState::Disconnected;
52+
case 40 ... 90: return NetworkDeviceState::Connecting;
53+
case 100: return NetworkDeviceState::Connected;
54+
case 110 ... 120: return NetworkDeviceState::Disconnecting;
5555
}
5656
}
5757

@@ -74,6 +74,7 @@ void NMWirelessAdapter::init(const QString& path) {
7474
this->wirelessProperties.updateAllViaGetAll();
7575
}
7676

77+
void NMWirelessAdapter::scan() { this->proxy->RequestScan(); }
7778
bool NMWirelessAdapter::isValid() const { return this->proxy && this->proxy->isValid(); }
7879
QString NMWirelessAdapter::address() const {
7980
return this->proxy ? this->proxy->service() : QString();

src/network/nm_adapters.hpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class NMDeviceState: public QObject {
3838
};
3939
Q_ENUM(Enum);
4040

41-
static DeviceState::Enum translate(NMDeviceState::Enum state);
41+
static NetworkDeviceState::Enum translate(NMDeviceState::Enum state);
4242
};
4343

4444
class NMDeviceType: public QObject {
@@ -156,16 +156,18 @@ class NMWirelessAdapter: public QObject {
156156
[[nodiscard]] QString address() const;
157157
[[nodiscard]] qint64 getLastScan() { return this->bLastScan; };
158158

159+
public slots:
160+
void scan();
161+
159162
signals:
160-
void lastScanChanged(qint64 time);
163+
void lastScanChanged(qint64 lastScan);
161164

162165
private:
163166
// clang-format off
164167
Q_OBJECT_BINDABLE_PROPERTY(NMWirelessAdapter, qint64, bLastScan, &NMWirelessAdapter::lastScanChanged);
165168

166169
QS_DBUS_BINDABLE_PROPERTY_GROUP(NMWirelessAdapter, wirelessProperties);
167170
QS_DBUS_PROPERTY_BINDING(NMWirelessAdapter, pLastScan, bLastScan, wirelessProperties, "LastScan");
168-
169171
DBusNMWirelessProxy* proxy = nullptr;
170172
};
171173
} // namespace qs::network

0 commit comments

Comments
 (0)