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

Unified Diff: chrome/browser/chromeos/extensions/networking_private_api.cc

Issue 11975015: This adds a private extension API to use for simple networking (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed self review nits Created 7 years, 11 months 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
Index: chrome/browser/chromeos/extensions/networking_private_api.cc
diff --git a/chrome/browser/chromeos/extensions/networking_private_api.cc b/chrome/browser/chromeos/extensions/networking_private_api.cc
new file mode 100644
index 0000000000000000000000000000000000000000..0fdf6d61fefd6bb8bb3de51c3258c4c8e148dd33
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/networking_private_api.cc
@@ -0,0 +1,259 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/extensions/networking_private_api.h"
+
+#include "base/bind_helpers.h"
+#include "chrome/browser/chromeos/extensions/networking_private_api_factory.h"
+#include "chrome/browser/extensions/extension_function_registry.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/shill_manager_client.h"
+#include "chromeos/dbus/shill_service_client.h"
+#include "dbus/object_path.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
+
+namespace chromeos {
+
+namespace {
+
+// These are keys used by the JavaScript code to access information in the
+// result.
+const char kBssid[] = "bssid";
+const char kName[] = "name";
+const char kNetworkId[] = "networkId";
+const char kNetworkTypeAll[] = "all";
+const char kStatus[] = "status";
+const char kType[] = "type";
+
+// This creates a new dictionary that only contains the information we're
+// interested in passing on to JavaScript.
+base::DictionaryValue* CreateFilteredResult(
+ const base::DictionaryValue& properties) {
+ scoped_ptr<base::DictionaryValue> filtered_result(new base::DictionaryValue);
+
+ std::string bssid;
+ if (properties.GetString(flimflam::kWifiBSsid, &bssid))
+ filtered_result->SetString(kBssid, bssid);
+ std::string name;
+ if (properties.GetString(flimflam::kNameProperty, &name)) {
mazda 2013/01/16 22:08:52 nit: braces are not needed
Greg Spencer (Chromium) 2013/01/16 22:29:17 Done.
+ filtered_result->SetString(kName, name);
+ }
+ std::string type;
+ if (properties.GetString(flimflam::kTypeProperty, &type))
+ filtered_result->SetString(kType, type);
+ std::string state;
+ if (properties.GetString(flimflam::kStateProperty, &state)) {
+ if (state == flimflam::kStateReady || state == flimflam::kStateOnline) {
+ filtered_result->SetString(kStatus, "connected");
+ } else if (state == flimflam::kStateAssociation ||
+ state == flimflam::kStatePortal ||
+ state == flimflam::kStateConfiguration) {
+ filtered_result->SetString(kStatus, "connecting");
+ } else {
+ filtered_result->SetString(kStatus, "notConnected");
+ }
+ }
+
+ return filtered_result.release();
+}
+
+} // namespace
+
+
+////////////////////////////////////////////////////////////////////////////////
+// NetworkingGetPropertiesFunction
+
+NetworkingGetPropertiesFunction::~NetworkingGetPropertiesFunction() {}
+
+bool NetworkingGetPropertiesFunction::RunImpl() {
+ std::string service_path;
+ if (!args_->GetString(0, &service_path))
+ return false;
mazda 2013/01/16 22:08:52 nit: indent with two spaces
Greg Spencer (Chromium) 2013/01/16 22:29:17 Done.
Greg Spencer (Chromium) 2013/01/16 22:29:17 Done.
+
+ DBusThreadManager::Get()->GetShillServiceClient()->GetProperties(
+ dbus::ObjectPath(service_path), base::Bind(
+ &NetworkingGetPropertiesFunction::ResultCallback, this));
+ return true;
+}
+
+void NetworkingGetPropertiesFunction::ResultCallback(
+ DBusMethodCallStatus call_status,
+ const base::DictionaryValue& result) {
+ scoped_ptr<base::DictionaryValue> filtered_result(
+ CreateFilteredResult(result));
+
+ SetResult(filtered_result.release());
+ SendResponse(true);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// NetworkingGetVisibleNetworksFunction::ScopedDecrementer
+
+NetworkingGetVisibleNetworksFunction::ScopedDecrementer::ScopedDecrementer(
+ NetworkingGetVisibleNetworksFunction* parent,
+ scoped_refptr<NetworkingGetVisibleNetworksFunction::ResultList> result_list)
+ : parent_(parent), result_list_(result_list) {
+}
+
+NetworkingGetVisibleNetworksFunction::ScopedDecrementer::~ScopedDecrementer() {
+ result_list_->count--;
+ if (result_list_->count == 0) {
+ parent_->SetResult(result_list_->list.release());
+ parent_->SendResponse(true);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// NetworkingGetVisibleNetworksFunction
+
+NetworkingGetVisibleNetworksFunction::~NetworkingGetVisibleNetworksFunction() {}
+
+bool NetworkingGetVisibleNetworksFunction::RunImpl() {
+ std::string network_type;
+ if (!args_->GetString(0, &network_type))
+ return false;
mazda 2013/01/16 22:08:52 nit: indent with two spaces
Greg Spencer (Chromium) 2013/01/16 22:29:17 Done.
+
+ DBusThreadManager::Get()->GetShillManagerClient()->GetProperties(
+ base::Bind(
+ &NetworkingGetVisibleNetworksFunction::ManagerPropertiesCallback,
+ this,
+ network_type));
+ return true;
+}
+
+// For each of the available services, fire off a request for its properties.
+void NetworkingGetVisibleNetworksFunction::ManagerPropertiesCallback(
+ const std::string& network_type,
+ DBusMethodCallStatus call_status,
+ const base::DictionaryValue& result) {
+ const base::ListValue* available_services;
+ if (!result.GetList(flimflam::kServicesProperty, &available_services)) {
+ error_ = "Error.noServices";
+ SendResponse(false);
+ return;
+ }
+
+ scoped_refptr<ResultList> results(new ResultList);
+ results->count = available_services->GetSize();
+ for (size_t i = 0; i < available_services->GetSize(); ++i) {
+ std::string service_path;
+ available_services->GetString(i, &service_path);
+ DBusThreadManager::Get()->GetShillServiceClient()->GetProperties(
+ dbus::ObjectPath(service_path),
+ base::Bind(
+ &NetworkingGetVisibleNetworksFunction::ServicePropertiesCallback,
+ this,
+ service_path,
+ network_type,
+ results));
+ }
+}
+
+// If this network is of the appropriate type, add it to the results and
+// decrement the count. If the count hits zero, then send the result.
+void NetworkingGetVisibleNetworksFunction::ServicePropertiesCallback(
+ const std::string& service_path,
+ const std::string& network_type,
+ scoped_refptr<ResultList> result_list,
+ DBusMethodCallStatus call_status,
+ const base::DictionaryValue& result) {
+ // We must decrement the count each time we get a callback, regardless of the
+ // outcome.
+ ScopedDecrementer decrementer(this, result_list);
+
+ if (call_status != DBUS_METHOD_CALL_SUCCESS)
+ return;
+
+ std::string type;
+ if (!result.GetString(flimflam::kTypeProperty, &type))
+ return;
+
+ if (type == network_type || network_type == kNetworkTypeAll) {
+ scoped_ptr<base::DictionaryValue> network_properties(
+ CreateFilteredResult(result));
+ network_properties->SetString(kNetworkId, service_path);
+ result_list->list->Append(network_properties.release());
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// NetworkingRequestConnectFunction
+
+NetworkingRequestConnectFunction::~NetworkingRequestConnectFunction() {}
+
+void NetworkingRequestConnectFunction::ConnectSuccess() {
+ SendResponse(true);
+}
+
+void NetworkingRequestConnectFunction::ConnectFailed(
+ const std::string& errorName,
+ const std::string& errorMessage) {
+ error_ = errorName;
+ SendResponse(false);
+}
+
+bool NetworkingRequestConnectFunction::RunImpl() {
+ std::string service_path;
+ if (!args_->GetString(0, &service_path))
+ return false;
mazda 2013/01/16 22:08:52 nit: indent with two spaces
Greg Spencer (Chromium) 2013/01/16 22:29:17 Done.
+
+ DBusThreadManager::Get()->GetShillServiceClient()->Connect(
+ dbus::ObjectPath(service_path),
mazda 2013/01/16 22:08:52 nit: indent with four spaces
Greg Spencer (Chromium) 2013/01/16 22:29:17 Done.
+ base::Bind(&NetworkingRequestConnectFunction::ConnectSuccess, this),
+ base::Bind(&NetworkingRequestConnectFunction::ConnectFailed, this));
+ return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// NetworkingRequestDisconnectFunction
+
+NetworkingRequestDisconnectFunction::~NetworkingRequestDisconnectFunction() {}
+
+void NetworkingRequestDisconnectFunction::ConnectSuccess() {
+ SendResponse(true);
+}
+
+void NetworkingRequestDisconnectFunction::ConnectFailed(
+ const std::string& errorName,
+ const std::string& errorMessage) {
+ error_ = errorName;
+ SendResponse(false);
+}
+
+bool NetworkingRequestDisconnectFunction::RunImpl() {
+ std::string service_path;
+ if (!args_->GetString(0, &service_path))
+ return false;
mazda 2013/01/16 22:08:52 nit: indent with two spaces
Greg Spencer (Chromium) 2013/01/16 22:29:17 Done.
+
+ DBusThreadManager::Get()->GetShillServiceClient()->Connect(
+ dbus::ObjectPath(service_path),
mazda 2013/01/16 22:08:52 nit: indent with four spaces
Greg Spencer (Chromium) 2013/01/16 22:29:17 Done.
+ base::Bind(&NetworkingRequestDisconnectFunction::ConnectSuccess, this),
+ base::Bind(&NetworkingRequestDisconnectFunction::ConnectFailed, this));
+ return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// NetworkingPrivateAPI
+
+NetworkingPrivateAPI::NetworkingPrivateAPI(Profile* profile) {
+ ExtensionFunctionRegistry* registry =
+ ExtensionFunctionRegistry::GetInstance();
+ registry->RegisterFunction<NetworkingGetPropertiesFunction>();
+ registry->RegisterFunction<NetworkingGetVisibleNetworksFunction>();
+ registry->RegisterFunction<NetworkingRequestConnectFunction>();
+ registry->RegisterFunction<NetworkingRequestDisconnectFunction>();
+}
+
+NetworkingPrivateAPI::~NetworkingPrivateAPI() {
+}
+
+void NetworkingPrivateAPI::Shutdown() {
+}
+
+// static
+NetworkingPrivateAPI* NetworkingPrivateAPI::Get(Profile* profile) {
+ return NetworkingPrivateAPIFactory::GetForProfile(profile);
+}
+
+} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698