Chromium Code Reviews| Index: components/arc/net/arc_net_host_impl.cc |
| diff --git a/components/arc/net/arc_net_host_impl.cc b/components/arc/net/arc_net_host_impl.cc |
| index 3ffab61ca33da84bbe185c923dcfd17459a8cc07..89362d96203ead634bdb7d1369fc4fdf0afc457c 100644 |
| --- a/components/arc/net/arc_net_host_impl.cc |
| +++ b/components/arc/net/arc_net_host_impl.cc |
| @@ -29,10 +29,6 @@ namespace { |
| const int kGetNetworksListLimit = 100; |
| -} // namespace |
| - |
| -namespace arc { |
| - |
| chromeos::NetworkStateHandler* GetStateHandler() { |
| return chromeos::NetworkHandler::Get()->network_state_handler(); |
| } |
| @@ -53,6 +49,176 @@ bool IsDeviceOwner() { |
| chromeos::LoginState::LOGGED_IN_USER_OWNER; |
| } |
| +std::string GetStringFromOncDictionary(const base::DictionaryValue* dict, |
| + const char* key, |
| + bool required) { |
| + std::string tmp; |
|
Luis Héctor Chávez
2016/05/18 21:41:57
nit: value?
Kevin Cernekee
2016/05/18 21:55:19
Done.
|
| + dict->GetString(key, &tmp); |
| + if (required && tmp.empty()) |
| + NOTREACHED(); |
| + return tmp; |
| +} |
| + |
| +arc::mojom::SecurityType TranslateONCWifiSecurityType( |
| + const base::DictionaryValue* dict) { |
| + std::string tmp = GetStringFromOncDictionary(dict, onc::wifi::kSecurity, |
|
Luis Héctor Chávez
2016/05/18 21:41:57
nit: type?
Kevin Cernekee
2016/05/18 21:55:18
Done.
|
| + true /* required */); |
| + if (tmp == onc::wifi::kWEP_PSK) |
| + return arc::mojom::SecurityType::WEP_PSK; |
| + else if (tmp == onc::wifi::kWEP_8021X) |
| + return arc::mojom::SecurityType::WEP_8021X; |
| + else if (tmp == onc::wifi::kWPA_PSK) |
| + return arc::mojom::SecurityType::WPA_PSK; |
| + else if (tmp == onc::wifi::kWPA_EAP) |
| + return arc::mojom::SecurityType::WPA_EAP; |
| + else |
| + return arc::mojom::SecurityType::NONE; |
| +} |
| + |
| +arc::mojom::WiFiPtr TranslateONCWifi(const base::DictionaryValue* dict) { |
| + arc::mojom::WiFiPtr mojo = arc::mojom::WiFi::New(); |
|
Luis Héctor Chávez
2016/05/18 21:41:57
nit: wifi?
Kevin Cernekee
2016/05/18 21:55:19
Done.
|
| + |
| + // Optional; defaults to 0. |
| + dict->GetInteger(onc::wifi::kFrequency, &mojo->frequency); |
| + |
| + mojo->bssid = |
| + GetStringFromOncDictionary(dict, onc::wifi::kBSSID, false /* required */); |
| + mojo->hex_ssid = GetStringFromOncDictionary(dict, onc::wifi::kHexSSID, |
| + true /* required */); |
| + |
| + // Optional; defaults to false. |
| + dict->GetBoolean(onc::wifi::kHiddenSSID, &mojo->hidden_ssid); |
| + |
| + mojo->security = TranslateONCWifiSecurityType(dict); |
| + |
| + // Optional; defaults to 0. |
| + dict->GetInteger(onc::wifi::kSignalStrength, &mojo->signal_strength); |
| + |
| + return mojo; |
| +} |
| + |
| +mojo::Array<mojo::String> TranslateStringArray(const base::ListValue* list) { |
| + mojo::Array<mojo::String> mojos = mojo::Array<mojo::String>::New(0); |
|
Luis Héctor Chávez
2016/05/18 21:41:57
nit: strings?
Kevin Cernekee
2016/05/18 21:55:18
Done.
|
| + |
| + for (size_t i = 0; i < list->GetSize(); i++) { |
| + std::string tmp; |
| + list->GetString(i, &tmp); |
| + DCHECK(!tmp.empty()); |
| + mojos.push_back(static_cast<mojo::String>(tmp)); |
| + } |
| + |
| + return mojos; |
| +} |
| + |
| +mojo::Array<arc::mojom::IPConfigurationPtr> TranslateONCIPConfigs( |
| + const base::ListValue* list) { |
| + mojo::Array<arc::mojom::IPConfigurationPtr> mojos = |
|
Luis Héctor Chávez
2016/05/18 21:41:57
nit: configs?
Kevin Cernekee
2016/05/18 21:55:18
Done.
|
| + mojo::Array<arc::mojom::IPConfigurationPtr>::New(0); |
| + |
| + for (size_t i = 0; i < list->GetSize(); i++) { |
| + const base::DictionaryValue* ip_dict = nullptr; |
| + arc::mojom::IPConfigurationPtr mojo = arc::mojom::IPConfiguration::New(); |
|
Luis Héctor Chávez
2016/05/18 21:41:57
nit: configuration?
Kevin Cernekee
2016/05/18 21:55:19
Done.
|
| + |
| + list->GetDictionary(i, &ip_dict); |
| + DCHECK(ip_dict); |
| + |
| + mojo->gateway = GetStringFromOncDictionary(ip_dict, onc::ipconfig::kGateway, |
| + true /* required */); |
| + mojo->ip_address = GetStringFromOncDictionary( |
| + ip_dict, onc::ipconfig::kIPAddress, true /* required */); |
| + |
| + const base::ListValue* dns_list; |
| + if (!ip_dict->GetList(onc::ipconfig::kNameServers, &dns_list)) |
| + NOTREACHED(); |
| + mojo->name_servers = TranslateStringArray(dns_list); |
| + |
| + if (!ip_dict->GetInteger(onc::ipconfig::kRoutingPrefix, |
| + &mojo->routing_prefix)) { |
| + NOTREACHED(); |
| + } |
| + |
| + std::string tmp = GetStringFromOncDictionary(ip_dict, onc::ipconfig::kType, |
| + true /* required */); |
| + mojo->type = tmp == onc::ipconfig::kIPv6 ? arc::mojom::IPAddressType::IPV6 |
| + : arc::mojom::IPAddressType::IPV4; |
| + |
| + mojo->web_proxy_auto_discovery_url = GetStringFromOncDictionary( |
| + ip_dict, onc::ipconfig::kWebProxyAutoDiscoveryUrl, true /* required */); |
| + |
| + mojos.push_back(std::move(mojo)); |
| + } |
| + return mojos; |
| +} |
| + |
| +arc::mojom::ConnectionStateType TranslateONCConnectionState( |
| + const base::DictionaryValue* dict) { |
| + std::string tmp = GetStringFromOncDictionary( |
|
Luis Héctor Chávez
2016/05/18 21:41:57
nit: connection_state?
Kevin Cernekee
2016/05/18 21:55:19
Done.
|
| + dict, onc::network_config::kConnectionState, true /* required */); |
| + |
| + if (tmp == onc::connection_state::kConnected) |
| + return arc::mojom::ConnectionStateType::CONNECTED; |
| + else if (tmp == onc::connection_state::kConnecting) |
| + return arc::mojom::ConnectionStateType::CONNECTING; |
| + else if (tmp == onc::connection_state::kNotConnected) |
| + return arc::mojom::ConnectionStateType::NOT_CONNECTED; |
| + |
| + NOTREACHED(); |
| + return arc::mojom::ConnectionStateType::NOT_CONNECTED; |
| +} |
| + |
| +void TranslateONCNetworkTypeDetails(const base::DictionaryValue* dict, |
| + arc::mojom::NetworkConfiguration* mojo) { |
| + std::string tmp = GetStringFromOncDictionary(dict, onc::network_config::kType, |
|
Luis Héctor Chávez
2016/05/18 21:41:57
nit: type?
Kevin Cernekee
2016/05/18 21:55:19
Done.
|
| + true /* required */); |
| + if (tmp == onc::network_type::kCellular) { |
| + mojo->type = arc::mojom::NetworkType::CELLULAR; |
| + } else if (tmp == onc::network_type::kEthernet) { |
| + mojo->type = arc::mojom::NetworkType::ETHERNET; |
| + } else if (tmp == onc::network_type::kVPN) { |
| + mojo->type = arc::mojom::NetworkType::VPN; |
| + } else if (tmp == onc::network_type::kWiFi) { |
| + mojo->type = arc::mojom::NetworkType::WIFI; |
| + |
| + const base::DictionaryValue* wifi_dict = nullptr; |
| + dict->GetDictionary(onc::network_config::kWiFi, &wifi_dict); |
| + DCHECK(wifi_dict); |
| + mojo->wifi = TranslateONCWifi(wifi_dict); |
| + } else if (tmp == onc::network_type::kWimax) { |
| + mojo->type = arc::mojom::NetworkType::WIMAX; |
| + } else { |
| + NOTREACHED(); |
| + } |
| +} |
| + |
| +arc::mojom::NetworkConfigurationPtr TranslateONCConfiguration( |
| + const base::DictionaryValue* dict) { |
| + arc::mojom::NetworkConfigurationPtr mojo = |
| + arc::mojom::NetworkConfiguration::New(); |
| + |
| + mojo->connection_state = TranslateONCConnectionState(dict); |
| + |
| + mojo->guid = GetStringFromOncDictionary(dict, onc::network_config::kGUID, |
| + true /* required */); |
| + |
| + const base::ListValue* ip_config_list = nullptr; |
| + if (dict->GetList(onc::network_config::kIPConfigs, &ip_config_list)) { |
| + DCHECK(ip_config_list); |
| + mojo->ip_configs = TranslateONCIPConfigs(ip_config_list); |
| + } |
| + |
| + mojo->guid = GetStringFromOncDictionary(dict, onc::network_config::kGUID, |
| + true /* required */); |
| + mojo->mac_address = GetStringFromOncDictionary( |
| + dict, onc::network_config::kMacAddress, true /* required */); |
| + TranslateONCNetworkTypeDetails(dict, mojo.get()); |
| + |
| + return mojo; |
| +} |
| + |
| +} // namespace |
| + |
| +namespace arc { |
| + |
| ArcNetHostImpl::ArcNetHostImpl(ArcBridgeService* bridge_service) |
| : ArcService(bridge_service), binding_(this) { |
| arc_bridge_service()->AddObserver(this); |
| @@ -370,6 +536,79 @@ void ArcNetHostImpl::ScanCompleted(const chromeos::DeviceState* /*unused*/) { |
| arc_bridge_service()->net_instance()->ScanCompleted(); |
| } |
| +void GetDefaultNetworkSuccessCallback( |
| + const ArcNetHostImpl::GetDefaultNetworkCallback& callback, |
| + const std::string& service_path, |
| + const base::DictionaryValue& dictionary) { |
| + // TODO(cernekee): Figure out how to query Chrome for the default physical |
| + // service if a VPN is connected, rather than just reporting the |
| + // default logical service in both fields. |
| + callback.Run(TranslateONCConfiguration(&dictionary), |
| + TranslateONCConfiguration(&dictionary)); |
| +} |
| + |
| +void GetDefaultNetworkFailureCallback( |
| + const ArcNetHostImpl::GetDefaultNetworkCallback& callback, |
| + const std::string& error_name, |
| + std::unique_ptr<base::DictionaryValue> error_data) { |
| + LOG(ERROR) << "Failed to query default logical network"; |
| + callback.Run(nullptr, nullptr); |
| +} |
| + |
| +void ArcNetHostImpl::GetDefaultNetwork( |
| + const GetDefaultNetworkCallback& callback) { |
| + const chromeos::NetworkState* default_network = |
| + GetStateHandler()->DefaultNetwork(); |
| + if (!default_network) { |
| + VLOG(1) << "GetDefaultNetwork: no default network"; |
| + callback.Run(nullptr, nullptr); |
| + return; |
| + } |
| + VLOG(1) << "GetDefaultNetwork: default network is " |
| + << default_network->path(); |
| + std::string user_id_hash = chromeos::LoginState::Get()->primary_user_hash(); |
| + GetManagedConfigurationHandler()->GetProperties( |
| + user_id_hash, default_network->path(), |
| + base::Bind(&GetDefaultNetworkSuccessCallback, callback), |
| + base::Bind(&GetDefaultNetworkFailureCallback, callback)); |
| +} |
| + |
| +void DefaultNetworkSuccessCallback(ArcNetHostImpl* instance, |
| + const std::string& service_path, |
| + const base::DictionaryValue& dictionary) { |
| + instance->arc_bridge_service()->net_instance()->DefaultNetworkChanged( |
| + TranslateONCConfiguration(&dictionary), |
| + TranslateONCConfiguration(&dictionary)); |
| +} |
| + |
| +void DefaultNetworkFailureCallback( |
| + const std::string& error_name, |
| + std::unique_ptr<base::DictionaryValue> error_data) { |
| + LOG(ERROR) << "Failed to query default logical network"; |
| +} |
| + |
| +void ArcNetHostImpl::DefaultNetworkChanged( |
| + const chromeos::NetworkState* network) { |
| + if (arc_bridge_service()->net_version() < 2) { |
| + VLOG(1) << "ArcBridgeService does not support DefaultNetworkChanged."; |
| + return; |
| + } |
| + |
| + if (!network) { |
| + VLOG(1) << "No default network"; |
| + arc_bridge_service()->net_instance()->DefaultNetworkChanged(nullptr, |
| + nullptr); |
| + return; |
| + } |
| + |
| + VLOG(1) << "New default network: " << network->path(); |
| + std::string user_id_hash = chromeos::LoginState::Get()->primary_user_hash(); |
| + GetManagedConfigurationHandler()->GetProperties( |
| + user_id_hash, network->path(), |
| + base::Bind(&DefaultNetworkSuccessCallback, base::Unretained(this)), |
| + base::Bind(&DefaultNetworkFailureCallback)); |
| +} |
| + |
| void ArcNetHostImpl::OnShuttingDown() { |
| GetStateHandler()->RemoveObserver(this, FROM_HERE); |
| } |