From d958ef007d320a5a50dba6e15300b83bb9a9fdbc Mon Sep 17 00:00:00 2001 From: Wu JiangYu Date: Fri, 11 Sep 2026 15:34:14 +0800 Subject: [PATCH] refactor: extract access point lookup and state handler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Extract the findAccessPoints lambda from onActiveConnectionChanged into a private member function findAccessPoints for reuse 2. Extract the stateChanged lambda handler into a dedicated slot onStateChanged 3. Use Qt::UniqueConnection for signal connections to prevent duplicate connections 4. Add forward declaration of AccessPointProxyNM in the header 5. Improve null safety by consolidating connection checks in the new helper methods Influence: 1. Test wireless connection state changes and verify status updates propagate correctly 2. Verify access point lookup matches correct SSID during connection activation 3. Test that duplicate signal connections are prevented when active connection changes repeatedly 4. Verify timestamp updates on connection activation 5. Test unsaved connection save flow and secret handling for 8021x and wireless security settings 6. Confirm no regressions in active connection changed signal emission refactor: 提取访问点查找和状态处理逻辑 1. 将 onActiveConnectionChanged 中的 findAccessPoints lambda 提取为私有 成员函数 findAccessPoints 以便复用 2. 将 stateChanged lambda 处理程序提取为专用槽函数 onStateChanged 3. 使用 Qt::UniqueConnection 防止信号重复连接 4. 在头文件中添加 AccessPointProxyNM 的前向声明 5. 通过在新辅助方法中整合连接检查来提高空指针安全性 Influence: 1. 测试无线连接状态变化,验证状态更新正确传播 2. 验证连接激活期间访问点查找能匹配正确的 SSID 3. 测试当活动连接反复变化时能防止信号重复连接 4. 验证连接激活时时间戳更新 5. 测试未保存连接的保存流程以及 8021x 和无线安全设置的密钥处理 6. 确认活动连接变化信号发射无回归问题 修复在无线网络时候,重启networkmanager导致内存泄露的问题, 历史提交 : http://gerrit.uniontech.com/c/dde-network-core/+/281742 PMS: BUG-376663 --- .../networkmanager/devicemanagerrealize.cpp | 107 ++++++++++-------- .../networkmanager/devicemanagerrealize.h | 3 + 2 files changed, 62 insertions(+), 48 deletions(-) diff --git a/src/impl/networkmanager/devicemanagerrealize.cpp b/src/impl/networkmanager/devicemanagerrealize.cpp index 3ad7b6b3e..22cd90b9b 100644 --- a/src/impl/networkmanager/devicemanagerrealize.cpp +++ b/src/impl/networkmanager/devicemanagerrealize.cpp @@ -986,55 +986,10 @@ void WirelessDeviceManagerRealize::onActiveConnectionChanged() { NetworkManager::ActiveConnection::Ptr activeConnection = m_device->activeConnection(); - auto findAccessPoints = [this](const NetworkManager::ActiveConnection::Ptr &activeConnection)->AccessPointProxyNM *{ - if (activeConnection.isNull()) - return nullptr; - - QList::iterator itAccessPoint = std::find_if(m_accessPointInfos.begin(), m_accessPointInfos.end(), [ activeConnection ](AccessPointInfo *accessPoint) { - NetworkManager::WirelessSetting::Ptr wirelessSetting = activeConnection->connection()->settings()->setting(NetworkManager::Setting::SettingType::Wireless).dynamicCast(); - if (!wirelessSetting.isNull()) - return accessPoint->accessPoint()->ssid() == wirelessSetting->ssid(); - - return false; - }); - - if (itAccessPoint == m_accessPointInfos.end()) - return nullptr; - - return (*itAccessPoint)->proxy(); - }; - - AccessPointProxyNM *activeAccessPoint = findAccessPoints(activeConnection); + AccessPointProxyNM *activeAccessPoint = findAccessPoints(activeConnection.data()); if (activeAccessPoint) { - connect(activeConnection.data(), &NetworkManager::ActiveConnection::stateChanged, this, [ this, activeConnection, findAccessPoints ](NetworkManager::ActiveConnection::State state) { - AccessPointProxyNM *activeAp = findAccessPoints(activeConnection); - NetworkManager::Connection::Ptr conn = activeConnection->connection(); - if (activeAp && conn) { - conn->settings()->setTimestamp(QDateTime::currentDateTime()); - if (state == NetworkManager::ActiveConnection::Activated && conn->isUnsaved()) { - if (SessionStateTracker::instance()->isSessionActive()) { - const NetworkManager::Setting::SettingType settingType[] = { NetworkManager::Setting::Security8021x, NetworkManager::Setting::WirelessSecurity }; - for (auto type : settingType) { - NetworkManager::Setting::Ptr setting = conn->settings()->setting(type); - if (setting) { - conn->secrets(setting->name()); - } - } - conn->save(); - } - connect(conn.data(), &NetworkManager::Connection::unsavedChanged, this, [this] { - Q_EMIT activeConnectionChanged(); - }); - } - activeAp->updateStatus(convertStateFromNetworkManager(state)); - WirelessConnection *connection = findConnection(conn->path()); - if (connection) - connection->updateTimeStamp(conn->settings()->timestamp()); - - qCDebug(DNC) << "active connection changed:" << activeAp->ssid() << "device:" << m_device->interfaceName() << "status:" << activeAp->status(); - Q_EMIT activeConnectionChanged(); - } - }); + connect(activeConnection.data(), &NetworkManager::ActiveConnection::stateChanged, + this, &WirelessDeviceManagerRealize::onStateChanged, Qt::UniqueConnection); activeAccessPoint->updateStatus(convertStateFromNetworkManager(activeConnection->state())); WirelessConnection *connection = findConnection(activeConnection->connection()->path()); @@ -1050,6 +1005,62 @@ void WirelessDeviceManagerRealize::onActiveConnectionChanged() Q_EMIT activeConnectionChanged(); } +AccessPointProxyNM *WirelessDeviceManagerRealize::findAccessPoints(NetworkManager::ActiveConnection *activeConnection) const +{ + if (!activeConnection) + return nullptr; + + const NetworkManager::Connection::Ptr connection = activeConnection->connection(); + if (connection.isNull()) + return nullptr; + + const NetworkManager::WirelessSetting::Ptr wirelessSetting = connection->settings()->setting(NetworkManager::Setting::SettingType::Wireless).dynamicCast(); + if (wirelessSetting.isNull()) + return nullptr; + + const auto itAccessPoint = std::find_if(m_accessPointInfos.cbegin(), m_accessPointInfos.cend(), [wirelessSetting](AccessPointInfo *accessPoint) { + return accessPoint->accessPoint()->ssid() == wirelessSetting->ssid(); + }); + + return itAccessPoint == m_accessPointInfos.cend() ? nullptr : (*itAccessPoint)->proxy(); +} + +void WirelessDeviceManagerRealize::onStateChanged(NetworkManager::ActiveConnection::State state) +{ + NetworkManager::ActiveConnection *activeConnection = qobject_cast(sender()); + AccessPointProxyNM *activeAp = findAccessPoints(activeConnection); + if (!activeAp) + return; + + NetworkManager::Connection::Ptr conn = activeConnection->connection(); + if (conn.isNull()) + return; + + conn->settings()->setTimestamp(QDateTime::currentDateTime()); + if (state == NetworkManager::ActiveConnection::Activated && conn->isUnsaved()) { + if (SessionStateTracker::instance()->isSessionActive()) { + const NetworkManager::Setting::SettingType settingTypes[] = { NetworkManager::Setting::Security8021x, NetworkManager::Setting::WirelessSecurity }; + for (auto type : settingTypes) { + NetworkManager::Setting::Ptr setting = conn->settings()->setting(type); + if (setting) + conn->secrets(setting->name()); + } + conn->save(); + } + connect(conn.data(), &NetworkManager::Connection::unsavedChanged, this, [this] { + Q_EMIT activeConnectionChanged(); + }, Qt::UniqueConnection); + } + + activeAp->updateStatus(convertStateFromNetworkManager(state)); + WirelessConnection *connection = findConnection(conn->path()); + if (connection) + connection->updateTimeStamp(conn->settings()->timestamp()); + + qCDebug(DNC) << "active connection changed:" << activeAp->ssid() << "device:" << m_device->interfaceName() << "status:" << activeAp->status(); + Q_EMIT activeConnectionChanged(); +} + DeviceStatus WirelessDeviceManagerRealize::deviceStatus() const { // 如果当前设备开了热点,则认为它为断开状态 diff --git a/src/impl/networkmanager/devicemanagerrealize.h b/src/impl/networkmanager/devicemanagerrealize.h index 385620bdd..82e8b3d68 100644 --- a/src/impl/networkmanager/devicemanagerrealize.h +++ b/src/impl/networkmanager/devicemanagerrealize.h @@ -26,6 +26,7 @@ namespace network { class ProcesserInterface; class IpManager; +class AccessPointProxyNM; class DeviceManagerRealize : public NetworkDeviceRealize { @@ -143,8 +144,10 @@ private Q_SLOTS: void onNetworkAppeared(const QString &ssid); void onNetworkDisappeared(const QString &ssid); void onInterfaceFlagsChanged(); + void onStateChanged(NetworkManager::ActiveConnection::State state); private: + AccessPointProxyNM *findAccessPoints(NetworkManager::ActiveConnection *activeConnection) const; NetworkManager::WirelessDevice::Ptr m_device; QList m_wirelessConnections; QList m_accessPointInfos;