Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2443)

Unified Diff: chrome/browser/extensions/api/networking_private/networking_private_linux.cc

Issue 782493003: Support disconnecting from wireless networks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/extensions/api/networking_private/networking_private_linux.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/extensions/api/networking_private/networking_private_linux.cc
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_linux.cc b/chrome/browser/extensions/api/networking_private/networking_private_linux.cc
index 5eace1fffc78106c5a7c23c67ed6b58409ecebb2..3d67bab267be610637bf033f4ab7ed9e9e3ce822 100644
--- a/chrome/browser/extensions/api/networking_private/networking_private_linux.cc
+++ b/chrome/browser/extensions/api/networking_private/networking_private_linux.cc
@@ -115,6 +115,19 @@ void OnNetworkConnected(
success_callback.Run();
}
+// Fires the appropriate callback when the network disconnection succeeds or
+// fails.
stevenjb 2014/12/05 20:39:43 Since this is identical to OnNetworkConnected, may
zentaro 2014/12/05 21:39:33 Done.
+void OnNetworkDisconnected(
+ scoped_ptr<std::string> error,
+ const NetworkingPrivateDelegate::VoidCallback& success_callback,
+ const NetworkingPrivateDelegate::FailureCallback& failure_callback) {
+ if (!error->empty()) {
+ failure_callback.Run(*error);
+ return;
+ }
+ success_callback.Run();
+}
+
} // namespace
NetworkingPrivateLinux::NetworkingPrivateLinux(
@@ -339,6 +352,55 @@ void NetworkingPrivateLinux::ConnectToNetwork(const std::string& guid,
return;
}
+void NetworkingPrivateLinux::DisconnectFromNetwork(const std::string& guid,
+ std::string* error) {
+ AssertOnDBusThread();
+ std::string device_path_str;
+ std::string access_point_path_str;
+ std::string ssid;
+ DVLOG(1) << "Disconnecting from network GUID " << guid;
+
+ if (!ParseNetworkGuid(guid, &device_path_str, &access_point_path_str,
+ &ssid)) {
+ *error = "Invalid Network GUID format";
+ return;
+ }
+
+ dbus::ObjectPath device_path(device_path_str);
stevenjb 2014/12/05 20:39:43 This is only used once below (the other time shoul
zentaro 2014/12/05 21:39:33 It's used in the log statement on 397 too.
+
+ scoped_ptr<NetworkMap> network_map(new NetworkMap);
+ GetAllWiFiAccessPoints(/* configured_only */ false, /* visible_only */ false,
stevenjb 2014/12/05 20:39:43 switch order: (false /* configured_only */, ...)
zentaro 2014/12/05 21:39:33 Done.
+ /* limit */ 0, network_map.get());
+
+ NetworkMap::const_iterator network_iter =
+ network_map->find(base::UTF8ToUTF16(ssid));
+ if (network_iter == network_map->end()) {
+ // This network doesn't exist so there's nothing to do.
+ return;
+ }
+
+ std::string connection_state;
+ network_iter->second->GetString(kAccessPointInfoConnectionState,
+ &connection_state);
+ if (connection_state != ::onc::connection_state::kNotConnected) {
stevenjb 2014/12/05 20:39:43 Invert + early exit
zentaro 2014/12/05 21:39:33 Done.
+ // It's not disconnected so disconnect it.
+ dbus::ObjectProxy* device_proxy = dbus_->GetObjectProxy(
+ networking_private::kNetworkManagerNamespace, device_path);
+ dbus::MethodCall method_call(
+ networking_private::kNetworkManagerDeviceNamespace,
+ networking_private::kNetworkManagerDisconnectMethod);
+ scoped_ptr<dbus::Response> response(device_proxy->CallMethodAndBlock(
+ &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
+
+ if (!response) {
+ LOG(WARNING) << "Failed to disconnect network on device "
+ << device_path.value();
+ *error = "Failed to disconnect network";
+ return;
+ }
+ }
+}
+
void NetworkingPrivateLinux::StartConnect(
const std::string& guid,
const VoidCallback& success_callback,
@@ -365,7 +427,18 @@ void NetworkingPrivateLinux::StartDisconnect(
const std::string& guid,
const VoidCallback& success_callback,
const FailureCallback& failure_callback) {
- ReportNotSupported("StartDisconnect", failure_callback);
+ if (!CheckNetworkManagerSupported(failure_callback))
+ return;
+
+ scoped_ptr<std::string> error(new std::string);
+
+ // Runs DisconnectFromNetwork on |dbus_thread|.
+ dbus_thread_.task_runner()->PostTaskAndReply(
+ FROM_HERE,
+ base::Bind(&NetworkingPrivateLinux::DisconnectFromNetwork,
+ base::Unretained(this), guid, base::Unretained(error.get())),
+ base::Bind(&OnNetworkDisconnected, base::Passed(&error), success_callback,
+ failure_callback));
}
void NetworkingPrivateLinux::SetWifiTDLSEnabledState(
« no previous file with comments | « chrome/browser/extensions/api/networking_private/networking_private_linux.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698