Skip to content

Commit be80d20

Browse files
committed
feat: ap flags, device connections
1 parent e5e0544 commit be80d20

16 files changed

+174
-198
lines changed

src/network/CMakeLists.txt

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,8 @@ qt_add_dbus_interface(NM_DBUS_INTERFACES
4949
nm/dbus_nm_connection
5050
)
5151

52-
set_source_files_properties(nm/org.freedesktop.NetworkManager.Settings.xml PROPERTIES
53-
CLASSNAME DBusNMSettingsProxy
54-
NO_NAMESPACE TRUE
55-
)
56-
57-
qt_add_dbus_interface(NM_DBUS_INTERFACES
58-
nm/org.freedesktop.NetworkManager.Settings.xml
59-
nm/dbus_nm_settings
60-
)
61-
6252
qt_add_library(quickshell-network STATIC
63-
api.cpp
53+
frontend.cpp
6454
nm/backend.cpp
6555
nm/device.cpp
6656
nm/accesspoint.cpp

src/network/api.cpp renamed to src/network/frontend.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "api.hpp"
1+
#include "frontend.hpp"
22

33
#include <qdbusconnection.h>
44
#include <qdbusconnectioninterface.h>
@@ -124,16 +124,16 @@ Network::Network(QObject* parent): QObject(parent) {
124124

125125
// NetworkManager
126126
auto* nm = new NetworkManager(this);
127-
connect(nm, &NetworkBackend::ready, this, [this, nm](bool success) {
128-
if (success) {
129-
QObject::connect(nm, &NetworkManager::deviceAdded, this, &Network::addDevice);
130-
QObject::connect(nm, &NetworkManager::deviceRemoved, this, &Network::removeDevice);
131-
this->backend = nm;
132-
} else {
133-
delete nm;
134-
qCCritical(logNetwork) << "Network will not work. Could not find an available backend.";
135-
}
136-
});
127+
if (nm->isAvailable()) {
128+
QObject::connect(nm, &NetworkManager::deviceAdded, this, &Network::addDevice);
129+
QObject::connect(nm, &NetworkManager::deviceRemoved, this, &Network::removeDevice);
130+
this->backend = nm;
131+
return;
132+
} else {
133+
delete nm;
134+
}
135+
136+
qCCritical(logNetwork) << "Network will not work. Could not find an available backend.";
137137
}
138138

139139
void Network::addDevice(NetworkDevice* device) { this->mDevices.insertObject(device); }

src/network/api.hpp renamed to src/network/frontend.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ public slots:
183183
class NetworkBackend: public QObject {
184184
Q_OBJECT;
185185

186-
signals:
187-
void ready(bool success);
186+
public:
187+
[[nodiscard]] virtual bool isAvailable() const = 0;
188188

189189
protected:
190190
explicit NetworkBackend(QObject* parent = nullptr): QObject(parent) {};

src/network/nm/accesspoint.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ QString NMAccessPointAdapter::address() const {
4242
}
4343
QString NMAccessPointAdapter::path() const { return this->proxy ? this->proxy->path() : QString(); }
4444

45-
NMAccessPointGroup::NMAccessPointGroup(QByteArray ssid, QObject* parent)
45+
NMWifiNetwork::NMWifiNetwork(QByteArray ssid, QObject* parent)
4646
: QObject(parent)
4747
, mSsid(std::move(ssid)) {}
4848

49-
void NMAccessPointGroup::updateSignalStrength() {
49+
void NMWifiNetwork::updateSignalStrength() {
5050
quint8 max = 0;
5151
for (auto* ap: mAccessPoints) {
5252
max = qMax(max, ap->getSignal());
@@ -56,7 +56,7 @@ void NMAccessPointGroup::updateSignalStrength() {
5656
}
5757
}
5858

59-
void NMAccessPointGroup::addAccessPoint(NMAccessPointAdapter* ap) {
59+
void NMWifiNetwork::addAccessPoint(NMAccessPointAdapter* ap) {
6060
if (this->mAccessPoints.contains(ap)) {
6161
qCWarning(logNetworkManager) << "Access point" << ap->path() << "was already in AP group";
6262
return;
@@ -67,16 +67,30 @@ void NMAccessPointGroup::addAccessPoint(NMAccessPointAdapter* ap) {
6767
ap,
6868
&NMAccessPointAdapter::signalStrengthChanged,
6969
this,
70-
&NMAccessPointGroup::updateSignalStrength
70+
&NMWifiNetwork::updateSignalStrength
7171
);
7272
this->updateSignalStrength();
7373
}
7474

75-
void NMAccessPointGroup::removeAccessPoint(NMAccessPointAdapter* ap) {
75+
void NMWifiNetwork::removeAccessPoint(NMAccessPointAdapter* ap) {
7676
if (mAccessPoints.removeOne(ap)) {
7777
QObject::disconnect(ap, nullptr, this, nullptr);
7878
this->updateSignalStrength();
7979
}
8080
}
8181

8282
} // namespace qs::network
83+
84+
namespace qs::dbus {
85+
86+
DBusResult<qs::network::NM80211ApFlags::Enum>
87+
DBusDataTransform<qs::network::NM80211ApFlags::Enum>::fromWire(quint32 wire) {
88+
return DBusResult(static_cast<qs::network::NM80211ApFlags::Enum>(wire));
89+
}
90+
91+
DBusResult<qs::network::NM80211ApSecurityFlags::Enum>
92+
DBusDataTransform<qs::network::NM80211ApSecurityFlags::Enum>::fromWire(quint32 wire) {
93+
return DBusResult(static_cast<qs::network::NM80211ApSecurityFlags::Enum>(wire));
94+
}
95+
96+
} // namespace qs::dbus

src/network/nm/accesspoint.hpp

Lines changed: 74 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,66 @@
1515

1616
namespace qs::network {
1717

18+
class NM80211ApFlags: public QObject {
19+
Q_OBJECT;
20+
21+
public:
22+
enum Enum : quint8 {
23+
None = 0,
24+
Privacy = 1,
25+
Wps = 2,
26+
WpsPbc = 4,
27+
WpsPin = 8,
28+
};
29+
Q_ENUM(Enum);
30+
};
31+
32+
class NM80211ApSecurityFlags: public QObject {
33+
Q_OBJECT;
34+
35+
public:
36+
enum Enum : quint16 {
37+
None = 0,
38+
PairWep40 = 1,
39+
PairWep104 = 2,
40+
PairTkip = 4,
41+
PairCcmp = 8,
42+
GroupWep40 = 16,
43+
GroupWep104 = 32,
44+
GroupTkip = 64,
45+
GroupCcmp = 128,
46+
KeyMgmtPsk = 256,
47+
KeyMgmt8021x = 512,
48+
KeyMgmtSae = 1024,
49+
KeyMgmtOwe = 2048,
50+
KeyMgmtOweTm = 4096,
51+
KeyMgmtEapSuiteB192 = 8192,
52+
};
53+
Q_ENUM(Enum);
54+
};
55+
56+
} // namespace qs::network
57+
58+
namespace qs::dbus {
59+
60+
template <>
61+
struct DBusDataTransform<qs::network::NM80211ApFlags::Enum> {
62+
using Wire = quint32;
63+
using Data = qs::network::NM80211ApFlags::Enum;
64+
static DBusResult<Data> fromWire(Wire wire);
65+
};
66+
67+
template <>
68+
struct DBusDataTransform<qs::network::NM80211ApSecurityFlags::Enum> {
69+
using Wire = quint32;
70+
using Data = qs::network::NM80211ApSecurityFlags::Enum;
71+
static DBusResult<Data> fromWire(Wire wire);
72+
};
73+
74+
} // namespace qs::dbus
75+
76+
namespace qs::network {
77+
1878
// NMAccessPointAdapter wraps the state of a NetworkManager access point
1979
// (org.freedesktop.NetworkManager.AccessPoint)
2080
class NMAccessPointAdapter: public QObject {
@@ -31,28 +91,36 @@ class NMAccessPointAdapter: public QObject {
3191
signals:
3292
void ssidChanged(const QByteArray& ssid);
3393
void signalStrengthChanged(quint8 signal);
94+
void wpaFlagsChanged(NM80211ApSecurityFlags::Enum wpaFlags);
95+
void rsnFlagsChanged(NM80211ApSecurityFlags::Enum rsnFlags);
96+
void flagsChanged(NM80211ApFlags::Enum flags);
3497

3598
private:
3699
// clang-format off
37100
Q_OBJECT_BINDABLE_PROPERTY(NMAccessPointAdapter, QByteArray, bSsid, &NMAccessPointAdapter::ssidChanged);
38101
Q_OBJECT_BINDABLE_PROPERTY(NMAccessPointAdapter, quint8, bSignalStrength, &NMAccessPointAdapter::signalStrengthChanged);
102+
Q_OBJECT_BINDABLE_PROPERTY(NMAccessPointAdapter, NM80211ApFlags::Enum, bFlags, &NMAccessPointAdapter::flagsChanged);
103+
Q_OBJECT_BINDABLE_PROPERTY(NMAccessPointAdapter, NM80211ApSecurityFlags::Enum, bWpaFlags, &NMAccessPointAdapter::wpaFlagsChanged);
104+
Q_OBJECT_BINDABLE_PROPERTY(NMAccessPointAdapter, NM80211ApSecurityFlags::Enum, bRsnFlags, &NMAccessPointAdapter::rsnFlagsChanged);
39105

40106
QS_DBUS_BINDABLE_PROPERTY_GROUP(NMAccessPointAdapter, accessPointProperties);
41107
QS_DBUS_PROPERTY_BINDING(NMAccessPointAdapter, pSsid, bSsid, accessPointProperties, "Ssid");
42108
QS_DBUS_PROPERTY_BINDING(NMAccessPointAdapter, pSignalStrength, bSignalStrength, accessPointProperties, "Strength");
109+
QS_DBUS_PROPERTY_BINDING(NMAccessPointAdapter, pFlags, bFlags, accessPointProperties, "Flags");
110+
QS_DBUS_PROPERTY_BINDING(NMAccessPointAdapter, pWpaFlags, bWpaFlags, accessPointProperties, "WpaFlags");
111+
QS_DBUS_PROPERTY_BINDING(NMAccessPointAdapter, pRsnFlags, bRsnFlags, accessPointProperties, "RsnFlags");
43112
// clang-format on
44113

45114
DBusNMAccessPointProxy* proxy = nullptr;
46115
};
47116

48-
// NMAccessPointGroup bundles the state of access points with the same SSID
49-
// into a single object and supplies signals/slots to connect AP signal strength
50-
// to NetworkWifiNetwork signal strength
51-
class NMAccessPointGroup: public QObject {
117+
// NMWifiNetwork represents a wireless network, which aggregates all access points with
118+
// the same SSID. It also provides signals and slots for a frontend WifiNetwork.
119+
class NMWifiNetwork: public QObject {
52120
Q_OBJECT;
53121

54122
public:
55-
explicit NMAccessPointGroup(QByteArray ssid, QObject* parent = nullptr);
123+
explicit NMWifiNetwork(QByteArray ssid, QObject* parent = nullptr);
56124
void addAccessPoint(NMAccessPointAdapter* ap);
57125
void removeAccessPoint(NMAccessPointAdapter* ap);
58126
void updateSignalStrength();
@@ -66,7 +134,7 @@ class NMAccessPointGroup: public QObject {
66134
QByteArray mSsid;
67135

68136
// clang-format off
69-
Q_OBJECT_BINDABLE_PROPERTY(NMAccessPointGroup, quint8, bMaxSignal, &NMAccessPointGroup::signalStrengthChanged);
137+
Q_OBJECT_BINDABLE_PROPERTY(NMWifiNetwork, quint8, bMaxSignal, &NMWifiNetwork::signalStrengthChanged);
70138
// clang-format on
71139
};
72140

src/network/nm/backend.cpp

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@
1010
#include <qtmetamacros.h>
1111
#include <qtypes.h>
1212

13-
#include "../../dbus/bus.hpp"
1413
#include "../../dbus/properties.hpp"
15-
#include "../api.hpp"
14+
#include "../frontend.hpp"
1615
#include "device.hpp"
1716
#include "nm/dbus_nm_backend.h"
1817
#include "wireless.hpp"
@@ -25,7 +24,6 @@ Q_LOGGING_CATEGORY(logNetworkManager, "quickshell.network.networkmanager", QtWar
2524

2625
const QString NM_SERVICE = "org.freedesktop.NetworkManager";
2726
const QString NM_PATH = "/org/freedesktop/NetworkManager";
28-
const QString NM_SETTINGS_PATH = "/org/freedesktop/NetworkManager/Settings";
2927

3028
NetworkManager::NetworkManager(QObject* parent): NetworkBackend(parent) {
3129
qCDebug(logNetworkManager) << "Starting NetworkManager Network Backend";
@@ -34,41 +32,20 @@ NetworkManager::NetworkManager(QObject* parent): NetworkBackend(parent) {
3432
if (!bus.isConnected()) {
3533
qCWarning(logNetworkManager
3634
) << "Could not connect to DBus. NetworkManager backend will not work.";
37-
emit ready(false);
3835
return;
3936
}
4037

4138
this->proxy = new DBusNetworkManagerProxy(NM_SERVICE, NM_PATH, bus, this);
4239

4340
if (!this->proxy->isValid()) {
4441
qCDebug(logNetworkManager
45-
) << "NetworkManager service is not currently running, attempting to start it.";
46-
47-
dbus::tryLaunchService(this, bus, NM_SERVICE, [this](bool success) {
48-
if (success) {
49-
qCDebug(logNetworkManager) << "Successfully launched NetworkManager backend.";
50-
this->init();
51-
} else {
52-
qCWarning(logNetworkManager)
53-
<< "Could not start NetworkManager. This network backend will not work.";
54-
emit ready(false);
55-
}
56-
});
42+
) << "NetworkManager service is not currently running. This network backend will not work";
5743
} else {
5844
this->init();
5945
}
6046
}
6147

6248
void NetworkManager::init() {
63-
emit ready(true);
64-
65-
this->settings = new NMSettingsAdapter(NM_SETTINGS_PATH, this);
66-
if (!this->settings->isValid()) {
67-
qCWarning(logNetworkManager) << "Failed to connect to NetworkManager settings service.";
68-
delete this->settings;
69-
return;
70-
}
71-
7249
QObject::connect(
7350
this->proxy,
7451
&DBusNetworkManagerProxy::DeviceAdded,
@@ -244,4 +221,6 @@ void NetworkManager::onDeviceRemoved(const QDBusObjectPath& path) {
244221
}
245222
}
246223

224+
bool NetworkManager::isAvailable() const { return this->proxy && this->proxy->isValid(); };
225+
247226
} // namespace qs::network

src/network/nm/backend.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#include <qtypes.h>
1212

1313
#include "../../dbus/properties.hpp"
14-
#include "../api.hpp"
14+
#include "../frontend.hpp"
1515
#include "connection.hpp"
1616
#include "device.hpp"
1717
#include "nm/dbus_nm_backend.h"
@@ -27,6 +27,7 @@ class NetworkManager: public NetworkBackend {
2727

2828
public:
2929
explicit NetworkManager(QObject* parent = nullptr);
30+
[[nodiscard]] bool isAvailable() const override;
3031

3132
private slots:
3233
void onDeviceAdded(const QDBusObjectPath& path);
@@ -42,7 +43,6 @@ private slots:
4243
NetworkDevice* bindDevice(NMDeviceAdapter* deviceAdapter);
4344

4445
QHash<QString, NetworkDevice*> mDeviceHash;
45-
NMSettingsAdapter* settings = nullptr;
4646

4747
QS_DBUS_BINDABLE_PROPERTY_GROUP(NetworkManager, dbusProperties);
4848
DBusNetworkManagerProxy* proxy = nullptr;

0 commit comments

Comments
 (0)