Skip to content

Commit 03413d9

Browse files
committed
network: fix segfault, split backend CMakeLists
- Fix segfault related to network state signal emission - Add WifiNetwork.forget() and Device.autoconnect - Create separate CMakeLists for nm - Use QObject::destroyed to clean up pointer lists - Use asyncReadProperty to get device type before registration - Remove mConnectionPaths - Add default cases to all toString invokables
1 parent 14068b8 commit 03413d9

21 files changed

+272
-237
lines changed

src/network/CMakeLists.txt

Lines changed: 2 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,11 @@
1-
set_source_files_properties(nm/org.freedesktop.NetworkManager.xml PROPERTIES
2-
CLASSNAME DBusNetworkManagerProxy
3-
NO_NAMESPACE TRUE
4-
INCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/nm/dbus_types.hpp
5-
)
6-
7-
qt_add_dbus_interface(NM_DBUS_INTERFACES
8-
nm/org.freedesktop.NetworkManager.xml
9-
nm/dbus_nm_backend
10-
)
11-
12-
set_source_files_properties(nm/org.freedesktop.NetworkManager.Device.xml PROPERTIES
13-
CLASSNAME DBusNMDeviceProxy
14-
NO_NAMESPACE TRUE
15-
)
16-
17-
qt_add_dbus_interface(NM_DBUS_INTERFACES
18-
nm/org.freedesktop.NetworkManager.Device.xml
19-
nm/dbus_nm_device
20-
)
21-
22-
set_source_files_properties(nm/org.freedesktop.NetworkManager.Device.Wireless.xml PROPERTIES
23-
CLASSNAME DBusNMWirelessProxy
24-
NO_NAMESPACE TRUE
25-
)
26-
27-
qt_add_dbus_interface(NM_DBUS_INTERFACES
28-
nm/org.freedesktop.NetworkManager.Device.Wireless.xml
29-
nm/dbus_nm_wireless
30-
)
31-
32-
set_source_files_properties(nm/org.freedesktop.NetworkManager.AccessPoint.xml PROPERTIES
33-
CLASSNAME DBusNMAccessPointProxy
34-
NO_NAMESPACE TRUE
35-
)
36-
37-
qt_add_dbus_interface(NM_DBUS_INTERFACES
38-
nm/org.freedesktop.NetworkManager.AccessPoint.xml
39-
nm/dbus_nm_accesspoint
40-
)
41-
42-
set_source_files_properties(nm/org.freedesktop.NetworkManager.Settings.Connection.xml PROPERTIES
43-
CLASSNAME DBusNMConnectionSettingsProxy
44-
NO_NAMESPACE TRUE
45-
INCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/nm/dbus_types.hpp
46-
)
47-
48-
qt_add_dbus_interface(NM_DBUS_INTERFACES
49-
nm/org.freedesktop.NetworkManager.Settings.Connection.xml
50-
nm/dbus_nm_connection_settings
51-
)
52-
53-
set_source_files_properties(nm/org.freedesktop.NetworkManager.Connection.Active.xml PROPERTIES
54-
CLASSNAME DBusNMActiveConnectionProxy
55-
NO_NAMESPACE TRUE
56-
)
57-
58-
qt_add_dbus_interface(NM_DBUS_INTERFACES
59-
nm/org.freedesktop.NetworkManager.Connection.Active.xml
60-
nm/dbus_nm_active_connection
61-
)
1+
add_subdirectory(nm)
622

633
qt_add_library(quickshell-network STATIC
644
network.cpp
655
device.cpp
666
wifi.cpp
67-
nm/backend.cpp
68-
nm/device.cpp
69-
nm/connection.cpp
70-
nm/accesspoint.cpp
71-
nm/wireless.cpp
72-
nm/utils.cpp
73-
nm/enums.hpp
74-
${NM_DBUS_INTERFACES}
757
)
768

77-
# dbus headers
789
target_include_directories(quickshell-network PRIVATE
7910
${CMAKE_CURRENT_BINARY_DIR}
8011
)
@@ -87,9 +18,7 @@ qt_add_qml_module(quickshell-network
8718

8819
qs_add_module_deps_light(quickshell-network Quickshell)
8920
install_qml_module(quickshell-network)
90-
91-
target_link_libraries(quickshell-network PRIVATE Qt::Qml Qt::DBus)
21+
target_link_libraries(quickshell-network PRIVATE quickshell-network-nm Qt::Qml Qt::DBus)
9222
qs_add_link_dependencies(quickshell-network quickshell-dbus)
9323
target_link_libraries(quickshell PRIVATE quickshell-networkplugin)
94-
9524
qs_module_pch(quickshell-network SET dbus)

src/network/device.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <qloggingcategory.h>
66
#include <qobject.h>
77
#include <qstringliteral.h>
8+
#include <qtmetamacros.h>
89

910
#include "../core/logcat.hpp"
1011

@@ -21,13 +22,15 @@ QString DeviceConnectionState::toString(DeviceConnectionState::Enum state) {
2122
case Connected: return QStringLiteral("Connected");
2223
case Disconnecting: return QStringLiteral("Disconnecting");
2324
case Disconnected: return QStringLiteral("Disconnected");
25+
default: return QStringLiteral("Unknown");
2426
}
2527
}
2628

2729
QString DeviceType::toString(DeviceType::Enum type) {
2830
switch (type) {
2931
case None: return QStringLiteral("None");
3032
case Wifi: return QStringLiteral("Wifi");
33+
default: return QStringLiteral("Unknown");
3134
}
3235
}
3336

@@ -48,12 +51,19 @@ QString NMDeviceState::toString(NMDeviceState::Enum state) {
4851
case Activated: return QStringLiteral("Connected");
4952
case Deactivating: return QStringLiteral("Disconnecting");
5053
case Failed: return QStringLiteral("Failed to connect");
54+
default: return QStringLiteral("Unknown");
5155
};
5256
}
5357

54-
NetworkDevice::NetworkDevice(DeviceType::Enum type, QObject* parent)
55-
: QObject(parent)
56-
, mType(type) {};
58+
NetworkDevice::NetworkDevice(DeviceType::Enum type, QObject* parent): QObject(parent), mType(type) {
59+
this->bConnected.setBinding([this]() { return this->bState == DeviceConnectionState::Connected; }
60+
);
61+
};
62+
63+
void NetworkDevice::setAutoconnect(bool autoconnect) {
64+
if (this->bAutoconnect == autoconnect) return;
65+
emit this->requestSetAutoconnect(autoconnect);
66+
}
5767

5868
void NetworkDevice::disconnect() {
5969
if (this->bState == DeviceConnectionState::Disconnected) {

src/network/device.hpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,15 @@ class NetworkDevice: public QObject {
7979
/// The name of the device's control interface.
8080
Q_PROPERTY(QString name READ name NOTIFY nameChanged BINDABLE bindableName);
8181
/// The hardware address of the device in the XX:XX:XX:XX:XX:XX format.
82-
Q_PROPERTY(QString address READ address NOTIFY addressChanged BINDABLE bindableAddress);
82+
Q_PROPERTY(QString address READ default NOTIFY addressChanged BINDABLE bindableAddress);
83+
/// True if the device is connected.
84+
Q_PROPERTY(bool connected READ default NOTIFY connectedChanged BINDABLE bindableConnected);
8385
/// Connection state of the device.
84-
Q_PROPERTY(qs::network::DeviceConnectionState::Enum state READ state NOTIFY stateChanged BINDABLE bindableState);
86+
Q_PROPERTY(qs::network::DeviceConnectionState::Enum state READ default NOTIFY stateChanged BINDABLE bindableState);
8587
/// A more specific device state when the backend is NetworkManager.
86-
Q_PROPERTY(qs::network::NMDeviceState::Enum nmState READ nmState NOTIFY nmStateChanged BINDABLE bindableNmState);
88+
Q_PROPERTY(qs::network::NMDeviceState::Enum nmState READ default NOTIFY nmStateChanged BINDABLE bindableNmState);
89+
/// True if the device is allowed to autoconnect.
90+
Q_PROPERTY(bool autoconnect READ autoconnect WRITE setAutoconnect NOTIFY autoconnectChanged);
8791
// clang-format on
8892

8993
public:
@@ -96,26 +100,32 @@ class NetworkDevice: public QObject {
96100
QBindable<QString> bindableName() { return &this->bName; };
97101
[[nodiscard]] QString name() const { return this->bName; };
98102
QBindable<QString> bindableAddress() { return &this->bAddress; };
99-
[[nodiscard]] QString address() const { return this->bAddress; };
103+
QBindable<bool> bindableConnected() { return &this->bConnected; };
100104
QBindable<DeviceConnectionState::Enum> bindableState() { return &this->bState; };
101-
[[nodiscard]] DeviceConnectionState::Enum state() const { return this->bState; };
102105
QBindable<NMDeviceState::Enum> bindableNmState() { return &this->bNmState; };
103-
[[nodiscard]] NMDeviceState::Enum nmState() const { return this->bNmState; };
106+
[[nodiscard]] bool autoconnect() const { return this->bAutoconnect; };
107+
QBindable<bool> bindableAutoconnect() { return &this->bAutoconnect; };
108+
void setAutoconnect(bool autoconnect);
104109

105110
signals:
106111
void requestDisconnect();
112+
void requestSetAutoconnect(bool autoconnect);
107113
void nameChanged();
108114
void addressChanged();
115+
void connectedChanged();
109116
void stateChanged();
110117
void nmStateChanged();
118+
void autoconnectChanged();
111119

112120
private:
113121
DeviceType::Enum mType;
114122
// clang-format off
115123
Q_OBJECT_BINDABLE_PROPERTY(NetworkDevice, QString, bName, &NetworkDevice::nameChanged);
116124
Q_OBJECT_BINDABLE_PROPERTY(NetworkDevice, QString, bAddress, &NetworkDevice::addressChanged);
125+
Q_OBJECT_BINDABLE_PROPERTY(NetworkDevice, bool, bConnected, &NetworkDevice::connectedChanged);
117126
Q_OBJECT_BINDABLE_PROPERTY(NetworkDevice, DeviceConnectionState::Enum, bState, &NetworkDevice::stateChanged);
118127
Q_OBJECT_BINDABLE_PROPERTY(NetworkDevice, NMDeviceState::Enum, bNmState, &NetworkDevice::nmStateChanged);
128+
Q_OBJECT_BINDABLE_PROPERTY(NetworkDevice, bool, bAutoconnect, &NetworkDevice::autoconnectChanged);
119129
// clang-format on
120130
};
121131

src/network/module.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ headers = [
66
"wifi.hpp",
77
]
88
-----
9-
This modules exposes Network management APIs provided by a supported network backend.
9+
This module exposes Network management APIs provided by a supported network backend.
1010
For now, the only backend available is the NetworkManager DBus interface.
1111
Both DBus and NetworkManager must be running to use it.
1212

src/network/network.cpp

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ Network::Network(QObject* parent): QObject(parent) {
2020
// Try to create the NetworkManager backend and bind to it.
2121
auto* nm = new NetworkManager(this);
2222
if (nm->isAvailable()) {
23-
QObject::connect(nm, &NetworkManager::deviceAdded, this, &Network::onDeviceAdded);
24-
QObject::connect(nm, &NetworkManager::deviceRemoved, this, &Network::onDeviceRemoved);
23+
QObject::connect(nm, &NetworkManager::deviceAdded, this, &Network::deviceAdded);
24+
QObject::connect(nm, &NetworkManager::deviceRemoved, this, &Network::deviceRemoved);
2525
QObject::connect(this, &Network::requestSetWifiEnabled, nm, &NetworkManager::setWifiEnabled);
2626
this->bindableWifiEnabled().setBinding([nm]() { return nm->wifiEnabled(); });
2727
this->bindableWifiHardwareEnabled().setBinding([nm]() { return nm->wifiHardwareEnabled(); });
@@ -36,16 +36,12 @@ Network::Network(QObject* parent): QObject(parent) {
3636
qCCritical(logNetwork) << "Network will not work. Could not find an available backend.";
3737
}
3838

39-
void Network::onDeviceAdded(NetworkDevice* dev) { this->mDevices.insertObject(dev); }
40-
void Network::onDeviceRemoved(NetworkDevice* dev) { this->mDevices.removeObject(dev); }
39+
void Network::deviceAdded(NetworkDevice* dev) { this->mDevices.insertObject(dev); }
40+
void Network::deviceRemoved(NetworkDevice* dev) { this->mDevices.removeObject(dev); }
4141

4242
void Network::setWifiEnabled(bool enabled) {
43-
if (this->bWifiEnabled == enabled) {
44-
const QString state = enabled ? "enabled" : "disabled";
45-
qCCritical(logNetwork) << "Wifi is already globally software" << state;
46-
} else {
47-
emit this->requestSetWifiEnabled(enabled);
48-
}
43+
if (this->bWifiEnabled == enabled) return;
44+
emit this->requestSetWifiEnabled(enabled);
4945
}
5046

5147
BaseNetwork::BaseNetwork(QString name, QObject* parent): QObject(parent), mName(std::move(name)) {};

src/network/network.hpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ class Network: public QObject {
5050
Q_PROPERTY(qs::network::NetworkBackendType::Enum backend READ backend CONSTANT);
5151
/// Switch for the rfkill software block of all wireless devices.
5252
Q_PROPERTY(bool wifiEnabled READ wifiEnabled WRITE setWifiEnabled NOTIFY wifiEnabledChanged);
53-
/// Switch for the rfkill hardware block of all wireless devices.
54-
Q_PROPERTY(bool wifiHardwareEnabled READ wifiHardwareEnabled NOTIFY wifiHardwareEnabledChanged BINDABLE bindableWifiHardwareEnabled);
53+
/// State of the rfkill hardware block of all wireless devices.
54+
Q_PROPERTY(bool wifiHardwareEnabled READ default NOTIFY wifiHardwareEnabledChanged BINDABLE bindableWifiHardwareEnabled);
5555
// clang-format on
5656

5757
public:
@@ -63,16 +63,15 @@ class Network: public QObject {
6363
[[nodiscard]] bool wifiEnabled() const { return this->bWifiEnabled; };
6464
void setWifiEnabled(bool enabled);
6565
QBindable<bool> bindableWifiHardwareEnabled() { return &this->bWifiHardwareEnabled; };
66-
[[nodiscard]] bool wifiHardwareEnabled() const { return this->bWifiHardwareEnabled; };
6766

6867
signals:
6968
void requestSetWifiEnabled(bool enabled);
7069
void wifiEnabledChanged();
7170
void wifiHardwareEnabledChanged();
7271

73-
public slots:
74-
void onDeviceAdded(NetworkDevice* dev);
75-
void onDeviceRemoved(NetworkDevice* dev);
72+
private slots:
73+
void deviceAdded(NetworkDevice* dev);
74+
void deviceRemoved(NetworkDevice* dev);
7675

7776
private:
7877
ObjectModel<NetworkDevice> mDevices {this};
@@ -93,14 +92,13 @@ class BaseNetwork: public QObject {
9392
/// The name of the network.
9493
Q_PROPERTY(QString name READ name CONSTANT);
9594
/// True if the network is connected.
96-
Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged BINDABLE bindableConnected);
95+
Q_PROPERTY(bool connected READ default NOTIFY connectedChanged BINDABLE bindableConnected);
9796

9897
public:
9998
explicit BaseNetwork(QString name, QObject* parent = nullptr);
10099

101100
[[nodiscard]] QString name() const { return this->mName; };
102101
QBindable<bool> bindableConnected() { return &this->bConnected; }
103-
[[nodiscard]] bool connected() const { return this->bConnected; };
104102

105103
signals:
106104
void connectedChanged();

src/network/nm/CMakeLists.txt

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
set_source_files_properties(org.freedesktop.NetworkManager.xml PROPERTIES
2+
CLASSNAME DBusNetworkManagerProxy
3+
NO_NAMESPACE TRUE
4+
INCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/dbus_types.hpp
5+
)
6+
7+
qt_add_dbus_interface(NM_DBUS_INTERFACES
8+
org.freedesktop.NetworkManager.xml
9+
dbus_nm_backend
10+
)
11+
12+
set_source_files_properties(org.freedesktop.NetworkManager.Device.xml PROPERTIES
13+
CLASSNAME DBusNMDeviceProxy
14+
NO_NAMESPACE TRUE
15+
)
16+
17+
qt_add_dbus_interface(NM_DBUS_INTERFACES
18+
org.freedesktop.NetworkManager.Device.xml
19+
dbus_nm_device
20+
)
21+
22+
set_source_files_properties(org.freedesktop.NetworkManager.Device.Wireless.xml PROPERTIES
23+
CLASSNAME DBusNMWirelessProxy
24+
NO_NAMESPACE TRUE
25+
)
26+
27+
qt_add_dbus_interface(NM_DBUS_INTERFACES
28+
org.freedesktop.NetworkManager.Device.Wireless.xml
29+
dbus_nm_wireless
30+
)
31+
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+
42+
set_source_files_properties(org.freedesktop.NetworkManager.Settings.Connection.xml PROPERTIES
43+
CLASSNAME DBusNMConnectionSettingsProxy
44+
NO_NAMESPACE TRUE
45+
INCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/dbus_types.hpp
46+
)
47+
48+
qt_add_dbus_interface(NM_DBUS_INTERFACES
49+
org.freedesktop.NetworkManager.Settings.Connection.xml
50+
dbus_nm_connection_settings
51+
)
52+
53+
set_source_files_properties(org.freedesktop.NetworkManager.Connection.Active.xml PROPERTIES
54+
CLASSNAME DBusNMActiveConnectionProxy
55+
NO_NAMESPACE TRUE
56+
)
57+
58+
qt_add_dbus_interface(NM_DBUS_INTERFACES
59+
org.freedesktop.NetworkManager.Connection.Active.xml
60+
dbus_nm_active_connection
61+
)
62+
63+
qt_add_library(quickshell-network-nm STATIC
64+
backend.cpp
65+
device.cpp
66+
connection.cpp
67+
accesspoint.cpp
68+
wireless.cpp
69+
utils.cpp
70+
enums.hpp
71+
${NM_DBUS_INTERFACES}
72+
)
73+
74+
target_include_directories(quickshell-network-nm PUBLIC
75+
${CMAKE_CURRENT_BINARY_DIR}
76+
)
77+
78+
target_link_libraries(quickshell-network-nm PRIVATE Qt::Qml Qt::DBus)
79+
qs_add_link_dependencies(quickshell-network-nm quickshell-dbus)

src/network/nm/accesspoint.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010

1111
#include "../../core/logcat.hpp"
1212
#include "../../dbus/properties.hpp"
13+
#include "dbus_nm_accesspoint.h"
1314
#include "enums.hpp"
14-
#include "nm/dbus_nm_accesspoint.h"
1515

1616
namespace qs::network {
1717
using namespace qs::dbus;

src/network/nm/accesspoint.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99
#include "../../dbus/properties.hpp"
1010
#include "../wifi.hpp"
11+
#include "dbus_nm_accesspoint.h"
1112
#include "enums.hpp"
12-
#include "nm/dbus_nm_accesspoint.h"
1313

1414
namespace qs::dbus {
1515

@@ -59,7 +59,6 @@ class NMAccessPoint: public QObject {
5959

6060
signals:
6161
void loaded();
62-
void disappeared();
6362
void ssidChanged(const QByteArray& ssid);
6463
void signalStrengthChanged(quint8 signal);
6564
void flagsChanged(NM80211ApFlags::Enum flags);

0 commit comments

Comments
 (0)