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

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: fix linter error 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;
56 dict->GetString(key, &tmp);
57 if (required && tmp.empty())
58 NOTREACHED();
59 return tmp;
60 }
61
62 } // namespace
63
64 namespace arc {
65
56 ArcNetHostImpl::ArcNetHostImpl(ArcBridgeService* bridge_service) 66 ArcNetHostImpl::ArcNetHostImpl(ArcBridgeService* bridge_service)
57 : ArcService(bridge_service), binding_(this) { 67 : ArcService(bridge_service), binding_(this) {
58 arc_bridge_service()->AddObserver(this); 68 arc_bridge_service()->AddObserver(this);
59 GetStateHandler()->AddObserver(this, FROM_HERE); 69 GetStateHandler()->AddObserver(this, FROM_HERE);
60 } 70 }
61 71
62 ArcNetHostImpl::~ArcNetHostImpl() { 72 ArcNetHostImpl::~ArcNetHostImpl() {
63 DCHECK(thread_checker_.CalledOnValidThread()); 73 DCHECK(thread_checker_.CalledOnValidThread());
64 arc_bridge_service()->RemoveObserver(this); 74 arc_bridge_service()->RemoveObserver(this);
65 if (chromeos::NetworkHandler::IsInitialized()) { 75 if (chromeos::NetworkHandler::IsInitialized()) {
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 return; 373 return;
364 } 374 }
365 if (arc_bridge_service()->net_version() < 1) { 375 if (arc_bridge_service()->net_version() < 1) {
366 VLOG(1) << "NetInstance does not support ScanCompleted."; 376 VLOG(1) << "NetInstance does not support ScanCompleted.";
367 return; 377 return;
368 } 378 }
369 379
370 arc_bridge_service()->net_instance()->ScanCompleted(); 380 arc_bridge_service()->net_instance()->ScanCompleted();
371 } 381 }
372 382
383 mojom::SecurityType TranslateONCWifiSecurityType(
384 const base::DictionaryValue* dict) {
dcheng 2016/05/18 05:32:45 I've expressed this in past reviews (https://coder
stevenjb 2016/05/18 15:35:48 That would be a huge amount of work and, imho, a s
Kevin Cernekee 2016/05/18 21:36:58 Acknowledged.
385 std::string tmp = GetStringFromOncDictionary(dict, onc::wifi::kSecurity,
386 true /* required */);
387 if (tmp == onc::wifi::kWEP_PSK)
388 return mojom::SecurityType::WEP_PSK;
389 else if (tmp == onc::wifi::kWEP_8021X)
390 return mojom::SecurityType::WEP_8021X;
391 else if (tmp == onc::wifi::kWPA_PSK)
392 return mojom::SecurityType::WPA_PSK;
393 else if (tmp == onc::wifi::kWPA_EAP)
394 return mojom::SecurityType::WPA_EAP;
395 else
396 return mojom::SecurityType::NONE;
397 }
398
399 mojom::WiFiPtr TranslateONCWifi(const base::DictionaryValue* dict) {
400 mojom::WiFiPtr mojo = mojom::WiFi::New();
401
402 // Optional; defaults to 0.
403 dict->GetInteger(onc::wifi::kFrequency, &mojo->frequency);
404
405 mojo->bssid =
406 GetStringFromOncDictionary(dict, onc::wifi::kBSSID, false /* required */);
407 mojo->hex_ssid = GetStringFromOncDictionary(dict, onc::wifi::kHexSSID,
408 true /* required */);
409
410 // Optional; defaults to false.
411 dict->GetBoolean(onc::wifi::kHiddenSSID, &mojo->hidden_ssid);
412
413 mojo->security = TranslateONCWifiSecurityType(dict);
414
415 // Optional; defaults to 0.
416 dict->GetInteger(onc::wifi::kSignalStrength, &mojo->signal_strength);
417
418 return mojo;
419 }
stevenjb 2016/05/18 21:00:18 All non member / non public functions should be in
Kevin Cernekee 2016/05/18 21:36:58 Done.
420
421 mojo::Array<mojo::String> TranslateStringArray(const base::ListValue* list) {
422 mojo::Array<mojo::String> mojos = mojo::Array<mojo::String>::New(0);
423
424 for (size_t i = 0; i < list->GetSize(); i++) {
425 std::string tmp;
426 list->GetString(i, &tmp);
427 DCHECK(!tmp.empty());
428 mojos.push_back(static_cast<mojo::String>(tmp));
429 }
430
431 return mojos;
432 }
433
434 mojo::Array<mojom::IPConfigurationPtr> TranslateONCIPConfigs(
435 const base::ListValue* list) {
436 mojo::Array<mojom::IPConfigurationPtr> mojos =
437 mojo::Array<mojom::IPConfigurationPtr>::New(0);
438
439 for (size_t i = 0; i < list->GetSize(); i++) {
440 const base::DictionaryValue* ip_dict = nullptr;
441 mojom::IPConfigurationPtr mojo = mojom::IPConfiguration::New();
442
443 list->GetDictionary(i, &ip_dict);
444 DCHECK(ip_dict);
445
446 mojo->gateway = GetStringFromOncDictionary(ip_dict, onc::ipconfig::kGateway,
447 true /* required */);
448 mojo->ip_address = GetStringFromOncDictionary(
449 ip_dict, onc::ipconfig::kIPAddress, true /* required */);
450
451 const base::ListValue* dns_list;
452 if (!ip_dict->GetList(onc::ipconfig::kNameServers, &dns_list))
453 NOTREACHED();
454 mojo->name_servers = TranslateStringArray(dns_list);
455
456 if (!ip_dict->GetInteger(onc::ipconfig::kRoutingPrefix,
457 &mojo->routing_prefix)) {
458 NOTREACHED();
459 }
460
461 std::string tmp = GetStringFromOncDictionary(ip_dict, onc::ipconfig::kType,
462 true /* required */);
463 mojo->type = tmp == onc::ipconfig::kIPv6 ? mojom::IPAddressType::IPV6
464 : mojom::IPAddressType::IPV4;
465
466 mojo->web_proxy_auto_discovery_url = GetStringFromOncDictionary(
467 ip_dict, onc::ipconfig::kWebProxyAutoDiscoveryUrl, true /* required */);
468
469 mojos.push_back(std::move(mojo));
470 }
471 return mojos;
472 }
473
474 mojom::ConnectionStateType TranslateONCConnectionState(
475 const base::DictionaryValue* dict) {
476 std::string tmp = GetStringFromOncDictionary(
477 dict, onc::network_config::kConnectionState, true /* required */);
478
479 if (tmp == onc::connection_state::kConnected)
480 return mojom::ConnectionStateType::CONNECTED;
481 else if (tmp == onc::connection_state::kConnecting)
482 return mojom::ConnectionStateType::CONNECTING;
483 else if (tmp == onc::connection_state::kNotConnected)
484 return mojom::ConnectionStateType::NOT_CONNECTED;
485
486 NOTREACHED();
487 return mojom::ConnectionStateType::NOT_CONNECTED;
488 }
489
490 void TranslateONCNetworkTypeDetails(const base::DictionaryValue* dict,
491 mojom::NetworkConfiguration* mojo) {
492 std::string tmp = GetStringFromOncDictionary(dict, onc::network_config::kType,
493 true /* required */);
494 if (tmp == onc::network_type::kCellular) {
495 mojo->type = mojom::NetworkType::CELLULAR;
496 } else if (tmp == onc::network_type::kEthernet) {
497 mojo->type = mojom::NetworkType::ETHERNET;
498 } else if (tmp == onc::network_type::kVPN) {
499 mojo->type = mojom::NetworkType::VPN;
500 } else if (tmp == onc::network_type::kWiFi) {
501 mojo->type = mojom::NetworkType::WIFI;
502
503 const base::DictionaryValue* wifi_dict = nullptr;
504 dict->GetDictionary(onc::network_config::kWiFi, &wifi_dict);
505 DCHECK(wifi_dict);
506 mojo->wifi = TranslateONCWifi(wifi_dict);
507 } else if (tmp == onc::network_type::kWimax) {
508 mojo->type = mojom::NetworkType::WIMAX;
509 } else {
510 NOTREACHED();
511 }
stevenjb 2016/05/18 21:00:18 I think this would be simpler / more clear if it r
Kevin Cernekee 2016/05/18 21:36:58 It is also setting mojo->wifi (and will someday se
512 }
513
514 mojom::NetworkConfigurationPtr TranslateONCConfiguration(
515 const base::DictionaryValue* dict) {
516 mojom::NetworkConfigurationPtr mojo = mojom::NetworkConfiguration::New();
517
518 mojo->connection_state = TranslateONCConnectionState(dict);
519
520 mojo->guid = GetStringFromOncDictionary(dict, onc::network_config::kGUID,
521 true /* required */);
522
523 const base::ListValue* ip_config_list = nullptr;
524 if (dict->GetList(onc::network_config::kIPConfigs, &ip_config_list)) {
525 DCHECK(ip_config_list);
526 mojo->ip_configs = TranslateONCIPConfigs(ip_config_list);
527 }
528
529 mojo->guid = GetStringFromOncDictionary(dict, onc::network_config::kGUID,
530 true /* required */);
531 mojo->mac_address = GetStringFromOncDictionary(
532 dict, onc::network_config::kMacAddress, true /* required */);
533 TranslateONCNetworkTypeDetails(dict, mojo.get());
534
535 return mojo;
536 }
537
538 void GetDefaultNetworkSuccessCallback(
539 const ArcNetHostImpl::GetDefaultNetworkCallback& callback,
540 const std::string& service_path,
541 const base::DictionaryValue& dictionary) {
542 // TODO(cernekee): Figure out how to query Chrome for the default physical
543 // service if a VPN is connected, rather than just reporting the
544 // default logical service in both fields.
545 callback.Run(TranslateONCConfiguration(&dictionary),
546 TranslateONCConfiguration(&dictionary));
547 }
548
549 void GetDefaultNetworkFailureCallback(
550 const ArcNetHostImpl::GetDefaultNetworkCallback& callback,
551 const std::string& error_name,
552 std::unique_ptr<base::DictionaryValue> error_data) {
553 LOG(ERROR) << "Failed to query default logical network";
554 callback.Run(nullptr, nullptr);
555 }
556
557 void ArcNetHostImpl::GetDefaultNetwork(
558 const GetDefaultNetworkCallback& callback) {
559 const chromeos::NetworkState* default_network =
560 GetStateHandler()->DefaultNetwork();
561 if (!default_network) {
562 VLOG(1) << "GetDefaultNetwork: no default network";
563 callback.Run(nullptr, nullptr);
564 return;
565 }
566 VLOG(1) << "GetDefaultNetwork: default network is "
567 << default_network->path();
568 std::string user_id_hash = chromeos::LoginState::Get()->primary_user_hash();
569 GetManagedConfigurationHandler()->GetProperties(
570 user_id_hash, default_network->path(),
571 base::Bind(&GetDefaultNetworkSuccessCallback, callback),
572 base::Bind(&GetDefaultNetworkFailureCallback, callback));
573 }
574
575 void DefaultNetworkSuccessCallback(ArcNetHostImpl* instance,
576 const std::string& service_path,
577 const base::DictionaryValue& dictionary) {
578 instance->arc_bridge_service()->net_instance()->DefaultNetworkChanged(
579 TranslateONCConfiguration(&dictionary),
580 TranslateONCConfiguration(&dictionary));
581 }
582
583 void DefaultNetworkFailureCallback(
584 const std::string& error_name,
585 std::unique_ptr<base::DictionaryValue> error_data) {
586 LOG(ERROR) << "Failed to query default logical network";
587 }
588
589 void ArcNetHostImpl::DefaultNetworkChanged(
590 const chromeos::NetworkState* network) {
591 if (arc_bridge_service()->net_version() < 2) {
592 VLOG(1) << "ArcBridgeService does not support DefaultNetworkChanged.";
593 return;
594 }
595
596 if (!network) {
597 VLOG(1) << "No default network";
598 arc_bridge_service()->net_instance()->DefaultNetworkChanged(nullptr,
599 nullptr);
600 return;
601 }
602
603 VLOG(1) << "New default network: " << network->path();
604 std::string user_id_hash = chromeos::LoginState::Get()->primary_user_hash();
605 GetManagedConfigurationHandler()->GetProperties(
606 user_id_hash, network->path(),
607 base::Bind(&DefaultNetworkSuccessCallback, base::Unretained(this)),
608 base::Bind(&DefaultNetworkFailureCallback));
609 }
610
373 void ArcNetHostImpl::OnShuttingDown() { 611 void ArcNetHostImpl::OnShuttingDown() {
374 GetStateHandler()->RemoveObserver(this, FROM_HERE); 612 GetStateHandler()->RemoveObserver(this, FROM_HERE);
375 } 613 }
376 614
377 } // namespace arc 615 } // 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