Skip to content

Commit 5f28626

Browse files
committed
fix: Fix incorrect network selection after disabling and re-enabling network interface
After a successful connection, the latest connection time failed to save correctly, leading to errors when manually retrieving connections. The solution involves saving the UUID of the currently successful connection to a configuration file. When the network interface is re-enabled, the connection configuration is read directly from this configuration file and actively reconnected. Log: Fix reconnection error after enabling network interface BUG: PMS-350785 fix: 修复关闭再开启后选择连接网络错误 在连接成功后,最新的连接的时间保存失败,手动获取的连接错误,修改为保存当前连接成功的连接的uuid到配置文件,开启网卡后直接从配置文件读取连接配置并主动连接 Log: 修复开启网卡后回连错误的问题
1 parent 9052d41 commit 5f28626

File tree

5 files changed

+75
-109
lines changed

5 files changed

+75
-109
lines changed

network-service-plugin/src/system/networkenabledconfig.cpp

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44
#include "networkenabledconfig.h"
@@ -78,6 +78,14 @@ void NetworkEnabledConfig::loadConfig()
7878
map.insert(key, valObj.value("Enabled").toBool());
7979
}
8080
m_map.insert("Devices", QVariant::fromValue(map));
81+
// 读取最后一次保存的
82+
QJsonObject connObj = jsonObj.value("Connections").toObject();
83+
QVariantMap conn_map;
84+
for (const QString &conn_key : connObj.keys()) {
85+
QString curr_obj_value = connObj.value(conn_key).toString();
86+
conn_map.insert(conn_key, curr_obj_value);
87+
}
88+
m_map.insert("Connections", conn_map);
8189
} else {
8290
qCWarning(DSM()) << "failed to load config:" << file.errorString();
8391
}
@@ -94,9 +102,15 @@ QString NetworkEnabledConfig::saveConfig()
94102
devsObj.insert(it.key(), obj);
95103
}
96104
}
105+
QJsonObject connectionObj;
106+
QVariantMap connection_map = m_map.value("Connections").value<QVariantMap>();
107+
for (auto it = connection_map.constBegin(); it != connection_map.constEnd(); it++) {
108+
connectionObj.insert(it.key(), it.value().toString());
109+
}
97110
QJsonObject jsonObj;
98111
jsonObj.insert("VpnEnabled", vpnEnabled());
99112
jsonObj.insert("Devices", devsObj);
113+
jsonObj.insert("Connections", connectionObj);
100114
QJsonDocument jsonDoc(jsonObj);
101115
QString jsonString = jsonDoc.toJson(QJsonDocument::Compact);
102116
QFileInfo info(configFile);
@@ -113,5 +127,23 @@ QString NetworkEnabledConfig::saveConfig()
113127
}
114128
return QString();
115129
}
130+
131+
void NetworkEnabledConfig::setConnectionInfo(const QString &dev, const QString &uuid)
132+
{
133+
QVariant conn = m_map["Connections"];
134+
QVariantMap conn_map = conn.value<QVariantMap>();
135+
conn_map[dev] = uuid;
136+
m_map["Connections"] = conn_map;
137+
}
138+
139+
QString NetworkEnabledConfig::connectionUuid(const QString &dev) const
140+
{
141+
QVariant conn = m_map["Connections"];
142+
QVariantMap conn_map = conn.value<QVariantMap>();
143+
if (conn_map.contains(dev))
144+
return conn_map.value(dev).toString();
145+
146+
return QString();
147+
}
116148
} // namespace systemservice
117149
} // namespace network

network-service-plugin/src/system/networkenabledconfig.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44
#ifndef NetworkEnabledConfig_H
@@ -21,6 +21,8 @@ class NetworkEnabledConfig
2121

2222
void loadConfig();
2323
QString saveConfig();
24+
void setConnectionInfo(const QString &dev, const QString &uuid);
25+
QString connectionUuid(const QString &dev) const;
2426

2527
private:
2628
QMap<QString, QVariant> m_map;

network-service-plugin/src/system/networkthread.cpp

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44
#include "networkthread.h"
@@ -163,8 +163,17 @@ void NetworkThread::onDevicestateChanged(NetworkManager::Device::State newState,
163163
return;
164164
}
165165
bool enabled = m_networkConfig->deviceEnabled(dev->uni());
166-
if (!enabled) {
167-
Device::State state = dev->state();
166+
Device::State state = dev->state();
167+
if (enabled) {
168+
if (state == Device::Activated) {
169+
qCDebug(DSM) << "device connection success";
170+
NetworkManager::ActiveConnection::Ptr activeConnection = dev->activeConnection();
171+
if (activeConnection) {
172+
m_networkConfig->setConnectionInfo(dev->interfaceName(), activeConnection->connection()->uuid());
173+
m_networkConfig->saveConfig();
174+
}
175+
}
176+
} else {
168177
if (state >= Device::Preparing && state <= Device::Activated) {
169178
qCDebug(DSM()) << "disconnect device" << dev->uni();
170179
dev->disconnectInterface();
@@ -277,21 +286,34 @@ QString NetworkThread::setPropVpnEnabled(bool enabled)
277286

278287
QString NetworkThread::enableDevice(NetworkManager::Device::Ptr device)
279288
{
280-
auto availableConnections = device->availableConnections();
281-
qCDebug(DSM()) << "available connections:" << availableConnections;
282289
QString connPath0;
283-
QDateTime maxTs;
284-
for (auto &&connPath : availableConnections) {
285-
auto settings = connPath->settings();
286-
if (!settings->autoconnect()) {
287-
continue;
290+
const QString &device_uuid = m_networkConfig->connectionUuid(device->interfaceName());
291+
if (!device_uuid.isEmpty()) {
292+
NetworkManager::Connection::Ptr current_connection = NetworkManager::findConnectionByUuid(device_uuid);
293+
if (current_connection && current_connection->settings()->autoconnect()) {
294+
connPath0 = current_connection->path();
288295
}
289-
QDateTime ts = settings->timestamp();
290-
if (maxTs < ts || connPath0.isEmpty()) {
291-
maxTs = ts;
292-
connPath0 = connPath->path();
296+
}
297+
if (connPath0.isEmpty()) {
298+
auto availableConnections = device->availableConnections();
299+
qCDebug(DSM()) << "available connections:" << availableConnections;
300+
QDateTime maxTs;
301+
for (auto &&connPath : availableConnections) {
302+
auto settings = connPath->settings();
303+
if (!settings->autoconnect()) {
304+
continue;
305+
}
306+
QDateTime ts = settings->timestamp();
307+
if (maxTs < ts || connPath0.isEmpty()) {
308+
maxTs = ts;
309+
connPath0 = connPath->path();
310+
}
293311
}
294312
}
313+
if (!connPath0.isEmpty()) {
314+
NetworkManager::activateConnection(connPath0, device->uni(), QString());
315+
qDebug() << "connected:" << connPath0;
316+
}
295317

296318
bool enabled = NetworkManager::isNetworkingEnabled();
297319
if (!enabled) {

src/impl/networkmanager/devicemanagerrealize.cpp

Lines changed: 2 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2018 - 2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

@@ -296,8 +296,7 @@ void DeviceManagerRealize::setEnabled(bool enabled)
296296

297297
qCDebug(DNC) << QString("set Device %1, enabled: %2").arg(m_device->uni()).arg(enabled ? "true" : "false");
298298
QDBusInterface dbusInter(SYS_NETWORK_SERVICE, SYS_NETWORK_PATH, SYS_NETWORK_INTER, QDBusConnection::systemBus());
299-
QDBusReply<QDBusObjectPath> reply = dbusInter.call("EnableDevice", m_device->uni(), enabled);
300-
deviceEnabledAction(reply, enabled);
299+
dbusInter.call("EnableDevice", m_device->uni(), enabled);
301300
}
302301

303302
void DeviceManagerRealize::disconnectNetwork()
@@ -553,26 +552,6 @@ void WiredDeviceManagerRealize::onActiveConnectionChanged()
553552
Q_EMIT activeConnectionChanged();
554553
}
555554

556-
void WiredDeviceManagerRealize::deviceEnabledAction(const QDBusReply<QDBusObjectPath> &reply, bool enabled)
557-
{
558-
if (!enabled)
559-
return;
560-
561-
// 如果是开启,则让其自动连接
562-
QString activeConnectionPath = reply.value().path();
563-
// 开启自动连接才需要回连
564-
bool isAutoConnect = false;
565-
for (const auto connection : m_device->availableConnections()) {
566-
if (activeConnectionPath == connection->path()) {
567-
isAutoConnect = connection->settings()->autoconnect();
568-
}
569-
}
570-
if (isAutoConnect) {
571-
NetworkManager::activateConnection(activeConnectionPath, m_device->uni(), QString());
572-
qCDebug(DNC) << "connected:" << activeConnectionPath;
573-
}
574-
}
575-
576555
QString WiredDeviceManagerRealize::usingHwAdr() const
577556
{
578557
return m_device->hardwareAddress().toUpper();
@@ -1083,72 +1062,6 @@ void WirelessDeviceManagerRealize::deviceEnabledChanged(bool enabled)
10831062
m_netProcesser->deviceEnabledChanged();
10841063
}
10851064

1086-
void WirelessDeviceManagerRealize::deviceEnabledAction(const QDBusReply<QDBusObjectPath> &reply, bool enabled)
1087-
{
1088-
if (!enabled)
1089-
return;
1090-
1091-
QString enableConnectionPath = reply.value().path();
1092-
// 获取所有的wlan的连接
1093-
// 如果禁用之前的连接是热点,就让其不自动连接
1094-
do {
1095-
auto itLastActiveConnection = std::find_if(m_wirelessConnections.begin(), m_wirelessConnections.end(), [ enableConnectionPath ](WirelessConnection *item) {
1096-
return item->connection()->path() == enableConnectionPath;
1097-
});
1098-
if (itLastActiveConnection != m_wirelessConnections.end())
1099-
break;
1100-
1101-
auto connectionPath = [ this ] {
1102-
// 如果不在当前的连接列表中,说明连接的是热点,则让其连接当前的wlan即可
1103-
NetworkManager::Connection::List connections = m_device->availableConnections();
1104-
NetworkManager::Connection::List wirelessConnections;
1105-
for (NetworkManager::Connection::Ptr conn : connections) {
1106-
if (conn->settings()->connectionType() != NetworkManager::ConnectionSettings::ConnectionType::Wireless
1107-
|| !conn->settings()->timestamp().isValid() || !conn->settings()->autoconnect())
1108-
continue;
1109-
1110-
// 获取无线连接的设置
1111-
NetworkManager::WirelessSetting::Ptr wirelessSetting = conn->settings()->setting(NetworkManager::Setting::SettingType::Wireless)
1112-
.dynamicCast<NetworkManager::WirelessSetting>();
1113-
if (wirelessSetting.isNull())
1114-
continue;
1115-
1116-
// 只有mode为Ap的连接才是自建的热点
1117-
if (wirelessSetting->mode() == NetworkManager::WirelessSetting::NetworkMode::Ap)
1118-
continue;
1119-
1120-
wirelessConnections << conn;
1121-
}
1122-
1123-
if (wirelessConnections.size() == 0)
1124-
return QString();
1125-
1126-
std::sort(wirelessConnections.begin(), wirelessConnections.end(), [](NetworkManager::Connection::Ptr item1, NetworkManager::Connection::Ptr item2 ) {
1127-
return item1->settings()->timestamp() > item2->settings()->timestamp();
1128-
});
1129-
return wirelessConnections.first()->path();
1130-
};
1131-
enableConnectionPath = connectionPath();
1132-
if (enableConnectionPath.isEmpty()) {
1133-
connect(m_device.data(), &NetworkManager::WirelessDevice::availableConnectionAppeared, this, [ this, connectionPath ](const QString &connectionUni) {
1134-
QString enablePath = connectionPath();
1135-
if (enablePath != connectionUni)
1136-
return;
1137-
1138-
// 自动连接
1139-
NetworkManager::activateConnection(enablePath, m_device->uni(), QString());
1140-
qCDebug(DNC) << "connected:" << enablePath;
1141-
});
1142-
}
1143-
} while (0);
1144-
1145-
if (!enableConnectionPath.isEmpty()) {
1146-
// 自动连接
1147-
NetworkManager::activateConnection(enableConnectionPath, m_device->uni(), QString());
1148-
qCDebug(DNC) << "connected:" << enableConnectionPath;
1149-
}
1150-
}
1151-
11521065
QString WirelessDeviceManagerRealize::usingHwAdr() const
11531066
{
11541067
return m_device->hardwareAddress().toUpper();

src/impl/networkmanager/devicemanagerrealize.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2018 - 2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

@@ -58,7 +58,6 @@ class DeviceManagerRealize : public NetworkDeviceRealize
5858
virtual void removeConnection(const QString &connection) = 0;
5959
virtual void onActiveConnectionChanged() = 0;
6060
virtual void deviceEnabledChanged(bool) {}
61-
virtual void deviceEnabledAction(const QDBusReply<QDBusObjectPath> &, bool) {}
6261

6362
private:
6463
void initConnection();
@@ -96,7 +95,6 @@ class WiredDeviceManagerRealize : public DeviceManagerRealize
9695
void addConnection(const NetworkManager::Connection::Ptr &connection) override; // 新增有线网络连接
9796
void removeConnection(const QString &connectionUni) override; // 移除有线网络连接
9897
void onActiveConnectionChanged() override; // 活动连接变化
99-
void deviceEnabledAction(const QDBusReply<QDBusObjectPath> &reply, bool enabled) override;
10098
QString usingHwAdr() const override;
10199
bool carrier() const override; // 是否插入网线
102100

@@ -133,7 +131,6 @@ class WirelessDeviceManagerRealize : public DeviceManagerRealize
133131
void onActiveConnectionChanged() override;
134132
DeviceStatus deviceStatus() const override; // 返回设备的状态
135133
void deviceEnabledChanged(bool enabled) override; // 设备启用状态发生变化
136-
void deviceEnabledAction(const QDBusReply<QDBusObjectPath> &reply, bool enabled) override;
137134
QString usingHwAdr() const override;
138135

139136
private:

0 commit comments

Comments
 (0)