@@ -34,7 +34,7 @@ void NMDeviceAdapter::init(const QString& path) {
3434 );
3535
3636 if (!this ->proxy ->isValid ()) {
37- qCWarning (logNetworkManager) << " Cannot create NMDeviceAdapter for" << path;
37+ qCWarning (logNetworkManager) << " Cannot create dbus proxy for" << path;
3838 return ;
3939 }
4040
@@ -72,7 +72,7 @@ void NMWirelessAdapter::init(const QString& path) {
7272 );
7373
7474 if (!this ->proxy ->isValid ()) {
75- qCWarning (logNetworkManager) << " Cannot create NMWirelessAdapter for" << path;
75+ qCWarning (logNetworkManager) << " Cannot create dbus proxy for" << path;
7676 return ;
7777 }
7878
@@ -101,16 +101,16 @@ void NMWirelessAdapter::onAccessPointAdded(const QDBusObjectPath& path) {
101101}
102102
103103void NMWirelessAdapter::onAccessPointRemoved (const QDBusObjectPath& path) {
104- auto iter = this ->mAPHash .find (path.path ());
105- if (iter == this ->mAPHash .end ()) {
106- qCWarning (logNetworkManager) << " NMWirelessAdapter sent removal signal for" << path.path ()
107- << " which is not registered." ;
108- } else {
109- auto * ap = iter.value ();
110- this ->mAPHash .erase (iter);
111- emit accessPointRemoved (ap);
112- qCDebug (logNetworkManager) << " Access point" << path.path () << " removed." ;
104+ auto * ap = mPathToApHash .take (path.path ());
105+
106+ if (!ap) {
107+ qCDebug (logNetworkManager) << " NetworkManager backend sent removal signal for" << path.path ()
108+ << " which is not registered." ;
109+ return ;
113110 }
111+
112+ removeApFromNetwork (ap);
113+ delete ap;
114114}
115115
116116void NMWirelessAdapter::registerAccessPoints () {
@@ -135,35 +135,80 @@ void NMWirelessAdapter::registerAccessPoints() {
135135}
136136
137137void NMWirelessAdapter::registerAccessPoint (const QString& path) {
138- if (this ->mAPHash .contains (path)) {
138+ if (this ->mPathToApHash .contains (path)) {
139139 qCDebug (logNetworkManager) << " Skipping duplicate registration of access point" << path;
140140 return ;
141141 }
142142
143- // Create an access point adapter
144- auto * apAdapter = new NMAccessPointAdapter ();
145- apAdapter->init (path);
143+ auto * ap = new NMAccessPointAdapter (this );
144+ ap->init (path);
146145
147- if (!apAdapter ->isValid ()) {
148- qCWarning (logNetworkManager) << " Cannot create NMAccessPointAdapter for" << path;
149- delete apAdapter ;
146+ if (!ap ->isValid ()) {
147+ qCWarning (logNetworkManager) << " Cannot create access point for" << path;
148+ delete ap ;
150149 return ;
151150 }
152- auto * ap = new NetworkAccessPoint (this );
153- apAdapter->setParent (ap);
154151
155- // NMAccessPointAdapter signal -> NetworkAccessPoint slot
156- QObject::connect (apAdapter, &NMAccessPointAdapter::ssidChanged, ap, &NetworkAccessPoint::setSsid);
152+ this ->mPathToApHash .insert (path, ap);
153+ qCDebug (logNetworkManager) << " Registered access point" << path;
154+
157155 QObject::connect (
158- apAdapter,
159- &NMAccessPointAdapter::signalChanged,
160156 ap,
161- &NetworkAccessPoint::setSignal
157+ &NMAccessPointAdapter::ssidChanged,
158+ this ,
159+ [this , ap](const QByteArray& ssid) {
160+ if (ssid.isEmpty ()) {
161+ this ->removeApFromNetwork (ap);
162+ } else {
163+ this ->addApToNetwork (ap, ssid);
164+ }
165+ }
162166 );
167+ }
163168
164- this ->mAPHash .insert (path, ap);
165- emit accessPointAdded (ap);
166- qCDebug (logNetworkManager) << " Registered access point" << path;
169+ void NMWirelessAdapter::addApToNetwork (NMAccessPointAdapter* ap, const QByteArray& ssid) {
170+ // Remove AP from old network
171+ removeApFromNetwork (ap);
172+
173+ auto * group = mSsidToApGroupHash .value (ssid);
174+ if (!group) {
175+ // Create a new AP group and wifi network
176+ group = new NMAccessPointGroup (ssid, this );
177+ auto * network = new NetworkWifiNetwork (this );
178+ network->setSsid (ssid);
179+
180+ // NMAccessPointGroup signal -> NetworkWifiNetwork slot
181+ QObject::connect (
182+ group,
183+ &NMAccessPointGroup::maxSignalChanged,
184+ network,
185+ &NetworkWifiNetwork::setSignal
186+ );
187+
188+ this ->mSsidToApGroupHash .insert (ssid, group);
189+ this ->mSsidToNetworkHash .insert (ssid, network);
190+ emit this ->wifiNetworkAdded (network);
191+ qCDebug (logNetworkManager) << " Registered wifi network" << ssid;
192+ }
193+
194+ group->addAccessPoint (ap);
195+ this ->mPathToSsidHash .insert (ap->path (), ssid);
196+ }
197+
198+ void NMWirelessAdapter::removeApFromNetwork (NMAccessPointAdapter* ap) {
199+ QByteArray ssid = mPathToSsidHash .take (ap->path ());
200+ if (ssid.isEmpty ()) return ; // AP wasn't in any network
201+
202+ auto * group = mSsidToApGroupHash .value (ssid);
203+ group->removeAccessPoint (ap);
204+ if (group->isEmpty ()) {
205+ mSsidToApGroupHash .remove (ssid);
206+ auto * network = mSsidToNetworkHash .take (ssid);
207+ emit wifiNetworkRemoved (network);
208+ delete network;
209+ delete group;
210+ qCDebug (logNetworkManager) << " Deleted wifi network" << ssid;
211+ }
167212}
168213
169214void NMWirelessAdapter::scan () { this ->proxy ->RequestScan ({}); }
@@ -176,10 +221,6 @@ QString NMWirelessAdapter::path() const { return this->proxy ? this->proxy->path
176221
177222// Access Point
178223
179- namespace {
180- Q_LOGGING_CATEGORY (logNMAccessPoint, " quickshell.network.networkmanager.accesspoint" , QtWarningMsg);
181- }
182-
183224NMAccessPointAdapter::NMAccessPointAdapter (QObject* parent): QObject(parent) {}
184225
185226void NMAccessPointAdapter::init (const QString& path) {
@@ -191,7 +232,7 @@ void NMAccessPointAdapter::init(const QString& path) {
191232 );
192233
193234 if (!this ->proxy ->isValid ()) {
194- qCWarning (logNMAccessPoint ) << " Cannot create NMWirelessAdapter for" << path;
235+ qCWarning (logNetworkManager ) << " Cannot create access point proxy for" << path;
195236 return ;
196237 }
197238
@@ -205,6 +246,47 @@ QString NMAccessPointAdapter::address() const {
205246}
206247QString NMAccessPointAdapter::path () const { return this ->proxy ? this ->proxy ->path () : QString (); }
207248
249+ // Access Point Group
250+
251+ NMAccessPointGroup::NMAccessPointGroup (const QByteArray& ssid, QObject* parent)
252+ : QObject(parent)
253+ , mSsid (ssid) {}
254+
255+ void NMAccessPointGroup::updateMaxSignal () {
256+ quint8 max = 0 ;
257+ for (auto * ap: mAccessPoints ) {
258+ max = qMax (max, ap->getSignal ());
259+ }
260+ if (this ->bMaxSignal != max) {
261+ this ->bMaxSignal = max;
262+ }
263+ }
264+
265+ void NMAccessPointGroup::addAccessPoint (NMAccessPointAdapter* ap) {
266+ if (this ->mAccessPoints .contains (ap)) return ;
267+
268+ this ->mAccessPoints .append (ap);
269+ QObject::connect (
270+ ap,
271+ &NMAccessPointAdapter::signalChanged,
272+ this ,
273+ &NMAccessPointGroup::updateMaxSignal
274+ );
275+ this ->updateMaxSignal ();
276+ }
277+
278+ void NMAccessPointGroup::removeAccessPoint (NMAccessPointAdapter* ap) {
279+ if (mAccessPoints .removeOne (ap)) {
280+ QObject::disconnect (
281+ ap,
282+ &NMAccessPointAdapter::signalChanged,
283+ this ,
284+ &NMAccessPointGroup::updateMaxSignal
285+ );
286+ this ->updateMaxSignal ();
287+ }
288+ }
289+
208290} // namespace qs::network
209291
210292namespace qs ::dbus {
0 commit comments