diff --git a/src/impl/networkmanager/accesspointproxynm.cpp b/src/impl/networkmanager/accesspointproxynm.cpp index 06363fd7..6dd71136 100644 --- a/src/impl/networkmanager/accesspointproxynm.cpp +++ b/src/impl/networkmanager/accesspointproxynm.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2018 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -18,6 +18,7 @@ AccessPointProxyNM::AccessPointProxyNM(NetworkManager::WirelessDevice::Ptr devic , m_strength(0) , m_secured(false) { + updateSsid(); initState(); initConnection(); updateInfo(); @@ -40,6 +41,7 @@ void AccessPointProxyNM::updateStatus(ConnectionStatus status) void AccessPointProxyNM::updateNetwork(NetworkManager::WirelessNetwork::Ptr network) { m_network = network; + updateSsid(); } bool AccessPointProxyNM::contains(const QString &uni) const @@ -57,7 +59,7 @@ bool AccessPointProxyNM::contains(const QString &uni) const QString AccessPointProxyNM::ssid() const { - return m_network->ssid(); + return m_ssid; } int AccessPointProxyNM::strength() const @@ -134,7 +136,7 @@ void AccessPointProxyNM::initState() if (wirelessSetting.isNull()) return; - if (wirelessSetting->ssid() != m_network->ssid()) + if (wirelessSetting->ssid() != ssid()) return; updateStatus(convertStateFromNetworkManager(activeConnection->state())); @@ -181,7 +183,7 @@ void AccessPointProxyNM::updateHiddenInfo() if (wirelessSetting.isNull()) return false; - return wirelessSetting->ssid() == m_network->ssid(); + return wirelessSetting->ssid() == ssid(); }); // 如果没有找到连接,就是非隐藏网络 if (itConnection == connections.end()) @@ -195,6 +197,11 @@ void AccessPointProxyNM::updateHiddenInfo() qCDebug(DNC) << "update accesspoint hidden info, ssid:" << m_isHidden << ", hidden:" << m_isHidden; } +void AccessPointProxyNM::updateSsid() +{ + m_ssid = (m_network && m_network->referenceAccessPoint()) ? decodeByteArray(m_network->referenceAccessPoint()->rawSsid()) : QString(); +} + void AccessPointProxyNM::onUpdateNetwork() { int strength = m_strength; diff --git a/src/impl/networkmanager/accesspointproxynm.h b/src/impl/networkmanager/accesspointproxynm.h index aa06dfaa..bb9a2e96 100644 --- a/src/impl/networkmanager/accesspointproxynm.h +++ b/src/impl/networkmanager/accesspointproxynm.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2018 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -47,6 +47,7 @@ class AccessPointProxyNM : public AccessPointProxy void updateInfo(); void updateConnection(); void updateHiddenInfo(); + void updateSsid(); private slots: void onUpdateNetwork(); @@ -55,6 +56,7 @@ private slots: NetworkManager::WirelessDevice::Ptr m_device; NetworkManager::WirelessNetwork::Ptr m_network; ConnectionStatus m_status; + QString m_ssid; bool m_isHidden; int m_strength; bool m_secured; diff --git a/src/impl/networkmanager/devicemanagerrealize.cpp b/src/impl/networkmanager/devicemanagerrealize.cpp index d9a34eea..61c825fe 100644 --- a/src/impl/networkmanager/devicemanagerrealize.cpp +++ b/src/impl/networkmanager/devicemanagerrealize.cpp @@ -718,7 +718,7 @@ QString WirelessDeviceManagerRealize::activeAp() const NetworkManager::WirelessDevice::Ptr wirelessDevice = m_device.staticCast(); NetworkManager::AccessPoint::Ptr ap = wirelessDevice->activeAccessPoint(); if (ap) - return ap->ssid(); + return decodeByteArray(ap->rawSsid()); return QString(); } @@ -1081,7 +1081,8 @@ bool WirelessDeviceManagerRealize::hotspotEnabled() void WirelessDeviceManagerRealize::addNetwork(const NetworkManager::WirelessNetwork::Ptr &network) { // 在当前的网络列表中查找同名SSID的网络,如果查找到了,就更新数据,没有查找到,就新增一条网络 - QList::iterator itApInfo = std::find_if(m_accessPointInfos.begin(), m_accessPointInfos.end(), [ network ](AccessPointInfo *accessPoint) { return accessPoint->accessPoint()->ssid() == network->ssid(); }); + QString ssid = decodeByteArray(network->referenceAccessPoint()->rawSsid()); + QList::iterator itApInfo = std::find_if(m_accessPointInfos.begin(), m_accessPointInfos.end(), [ ssid ](AccessPointInfo *accessPoint) { return accessPoint->accessPoint()->ssid() == ssid; }); if (itApInfo == m_accessPointInfos.end()) { // 新增的无线网络 AccessPointInfo *apInfo = new AccessPointInfo(m_device, network); diff --git a/src/impl/networkmanager/networkdetailnmrealize.cpp b/src/impl/networkmanager/networkdetailnmrealize.cpp index 1ad02645..24e96e04 100644 --- a/src/impl/networkmanager/networkdetailnmrealize.cpp +++ b/src/impl/networkmanager/networkdetailnmrealize.cpp @@ -1,9 +1,10 @@ -// SPDX-FileCopyrightText: 2011 - 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2011 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "networkdetailnmrealize.h" #include "devicemanagerrealize.h" #include "ipmanager.h" +#include "netutils.h" #include #include @@ -61,7 +62,7 @@ void NetworkDetailNMRealize::initProperties() QString frequencyBand = tr("automatic"); NetworkManager::AccessPoint::Ptr activeAccessPoint = wirelessDevice->activeAccessPoint(); if (activeAccessPoint) { - ssid = activeAccessPoint->ssid(); + ssid = decodeByteArray(activeAccessPoint->rawSsid()); switch (NetworkManager::findFrequencyBand(static_cast(activeAccessPoint->frequency()))) { case NetworkManager::WirelessSetting::FrequencyBand::A: frequencyBand = "5 GHz"; diff --git a/src/netutils.cpp b/src/netutils.cpp index 60aa0e5e..fec2cfdc 100644 --- a/src/netutils.cpp +++ b/src/netutils.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2022 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -6,6 +6,7 @@ #include #include +#include namespace dde { namespace network { @@ -75,5 +76,21 @@ ConnectionStatus convertStateFromNetworkManager(NetworkManager::ActiveConnection return ConnectionStatus::Deactivated; } +QString decodeByteArray(const QByteArray &data) +{ + if (data.isEmpty()) { + return QString(); + } + + QStringDecoder utf8Decoder(QStringDecoder::Utf8); + QString utf8Result = utf8Decoder(data); + if (utf8Result.contains(QChar::ReplacementCharacter)) { + QStringDecoder gbkDecoder("GBK"); + if (gbkDecoder.isValid()) { + return gbkDecoder.decode(data); + } + } + return utf8Result; +} } } diff --git a/src/netutils.h b/src/netutils.h index d44dcff8..8525936c 100644 --- a/src/netutils.h +++ b/src/netutils.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2022 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -36,6 +36,9 @@ Connectivity connectivityValue(uint sourceConnectivity); DeviceStatus convertDeviceStatus(int sourceDeviceStatus); ConnectionStatus convertConnectionStatus(int sourceConnectionStatus); ConnectionStatus convertStateFromNetworkManager(NetworkManager::ActiveConnection::State state); + +// 检测并转换 SSID 编码,处理 GBK 和 UTF-8 编码 +QString decodeByteArray(const QByteArray &rawSsid); } } #endif // NETUTILS_H