Skip to content

Commit 560232c

Browse files
committed
feat: accessPoints
1 parent 997f45b commit 560232c

File tree

10 files changed

+365
-72
lines changed

10 files changed

+365
-72
lines changed

src/network/CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,16 @@ qt_add_dbus_interface(NM_DBUS_INTERFACES
2929
dbus_nm_wireless
3030
)
3131

32+
set_source_files_properties(org.freedesktop.NetworkManager.AccessPoint.xml PROPERTIES
33+
CLASSNAME DBusNMAccessPointProxy
34+
NO_NAMESPACE TRUE
35+
)
36+
37+
qt_add_dbus_interface(NM_DBUS_INTERFACES
38+
org.freedesktop.NetworkManager.AccessPoint.xml
39+
dbus_nm_accesspoint
40+
)
41+
3242
qt_add_library(quickshell-network STATIC
3343
api.cpp
3444
nm_backend.cpp

src/network/api.cpp

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

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

20+
// NetworkDevice
21+
2022
NetworkDevice::NetworkDevice(QObject* parent): QObject(parent) {};
21-
WirelessNetworkDevice::WirelessNetworkDevice(QObject* parent): NetworkDevice(parent) {};
2223

2324
QString NetworkDeviceState::toString(NetworkDeviceState::Enum state) {
2425
switch (state) {
@@ -60,20 +61,24 @@ void NetworkDevice::setState(NetworkDeviceState::Enum state) {
6061

6162
void NetworkDevice::disconnect() {
6263
if (this->bState == NetworkDeviceState::Disconnected) {
63-
qCCritical(logNetworkNetworkDevice) << "NetworkDevice" << this << "is already disconnected";
64+
qCCritical(logNetworkDevice) << "Device" << this << "is already disconnected";
6465
return;
6566
}
6667

6768
if (this->bState == NetworkDeviceState::Disconnecting) {
68-
qCCritical(logNetworkNetworkDevice) << "NetworkDevice" << this << "is already disconnecting";
69+
qCCritical(logNetworkDevice) << "Device" << this << "is already disconnecting";
6970
return;
7071
}
7172

72-
qCDebug(logNetworkNetworkDevice) << "Disconnecting from device" << this;
73+
qCDebug(logNetworkDevice) << "Disconnecting from device" << this;
7374

7475
signalDisconnect();
7576
}
7677

78+
// WirelessNetworkDevice
79+
80+
WirelessNetworkDevice::WirelessNetworkDevice(QObject* parent): NetworkDevice(parent) {};
81+
7782
void WirelessNetworkDevice::scanComplete(qint64 lastScan) {
7883
this->bLastScan = lastScan;
7984
emit this->lastScanChanged();
@@ -86,28 +91,62 @@ void WirelessNetworkDevice::scanComplete(qint64 lastScan) {
8691

8792
void WirelessNetworkDevice::scan() {
8893
if (this->bScanning) {
89-
qCCritical(logNetworkNetworkDevice) << "NetworkDevice" << this << "is already scanning";
94+
qCCritical(logNetworkDevice) << "Wireless device" << this << "is already scanning";
9095
return;
9196
}
9297

93-
qCDebug(logNetworkNetworkDevice) << "Requesting scan on wireless device" << this;
98+
qCDebug(logNetworkDevice) << "Requesting scan on wireless device" << this;
9499
this->bScanning = true;
95100
signalScan();
96101
}
97102

103+
void WirelessNetworkDevice::addAccessPoint(NetworkAccessPoint* ap) {
104+
mAccessPoints.insertObject(ap);
105+
}
106+
107+
void WirelessNetworkDevice::removeAccessPoint(NetworkAccessPoint* ap) {
108+
mAccessPoints.removeObject(ap);
109+
}
110+
111+
// NetworkAccessPoint
112+
113+
NetworkAccessPoint::NetworkAccessPoint(QObject* parent): QObject(parent) {};
114+
115+
void NetworkAccessPoint::setSsid(const QString& ssid) {
116+
if (this->bSsid != ssid) {
117+
this->bSsid = ssid;
118+
emit ssidChanged();
119+
}
120+
}
121+
122+
void NetworkAccessPoint::setSignal(quint8 signal) {
123+
if (this->bSignal != signal) {
124+
this->bSignal = signal;
125+
emit signalChanged();
126+
}
127+
}
128+
129+
// Network
130+
98131
Network::Network(QObject* parent): QObject(parent) {
99132
// Try each backend
100133

101134
// NetworkManager
102135
auto* nm = new NetworkManager();
103136
if (nm->isAvailable()) {
137+
QObject::connect(nm, &NetworkManager::deviceAdded, this, &Network::addDevice);
138+
QObject::connect(nm, &NetworkManager::deviceRemoved, this, &Network::removeDevice);
104139
this->backend = nm;
105140
return;
106141
}
107142

108143
// None found
109144
this->backend = nullptr;
110-
qCDebug(logNetwork) << "Network will not work. Could not find an available backend.";
145+
qCCritical(logNetwork) << "Network will not work. Could not find an available backend.";
111146
}
112147

148+
void Network::addDevice(NetworkDevice* device) { this->mDevices.insertObject(device); }
149+
150+
void Network::removeDevice(NetworkDevice* device) { this->mDevices.removeObject(device); }
151+
113152
} // namespace qs::network

src/network/api.hpp

Lines changed: 58 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,36 @@
1414

1515
namespace 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.
1949
class 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

85114
public 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:
102130
private:
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

119155
signals:
120156
void signalScan();
121157

122-
// Frontend-facing signals
123158
void lastScanChanged();
124159
void scanningChanged();
125160

126161
public slots:
127-
// For backend signals
128162
void scanComplete(qint64 lastScan);
163+
void addAccessPoint(NetworkAccessPoint* ap);
164+
void removeAccessPoint(NetworkAccessPoint* ap);
129165

130166
public:
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+
140178
private:
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

151188
public:
152189
[[nodiscard]] virtual bool isAvailable() const = 0;
153-
virtual UntypedObjectModel* devices() = 0;
154-
virtual WirelessNetworkDevice* defaultWifiDevice() = 0;
155190

156191
protected:
157192
explicit NetworkBackend(QObject* parent = nullptr): QObject(parent) {};
158193
};
159194

195+
///! Network manager
196+
/// Provides access to network devices.
160197
class 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

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

175218
private:
219+
ObjectModel<NetworkDevice> mDevices {this};
176220
class NetworkBackend* backend = nullptr;
177221
};
178222

0 commit comments

Comments
 (0)