Skip to content

Commit c955811

Browse files
committed
refactor: move nm_* to nm/ and seperate adapter classes
1 parent 8b21137 commit c955811

15 files changed

+479
-398
lines changed

src/network/CMakeLists.txt

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,50 @@
11
# NetworkManager DBus
2-
set_source_files_properties(org.freedesktop.NetworkManager.xml PROPERTIES
2+
set_source_files_properties(nm/org.freedesktop.NetworkManager.xml PROPERTIES
33
CLASSNAME DBusNetworkManagerProxy
44
NO_NAMESPACE TRUE
55
)
66

77
qt_add_dbus_interface(NM_DBUS_INTERFACES
8-
org.freedesktop.NetworkManager.xml
9-
dbus_nm_backend
8+
nm/org.freedesktop.NetworkManager.xml
9+
nm/dbus_nm_backend
1010
)
1111

12-
set_source_files_properties(org.freedesktop.NetworkManager.Device.xml PROPERTIES
12+
set_source_files_properties(nm/org.freedesktop.NetworkManager.Device.xml PROPERTIES
1313
CLASSNAME DBusNMDeviceProxy
1414
NO_NAMESPACE TRUE
1515
)
1616

1717
qt_add_dbus_interface(NM_DBUS_INTERFACES
18-
org.freedesktop.NetworkManager.Device.xml
19-
dbus_nm_device
18+
nm/org.freedesktop.NetworkManager.Device.xml
19+
nm/dbus_nm_device
2020
)
2121

22-
set_source_files_properties(org.freedesktop.NetworkManager.Device.Wireless.xml PROPERTIES
22+
set_source_files_properties(nm/org.freedesktop.NetworkManager.Device.Wireless.xml PROPERTIES
2323
CLASSNAME DBusNMWirelessProxy
2424
NO_NAMESPACE TRUE
2525
)
2626

2727
qt_add_dbus_interface(NM_DBUS_INTERFACES
28-
org.freedesktop.NetworkManager.Device.Wireless.xml
29-
dbus_nm_wireless
28+
nm/org.freedesktop.NetworkManager.Device.Wireless.xml
29+
nm/dbus_nm_wireless
3030
)
3131

32-
set_source_files_properties(org.freedesktop.NetworkManager.AccessPoint.xml PROPERTIES
32+
set_source_files_properties(nm/org.freedesktop.NetworkManager.AccessPoint.xml PROPERTIES
3333
CLASSNAME DBusNMAccessPointProxy
3434
NO_NAMESPACE TRUE
3535
)
3636

3737
qt_add_dbus_interface(NM_DBUS_INTERFACES
38-
org.freedesktop.NetworkManager.AccessPoint.xml
39-
dbus_nm_accesspoint
38+
nm/org.freedesktop.NetworkManager.AccessPoint.xml
39+
nm/dbus_nm_accesspoint
4040
)
4141

4242
qt_add_library(quickshell-network STATIC
4343
api.cpp
44-
nm_backend.cpp
45-
nm_adapters.cpp
44+
nm/backend.cpp
45+
nm/device.cpp
46+
nm/accesspoint.cpp
47+
nm/wireless.cpp
4648
${NM_DBUS_INTERFACES}
4749
)
4850

src/network/api.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include <qdbusservicewatcher.h>
99
#include <qlogging.h>
1010

11-
#include "nm_backend.hpp"
11+
#include "nm/backend.hpp"
1212

1313
namespace qs::network {
1414

src/network/nm/accesspoint.cpp

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#include "accesspoint.hpp"
2+
3+
#include <qcontainerfwd.h>
4+
#include <qdbusconnection.h>
5+
#include <qlogging.h>
6+
#include <qloggingcategory.h>
7+
#include <qobject.h>
8+
#include <qstring.h>
9+
#include <qtypes.h>
10+
11+
#include "../../dbus/properties.hpp"
12+
#include "dbus_nm_accesspoint.h"
13+
14+
using namespace qs::dbus;
15+
16+
namespace qs::network {
17+
18+
namespace {
19+
Q_LOGGING_CATEGORY(logNetworkManager, "quickshell.network.networkmanager", QtWarningMsg);
20+
}
21+
22+
NMAccessPointAdapter::NMAccessPointAdapter(const QString& path, QObject* parent): QObject(parent) {
23+
this->proxy = new DBusNMAccessPointProxy(
24+
"org.freedesktop.NetworkManager",
25+
path,
26+
QDBusConnection::systemBus(),
27+
this
28+
);
29+
30+
if (!this->proxy->isValid()) {
31+
qCWarning(logNetworkManager) << "Cannot create access point proxy for" << path;
32+
return;
33+
}
34+
35+
this->accessPointProperties.setInterface(this->proxy);
36+
this->accessPointProperties.updateAllViaGetAll();
37+
}
38+
39+
bool NMAccessPointAdapter::isValid() const { return this->proxy && this->proxy->isValid(); }
40+
QString NMAccessPointAdapter::address() const {
41+
return this->proxy ? this->proxy->service() : QString();
42+
}
43+
QString NMAccessPointAdapter::path() const { return this->proxy ? this->proxy->path() : QString(); }
44+
45+
NMAccessPointGroup::NMAccessPointGroup(QByteArray ssid, QObject* parent)
46+
: QObject(parent)
47+
, mSsid(std::move(ssid)) {}
48+
49+
void NMAccessPointGroup::updateSignalStrength() {
50+
quint8 max = 0;
51+
for (auto* ap: mAccessPoints) {
52+
max = qMax(max, ap->getSignal());
53+
}
54+
if (this->bMaxSignal != max) {
55+
this->bMaxSignal = max;
56+
}
57+
}
58+
59+
void NMAccessPointGroup::addAccessPoint(NMAccessPointAdapter* ap) {
60+
if (this->mAccessPoints.contains(ap)) {
61+
qCWarning(logNetworkManager) << "Access point" << ap->path() << "was already in AP group";
62+
return;
63+
}
64+
65+
this->mAccessPoints.append(ap);
66+
QObject::connect(
67+
ap,
68+
&NMAccessPointAdapter::signalStrengthChanged,
69+
this,
70+
&NMAccessPointGroup::updateSignalStrength
71+
);
72+
this->updateSignalStrength();
73+
}
74+
75+
void NMAccessPointGroup::removeAccessPoint(NMAccessPointAdapter* ap) {
76+
if (mAccessPoints.removeOne(ap)) {
77+
QObject::disconnect(ap, nullptr, this, nullptr);
78+
this->updateSignalStrength();
79+
}
80+
}
81+
82+
} // namespace qs::network

src/network/nm/accesspoint.hpp

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#pragma once
2+
3+
#include <qcontainerfwd.h>
4+
#include <qdbusextratypes.h>
5+
#include <qdbusservicewatcher.h>
6+
#include <qhash.h>
7+
#include <qobject.h>
8+
#include <qqmlintegration.h>
9+
#include <qqmllist.h>
10+
#include <qtmetamacros.h>
11+
#include <qtypes.h>
12+
13+
#include "../../dbus/properties.hpp"
14+
#include "dbus_nm_accesspoint.h"
15+
16+
namespace qs::network {
17+
18+
// NMAccessPointAdapter wraps the state of a NetworkManager access point
19+
// (org.freedesktop.NetworkManager.AccessPoint)
20+
class NMAccessPointAdapter: public QObject {
21+
Q_OBJECT;
22+
23+
public:
24+
explicit NMAccessPointAdapter(const QString& path, QObject* parent = nullptr);
25+
26+
[[nodiscard]] bool isValid() const;
27+
[[nodiscard]] QString path() const;
28+
[[nodiscard]] QString address() const;
29+
[[nodiscard]] quint8 getSignal() const { return this->bSignalStrength; };
30+
31+
signals:
32+
void ssidChanged(const QByteArray& ssid);
33+
void signalStrengthChanged(quint8 signal);
34+
35+
private:
36+
// clang-format off
37+
Q_OBJECT_BINDABLE_PROPERTY(NMAccessPointAdapter, QByteArray, bSsid, &NMAccessPointAdapter::ssidChanged);
38+
Q_OBJECT_BINDABLE_PROPERTY(NMAccessPointAdapter, quint8, bSignalStrength, &NMAccessPointAdapter::signalStrengthChanged);
39+
40+
QS_DBUS_BINDABLE_PROPERTY_GROUP(NMAccessPointAdapter, accessPointProperties);
41+
QS_DBUS_PROPERTY_BINDING(NMAccessPointAdapter, pSsid, bSsid, accessPointProperties, "Ssid");
42+
QS_DBUS_PROPERTY_BINDING(NMAccessPointAdapter, pSignalStrength, bSignalStrength, accessPointProperties, "Strength");
43+
// clang-format on
44+
45+
DBusNMAccessPointProxy* proxy = nullptr;
46+
};
47+
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 {
52+
Q_OBJECT;
53+
54+
public:
55+
explicit NMAccessPointGroup(QByteArray ssid, QObject* parent = nullptr);
56+
void addAccessPoint(NMAccessPointAdapter* ap);
57+
void removeAccessPoint(NMAccessPointAdapter* ap);
58+
void updateSignalStrength();
59+
[[nodiscard]] bool isEmpty() const { return this->mAccessPoints.isEmpty(); };
60+
61+
signals:
62+
void signalStrengthChanged(quint8 signal);
63+
64+
private:
65+
QList<NMAccessPointAdapter*> mAccessPoints;
66+
QByteArray mSsid;
67+
68+
// clang-format off
69+
Q_OBJECT_BINDABLE_PROPERTY(NMAccessPointGroup, quint8, bMaxSignal, &NMAccessPointGroup::signalStrengthChanged);
70+
// clang-format on
71+
};
72+
73+
} // namespace qs::network

src/network/nm_backend.cpp renamed to src/network/nm/backend.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "nm_backend.hpp"
1+
#include "backend.hpp"
22

33
#include <qcontainerfwd.h>
44
#include <qdbusextratypes.h>
@@ -10,11 +10,12 @@
1010
#include <qtmetamacros.h>
1111
#include <qtypes.h>
1212

13-
#include "../dbus/bus.hpp"
14-
#include "../dbus/properties.hpp"
15-
#include "api.hpp"
13+
#include "../../dbus/bus.hpp"
14+
#include "../../dbus/properties.hpp"
15+
#include "../api.hpp"
16+
#include "device.hpp"
17+
#include "wireless.hpp"
1618
#include "dbus_nm_backend.h"
17-
#include "nm_adapters.hpp"
1819

1920
namespace qs::network {
2021

src/network/nm_backend.hpp renamed to src/network/nm/backend.hpp

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

13-
#include "../dbus/properties.hpp"
14-
#include "api.hpp"
13+
#include "../../dbus/properties.hpp"
14+
#include "../api.hpp"
1515
#include "dbus_nm_backend.h"
16-
#include "nm_adapters.hpp"
16+
#include "device.hpp"
1717

1818
namespace qs::network {
1919

src/network/nm/device.cpp

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#include "device.hpp"
2+
3+
#include <qcontainerfwd.h>
4+
#include <qdbusconnection.h>
5+
#include <qlogging.h>
6+
#include <qloggingcategory.h>
7+
#include <qobject.h>
8+
#include <qstring.h>
9+
#include <qtypes.h>
10+
11+
#include "../../dbus/properties.hpp"
12+
#include "dbus_nm_device.h"
13+
14+
using namespace qs::dbus;
15+
16+
namespace qs::network {
17+
18+
namespace {
19+
Q_LOGGING_CATEGORY(logNetworkManager, "quickshell.network.networkmanager", QtWarningMsg);
20+
}
21+
22+
NMDeviceAdapter::NMDeviceAdapter(const QString& path, QObject* parent): QObject(parent) {
23+
this->proxy = new DBusNMDeviceProxy(
24+
"org.freedesktop.NetworkManager",
25+
path,
26+
QDBusConnection::systemBus(),
27+
this
28+
);
29+
30+
if (!this->proxy->isValid()) {
31+
qCWarning(logNetworkManager) << "Cannot create DBus interface for device at" << path;
32+
return;
33+
}
34+
35+
this->deviceProperties.setInterface(this->proxy);
36+
this->deviceProperties.updateAllViaGetAll();
37+
}
38+
39+
void NMDeviceAdapter::disconnect() { this->proxy->Disconnect(); }
40+
bool NMDeviceAdapter::isValid() const { return this->proxy && this->proxy->isValid(); }
41+
QString NMDeviceAdapter::address() const {
42+
return this->proxy ? this->proxy->service() : QString();
43+
}
44+
QString NMDeviceAdapter::path() const { return this->proxy ? this->proxy->path() : QString(); }
45+
46+
NetworkDeviceState::Enum NMDeviceState::toNetworkDeviceState(NMDeviceState::Enum state) {
47+
switch (state) {
48+
case 0 ... 20: return NetworkDeviceState::Unknown;
49+
case 30: return NetworkDeviceState::Disconnected;
50+
case 40 ... 90: return NetworkDeviceState::Connecting;
51+
case 100: return NetworkDeviceState::Connected;
52+
case 110 ... 120: return NetworkDeviceState::Disconnecting;
53+
}
54+
}
55+
56+
} // namespace qs::network
57+
58+
namespace qs::dbus {
59+
60+
DBusResult<qs::network::NMDeviceType::Enum>
61+
DBusDataTransform<qs::network::NMDeviceType::Enum>::fromWire(quint32 wire) {
62+
return DBusResult(static_cast<qs::network::NMDeviceType::Enum>(wire));
63+
}
64+
65+
DBusResult<qs::network::NMDeviceState::Enum>
66+
DBusDataTransform<qs::network::NMDeviceState::Enum>::fromWire(quint32 wire) {
67+
return DBusResult(static_cast<qs::network::NMDeviceState::Enum>(wire));
68+
}
69+
70+
} // namespace qs::dbus

0 commit comments

Comments
 (0)