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

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