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

Side by Side 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: move helpers to anonymous namespace 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 unified diff | Download patch
« no previous file with comments | « components/arc/net/arc_net_host_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/arc/net/arc_net_host_impl.h" 5 #include "components/arc/net/arc_net_host_impl.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 11 matching lines...) Expand all
22 #include "chromeos/network/network_state_handler.h" 22 #include "chromeos/network/network_state_handler.h"
23 #include "chromeos/network/network_type_pattern.h" 23 #include "chromeos/network/network_type_pattern.h"
24 #include "chromeos/network/network_util.h" 24 #include "chromeos/network/network_util.h"
25 #include "chromeos/network/onc/onc_utils.h" 25 #include "chromeos/network/onc/onc_utils.h"
26 #include "components/arc/arc_bridge_service.h" 26 #include "components/arc/arc_bridge_service.h"
27 27
28 namespace { 28 namespace {
29 29
30 const int kGetNetworksListLimit = 100; 30 const int kGetNetworksListLimit = 100;
31 31
32 } // namespace
33
34 namespace arc {
35
36 chromeos::NetworkStateHandler* GetStateHandler() { 32 chromeos::NetworkStateHandler* GetStateHandler() {
37 return chromeos::NetworkHandler::Get()->network_state_handler(); 33 return chromeos::NetworkHandler::Get()->network_state_handler();
38 } 34 }
39 35
40 chromeos::ManagedNetworkConfigurationHandler* GetManagedConfigurationHandler() { 36 chromeos::ManagedNetworkConfigurationHandler* GetManagedConfigurationHandler() {
41 return chromeos::NetworkHandler::Get() 37 return chromeos::NetworkHandler::Get()
42 ->managed_network_configuration_handler(); 38 ->managed_network_configuration_handler();
43 } 39 }
44 40
45 chromeos::NetworkConnectionHandler* GetNetworkConnectionHandler() { 41 chromeos::NetworkConnectionHandler* GetNetworkConnectionHandler() {
46 return chromeos::NetworkHandler::Get()->network_connection_handler(); 42 return chromeos::NetworkHandler::Get()->network_connection_handler();
47 } 43 }
48 44
49 bool IsDeviceOwner() { 45 bool IsDeviceOwner() {
50 // Check whether the logged-in Chrome OS user is allowed to add or 46 // Check whether the logged-in Chrome OS user is allowed to add or
51 // remove WiFi networks. 47 // remove WiFi networks.
52 return chromeos::LoginState::Get()->GetLoggedInUserType() == 48 return chromeos::LoginState::Get()->GetLoggedInUserType() ==
53 chromeos::LoginState::LOGGED_IN_USER_OWNER; 49 chromeos::LoginState::LOGGED_IN_USER_OWNER;
54 } 50 }
55 51
52 std::string GetStringFromOncDictionary(const base::DictionaryValue* dict,
53 const char* key,
54 bool required) {
55 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.
56 dict->GetString(key, &tmp);
57 if (required && tmp.empty())
58 NOTREACHED();
59 return tmp;
60 }
61
62 arc::mojom::SecurityType TranslateONCWifiSecurityType(
63 const base::DictionaryValue* dict) {
64 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.
65 true /* required */);
66 if (tmp == onc::wifi::kWEP_PSK)
67 return arc::mojom::SecurityType::WEP_PSK;
68 else if (tmp == onc::wifi::kWEP_8021X)
69 return arc::mojom::SecurityType::WEP_8021X;
70 else if (tmp == onc::wifi::kWPA_PSK)
71 return arc::mojom::SecurityType::WPA_PSK;
72 else if (tmp == onc::wifi::kWPA_EAP)
73 return arc::mojom::SecurityType::WPA_EAP;
74 else
75 return arc::mojom::SecurityType::NONE;
76 }
77
78 arc::mojom::WiFiPtr TranslateONCWifi(const base::DictionaryValue* dict) {
79 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.
80
81 // Optional; defaults to 0.
82 dict->GetInteger(onc::wifi::kFrequency, &mojo->frequency);
83
84 mojo->bssid =
85 GetStringFromOncDictionary(dict, onc::wifi::kBSSID, false /* required */);
86 mojo->hex_ssid = GetStringFromOncDictionary(dict, onc::wifi::kHexSSID,
87 true /* required */);
88
89 // Optional; defaults to false.
90 dict->GetBoolean(onc::wifi::kHiddenSSID, &mojo->hidden_ssid);
91
92 mojo->security = TranslateONCWifiSecurityType(dict);
93
94 // Optional; defaults to 0.
95 dict->GetInteger(onc::wifi::kSignalStrength, &mojo->signal_strength);
96
97 return mojo;
98 }
99
100 mojo::Array<mojo::String> TranslateStringArray(const base::ListValue* list) {
101 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.
102
103 for (size_t i = 0; i < list->GetSize(); i++) {
104 std::string tmp;
105 list->GetString(i, &tmp);
106 DCHECK(!tmp.empty());
107 mojos.push_back(static_cast<mojo::String>(tmp));
108 }
109
110 return mojos;
111 }
112
113 mojo::Array<arc::mojom::IPConfigurationPtr> TranslateONCIPConfigs(
114 const base::ListValue* list) {
115 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.
116 mojo::Array<arc::mojom::IPConfigurationPtr>::New(0);
117
118 for (size_t i = 0; i < list->GetSize(); i++) {
119 const base::DictionaryValue* ip_dict = nullptr;
120 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.
121
122 list->GetDictionary(i, &ip_dict);
123 DCHECK(ip_dict);
124
125 mojo->gateway = GetStringFromOncDictionary(ip_dict, onc::ipconfig::kGateway,
126 true /* required */);
127 mojo->ip_address = GetStringFromOncDictionary(
128 ip_dict, onc::ipconfig::kIPAddress, true /* required */);
129
130 const base::ListValue* dns_list;
131 if (!ip_dict->GetList(onc::ipconfig::kNameServers, &dns_list))
132 NOTREACHED();
133 mojo->name_servers = TranslateStringArray(dns_list);
134
135 if (!ip_dict->GetInteger(onc::ipconfig::kRoutingPrefix,
136 &mojo->routing_prefix)) {
137 NOTREACHED();
138 }
139
140 std::string tmp = GetStringFromOncDictionary(ip_dict, onc::ipconfig::kType,
141 true /* required */);
142 mojo->type = tmp == onc::ipconfig::kIPv6 ? arc::mojom::IPAddressType::IPV6
143 : arc::mojom::IPAddressType::IPV4;
144
145 mojo->web_proxy_auto_discovery_url = GetStringFromOncDictionary(
146 ip_dict, onc::ipconfig::kWebProxyAutoDiscoveryUrl, true /* required */);
147
148 mojos.push_back(std::move(mojo));
149 }
150 return mojos;
151 }
152
153 arc::mojom::ConnectionStateType TranslateONCConnectionState(
154 const base::DictionaryValue* dict) {
155 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.
156 dict, onc::network_config::kConnectionState, true /* required */);
157
158 if (tmp == onc::connection_state::kConnected)
159 return arc::mojom::ConnectionStateType::CONNECTED;
160 else if (tmp == onc::connection_state::kConnecting)
161 return arc::mojom::ConnectionStateType::CONNECTING;
162 else if (tmp == onc::connection_state::kNotConnected)
163 return arc::mojom::ConnectionStateType::NOT_CONNECTED;
164
165 NOTREACHED();
166 return arc::mojom::ConnectionStateType::NOT_CONNECTED;
167 }
168
169 void TranslateONCNetworkTypeDetails(const base::DictionaryValue* dict,
170 arc::mojom::NetworkConfiguration* mojo) {
171 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.
172 true /* required */);
173 if (tmp == onc::network_type::kCellular) {
174 mojo->type = arc::mojom::NetworkType::CELLULAR;
175 } else if (tmp == onc::network_type::kEthernet) {
176 mojo->type = arc::mojom::NetworkType::ETHERNET;
177 } else if (tmp == onc::network_type::kVPN) {
178 mojo->type = arc::mojom::NetworkType::VPN;
179 } else if (tmp == onc::network_type::kWiFi) {
180 mojo->type = arc::mojom::NetworkType::WIFI;
181
182 const base::DictionaryValue* wifi_dict = nullptr;
183 dict->GetDictionary(onc::network_config::kWiFi, &wifi_dict);
184 DCHECK(wifi_dict);
185 mojo->wifi = TranslateONCWifi(wifi_dict);
186 } else if (tmp == onc::network_type::kWimax) {
187 mojo->type = arc::mojom::NetworkType::WIMAX;
188 } else {
189 NOTREACHED();
190 }
191 }
192
193 arc::mojom::NetworkConfigurationPtr TranslateONCConfiguration(
194 const base::DictionaryValue* dict) {
195 arc::mojom::NetworkConfigurationPtr mojo =
196 arc::mojom::NetworkConfiguration::New();
197
198 mojo->connection_state = TranslateONCConnectionState(dict);
199
200 mojo->guid = GetStringFromOncDictionary(dict, onc::network_config::kGUID,
201 true /* required */);
202
203 const base::ListValue* ip_config_list = nullptr;
204 if (dict->GetList(onc::network_config::kIPConfigs, &ip_config_list)) {
205 DCHECK(ip_config_list);
206 mojo->ip_configs = TranslateONCIPConfigs(ip_config_list);
207 }
208
209 mojo->guid = GetStringFromOncDictionary(dict, onc::network_config::kGUID,
210 true /* required */);
211 mojo->mac_address = GetStringFromOncDictionary(
212 dict, onc::network_config::kMacAddress, true /* required */);
213 TranslateONCNetworkTypeDetails(dict, mojo.get());
214
215 return mojo;
216 }
217
218 } // namespace
219
220 namespace arc {
221
56 ArcNetHostImpl::ArcNetHostImpl(ArcBridgeService* bridge_service) 222 ArcNetHostImpl::ArcNetHostImpl(ArcBridgeService* bridge_service)
57 : ArcService(bridge_service), binding_(this) { 223 : ArcService(bridge_service), binding_(this) {
58 arc_bridge_service()->AddObserver(this); 224 arc_bridge_service()->AddObserver(this);
59 GetStateHandler()->AddObserver(this, FROM_HERE); 225 GetStateHandler()->AddObserver(this, FROM_HERE);
60 } 226 }
61 227
62 ArcNetHostImpl::~ArcNetHostImpl() { 228 ArcNetHostImpl::~ArcNetHostImpl() {
63 DCHECK(thread_checker_.CalledOnValidThread()); 229 DCHECK(thread_checker_.CalledOnValidThread());
64 arc_bridge_service()->RemoveObserver(this); 230 arc_bridge_service()->RemoveObserver(this);
65 if (chromeos::NetworkHandler::IsInitialized()) { 231 if (chromeos::NetworkHandler::IsInitialized()) {
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 return; 529 return;
364 } 530 }
365 if (arc_bridge_service()->net_version() < 1) { 531 if (arc_bridge_service()->net_version() < 1) {
366 VLOG(1) << "NetInstance does not support ScanCompleted."; 532 VLOG(1) << "NetInstance does not support ScanCompleted.";
367 return; 533 return;
368 } 534 }
369 535
370 arc_bridge_service()->net_instance()->ScanCompleted(); 536 arc_bridge_service()->net_instance()->ScanCompleted();
371 } 537 }
372 538
539 void GetDefaultNetworkSuccessCallback(
540 const ArcNetHostImpl::GetDefaultNetworkCallback& callback,
541 const std::string& service_path,
542 const base::DictionaryValue& dictionary) {
543 // TODO(cernekee): Figure out how to query Chrome for the default physical
544 // service if a VPN is connected, rather than just reporting the
545 // default logical service in both fields.
546 callback.Run(TranslateONCConfiguration(&dictionary),
547 TranslateONCConfiguration(&dictionary));
548 }
549
550 void GetDefaultNetworkFailureCallback(
551 const ArcNetHostImpl::GetDefaultNetworkCallback& callback,
552 const std::string& error_name,
553 std::unique_ptr<base::DictionaryValue> error_data) {
554 LOG(ERROR) << "Failed to query default logical network";
555 callback.Run(nullptr, nullptr);
556 }
557
558 void ArcNetHostImpl::GetDefaultNetwork(
559 const GetDefaultNetworkCallback& callback) {
560 const chromeos::NetworkState* default_network =
561 GetStateHandler()->DefaultNetwork();
562 if (!default_network) {
563 VLOG(1) << "GetDefaultNetwork: no default network";
564 callback.Run(nullptr, nullptr);
565 return;
566 }
567 VLOG(1) << "GetDefaultNetwork: default network is "
568 << default_network->path();
569 std::string user_id_hash = chromeos::LoginState::Get()->primary_user_hash();
570 GetManagedConfigurationHandler()->GetProperties(
571 user_id_hash, default_network->path(),
572 base::Bind(&GetDefaultNetworkSuccessCallback, callback),
573 base::Bind(&GetDefaultNetworkFailureCallback, callback));
574 }
575
576 void DefaultNetworkSuccessCallback(ArcNetHostImpl* instance,
577 const std::string& service_path,
578 const base::DictionaryValue& dictionary) {
579 instance->arc_bridge_service()->net_instance()->DefaultNetworkChanged(
580 TranslateONCConfiguration(&dictionary),
581 TranslateONCConfiguration(&dictionary));
582 }
583
584 void DefaultNetworkFailureCallback(
585 const std::string& error_name,
586 std::unique_ptr<base::DictionaryValue> error_data) {
587 LOG(ERROR) << "Failed to query default logical network";
588 }
589
590 void ArcNetHostImpl::DefaultNetworkChanged(
591 const chromeos::NetworkState* network) {
592 if (arc_bridge_service()->net_version() < 2) {
593 VLOG(1) << "ArcBridgeService does not support DefaultNetworkChanged.";
594 return;
595 }
596
597 if (!network) {
598 VLOG(1) << "No default network";
599 arc_bridge_service()->net_instance()->DefaultNetworkChanged(nullptr,
600 nullptr);
601 return;
602 }
603
604 VLOG(1) << "New default network: " << network->path();
605 std::string user_id_hash = chromeos::LoginState::Get()->primary_user_hash();
606 GetManagedConfigurationHandler()->GetProperties(
607 user_id_hash, network->path(),
608 base::Bind(&DefaultNetworkSuccessCallback, base::Unretained(this)),
609 base::Bind(&DefaultNetworkFailureCallback));
610 }
611
373 void ArcNetHostImpl::OnShuttingDown() { 612 void ArcNetHostImpl::OnShuttingDown() {
374 GetStateHandler()->RemoveObserver(this, FROM_HERE); 613 GetStateHandler()->RemoveObserver(this, FROM_HERE);
375 } 614 }
376 615
377 } // namespace arc 616 } // namespace arc
OLDNEW
« 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