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

Unified Diff: components/arc/net/arc_net_host_impl.cc

Issue 1925083003: Notify ARC of default network changes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@wifi-change
Patch Set: forward-declare base::DictionaryValue Created 4 years, 7 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
« no previous file with comments | « components/arc/net/arc_net_host_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « components/arc/net/arc_net_host_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698