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..e2472b696af1075808bcf3e7a7372e7e09eeec9b 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,8 +49,260 @@ bool IsDeviceOwner() { |
chromeos::LoginState::LOGGED_IN_USER_OWNER; |
} |
+std::string GetStringFromOncDictionary(const base::DictionaryValue* dict, |
+ const char* key, |
+ bool required) { |
+ std::string value; |
+ dict->GetString(key, &value); |
+ if (required && value.empty()) |
+ NOTREACHED(); |
+ return value; |
+} |
+ |
+arc::mojom::SecurityType TranslateONCWifiSecurityType( |
+ const base::DictionaryValue* dict) { |
+ std::string type = GetStringFromOncDictionary(dict, onc::wifi::kSecurity, |
+ true /* required */); |
+ if (type == onc::wifi::kWEP_PSK) |
+ return arc::mojom::SecurityType::WEP_PSK; |
+ else if (type == onc::wifi::kWEP_8021X) |
+ return arc::mojom::SecurityType::WEP_8021X; |
+ else if (type == onc::wifi::kWPA_PSK) |
+ return arc::mojom::SecurityType::WPA_PSK; |
+ else if (type == 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 wifi = arc::mojom::WiFi::New(); |
+ |
+ // Optional; defaults to 0. |
+ dict->GetInteger(onc::wifi::kFrequency, &wifi->frequency); |
+ |
+ wifi->bssid = |
+ GetStringFromOncDictionary(dict, onc::wifi::kBSSID, false /* required */); |
+ wifi->hex_ssid = GetStringFromOncDictionary(dict, onc::wifi::kHexSSID, |
+ true /* required */); |
+ |
+ // Optional; defaults to false. |
+ dict->GetBoolean(onc::wifi::kHiddenSSID, &wifi->hidden_ssid); |
+ |
+ wifi->security = TranslateONCWifiSecurityType(dict); |
+ |
+ // Optional; defaults to 0. |
+ dict->GetInteger(onc::wifi::kSignalStrength, &wifi->signal_strength); |
+ |
+ return wifi; |
+} |
+ |
+mojo::Array<mojo::String> TranslateStringArray(const base::ListValue* list) { |
+ mojo::Array<mojo::String> strings = mojo::Array<mojo::String>::New(0); |
+ |
+ for (size_t i = 0; i < list->GetSize(); i++) { |
+ std::string value; |
+ list->GetString(i, &value); |
+ DCHECK(!value.empty()); |
+ strings.push_back(static_cast<mojo::String>(value)); |
+ } |
+ |
+ return strings; |
+} |
+ |
+mojo::Array<arc::mojom::IPConfigurationPtr> TranslateONCIPConfigs( |
+ const base::ListValue* list) { |
+ mojo::Array<arc::mojom::IPConfigurationPtr> configs = |
+ 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 configuration = |
+ arc::mojom::IPConfiguration::New(); |
+ |
+ list->GetDictionary(i, &ip_dict); |
+ DCHECK(ip_dict); |
+ |
+ configuration->gateway = GetStringFromOncDictionary( |
+ ip_dict, onc::ipconfig::kGateway, true /* required */); |
+ configuration->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(); |
+ configuration->name_servers = TranslateStringArray(dns_list); |
+ |
+ if (!ip_dict->GetInteger(onc::ipconfig::kRoutingPrefix, |
+ &configuration->routing_prefix)) { |
+ NOTREACHED(); |
+ } |
+ |
+ std::string type = GetStringFromOncDictionary(ip_dict, onc::ipconfig::kType, |
+ true /* required */); |
+ configuration->type = type == onc::ipconfig::kIPv6 |
+ ? arc::mojom::IPAddressType::IPV6 |
+ : arc::mojom::IPAddressType::IPV4; |
+ |
+ configuration->web_proxy_auto_discovery_url = GetStringFromOncDictionary( |
+ ip_dict, onc::ipconfig::kWebProxyAutoDiscoveryUrl, true /* required */); |
+ |
+ configs.push_back(std::move(configuration)); |
+ } |
+ return configs; |
+} |
+ |
+arc::mojom::ConnectionStateType TranslateONCConnectionState( |
+ const base::DictionaryValue* dict) { |
+ std::string connection_state = GetStringFromOncDictionary( |
+ dict, onc::network_config::kConnectionState, true /* required */); |
+ |
+ if (connection_state == onc::connection_state::kConnected) |
+ return arc::mojom::ConnectionStateType::CONNECTED; |
+ else if (connection_state == onc::connection_state::kConnecting) |
+ return arc::mojom::ConnectionStateType::CONNECTING; |
+ else if (connection_state == 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 type = GetStringFromOncDictionary( |
+ dict, onc::network_config::kType, true /* required */); |
+ if (type == onc::network_type::kCellular) { |
+ mojo->type = arc::mojom::NetworkType::CELLULAR; |
+ } else if (type == onc::network_type::kEthernet) { |
+ mojo->type = arc::mojom::NetworkType::ETHERNET; |
+ } else if (type == onc::network_type::kVPN) { |
+ mojo->type = arc::mojom::NetworkType::VPN; |
+ } else if (type == 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 (type == 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; |
+} |
+ |
+void CreateNetworkSuccessCallback( |
+ const arc::mojom::NetHost::CreateNetworkCallback& mojo_callback, |
+ const std::string& service_path, |
+ const std::string& guid) { |
+ VLOG(1) << "CreateNetworkSuccessCallback"; |
+ mojo_callback.Run(guid); |
+} |
+ |
+void CreateNetworkFailureCallback( |
+ const arc::mojom::NetHost::CreateNetworkCallback& mojo_callback, |
+ const std::string& error_name, |
+ std::unique_ptr<base::DictionaryValue> error_data) { |
+ VLOG(1) << "CreateNetworkFailureCallback: " << error_name; |
+ mojo_callback.Run(""); |
+} |
+ |
+void ForgetNetworkSuccessCallback( |
+ const arc::mojom::NetHost::ForgetNetworkCallback& mojo_callback) { |
+ mojo_callback.Run(arc::mojom::NetworkResult::SUCCESS); |
+} |
+ |
+void ForgetNetworkFailureCallback( |
+ const arc::mojom::NetHost::ForgetNetworkCallback& mojo_callback, |
+ const std::string& error_name, |
+ std::unique_ptr<base::DictionaryValue> error_data) { |
+ VLOG(1) << "ForgetNetworkFailureCallback: " << error_name; |
+ mojo_callback.Run(arc::mojom::NetworkResult::FAILURE); |
+} |
+ |
+void StartConnectSuccessCallback( |
+ const arc::mojom::NetHost::StartConnectCallback& mojo_callback) { |
+ mojo_callback.Run(arc::mojom::NetworkResult::SUCCESS); |
+} |
+ |
+void StartConnectFailureCallback( |
+ const arc::mojom::NetHost::StartConnectCallback& mojo_callback, |
+ const std::string& error_name, |
+ std::unique_ptr<base::DictionaryValue> error_data) { |
+ VLOG(1) << "StartConnectFailureCallback: " << error_name; |
+ mojo_callback.Run(arc::mojom::NetworkResult::FAILURE); |
+} |
+ |
+void StartDisconnectSuccessCallback( |
+ const arc::mojom::NetHost::StartDisconnectCallback& mojo_callback) { |
+ mojo_callback.Run(arc::mojom::NetworkResult::SUCCESS); |
+} |
+ |
+void StartDisconnectFailureCallback( |
+ const arc::mojom::NetHost::StartDisconnectCallback& mojo_callback, |
+ const std::string& error_name, |
+ std::unique_ptr<base::DictionaryValue> error_data) { |
+ VLOG(1) << "StartDisconnectFailureCallback: " << error_name; |
+ mojo_callback.Run(arc::mojom::NetworkResult::FAILURE); |
+} |
+ |
+void GetDefaultNetworkSuccessCallback( |
+ const arc::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 arc::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 DefaultNetworkFailureCallback( |
+ const std::string& error_name, |
+ std::unique_ptr<base::DictionaryValue> error_data) { |
+ LOG(ERROR) << "Failed to query default logical network"; |
+} |
+ |
+} // namespace |
+ |
+namespace arc { |
+ |
ArcNetHostImpl::ArcNetHostImpl(ArcBridgeService* bridge_service) |
- : ArcService(bridge_service), binding_(this) { |
+ : ArcService(bridge_service), binding_(this), weak_factory_(this) { |
arc_bridge_service()->AddObserver(this); |
GetStateHandler()->AddObserver(this, FROM_HERE); |
} |
@@ -173,22 +421,6 @@ void ArcNetHostImpl::GetNetworks(mojom::GetNetworksRequestType type, |
callback.Run(std::move(data)); |
} |
-void CreateNetworkSuccessCallback( |
- const arc::mojom::NetHost::CreateNetworkCallback& mojo_callback, |
- const std::string& service_path, |
- const std::string& guid) { |
- VLOG(1) << "CreateNetworkSuccessCallback"; |
- mojo_callback.Run(guid); |
-} |
- |
-void CreateNetworkFailureCallback( |
- const arc::mojom::NetHost::CreateNetworkCallback& mojo_callback, |
- const std::string& error_name, |
- std::unique_ptr<base::DictionaryValue> error_data) { |
- VLOG(1) << "CreateNetworkFailureCallback: " << error_name; |
- mojo_callback.Run(""); |
-} |
- |
void ArcNetHostImpl::CreateNetwork(mojom::WifiConfigurationPtr cfg, |
const CreateNetworkCallback& callback) { |
if (!IsDeviceOwner()) { |
@@ -236,19 +468,6 @@ void ArcNetHostImpl::CreateNetwork(mojom::WifiConfigurationPtr cfg, |
base::Bind(&CreateNetworkFailureCallback, callback)); |
} |
-void ForgetNetworkSuccessCallback( |
- const arc::mojom::NetHost::ForgetNetworkCallback& mojo_callback) { |
- mojo_callback.Run(mojom::NetworkResult::SUCCESS); |
-} |
- |
-void ForgetNetworkFailureCallback( |
- const arc::mojom::NetHost::ForgetNetworkCallback& mojo_callback, |
- const std::string& error_name, |
- std::unique_ptr<base::DictionaryValue> error_data) { |
- VLOG(1) << "ForgetNetworkFailureCallback: " << error_name; |
- mojo_callback.Run(mojom::NetworkResult::FAILURE); |
-} |
- |
void ArcNetHostImpl::ForgetNetwork(const mojo::String& guid, |
const ForgetNetworkCallback& callback) { |
if (!IsDeviceOwner()) { |
@@ -269,19 +488,6 @@ void ArcNetHostImpl::ForgetNetwork(const mojo::String& guid, |
base::Bind(&ForgetNetworkFailureCallback, callback)); |
} |
-void StartConnectSuccessCallback( |
- const arc::mojom::NetHost::StartConnectCallback& mojo_callback) { |
- mojo_callback.Run(mojom::NetworkResult::SUCCESS); |
-} |
- |
-void StartConnectFailureCallback( |
- const arc::mojom::NetHost::StartConnectCallback& mojo_callback, |
- const std::string& error_name, |
- std::unique_ptr<base::DictionaryValue> error_data) { |
- VLOG(1) << "StartConnectFailureCallback: " << error_name; |
- mojo_callback.Run(mojom::NetworkResult::FAILURE); |
-} |
- |
void ArcNetHostImpl::StartConnect(const mojo::String& guid, |
const StartConnectCallback& callback) { |
const chromeos::NetworkState* network = |
@@ -297,19 +503,6 @@ void ArcNetHostImpl::StartConnect(const mojo::String& guid, |
base::Bind(&StartConnectFailureCallback, callback), false); |
} |
-void StartDisconnectSuccessCallback( |
- const arc::mojom::NetHost::StartDisconnectCallback& mojo_callback) { |
- mojo_callback.Run(mojom::NetworkResult::SUCCESS); |
-} |
- |
-void StartDisconnectFailureCallback( |
- const arc::mojom::NetHost::StartDisconnectCallback& mojo_callback, |
- const std::string& error_name, |
- std::unique_ptr<base::DictionaryValue> error_data) { |
- VLOG(1) << "StartDisconnectFailureCallback: " << error_name; |
- mojo_callback.Run(mojom::NetworkResult::FAILURE); |
-} |
- |
void ArcNetHostImpl::StartDisconnect(const mojo::String& guid, |
const StartDisconnectCallback& callback) { |
const chromeos::NetworkState* network = |
@@ -370,6 +563,55 @@ void ArcNetHostImpl::ScanCompleted(const chromeos::DeviceState* /*unused*/) { |
arc_bridge_service()->net_instance()->ScanCompleted(); |
} |
+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 ArcNetHostImpl::DefaultNetworkSuccessCallback( |
+ const std::string& service_path, |
+ const base::DictionaryValue& dictionary) { |
+ arc_bridge_service()->net_instance()->DefaultNetworkChanged( |
+ TranslateONCConfiguration(&dictionary), |
+ TranslateONCConfiguration(&dictionary)); |
+} |
+ |
+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(&arc::ArcNetHostImpl::DefaultNetworkSuccessCallback, |
+ weak_factory_.GetWeakPtr()), |
+ base::Bind(&DefaultNetworkFailureCallback)); |
+} |
+ |
void ArcNetHostImpl::OnShuttingDown() { |
GetStateHandler()->RemoveObserver(this, FROM_HERE); |
} |