From 305786f0da7659a41a1ab191932a4536a1085abe Mon Sep 17 00:00:00 2001 From: ShaneSmiskol Date: Mon, 14 Jun 2021 16:17:08 -0700 Subject: [PATCH] ui: remember previous connections (#21233) * remember previous connections * minor * remove ssid_from_path * abstract into function * forgot one * const * add path_from_ssid function * more clear what these do * fix * more clear * structured binding test * remove ssid_from_path * fix name * disconnect if connected * let's just match the activate function in naming * return if empty * revert and clean up --- selfdrive/ui/qt/offroad/networking.cc | 4 +- selfdrive/ui/qt/offroad/wifiManager.cc | 140 +++++++++---------------- selfdrive/ui/qt/offroad/wifiManager.h | 12 ++- 3 files changed, 62 insertions(+), 94 deletions(-) diff --git a/selfdrive/ui/qt/offroad/networking.cc b/selfdrive/ui/qt/offroad/networking.cc index 95cdc1da..6dec8ddc 100644 --- a/selfdrive/ui/qt/offroad/networking.cc +++ b/selfdrive/ui/qt/offroad/networking.cc @@ -104,7 +104,9 @@ void Networking::refresh() { } void Networking::connectToNetwork(const Network &n) { - if (n.security_type == SecurityType::OPEN) { + if (wifi->isKnownNetwork(n.ssid)) { + wifi->activateWifiConnection(n.ssid); + } else if (n.security_type == SecurityType::OPEN) { wifi->connect(n); } else if (n.security_type == SecurityType::WPA) { QString pass = InputDialog::getText("Enter password for \"" + n.ssid + "\"", 8); diff --git a/selfdrive/ui/qt/offroad/wifiManager.cc b/selfdrive/ui/qt/offroad/wifiManager.cc index 2f10ce46..0588cbd5 100644 --- a/selfdrive/ui/qt/offroad/wifiManager.cc +++ b/selfdrive/ui/qt/offroad/wifiManager.cc @@ -213,7 +213,7 @@ void WifiManager::connect(const Network &n, const QString &password) { void WifiManager::connect(const Network &n, const QString &username, const QString &password) { connecting_to_network = n.ssid; // disconnect(); - clear_connections(n.ssid); //Clear all connections that may already exist to the network we are connecting + forgetNetwork(n.ssid); //Clear all connections that may already exist to the network we are connecting connect(n.ssid, username, password, n.security_type); } @@ -240,10 +240,10 @@ void WifiManager::connect(const QByteArray &ssid, const QString &username, const nm_settings.setTimeout(dbus_timeout); nm_settings.call("AddConnection", QVariant::fromValue(connection)); - activate_wifi_connection(QString(ssid)); + activateWifiConnection(QString(ssid)); } -void WifiManager::deactivate_connections(const QString &ssid) { +void WifiManager::deactivateConnection(const QString &ssid) { for (QDBusObjectPath active_connection_raw : get_active_connections()) { QString active_connection = active_connection_raw.path(); QDBusInterface nm(nm_service, active_connection, props_iface, bus); @@ -255,7 +255,7 @@ void WifiManager::deactivate_connections(const QString &ssid) { if (Ssid == ssid) { QDBusInterface nm2(nm_service, nm_path, nm_iface, bus); nm2.setTimeout(dbus_timeout); - nm2.call("DeactivateConnection", QVariant::fromValue(active_connection_raw));// TODO change to disconnect + nm2.call("DeactivateConnection", QVariant::fromValue(active_connection_raw)); } } } @@ -279,27 +279,15 @@ QVector WifiManager::get_active_connections() { return conns; } -void WifiManager::clear_connections(const QString &ssid) { - for(QDBusObjectPath path : list_connections()) { +bool WifiManager::isKnownNetwork(const QString &ssid) { + return !pathFromSsid(ssid).path().isEmpty(); +} + +void WifiManager::forgetNetwork(const QString &ssid) { + QDBusObjectPath path = pathFromSsid(ssid); + if (!path.path().isEmpty()) { QDBusInterface nm2(nm_service, path.path(), nm_settings_conn_iface, bus); - nm2.setTimeout(dbus_timeout); - - QDBusMessage response = nm2.call("GetSettings"); - - const QDBusArgument &dbusArg = response.arguments().at(0).value(); - - QMap> map; - dbusArg >> map; - for (auto &inner : map) { - for (auto &val : inner) { - QString key = inner.key(val); - if (key == "ssid") { - if (val == ssid) { - nm2.call("Delete"); - } - } - } - } + nm2.call("Delete"); } } @@ -388,12 +376,22 @@ void WifiManager::change(unsigned int new_state, unsigned int previous_state, un void WifiManager::disconnect() { QString active_ap = get_active_ap(); if (active_ap != "" && active_ap != "/") { - deactivate_connections(get_property(active_ap, "Ssid")); + deactivateConnection(get_property(active_ap, "Ssid")); } } -QVector WifiManager::list_connections() { - QVector connections; +QDBusObjectPath WifiManager::pathFromSsid(const QString &ssid) { + QDBusObjectPath path; // returns uninitialized path if network is not known + for (auto const& [conn_ssid, conn_path] : listConnections()) { + if (conn_ssid == ssid) { + path = conn_path; + } + } + return path; +} + +QVector> WifiManager::listConnections() { + QVector> connections; QDBusInterface nm(nm_service, nm_settings_path, nm_settings_iface, bus); nm.setTimeout(dbus_timeout); @@ -404,68 +402,33 @@ QVector WifiManager::list_connections() { while (!args.atEnd()) { QDBusObjectPath path; args >> path; - connections.push_back(path); + + // Get ssid + QDBusInterface nm2(nm_service, path.path(), nm_settings_conn_iface, bus); + nm2.setTimeout(dbus_timeout); + + QDBusMessage response = nm2.call("GetSettings"); + const QDBusArgument &dbusArg = response.arguments().at(0).value(); + QMap> map; + dbusArg >> map; + + const QString ssid = map.value("802-11-wireless").value("ssid").toString(); + connections.push_back(qMakePair(ssid, path)); } return connections; } -bool WifiManager::activate_wifi_connection(const QString &ssid) { - QString devicePath = get_adapter(); - - for(QDBusObjectPath path : list_connections()) { - QDBusInterface nm2(nm_service, path.path(), nm_settings_conn_iface, bus); - nm2.setTimeout(dbus_timeout); - - QDBusMessage response = nm2.call("GetSettings"); - const QDBusArgument &dbusArg = response.arguments().at(0).value(); - - QMap> map; - dbusArg >> map; - for (auto &inner : map) { - for (auto &val : inner) { - QString key = inner.key(val); - if (key == "ssid") { - if (val == ssid) { - QDBusInterface nm3(nm_service, nm_path, nm_iface, bus); - nm3.setTimeout(dbus_timeout); - nm3.call("ActivateConnection", QVariant::fromValue(path), QVariant::fromValue(QDBusObjectPath(devicePath)), QVariant::fromValue(QDBusObjectPath("/"))); - return true; - } - } - } - } +void WifiManager::activateWifiConnection(const QString &ssid) { + QDBusObjectPath path = pathFromSsid(ssid); + if (!path.path().isEmpty()) { + QString devicePath = get_adapter(); + QDBusInterface nm3(nm_service, nm_path, nm_iface, bus); + nm3.setTimeout(dbus_timeout); + nm3.call("ActivateConnection", QVariant::fromValue(path), QVariant::fromValue(QDBusObjectPath(devicePath)), QVariant::fromValue(QDBusObjectPath("/"))); } - return false; } -//Functions for tethering -bool WifiManager::activate_tethering_connection() { - QString devicePath = get_adapter(); - for(QDBusObjectPath path : list_connections()) { - QDBusInterface nm2(nm_service, path.path(), nm_settings_conn_iface, bus); - nm2.setTimeout(dbus_timeout); - - QDBusMessage response = nm2.call("GetSettings"); - const QDBusArgument &dbusArg = response.arguments().at(0).value(); - - QMap> map; - dbusArg >> map; - for (auto &inner : map) { - for (auto &val : inner) { - QString key = inner.key(val); - if (key == "ssid") { - if (val == tethering_ssid.toUtf8()) { - QDBusInterface nm3(nm_service, nm_path, nm_iface, bus); - nm3.setTimeout(dbus_timeout); - nm3.call("ActivateConnection", QVariant::fromValue(path), QVariant::fromValue(QDBusObjectPath(devicePath)), QVariant::fromValue(QDBusObjectPath("/"))); - return true; - } - } - } - } - } - return false; -} +// Functions for tethering void WifiManager::addTetheringConnection() { Connection connection; connection["connection"]["id"] = "Hotspot"; @@ -499,15 +462,14 @@ void WifiManager::addTetheringConnection() { } void WifiManager::enableTethering() { - if(activate_tethering_connection()) { - return; + if (!isKnownNetwork(tethering_ssid.toUtf8())) { + addTetheringConnection(); } - addTetheringConnection(); - activate_tethering_connection(); + activateWifiConnection(tethering_ssid.toUtf8()); } void WifiManager::disableTethering() { - deactivate_connections(tethering_ssid.toUtf8()); + deactivateConnection(tethering_ssid.toUtf8()); } bool WifiManager::tetheringEnabled() { @@ -517,6 +479,8 @@ bool WifiManager::tetheringEnabled() { void WifiManager::changeTetheringPassword(const QString &newPassword) { tetheringPassword = newPassword; - clear_connections(tethering_ssid.toUtf8()); + if (isKnownNetwork(tethering_ssid.toUtf8())) { + forgetNetwork(tethering_ssid.toUtf8()); + } addTetheringConnection(); } diff --git a/selfdrive/ui/qt/offroad/wifiManager.h b/selfdrive/ui/qt/offroad/wifiManager.h index db60ac59..9969f9a6 100644 --- a/selfdrive/ui/qt/offroad/wifiManager.h +++ b/selfdrive/ui/qt/offroad/wifiManager.h @@ -35,6 +35,8 @@ public: QString ipv4_address; void refreshNetworks(); + bool isKnownNetwork(const QString &ssid); + void connect(const Network &ssid); void connect(const Network &ssid, const QString &password); void connect(const Network &ssid, const QString &username, const QString &password); @@ -45,9 +47,8 @@ public: void disableTethering(); bool tetheringEnabled(); - bool activate_tethering_connection(); void addTetheringConnection(); - bool activate_wifi_connection(const QString &ssid); + void activateWifiConnection(const QString &ssid); void changeTetheringPassword(const QString &newPassword); private: @@ -64,14 +65,15 @@ private: QList get_networks(); void connect(const QByteArray &ssid, const QString &username, const QString &password, SecurityType security_type); QString get_active_ap(); - void deactivate_connections(const QString &ssid); - void clear_connections(const QString &ssid); + void deactivateConnection(const QString &ssid); + void forgetNetwork(const QString &ssid); QVector get_active_connections(); uint get_wifi_device_state(); QByteArray get_property(const QString &network_path, const QString &property); unsigned int get_ap_strength(const QString &network_path); SecurityType getSecurityType(const QString &ssid); - QVector list_connections(); + QDBusObjectPath pathFromSsid(const QString &ssid); + QVector> listConnections(); private slots: void change(unsigned int new_state, unsigned int previous_state, unsigned int change_reason);