| Index: chrome/browser/chromeos/cros/network_parser.cc
|
| diff --git a/chrome/browser/chromeos/cros/network_parser.cc b/chrome/browser/chromeos/cros/network_parser.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..765765585e060428730e80ddf1b3696097f48add
|
| --- /dev/null
|
| +++ b/chrome/browser/chromeos/cros/network_parser.cc
|
| @@ -0,0 +1,272 @@
|
| +// Copyright (c) 2011 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/cros/network_parser.h"
|
| +
|
| +#include "base/json/json_writer.h" // for debug output only.
|
| +#include "base/stringprintf.h"
|
| +// Needed only for debug output (ConnectionTypeToString).
|
| +#include "chrome/browser/chromeos/cros/native_network_constants.h"
|
| +
|
| +namespace chromeos {
|
| +
|
| +namespace {
|
| +Network* CreateNewNetwork(
|
| + ConnectionType type, const std::string& service_path) {
|
| + switch (type) {
|
| + case TYPE_ETHERNET: {
|
| + EthernetNetwork* ethernet = new EthernetNetwork(service_path);
|
| + return ethernet;
|
| + }
|
| + case TYPE_WIFI: {
|
| + WifiNetwork* wifi = new WifiNetwork(service_path);
|
| + return wifi;
|
| + }
|
| + case TYPE_CELLULAR: {
|
| + CellularNetwork* cellular = new CellularNetwork(service_path);
|
| + return cellular;
|
| + }
|
| + case TYPE_VPN: {
|
| + VirtualNetwork* vpn = new VirtualNetwork(service_path);
|
| + return vpn;
|
| + }
|
| + default: {
|
| + // If we try and create a service for which we have an unknown
|
| + // type, then that's a bug, and we will crash.
|
| + LOG(FATAL) << "Unknown service type: " << type;
|
| + return NULL;
|
| + }
|
| + }
|
| +}
|
| +} // namespace
|
| +
|
| +NetworkDeviceParser::NetworkDeviceParser(
|
| + const EnumMapper<PropertyIndex>* mapper) : mapper_(mapper) {
|
| + CHECK(mapper);
|
| +}
|
| +
|
| +NetworkDeviceParser::~NetworkDeviceParser() {
|
| +}
|
| +
|
| +NetworkDevice* NetworkDeviceParser::CreateDeviceFromInfo(
|
| + const std::string& device_path,
|
| + const DictionaryValue& info) {
|
| + scoped_ptr<NetworkDevice> device(new NetworkDevice(device_path));
|
| + if (!UpdateDeviceFromInfo(info, device.get())) {
|
| + NOTREACHED() << "Unable to create new device";
|
| + return NULL;
|
| + }
|
| + VLOG(2) << "Created device for path " << device_path;
|
| + return device.release();
|
| +}
|
| +
|
| +bool NetworkDeviceParser::UpdateDeviceFromInfo(const DictionaryValue& info,
|
| + NetworkDevice* device) {
|
| + for (DictionaryValue::key_iterator iter = info.begin_keys();
|
| + iter != info.end_keys(); ++iter) {
|
| + const std::string& key = *iter;
|
| + Value* value;
|
| + bool result = info.GetWithoutPathExpansion(key, &value);
|
| + DCHECK(result);
|
| + if (result)
|
| + UpdateStatus(key, *value, device, NULL);
|
| + }
|
| + if (VLOG_IS_ON(2)) {
|
| + std::string json;
|
| + base::JSONWriter::Write(&info, true, &json);
|
| + VLOG(2) << "Updated device for path "
|
| + << device->device_path() << ": " << json;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +bool NetworkDeviceParser::UpdateStatus(const std::string& key,
|
| + const Value& value,
|
| + NetworkDevice* device,
|
| + PropertyIndex* index) {
|
| + PropertyIndex found_index = mapper().Get(key);
|
| + if (index)
|
| + *index = found_index;
|
| + if (!ParseValue(found_index, value, device)) {
|
| + VLOG(1) << "NetworkDeviceParser: Unhandled key: " << key;
|
| + return false;
|
| + }
|
| + if (VLOG_IS_ON(2)) {
|
| + std::string value_json;
|
| + base::JSONWriter::Write(&value, true, &value_json);
|
| + VLOG(2) << "Updated value on device: "
|
| + << device->device_path() << "[" << key << "] = " << value_json;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +//----------- Network Parser -----------------
|
| +
|
| +NetworkParser::NetworkParser(const EnumMapper<PropertyIndex>* mapper)
|
| + : mapper_(mapper) {
|
| + CHECK(mapper);
|
| +}
|
| +
|
| +NetworkParser::~NetworkParser() {
|
| +}
|
| +
|
| +Network* NetworkParser::CreateNetworkFromInfo(
|
| + const std::string& service_path,
|
| + const DictionaryValue& info) {
|
| + ConnectionType type = ParseTypeFromDictionary(info);
|
| + scoped_ptr<Network> network(CreateNewNetwork(type, service_path));
|
| + if (network.get())
|
| + UpdateNetworkFromInfo(info, network.get());
|
| + VLOG(2) << "Created Network '" << network->name()
|
| + << "' from info. Path:" << service_path
|
| + << " Type:" << ConnectionTypeToString(type);
|
| + return network.release();
|
| +}
|
| +
|
| +bool NetworkParser::UpdateNetworkFromInfo(const DictionaryValue& info,
|
| + Network* network) {
|
| + network->set_unique_id("");
|
| + for (DictionaryValue::key_iterator iter = info.begin_keys();
|
| + iter != info.end_keys(); ++iter) {
|
| + const std::string& key = *iter;
|
| + Value* value;
|
| + bool res = info.GetWithoutPathExpansion(key, &value);
|
| + DCHECK(res);
|
| + if (res)
|
| + UpdateStatus(key, *value, network, NULL);
|
| + }
|
| + if (network->unique_id().empty())
|
| + network->CalculateUniqueId();
|
| + VLOG(2) << "Updated network '" << network->name()
|
| + << "' Path:" << network->service_path() << " Type:"
|
| + << ConnectionTypeToString(network->type());
|
| + return true;
|
| +}
|
| +
|
| +bool NetworkParser::UpdateStatus(const std::string& key,
|
| + const Value& value,
|
| + Network* network,
|
| + PropertyIndex* index) {
|
| + PropertyIndex found_index = mapper().Get(key);
|
| + if (index)
|
| + *index = found_index;
|
| + if (!ParseValue(found_index, value, network)) {
|
| + VLOG(1) << "Unhandled key '" << key << "' in Network: " << network->name()
|
| + << " ID: " << network->unique_id()
|
| + << " Type: " << ConnectionTypeToString(network->type());
|
| + return false;
|
| + }
|
| + if (VLOG_IS_ON(2)) {
|
| + std::string value_json;
|
| + base::JSONWriter::Write(&value, true, &value_json);
|
| + VLOG(2) << "Updated value on network: "
|
| + << network->unique_id() << "[" << key << "] = " << value_json;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +bool NetworkParser::ParseValue(PropertyIndex index,
|
| + const Value& value,
|
| + Network* network) {
|
| + switch (index) {
|
| + case PROPERTY_INDEX_TYPE: {
|
| + std::string type_string;
|
| + if (value.GetAsString(&type_string)) {
|
| + ConnectionType type = ParseType(type_string);
|
| + LOG_IF(ERROR, type != network->type())
|
| + << "Network with mismatched type: " << network->service_path()
|
| + << " " << type << " != " << network->type();
|
| + return true;
|
| + }
|
| + break;
|
| + }
|
| + case PROPERTY_INDEX_DEVICE: {
|
| + std::string device_path;
|
| + if (!value.GetAsString(&device_path))
|
| + break;
|
| + network->set_device_path(device_path);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_NAME: {
|
| + std::string name;
|
| + if (value.GetAsString(&name)) {
|
| + network->SetName(name);
|
| + return true;
|
| + }
|
| + break;
|
| + }
|
| + case PROPERTY_INDEX_GUID: {
|
| + std::string unique_id;
|
| + if (!value.GetAsString(&unique_id))
|
| + break;
|
| + network->set_unique_id(unique_id);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_PROFILE: {
|
| + // Note: currently this is only provided for non remembered networks.
|
| + std::string profile_path;
|
| + if (!value.GetAsString(&profile_path))
|
| + break;
|
| + network->set_profile_path(profile_path);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_STATE: {
|
| + std::string state_string;
|
| + if (value.GetAsString(&state_string)) {
|
| + network->SetState(ParseState(state_string));
|
| + return true;
|
| + }
|
| + break;
|
| + }
|
| + case PROPERTY_INDEX_MODE: {
|
| + std::string mode_string;
|
| + if (value.GetAsString(&mode_string)) {
|
| + network->mode_ = ParseMode(mode_string);
|
| + return true;
|
| + }
|
| + break;
|
| + }
|
| + case PROPERTY_INDEX_ERROR: {
|
| + std::string error_string;
|
| + if (value.GetAsString(&error_string)) {
|
| + network->error_ = ParseError(error_string);
|
| + return true;
|
| + }
|
| + break;
|
| + }
|
| + case PROPERTY_INDEX_CONNECTABLE: {
|
| + bool connectable;
|
| + if (!value.GetAsBoolean(&connectable))
|
| + break;
|
| + network->set_connectable(connectable);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_IS_ACTIVE: {
|
| + bool is_active;
|
| + if (!value.GetAsBoolean(&is_active))
|
| + break;
|
| + network->set_is_active(is_active);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_AUTO_CONNECT: {
|
| + bool auto_connect;
|
| + if (!value.GetAsBoolean(&auto_connect))
|
| + break;
|
| + network->set_auto_connect(auto_connect);
|
| + return true;
|
| + }
|
| + case PROPERTY_INDEX_SAVE_CREDENTIALS: {
|
| + bool save_credentials;
|
| + if (!value.GetAsBoolean(&save_credentials))
|
| + break;
|
| + network->set_save_credentials(save_credentials);
|
| + return true;
|
| + }
|
| + default:
|
| + break;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +} // namespace chromeos
|
|
|