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

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: upload after another merge Created 7 years, 10 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..077619ea2dd57d38748c9346448347838d12dfe8
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/networking_private_api.cc
@@ -0,0 +1,303 @@
+// 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/extensions/extension_function_registry.h"
+#include "chrome/common/extensions/api/networking_private.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/shill_manager_client.h"
+#include "chromeos/dbus/shill_service_client.h"
+#include "chromeos/network/onc/onc_constants.h"
+#include "chromeos/network/onc/onc_signature.h"
+#include "chromeos/network/onc/onc_translation_tables.h"
+#include "chromeos/network/onc/onc_translator.h"
+#include "dbus/object_path.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
+
+using namespace chromeos;
+namespace api = extensions::api::networking_private;
+
+namespace {
+
+// An error returned when no valid services were found.
+const char kInvalidResponseError[] = "Error.invalidResponse";
+
+// This creates a new ONC dictionary that only contains the information we're
+// interested in passing on to JavaScript.
+scoped_ptr<api::NetworkProperties> CreateFilteredResult(
+ const base::DictionaryValue& properties) {
+ scoped_ptr<base::DictionaryValue> onc_properties(
+ onc::TranslateShillServiceToONCPart(
+ properties,
+ &onc::kNetworkConfigurationSignature));
+
+ // Now we filter it so we only include properties that we care about for this
+ // interface.
+ static const char* const desired_fields[] = {
+ onc::network_config::kWiFi,
+ onc::network_config::kName,
+ onc::network_config::kGUID,
+ onc::network_config::kType,
+ onc::network_config::kConnectionState,
+ };
+
+ scoped_ptr<api::NetworkProperties> filtered_result(
+ new api::NetworkProperties);
+ for (size_t i = 0; i < arraysize(desired_fields); ++i) {
+ base::Value* value;
+ if (onc_properties->Get(desired_fields[i], &value))
+ filtered_result->additional_properties.Set(desired_fields[i],
+ value->DeepCopy());
+ }
+
+ return filtered_result.Pass();
+}
+
+class ResultList : public base::RefCounted<ResultList> {
+ public:
+ typedef base::Callback<void(const std::string& error,
+ scoped_ptr<base::ListValue>)> ResultCallback;
+
+ ResultList(const std::string& type, const ResultCallback& callback)
+ : callback_(callback) {
+ DBusThreadManager::Get()->GetShillManagerClient()->GetProperties(
+ base::Bind(&ResultList::ManagerPropertiesCallback, this, type));
+ }
+
+ scoped_ptr<base::ListValue> GetResults() {
+ return api::GetVisibleNetworks::Results::Create(list_);
+ }
+
+ private:
+ friend class base::RefCounted<ResultList>;
+
+ ~ResultList() {
+ callback_.Run(std::string(), GetResults());
+ }
+
+ void Append(api::NetworkProperties* value) {
+ list_.push_back(linked_ptr<api::NetworkProperties>(value));
+ }
+
+ // Receives the result of a call to GetProperties on the Shill Manager API.
+ void ManagerPropertiesCallback(const std::string& network_type,
+ chromeos::DBusMethodCallStatus call_status,
+ const base::DictionaryValue& result);
+
+ // Receives the result of a call to GetProperties on the Shill Service API.
+ void ServicePropertiesCallback(const std::string& service_path,
+ const std::string& network_type,
+ chromeos::DBusMethodCallStatus call_status,
+ const base::DictionaryValue& result);
+
+ std::vector<linked_ptr<api::NetworkProperties> > list_;
+ ResultCallback callback_;
+
+ DISALLOW_COPY_AND_ASSIGN(ResultList);
+};
+
+// For each of the available services, fire off a request for its properties.
+void ResultList::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)) {
+ LOG(ERROR)
+ << "ShillManagerClient::GetProperties returned malformed service list.";
+ callback_.Run(kInvalidResponseError, make_scoped_ptr(new base::ListValue));
+ return;
+ }
+ // If there just are no services, return an empty list.
+ if (available_services->GetSize() == 0) {
+ callback_.Run(std::string(), make_scoped_ptr(new base::ListValue));
+ return;
+ }
+ for (base::ListValue::const_iterator iter = available_services->begin();
+ iter != available_services->end(); ++iter) {
+ std::string service_path;
+ if (!(*iter)->GetAsString(&service_path)) {
+ LOG(ERROR)
+ << "ShillManagerClient::GetProperties returned malformed service.";
+ continue;
+ }
+
+ DBusThreadManager::Get()->GetShillServiceClient()->GetProperties(
+ dbus::ObjectPath(service_path),
+ base::Bind(
+ &ResultList::ServicePropertiesCallback,
+ this,
+ service_path,
+ network_type));
+ }
+}
+
+void ResultList::ServicePropertiesCallback(
+ const std::string& service_path,
+ const std::string& network_type,
+ DBusMethodCallStatus call_status,
+ const base::DictionaryValue& result) {
+ if (call_status == DBUS_METHOD_CALL_SUCCESS) {
+ scoped_ptr<api::NetworkProperties> filtered_result(
+ CreateFilteredResult(result));
+
+ std::string onc_type;
+ if (filtered_result->additional_properties.GetString(
+ onc::network_config::kType, &onc_type) &&
+ (onc_type == network_type ||
+ network_type == onc::network_type::kAllTypes)) {
+ // TODO(gspencer): For now the "GUID" we send back is going to look
+ // remarkably like the service path. Once this code starts using the
+ // NetworkStateHandler instead of Shill directly, we should remove
+ // this line so that we're sending back the actual GUID. The
+ // JavaScript shouldn't care: this ID is opaque to it, and it
+ // shouldn't store it anywhere.
+ filtered_result->additional_properties.SetString(
+ onc::network_config::kGUID, service_path);
+
+ Append(filtered_result.release());
+ }
+ }
+}
+
+} // namespace
+
+////////////////////////////////////////////////////////////////////////////////
+// NetworkingPrivateGetPropertiesFunction
+
+NetworkingPrivateGetPropertiesFunction::
+ ~NetworkingPrivateGetPropertiesFunction() {
+}
+
+bool NetworkingPrivateGetPropertiesFunction::RunImpl() {
+ scoped_ptr<api::GetProperties::Params> params =
+ api::GetProperties::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(params);
+
+ // TODO(gspencer): Currently we're using the service path as the
+ // |network_guid|. Eventually this should be using the real GUID.
+ DBusThreadManager::Get()->GetShillServiceClient()->GetProperties(
+ dbus::ObjectPath(params->network_guid),
+ base::Bind(&NetworkingPrivateGetPropertiesFunction::ResultCallback,
+ this));
+ return true;
+}
+
+void NetworkingPrivateGetPropertiesFunction::ResultCallback(
+ DBusMethodCallStatus call_status,
+ const base::DictionaryValue& result) {
+ scoped_ptr<api::NetworkProperties> filtered_result(
+ CreateFilteredResult(result));
+ results_ = api::GetProperties::Results::Create(*filtered_result);
+ SendResponse(true);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// NetworkingPrivateGetVisibleNetworksFunction
+
+NetworkingPrivateGetVisibleNetworksFunction::
+~NetworkingPrivateGetVisibleNetworksFunction() {
+}
+
+bool NetworkingPrivateGetVisibleNetworksFunction::RunImpl() {
+ scoped_ptr<api::GetVisibleNetworks::Params> params =
+ api::GetVisibleNetworks::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(params);
+
+ scoped_refptr<ResultList> result_list(new ResultList(
+ api::GetVisibleNetworks::Params::ToString(params->type),
+ base::Bind(
+ &NetworkingPrivateGetVisibleNetworksFunction::SendResultCallback,
+ this)));
+ return true;
+}
+
+void NetworkingPrivateGetVisibleNetworksFunction::SendResultCallback(
+ const std::string& error,
+ scoped_ptr<base::ListValue> result_list) {
+ if (!error.empty()) {
+ error_ = error;
+ SendResponse(false);
+ } else {
+ results_.reset(result_list.release());
+ SendResponse(true);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// NetworkingPrivateStartConnectFunction
+
+NetworkingPrivateStartConnectFunction::
+ ~NetworkingPrivateStartConnectFunction() {
+}
+
+void NetworkingPrivateStartConnectFunction::ConnectionStartSuccess() {
+ SendResponse(true);
+}
+
+void NetworkingPrivateStartConnectFunction::ConnectionStartFailed(
+ const std::string& error_name,
+ const std::string& error_message) {
+ error_ = error_name;
+ SendResponse(false);
+}
+
+bool NetworkingPrivateStartConnectFunction::RunImpl() {
+ scoped_ptr<api::StartConnect::Params> params =
+ api::StartConnect::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(params);
+
+ // TODO(gspencer): For now, the "GUID" we receive from the JavaScript is going
+ // to be the service path. Fix this so it actually looks up the service path
+ // from the GUID once we're using the NetworkStateHandler.
+ std::string service_path = params->network_guid;
+
+ DBusThreadManager::Get()->GetShillServiceClient()->Connect(
+ dbus::ObjectPath(service_path),
+ base::Bind(
+ &NetworkingPrivateStartConnectFunction::ConnectionStartSuccess,
+ this),
+ base::Bind(&NetworkingPrivateStartConnectFunction::ConnectionStartFailed,
+ this));
+ return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// NetworkingPrivateStartDisconnectFunction
+
+NetworkingPrivateStartDisconnectFunction::
+ ~NetworkingPrivateStartDisconnectFunction() {
+}
+
+void NetworkingPrivateStartDisconnectFunction::DisconnectionStartSuccess() {
+ SendResponse(true);
+}
+
+void NetworkingPrivateStartDisconnectFunction::DisconnectionStartFailed(
+ const std::string& error_name,
+ const std::string& error_message) {
+ error_ = error_name;
+ SendResponse(false);
+}
+
+bool NetworkingPrivateStartDisconnectFunction::RunImpl() {
+ scoped_ptr<api::StartDisconnect::Params> params =
+ api::StartDisconnect::Params::Create(*args_);
+ EXTENSION_FUNCTION_VALIDATE(params);
+
+ // TODO(gspencer): Currently the |network_guid| parameter is storing the
+ // service path. Convert to using the actual GUID when we start using
+ // the NetworkStateHandler.
+ DBusThreadManager::Get()->GetShillServiceClient()->Connect(
+ dbus::ObjectPath(params->network_guid),
+ base::Bind(
+ &NetworkingPrivateStartDisconnectFunction::DisconnectionStartSuccess,
+ this),
+ base::Bind(
+ &NetworkingPrivateStartDisconnectFunction::DisconnectionStartFailed,
+ this));
+ return true;
+}

Powered by Google App Engine
This is Rietveld 408576698