OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "chrome/browser/chromeos/cros/network_library.h" | 5 #include "chrome/browser/chromeos/cros/network_library.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <map> | 8 #include <map> |
9 | 9 |
10 #include "app/l10n_util.h" | 10 #include "app/l10n_util.h" |
11 #include "base/stl_util-inl.h" | 11 #include "base/stl_util-inl.h" |
12 #include "base/string_number_conversions.h" | 12 #include "base/string_number_conversions.h" |
13 #include "base/string_util.h" | 13 #include "base/string_util.h" |
14 #include "base/utf_string_conversions.h" | 14 #include "base/utf_string_conversions.h" |
| 15 #include "base/values.h" |
15 #include "chrome/browser/browser_thread.h" | 16 #include "chrome/browser/browser_thread.h" |
16 #include "chrome/browser/chromeos/cros/cros_library.h" | 17 #include "chrome/browser/chromeos/cros/cros_library.h" |
17 #include "grit/generated_resources.h" | 18 #include "grit/generated_resources.h" |
18 | 19 |
19 namespace chromeos { | 20 namespace chromeos { |
20 | 21 |
| 22 namespace { |
| 23 // TODO(ers) These string constants and Parse functions are copied |
| 24 // straight out of libcros:chromeos_network.cc. Fix this by moving |
| 25 // all handling of properties into libcros. |
| 26 // Network service properties we are interested in monitoring |
| 27 static const char* kIsActiveProperty = "IsActive"; |
| 28 static const char* kStateProperty = "State"; |
| 29 static const char* kSignalStrengthProperty = "Strength"; |
| 30 static const char* kActivationStateProperty = "Cellular.ActivationState"; |
| 31 static const char* kNetworkTechnologyProperty = "Cellular.NetworkTechnology"; |
| 32 static const char* kPaymentURLProperty = "Cellular.OlpUrl"; |
| 33 static const char* kRestrictedPoolProperty = "Cellular.RestrictedPool"; |
| 34 static const char* kRoamingStateProperty = "Cellular.RoamingState"; |
| 35 |
| 36 // Connman state options. |
| 37 static const char* kStateIdle = "idle"; |
| 38 static const char* kStateCarrier = "carrier"; |
| 39 static const char* kStateAssociation = "association"; |
| 40 static const char* kStateConfiguration = "configuration"; |
| 41 static const char* kStateReady = "ready"; |
| 42 static const char* kStateDisconnect = "disconnect"; |
| 43 static const char* kStateFailure = "failure"; |
| 44 static const char* kStateActivationFailure = "activation-failure"; |
| 45 |
| 46 // Connman activation state options |
| 47 static const char* kActivationStateActivated = "activated"; |
| 48 static const char* kActivationStateActivating = "activating"; |
| 49 static const char* kActivationStateNotActivated = "not-activated"; |
| 50 static const char* kActivationStatePartiallyActivated = "partially-activated"; |
| 51 static const char* kActivationStateUnknown = "unknown"; |
| 52 |
| 53 // Connman network technology options. |
| 54 static const char* kNetworkTechnology1Xrtt = "1xRTT"; |
| 55 static const char* kNetworkTechnologyEvdo = "EVDO"; |
| 56 static const char* kNetworkTechnologyGprs = "GPRS"; |
| 57 static const char* kNetworkTechnologyEdge = "EDGE"; |
| 58 static const char* kNetworkTechnologyUmts = "UMTS"; |
| 59 static const char* kNetworkTechnologyHspa = "HSPA"; |
| 60 static const char* kNetworkTechnologyHspaPlus = "HSPA+"; |
| 61 static const char* kNetworkTechnologyLte = "LTE"; |
| 62 static const char* kNetworkTechnologyLteAdvanced = "LTE Advanced"; |
| 63 |
| 64 // Connman roaming state options |
| 65 static const char* kRoamingStateHome = "home"; |
| 66 static const char* kRoamingStateRoaming = "roaming"; |
| 67 static const char* kRoamingStateUnknown = "unknown"; |
| 68 |
| 69 static ConnectionState ParseState(const std::string& state) { |
| 70 if (state == kStateIdle) |
| 71 return STATE_IDLE; |
| 72 if (state == kStateCarrier) |
| 73 return STATE_CARRIER; |
| 74 if (state == kStateAssociation) |
| 75 return STATE_ASSOCIATION; |
| 76 if (state == kStateConfiguration) |
| 77 return STATE_CONFIGURATION; |
| 78 if (state == kStateReady) |
| 79 return STATE_READY; |
| 80 if (state == kStateDisconnect) |
| 81 return STATE_DISCONNECT; |
| 82 if (state == kStateFailure) |
| 83 return STATE_FAILURE; |
| 84 if (state == kStateActivationFailure) |
| 85 return STATE_ACTIVATION_FAILURE; |
| 86 return STATE_UNKNOWN; |
| 87 } |
| 88 |
| 89 static ActivationState ParseActivationState( |
| 90 const std::string& activation_state) { |
| 91 if (activation_state == kActivationStateActivated) |
| 92 return ACTIVATION_STATE_ACTIVATED; |
| 93 if (activation_state == kActivationStateActivating) |
| 94 return ACTIVATION_STATE_ACTIVATING; |
| 95 if (activation_state == kActivationStateNotActivated) |
| 96 return ACTIVATION_STATE_NOT_ACTIVATED; |
| 97 if (activation_state == kActivationStateUnknown) |
| 98 return ACTIVATION_STATE_UNKNOWN; |
| 99 if (activation_state == kActivationStatePartiallyActivated) |
| 100 return ACTIVATION_STATE_PARTIALLY_ACTIVATED; |
| 101 return ACTIVATION_STATE_UNKNOWN; |
| 102 } |
| 103 |
| 104 static NetworkTechnology ParseNetworkTechnology( |
| 105 const std::string& technology) { |
| 106 if (technology == kNetworkTechnology1Xrtt) |
| 107 return NETWORK_TECHNOLOGY_1XRTT; |
| 108 if (technology == kNetworkTechnologyEvdo) |
| 109 return NETWORK_TECHNOLOGY_EVDO; |
| 110 if (technology == kNetworkTechnologyGprs) |
| 111 return NETWORK_TECHNOLOGY_GPRS; |
| 112 if (technology == kNetworkTechnologyEdge) |
| 113 return NETWORK_TECHNOLOGY_EDGE; |
| 114 if (technology == kNetworkTechnologyUmts) |
| 115 return NETWORK_TECHNOLOGY_UMTS; |
| 116 if (technology == kNetworkTechnologyHspa) |
| 117 return NETWORK_TECHNOLOGY_HSPA; |
| 118 if (technology == kNetworkTechnologyHspaPlus) |
| 119 return NETWORK_TECHNOLOGY_HSPA_PLUS; |
| 120 if (technology == kNetworkTechnologyLte) |
| 121 return NETWORK_TECHNOLOGY_LTE; |
| 122 if (technology == kNetworkTechnologyLteAdvanced) |
| 123 return NETWORK_TECHNOLOGY_LTE_ADVANCED; |
| 124 return NETWORK_TECHNOLOGY_UNKNOWN; |
| 125 } |
| 126 static NetworkRoamingState ParseRoamingState( |
| 127 const std::string& roaming_state) { |
| 128 if (roaming_state == kRoamingStateHome) |
| 129 return ROAMING_STATE_HOME; |
| 130 if (roaming_state == kRoamingStateRoaming) |
| 131 return ROAMING_STATE_ROAMING; |
| 132 if (roaming_state == kRoamingStateUnknown) |
| 133 return ROAMING_STATE_UNKNOWN; |
| 134 return ROAMING_STATE_UNKNOWN; |
| 135 } |
| 136 |
| 137 } |
| 138 |
21 // Helper function to wrap Html with <th> tag. | 139 // Helper function to wrap Html with <th> tag. |
22 static std::string WrapWithTH(std::string text) { | 140 static std::string WrapWithTH(std::string text) { |
23 return "<th>" + text + "</th>"; | 141 return "<th>" + text + "</th>"; |
24 } | 142 } |
25 | 143 |
26 // Helper function to wrap Html with <td> tag. | 144 // Helper function to wrap Html with <td> tag. |
27 static std::string WrapWithTD(std::string text) { | 145 static std::string WrapWithTD(std::string text) { |
28 return "<td>" + text + "</td>"; | 146 return "<td>" + text + "</td>"; |
29 } | 147 } |
30 | 148 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 state_ = network.state(); | 210 state_ = network.state(); |
93 error_ = network.error(); | 211 error_ = network.error(); |
94 } | 212 } |
95 | 213 |
96 void Network::Clear() { | 214 void Network::Clear() { |
97 state_ = STATE_UNKNOWN; | 215 state_ = STATE_UNKNOWN; |
98 error_ = ERROR_UNKNOWN; | 216 error_ = ERROR_UNKNOWN; |
99 service_path_.clear(); | 217 service_path_.clear(); |
100 device_path_.clear(); | 218 device_path_.clear(); |
101 ip_address_.clear(); | 219 ip_address_.clear(); |
| 220 is_active_ = false; |
102 } | 221 } |
103 | 222 |
104 Network::Network(const ServiceInfo* service) { | 223 Network::Network(const ServiceInfo* service) { |
105 type_ = service->type; | 224 type_ = service->type; |
106 state_ = service->state; | 225 state_ = service->state; |
107 error_ = service->error; | 226 error_ = service->error; |
108 service_path_ = SafeString(service->service_path); | 227 service_path_ = SafeString(service->service_path); |
109 device_path_ = SafeString(service->device_path); | 228 device_path_ = SafeString(service->device_path); |
| 229 is_active_ = service->is_active; |
110 ip_address_.clear(); | 230 ip_address_.clear(); |
111 // If connected, get ip config. | 231 // If connected, get ip config. |
112 if (EnsureCrosLoaded() && connected() && service->device_path) { | 232 if (EnsureCrosLoaded() && connected() && service->device_path) { |
113 IPConfigStatus* ipconfig_status = ListIPConfigs(service->device_path); | 233 IPConfigStatus* ipconfig_status = ListIPConfigs(service->device_path); |
114 if (ipconfig_status) { | 234 if (ipconfig_status) { |
115 for (int i = 0; i < ipconfig_status->size; i++) { | 235 for (int i = 0; i < ipconfig_status->size; i++) { |
116 IPConfig ipconfig = ipconfig_status->ips[i]; | 236 IPConfig ipconfig = ipconfig_status->ips[i]; |
117 if (strlen(ipconfig.address) > 0) | 237 if (strlen(ipconfig.address) > 0) |
118 ip_address_ = ipconfig.address; | 238 ip_address_ = ipconfig.address; |
119 } | 239 } |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
503 } | 623 } |
504 return false; | 624 return false; |
505 } | 625 } |
506 | 626 |
507 //////////////////////////////////////////////////////////////////////////////// | 627 //////////////////////////////////////////////////////////////////////////////// |
508 // NetworkLibrary | 628 // NetworkLibrary |
509 | 629 |
510 class NetworkLibraryImpl : public NetworkLibrary { | 630 class NetworkLibraryImpl : public NetworkLibrary { |
511 public: | 631 public: |
512 NetworkLibraryImpl() | 632 NetworkLibraryImpl() |
513 : network_status_connection_(NULL), | 633 : network_manager_monitor_(NULL), |
514 data_plan_monitor_(NULL), | 634 data_plan_monitor_(NULL), |
515 ethernet_(NULL), | 635 ethernet_(NULL), |
516 wifi_(NULL), | 636 wifi_(NULL), |
517 cellular_(NULL), | 637 cellular_(NULL), |
518 available_devices_(0), | 638 available_devices_(0), |
519 enabled_devices_(0), | 639 enabled_devices_(0), |
520 connected_devices_(0), | 640 connected_devices_(0), |
521 offline_mode_(false) { | 641 offline_mode_(false) { |
522 if (EnsureCrosLoaded()) { | 642 if (EnsureCrosLoaded()) { |
523 Init(); | 643 Init(); |
| 644 network_manager_monitor_ = |
| 645 MonitorNetworkManager(&NetworkManagerStatusChangedHandler, |
| 646 this); |
| 647 data_plan_monitor_ = MonitorCellularDataPlan(&DataPlanUpdateHandler, |
| 648 this); |
524 } else { | 649 } else { |
525 InitTestData(); | 650 InitTestData(); |
526 } | 651 } |
527 } | 652 } |
528 | 653 |
529 ~NetworkLibraryImpl() { | 654 ~NetworkLibraryImpl() { |
530 if (network_status_connection_) { | 655 DCHECK(!network_manager_observers_.size()); |
531 DisconnectMonitorNetwork(network_status_connection_); | 656 DCHECK(network_manager_monitor_); |
532 } | 657 DisconnectPropertyChangeMonitor(network_manager_monitor_); |
533 if (data_plan_monitor_) { | 658 DCHECK(!data_plan_observers_.size()); |
534 DisconnectDataPlanUpdateMonitor(data_plan_monitor_); | 659 DCHECK(data_plan_monitor_); |
535 } | 660 DisconnectDataPlanUpdateMonitor(data_plan_monitor_); |
536 // DCHECK(!observers_.size()); | 661 DCHECK(!network_observers_.size()); |
537 DCHECK(!property_observers_.size()); | 662 STLDeleteValues(&network_observers_); |
538 STLDeleteValues(&property_observers_); | |
539 ClearNetworks(); | 663 ClearNetworks(); |
540 } | 664 } |
541 | 665 |
542 void AddObserver(Observer* observer) { | 666 virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) { |
543 observers_.AddObserver(observer); | 667 network_manager_observers_.AddObserver(observer); |
544 } | 668 } |
545 | 669 |
546 void RemoveObserver(Observer* observer) { | 670 virtual void RemoveNetworkManagerObserver(NetworkManagerObserver* observer) { |
547 observers_.RemoveObserver(observer); | 671 if (!network_manager_observers_.HasObserver(observer)) |
| 672 network_manager_observers_.RemoveObserver(observer); |
548 } | 673 } |
549 | 674 |
550 virtual void AddProperyObserver(const char* service_path, | 675 virtual void AddNetworkObserver(const std::string& service_path, |
551 PropertyObserver* observer) { | 676 NetworkObserver* observer) { |
552 DCHECK(service_path); | |
553 DCHECK(observer); | 677 DCHECK(observer); |
554 if (!EnsureCrosLoaded()) | 678 if (!EnsureCrosLoaded()) |
555 return; | 679 return; |
556 // First, add the observer to the callback map. | 680 // First, add the observer to the callback map. |
557 PropertyChangeObserverMap::iterator iter = property_observers_.find( | 681 NetworkObserverMap::iterator iter = network_observers_.find(service_path); |
558 std::string(service_path)); | 682 NetworkObserverList* oblist; |
559 if (iter != property_observers_.end()) { | 683 if (iter != network_observers_.end()) { |
560 iter->second->AddObserver(observer); | 684 oblist = iter->second; |
561 } else { | 685 } else { |
562 std::pair<PropertyChangeObserverMap::iterator, bool> inserted = | 686 std::pair<NetworkObserverMap::iterator, bool> inserted = |
563 property_observers_.insert( | 687 network_observers_.insert( |
564 std::pair<std::string, PropertyObserverList*>( | 688 std::make_pair<std::string, NetworkObserverList*>( |
565 std::string(service_path), | 689 service_path, |
566 new PropertyObserverList(this, service_path))); | 690 new NetworkObserverList(this, service_path))); |
567 inserted.first->second->AddObserver(observer); | 691 oblist = inserted.first->second; |
| 692 } |
| 693 if (!oblist->HasObserver(observer)) |
| 694 oblist->AddObserver(observer); |
| 695 } |
| 696 |
| 697 virtual void RemoveNetworkObserver(const std::string& service_path, |
| 698 NetworkObserver* observer) { |
| 699 DCHECK(observer); |
| 700 DCHECK(service_path.size()); |
| 701 NetworkObserverMap::iterator map_iter = network_observers_.find( |
| 702 service_path); |
| 703 if (map_iter != network_observers_.end()) { |
| 704 map_iter->second->RemoveObserver(observer); |
| 705 if (!map_iter->second->size()) { |
| 706 delete map_iter->second; |
| 707 network_observers_.erase(map_iter++); |
| 708 } |
568 } | 709 } |
569 } | 710 } |
570 | 711 |
571 virtual void RemoveProperyObserver(PropertyObserver* observer) { | 712 virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) { |
572 DCHECK(observer); | 713 DCHECK(observer); |
573 PropertyChangeObserverMap::iterator map_iter = | 714 NetworkObserverMap::iterator map_iter = network_observers_.begin(); |
574 property_observers_.begin(); | 715 while (map_iter != network_observers_.end()) { |
575 while (map_iter != property_observers_.end()) { | |
576 map_iter->second->RemoveObserver(observer); | 716 map_iter->second->RemoveObserver(observer); |
577 if (!map_iter->second->size()) { | 717 if (!map_iter->second->size()) { |
578 delete map_iter->second; | 718 delete map_iter->second; |
579 property_observers_.erase(map_iter++); | 719 network_observers_.erase(map_iter++); |
580 } else { | 720 } else { |
581 ++map_iter; | 721 ++map_iter; |
582 } | 722 } |
583 } | 723 } |
584 } | 724 } |
585 | 725 |
| 726 virtual void AddCellularDataPlanObserver(CellularDataPlanObserver* observer) { |
| 727 if (!data_plan_observers_.HasObserver(observer)) |
| 728 data_plan_observers_.AddObserver(observer); |
| 729 } |
| 730 |
| 731 virtual void RemoveCellularDataPlanObserver( |
| 732 CellularDataPlanObserver* observer) { |
| 733 data_plan_observers_.RemoveObserver(observer); |
| 734 } |
| 735 |
586 virtual EthernetNetwork* ethernet_network() { return ethernet_; } | 736 virtual EthernetNetwork* ethernet_network() { return ethernet_; } |
587 virtual bool ethernet_connecting() const { | 737 virtual bool ethernet_connecting() const { |
588 return ethernet_ ? ethernet_->connecting() : false; | 738 return ethernet_ ? ethernet_->connecting() : false; |
589 } | 739 } |
590 virtual bool ethernet_connected() const { | 740 virtual bool ethernet_connected() const { |
591 return ethernet_ ? ethernet_->connected() : false; | 741 return ethernet_ ? ethernet_->connected() : false; |
592 } | 742 } |
593 | 743 |
594 virtual WifiNetwork* wifi_network() { return wifi_; } | 744 virtual WifiNetwork* wifi_network() { return wifi_; } |
595 virtual bool wifi_connecting() const { | 745 virtual bool wifi_connecting() const { |
(...skipping 13 matching lines...) Expand all Loading... |
609 | 759 |
610 bool Connected() const { | 760 bool Connected() const { |
611 return ethernet_connected() || wifi_connected() || cellular_connected(); | 761 return ethernet_connected() || wifi_connected() || cellular_connected(); |
612 } | 762 } |
613 | 763 |
614 bool Connecting() const { | 764 bool Connecting() const { |
615 return ethernet_connecting() || wifi_connecting() || cellular_connecting(); | 765 return ethernet_connecting() || wifi_connecting() || cellular_connecting(); |
616 } | 766 } |
617 | 767 |
618 const std::string& IPAddress() const { | 768 const std::string& IPAddress() const { |
619 // Returns highest priority IP address. | 769 // Returns IP address for the active network. |
620 if (ethernet_connected()) | 770 const Network* active = active_network(); |
| 771 if (active != NULL) |
| 772 return active->ip_address(); |
| 773 if (ethernet_) |
621 return ethernet_->ip_address(); | 774 return ethernet_->ip_address(); |
622 if (wifi_connected()) | 775 static std::string null_address("0.0.0.0"); |
623 return wifi_->ip_address(); | 776 return null_address; |
624 if (cellular_connected()) | |
625 return cellular_->ip_address(); | |
626 return ethernet_->ip_address(); | |
627 } | 777 } |
628 | 778 |
629 virtual const WifiNetworkVector& wifi_networks() const { | 779 virtual const WifiNetworkVector& wifi_networks() const { |
630 return wifi_networks_; | 780 return wifi_networks_; |
631 } | 781 } |
632 | 782 |
633 virtual const WifiNetworkVector& remembered_wifi_networks() const { | 783 virtual const WifiNetworkVector& remembered_wifi_networks() const { |
634 return remembered_wifi_networks_; | 784 return remembered_wifi_networks_; |
635 } | 785 } |
636 | 786 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
681 return true; | 831 return true; |
682 } | 832 } |
683 | 833 |
684 virtual void ConnectToWifiNetwork(const WifiNetwork* network, | 834 virtual void ConnectToWifiNetwork(const WifiNetwork* network, |
685 const std::string& password, | 835 const std::string& password, |
686 const std::string& identity, | 836 const std::string& identity, |
687 const std::string& certpath) { | 837 const std::string& certpath) { |
688 DCHECK(network); | 838 DCHECK(network); |
689 if (!EnsureCrosLoaded()) | 839 if (!EnsureCrosLoaded()) |
690 return; | 840 return; |
| 841 // TODO(ers) make wifi the highest priority service type |
691 if (ConnectToNetworkWithCertInfo(network->service_path().c_str(), | 842 if (ConnectToNetworkWithCertInfo(network->service_path().c_str(), |
692 password.empty() ? NULL : password.c_str(), | 843 password.empty() ? NULL : password.c_str(), |
693 identity.empty() ? NULL : identity.c_str(), | 844 identity.empty() ? NULL : identity.c_str(), |
694 certpath.empty() ? NULL : certpath.c_str())) { | 845 certpath.empty() ? NULL : certpath.c_str())) { |
695 // Update local cache and notify listeners. | 846 // Update local cache and notify listeners. |
696 WifiNetwork* wifi = GetWirelessNetworkByPath( | 847 WifiNetwork* wifi = GetWirelessNetworkByPath( |
697 wifi_networks_, network->service_path()); | 848 wifi_networks_, network->service_path()); |
698 if (wifi) { | 849 if (wifi) { |
699 wifi->set_passphrase(password); | 850 wifi->set_passphrase(password); |
700 wifi->set_identity(identity); | 851 wifi->set_identity(identity); |
701 wifi->set_cert_path(certpath); | 852 wifi->set_cert_path(certpath); |
702 wifi->set_connecting(true); | 853 wifi->set_connecting(true); |
703 wifi_ = wifi; | 854 wifi_ = wifi; |
704 } | 855 } |
705 NotifyNetworkChanged(); | 856 NotifyNetworkManagerChanged(); |
706 } | 857 } |
707 } | 858 } |
708 | 859 |
709 virtual void ConnectToWifiNetwork(ConnectionSecurity security, | 860 virtual void ConnectToWifiNetwork(ConnectionSecurity security, |
710 const std::string& ssid, | 861 const std::string& ssid, |
711 const std::string& password, | 862 const std::string& password, |
712 const std::string& identity, | 863 const std::string& identity, |
713 const std::string& certpath, | 864 const std::string& certpath, |
714 bool auto_connect) { | 865 bool auto_connect) { |
715 if (!EnsureCrosLoaded()) | 866 if (!EnsureCrosLoaded()) |
716 return; | 867 return; |
717 | 868 |
718 // First create a service from hidden network. | 869 // First create a service from hidden network. |
719 ServiceInfo* service = GetWifiService(ssid.c_str(), security); | 870 ServiceInfo* service = GetWifiService(ssid.c_str(), security); |
720 if (service) { | 871 if (service) { |
721 // Set auto-connect. | 872 // Set auto-connect. |
722 SetAutoConnect(service->service_path, auto_connect); | 873 SetAutoConnect(service->service_path, auto_connect); |
723 // Now connect to that service. | 874 // Now connect to that service. |
| 875 // TODO(ers) make wifi the highest priority service type |
724 ConnectToNetworkWithCertInfo(service->service_path, | 876 ConnectToNetworkWithCertInfo(service->service_path, |
725 password.empty() ? NULL : password.c_str(), | 877 password.empty() ? NULL : password.c_str(), |
726 identity.empty() ? NULL : identity.c_str(), | 878 identity.empty() ? NULL : identity.c_str(), |
727 certpath.empty() ? NULL : certpath.c_str()); | 879 certpath.empty() ? NULL : certpath.c_str()); |
728 | 880 |
729 // Clean up ServiceInfo object. | 881 // Clean up ServiceInfo object. |
730 FreeServiceInfo(service); | 882 FreeServiceInfo(service); |
731 } else { | 883 } else { |
732 LOG(WARNING) << "Cannot find hidden network: " << ssid; | 884 LOG(WARNING) << "Cannot find hidden network: " << ssid; |
733 // TODO(chocobo): Show error message. | 885 // TODO(chocobo): Show error message. |
734 } | 886 } |
735 } | 887 } |
736 | 888 |
737 virtual void ConnectToCellularNetwork(const CellularNetwork* network) { | 889 virtual void ConnectToCellularNetwork(const CellularNetwork* network) { |
738 DCHECK(network); | 890 DCHECK(network); |
739 if (!EnsureCrosLoaded()) | 891 if (!EnsureCrosLoaded()) |
740 return; | 892 return; |
| 893 // TODO(ers) make cellular the highest priority service type |
741 if (network && ConnectToNetwork(network->service_path().c_str(), NULL)) { | 894 if (network && ConnectToNetwork(network->service_path().c_str(), NULL)) { |
742 // Update local cache and notify listeners. | 895 // Update local cache and notify listeners. |
743 CellularNetwork* cellular = GetWirelessNetworkByPath( | 896 CellularNetwork* cellular = GetWirelessNetworkByPath( |
744 cellular_networks_, network->service_path()); | 897 cellular_networks_, network->service_path()); |
745 if (cellular) { | 898 if (cellular) { |
746 cellular->set_connecting(true); | 899 cellular->set_connecting(true); |
747 cellular_ = cellular; | 900 cellular_ = cellular; |
748 } | 901 } |
749 NotifyNetworkChanged(); | 902 NotifyNetworkManagerChanged(); |
750 } | 903 } |
751 } | 904 } |
752 | 905 |
753 virtual void RefreshCellularDataPlans(const CellularNetwork* network) { | 906 virtual void RefreshCellularDataPlans(const CellularNetwork* network) { |
754 DCHECK(network); | 907 DCHECK(network); |
755 if (!EnsureCrosLoaded() || !network) | 908 if (!EnsureCrosLoaded() || !network) |
756 return; | 909 return; |
757 RequestCellularDataPlanUpdate(network->service_path().c_str()); | 910 RequestCellularDataPlanUpdate(network->service_path().c_str()); |
758 } | 911 } |
759 | 912 |
760 virtual void DisconnectFromWirelessNetwork(const WirelessNetwork* network) { | 913 virtual void DisconnectFromWirelessNetwork(const WirelessNetwork* network) { |
761 DCHECK(network); | 914 DCHECK(network); |
762 if (!EnsureCrosLoaded() || !network) | 915 if (!EnsureCrosLoaded() || !network) |
763 return; | 916 return; |
| 917 // TODO(ers) restore default service type priority ordering? |
764 if (DisconnectFromNetwork(network->service_path().c_str())) { | 918 if (DisconnectFromNetwork(network->service_path().c_str())) { |
765 // Update local cache and notify listeners. | 919 // Update local cache and notify listeners. |
766 if (network->type() == TYPE_WIFI) { | 920 if (network->type() == TYPE_WIFI) { |
767 WifiNetwork* wifi = GetWirelessNetworkByPath( | 921 WifiNetwork* wifi = GetWirelessNetworkByPath( |
768 wifi_networks_, network->service_path()); | 922 wifi_networks_, network->service_path()); |
769 if (wifi) { | 923 if (wifi) { |
770 wifi->set_connected(false); | 924 wifi->set_connected(false); |
771 wifi_ = NULL; | 925 wifi_ = NULL; |
772 } | 926 } |
773 } else if (network->type() == TYPE_CELLULAR) { | 927 } else if (network->type() == TYPE_CELLULAR) { |
774 CellularNetwork* cellular = GetWirelessNetworkByPath( | 928 CellularNetwork* cellular = GetWirelessNetworkByPath( |
775 cellular_networks_, network->service_path()); | 929 cellular_networks_, network->service_path()); |
776 if (cellular) { | 930 if (cellular) { |
777 cellular->set_connected(false); | 931 cellular->set_connected(false); |
778 cellular_ = NULL; | 932 cellular_ = NULL; |
779 } | 933 } |
780 } | 934 } |
781 NotifyNetworkChanged(); | 935 NotifyNetworkManagerChanged(); |
782 } | 936 } |
783 } | 937 } |
784 | 938 |
785 virtual void SaveCellularNetwork(const CellularNetwork* network) { | 939 virtual void SaveCellularNetwork(const CellularNetwork* network) { |
786 DCHECK(network); | 940 DCHECK(network); |
787 // Update the cellular network with libcros. | 941 // Update the cellular network with libcros. |
788 if (!EnsureCrosLoaded() || !network) | 942 if (!EnsureCrosLoaded() || !network) |
789 return; | 943 return; |
790 | 944 |
791 SetAutoConnect(network->service_path().c_str(), network->auto_connect()); | 945 SetAutoConnect(network->service_path().c_str(), network->auto_connect()); |
(...skipping 21 matching lines...) Expand all Loading... |
813 for (WifiNetworkVector::iterator iter = | 967 for (WifiNetworkVector::iterator iter = |
814 remembered_wifi_networks_.begin(); | 968 remembered_wifi_networks_.begin(); |
815 iter != remembered_wifi_networks_.end(); | 969 iter != remembered_wifi_networks_.end(); |
816 ++iter) { | 970 ++iter) { |
817 if ((*iter)->service_path() == service_path) { | 971 if ((*iter)->service_path() == service_path) { |
818 delete (*iter); | 972 delete (*iter); |
819 remembered_wifi_networks_.erase(iter); | 973 remembered_wifi_networks_.erase(iter); |
820 break; | 974 break; |
821 } | 975 } |
822 } | 976 } |
823 NotifyNetworkChanged(); | 977 NotifyNetworkManagerChanged(); |
824 } | 978 } |
825 } | 979 } |
826 | 980 |
827 virtual bool ethernet_available() const { | 981 virtual bool ethernet_available() const { |
828 return available_devices_ & (1 << TYPE_ETHERNET); | 982 return available_devices_ & (1 << TYPE_ETHERNET); |
829 } | 983 } |
830 virtual bool wifi_available() const { | 984 virtual bool wifi_available() const { |
831 return available_devices_ & (1 << TYPE_WIFI); | 985 return available_devices_ & (1 << TYPE_WIFI); |
832 } | 986 } |
833 virtual bool cellular_available() const { | 987 virtual bool cellular_available() const { |
834 return available_devices_ & (1 << TYPE_CELLULAR); | 988 return available_devices_ & (1 << TYPE_CELLULAR); |
835 } | 989 } |
836 | 990 |
837 virtual bool ethernet_enabled() const { | 991 virtual bool ethernet_enabled() const { |
838 return enabled_devices_ & (1 << TYPE_ETHERNET); | 992 return enabled_devices_ & (1 << TYPE_ETHERNET); |
839 } | 993 } |
840 virtual bool wifi_enabled() const { | 994 virtual bool wifi_enabled() const { |
841 return enabled_devices_ & (1 << TYPE_WIFI); | 995 return enabled_devices_ & (1 << TYPE_WIFI); |
842 } | 996 } |
843 virtual bool cellular_enabled() const { | 997 virtual bool cellular_enabled() const { |
844 return enabled_devices_ & (1 << TYPE_CELLULAR); | 998 return enabled_devices_ & (1 << TYPE_CELLULAR); |
845 } | 999 } |
846 | 1000 |
847 virtual bool offline_mode() const { return offline_mode_; } | 1001 virtual bool offline_mode() const { return offline_mode_; } |
848 | 1002 |
| 1003 virtual const Network* active_network() const { |
| 1004 if (ethernet_ && ethernet_->is_active()) |
| 1005 return ethernet_; |
| 1006 if (wifi_ && wifi_->is_active()) |
| 1007 return wifi_; |
| 1008 if (cellular_ && cellular_->is_active()) |
| 1009 return cellular_; |
| 1010 return NULL; |
| 1011 } |
| 1012 |
849 virtual void EnableEthernetNetworkDevice(bool enable) { | 1013 virtual void EnableEthernetNetworkDevice(bool enable) { |
850 EnableNetworkDeviceType(TYPE_ETHERNET, enable); | 1014 EnableNetworkDeviceType(TYPE_ETHERNET, enable); |
851 } | 1015 } |
852 | 1016 |
853 virtual void EnableWifiNetworkDevice(bool enable) { | 1017 virtual void EnableWifiNetworkDevice(bool enable) { |
854 EnableNetworkDeviceType(TYPE_WIFI, enable); | 1018 EnableNetworkDeviceType(TYPE_WIFI, enable); |
855 } | 1019 } |
856 | 1020 |
857 virtual void EnableCellularNetworkDevice(bool enable) { | 1021 virtual void EnableCellularNetworkDevice(bool enable) { |
858 EnableNetworkDeviceType(TYPE_CELLULAR, enable); | 1022 EnableNetworkDeviceType(TYPE_CELLULAR, enable); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
944 output.append("<tr>" + ToHtmlTableRow(remembered_wifi_networks_[i]) + | 1108 output.append("<tr>" + ToHtmlTableRow(remembered_wifi_networks_[i]) + |
945 "</tr>"); | 1109 "</tr>"); |
946 } | 1110 } |
947 | 1111 |
948 output.append("</table></body></html>"); | 1112 output.append("</table></body></html>"); |
949 return output; | 1113 return output; |
950 } | 1114 } |
951 | 1115 |
952 private: | 1116 private: |
953 | 1117 |
954 class PropertyObserverList : public ObserverList<PropertyObserver> { | 1118 class NetworkObserverList : public ObserverList<NetworkObserver> { |
955 public: | 1119 public: |
956 PropertyObserverList(NetworkLibraryImpl* library, | 1120 NetworkObserverList(NetworkLibraryImpl* library, |
957 const char* service_path) { | 1121 const std::string& service_path) { |
958 DCHECK(service_path); | 1122 network_monitor_ = MonitorNetworkService(&NetworkStatusChangedHandler, |
959 property_change_monitor_ = MonitorNetworkService(&PropertyChangeHandler, | 1123 service_path.c_str(), |
960 service_path, | 1124 library); |
961 library); | |
962 } | 1125 } |
963 | 1126 |
964 virtual ~PropertyObserverList() { | 1127 virtual ~NetworkObserverList() { |
965 if (property_change_monitor_) | 1128 if (network_monitor_) |
966 DisconnectPropertyChangeMonitor(property_change_monitor_); | 1129 DisconnectPropertyChangeMonitor(network_monitor_); |
967 } | 1130 } |
968 | 1131 |
969 private: | 1132 private: |
970 static void PropertyChangeHandler(void* object, | 1133 static void NetworkStatusChangedHandler(void* object, |
971 const char* path, | 1134 const char* path, |
972 const char* key, | 1135 const char* key, |
973 const Value* value) { | 1136 const Value* value) { |
974 NetworkLibraryImpl* network = static_cast<NetworkLibraryImpl*>(object); | 1137 NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object); |
975 DCHECK(network); | 1138 DCHECK(networklib); |
976 network->NotifyPropertyChange(path, key, value); | 1139 networklib->UpdateNetworkStatus(path, key, value); |
977 } | 1140 } |
978 PropertyChangeMonitor property_change_monitor_; | 1141 PropertyChangeMonitor network_monitor_; |
979 }; | 1142 }; |
980 | 1143 |
981 typedef std::map<std::string, PropertyObserverList*> | 1144 typedef std::map<std::string, NetworkObserverList*> NetworkObserverMap; |
982 PropertyChangeObserverMap; | |
983 | 1145 |
984 static void NetworkStatusChangedHandler(void* object) { | 1146 static void NetworkManagerStatusChangedHandler(void* object, |
985 NetworkLibraryImpl* network = static_cast<NetworkLibraryImpl*>(object); | 1147 const char* path, |
986 DCHECK(network); | 1148 const char* key, |
987 network->UpdateNetworkStatus(); | 1149 const Value* value) { |
| 1150 NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object); |
| 1151 DCHECK(networklib); |
| 1152 networklib->UpdateNetworkManagerStatus(); |
988 } | 1153 } |
989 | 1154 |
990 static void DataPlanUpdateHandler(void* object, | 1155 static void DataPlanUpdateHandler(void* object, |
991 const char* modem_service_path, | 1156 const char* modem_service_path, |
992 const CellularDataPlanList* dataplan) { | 1157 const CellularDataPlanList* dataplan) { |
993 NetworkLibraryImpl* network = static_cast<NetworkLibraryImpl*>(object); | 1158 NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object); |
994 DCHECK(network && network->cellular_network()); | 1159 DCHECK(networklib && networklib->cellular_network()); |
995 // Store data plan for currently connected cellular network. | 1160 // Store data plan for currently connected cellular network. |
996 if (network->cellular_network()->service_path() | 1161 if (networklib->cellular_network()->service_path() |
997 .compare(modem_service_path) == 0) { | 1162 .compare(modem_service_path) == 0) { |
998 if (dataplan != NULL) { | 1163 if (dataplan != NULL) { |
999 network->UpdateCellularDataPlan(*dataplan); | 1164 networklib->UpdateCellularDataPlan(*dataplan); |
1000 } | 1165 } |
1001 } | 1166 } |
1002 } | 1167 } |
1003 | 1168 |
1004 static void ParseSystem(SystemInfo* system, | 1169 static void ParseSystem(SystemInfo* system, |
1005 EthernetNetwork** ethernet, | 1170 EthernetNetwork** ethernet, |
1006 WifiNetworkVector* wifi_networks, | 1171 WifiNetworkVector* wifi_networks, |
1007 CellularNetworkVector* cellular_networks, | 1172 CellularNetworkVector* cellular_networks, |
1008 WifiNetworkVector* remembered_wifi_networks) { | 1173 WifiNetworkVector* remembered_wifi_networks) { |
1009 DVLOG(1) << "ParseSystem:"; | 1174 DVLOG(1) << "ParseSystem:"; |
1010 DCHECK(!(*ethernet)); | 1175 DCHECK(!(*ethernet)); |
1011 for (int i = 0; i < system->service_size; i++) { | 1176 for (int i = 0; i < system->service_size; i++) { |
1012 const ServiceInfo* service = system->GetServiceInfo(i); | 1177 const ServiceInfo* service = system->GetServiceInfo(i); |
1013 DVLOG(1) << " (" << service->type << ") " << service->name | 1178 DVLOG(1) << " (" << service->type << ") " << service->name |
1014 << " mode=" << service->mode | 1179 << " mode=" << service->mode |
1015 << " state=" << service->state | 1180 << " state=" << service->state |
1016 << " sec=" << service->security | 1181 << " sec=" << service->security |
1017 << " req=" << service->passphrase_required | 1182 << " req=" << service->passphrase_required |
1018 << " pass=" << service->passphrase | 1183 << " pass=" << service->passphrase |
1019 << " id=" << service->identity | 1184 << " id=" << service->identity |
1020 << " certpath=" << service->cert_path | 1185 << " certpath=" << service->cert_path |
1021 << " str=" << service->strength | 1186 << " str=" << service->strength |
1022 << " fav=" << service->favorite | 1187 << " fav=" << service->favorite |
1023 << " auto=" << service->auto_connect | 1188 << " auto=" << service->auto_connect |
| 1189 << " is_active=" << service->is_active |
1024 << " error=" << service->error; | 1190 << " error=" << service->error; |
1025 // Once a connected ethernet service is found, disregard other ethernet | 1191 // Once a connected ethernet service is found, disregard other ethernet |
1026 // services that are also found | 1192 // services that are also found |
1027 if (service->type == TYPE_ETHERNET) | 1193 if (service->type == TYPE_ETHERNET) |
1028 (*ethernet) = new EthernetNetwork(service); | 1194 (*ethernet) = new EthernetNetwork(service); |
1029 else if (service->type == TYPE_WIFI) { | 1195 else if (service->type == TYPE_WIFI) { |
1030 wifi_networks->push_back(new WifiNetwork(service)); | 1196 wifi_networks->push_back(new WifiNetwork(service)); |
1031 } else if (service->type == TYPE_CELLULAR) { | 1197 } else if (service->type == TYPE_CELLULAR) { |
1032 cellular_networks->push_back(new CellularNetwork(service)); | 1198 cellular_networks->push_back(new CellularNetwork(service)); |
1033 } | 1199 } |
(...skipping 19 matching lines...) Expand all Loading... |
1053 << " certpath=" << service->cert_path | 1219 << " certpath=" << service->cert_path |
1054 << " auto=" << service->auto_connect; | 1220 << " auto=" << service->auto_connect; |
1055 if (service->type == TYPE_WIFI) { | 1221 if (service->type == TYPE_WIFI) { |
1056 remembered_wifi_networks->push_back(new WifiNetwork(service)); | 1222 remembered_wifi_networks->push_back(new WifiNetwork(service)); |
1057 } | 1223 } |
1058 } | 1224 } |
1059 } | 1225 } |
1060 } | 1226 } |
1061 | 1227 |
1062 void Init() { | 1228 void Init() { |
1063 // First, get the currently available networks. This data is cached | 1229 // First, get the currently available networks. This data is cached |
1064 // on the connman side, so the call should be quick. | 1230 // on the connman side, so the call should be quick. |
1065 VLOG(1) << "Getting initial CrOS network info."; | 1231 VLOG(1) << "Getting initial CrOS network info."; |
1066 UpdateSystemInfo(); | 1232 UpdateSystemInfo(); |
1067 | |
1068 VLOG(1) << "Registering for network status updates."; | |
1069 // Now, register to receive updates on network status. | |
1070 network_status_connection_ = MonitorNetwork(&NetworkStatusChangedHandler, | |
1071 this); | |
1072 VLOG(1) << "Registering for cellular data plan updates."; | |
1073 data_plan_monitor_ = MonitorCellularDataPlan(&DataPlanUpdateHandler, this); | |
1074 } | 1233 } |
1075 | 1234 |
1076 void InitTestData() { | 1235 void InitTestData() { |
1077 ethernet_ = new EthernetNetwork(); | 1236 ethernet_ = new EthernetNetwork(); |
1078 ethernet_->set_connected(true); | 1237 ethernet_->set_connected(true); |
1079 ethernet_->set_service_path("eth1"); | 1238 ethernet_->set_service_path("eth1"); |
1080 | 1239 |
1081 STLDeleteElements(&wifi_networks_); | 1240 STLDeleteElements(&wifi_networks_); |
1082 wifi_networks_.clear(); | 1241 wifi_networks_.clear(); |
1083 WifiNetwork* wifi1 = new WifiNetwork(); | 1242 WifiNetwork* wifi1 = new WifiNetwork(); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1142 test_plan.plan_type = CELLULAR_DATA_PLAN_METERED_PAID; | 1301 test_plan.plan_type = CELLULAR_DATA_PLAN_METERED_PAID; |
1143 test_plan.update_time = base::Time::Now().ToInternalValue() / | 1302 test_plan.update_time = base::Time::Now().ToInternalValue() / |
1144 base::Time::kMicrosecondsPerSecond; | 1303 base::Time::kMicrosecondsPerSecond; |
1145 chromeos::CellularDataPlanList test_plans; | 1304 chromeos::CellularDataPlanList test_plans; |
1146 test_plans.push_back(test_plan); | 1305 test_plans.push_back(test_plan); |
1147 cellular_->SetDataPlans(test_plans); | 1306 cellular_->SetDataPlans(test_plans); |
1148 } | 1307 } |
1149 | 1308 |
1150 void UpdateSystemInfo() { | 1309 void UpdateSystemInfo() { |
1151 if (EnsureCrosLoaded()) { | 1310 if (EnsureCrosLoaded()) { |
1152 UpdateNetworkStatus(); | 1311 UpdateNetworkManagerStatus(); |
1153 } | 1312 } |
1154 } | 1313 } |
1155 | 1314 |
1156 WifiNetwork* GetWifiNetworkByName(const std::string& name) { | 1315 WifiNetwork* GetWifiNetworkByName(const std::string& name) { |
1157 for (size_t i = 0; i < wifi_networks_.size(); ++i) { | 1316 for (size_t i = 0; i < wifi_networks_.size(); ++i) { |
1158 if (wifi_networks_[i]->name().compare(name) == 0) { | 1317 if (wifi_networks_[i]->name().compare(name) == 0) { |
1159 return wifi_networks_[i]; | 1318 return wifi_networks_[i]; |
1160 } | 1319 } |
1161 } | 1320 } |
1162 return NULL; | 1321 return NULL; |
(...skipping 28 matching lines...) Expand all Loading... |
1191 } | 1350 } |
1192 if (!enable && !(enabled_devices_ & (1 << device))) { | 1351 if (!enable && !(enabled_devices_ & (1 << device))) { |
1193 LOG(WARNING) << "Trying to disable a device that's already disabled: " | 1352 LOG(WARNING) << "Trying to disable a device that's already disabled: " |
1194 << device; | 1353 << device; |
1195 return; | 1354 return; |
1196 } | 1355 } |
1197 | 1356 |
1198 EnableNetworkDevice(device, enable); | 1357 EnableNetworkDevice(device, enable); |
1199 } | 1358 } |
1200 | 1359 |
1201 void NotifyNetworkChanged() { | 1360 void NotifyNetworkManagerChanged() { |
1202 FOR_EACH_OBSERVER(Observer, observers_, NetworkChanged(this)); | 1361 FOR_EACH_OBSERVER(NetworkManagerObserver, |
| 1362 network_manager_observers_, |
| 1363 OnNetworkManagerChanged(this)); |
| 1364 } |
| 1365 |
| 1366 void NotifyNetworkChanged(Network* network) { |
| 1367 DCHECK(network); |
| 1368 NetworkObserverMap::const_iterator iter = network_observers_.find( |
| 1369 network->service_path()); |
| 1370 if (iter != network_observers_.end()) { |
| 1371 FOR_EACH_OBSERVER(NetworkObserver, |
| 1372 *(iter->second), |
| 1373 OnNetworkChanged(this, network)); |
| 1374 } else { |
| 1375 NOTREACHED() << |
| 1376 "There weren't supposed to be any property change observers of " << |
| 1377 network->service_path(); |
| 1378 } |
1203 } | 1379 } |
1204 | 1380 |
1205 void NotifyCellularDataPlanChanged() { | 1381 void NotifyCellularDataPlanChanged() { |
1206 FOR_EACH_OBSERVER(Observer, observers_, CellularDataPlanChanged(this)); | 1382 FOR_EACH_OBSERVER(CellularDataPlanObserver, |
| 1383 data_plan_observers_, |
| 1384 OnCellularDataPlanChanged(this)); |
1207 } | 1385 } |
1208 | 1386 |
1209 void NotifyPropertyChange(const char* service_path, | 1387 void UpdateNetworkManagerStatus() { |
1210 const char* key, | |
1211 const Value* value) { | |
1212 DCHECK(service_path); | |
1213 DCHECK(key); | |
1214 DCHECK(value); | |
1215 PropertyChangeObserverMap::const_iterator iter = property_observers_.find( | |
1216 std::string(service_path)); | |
1217 if (iter != property_observers_.end()) { | |
1218 FOR_EACH_OBSERVER(PropertyObserver, *(iter->second), | |
1219 PropertyChanged(service_path, key, value)); | |
1220 } else { | |
1221 NOTREACHED() << | |
1222 "There weren't supposed to be any property change observers of " << | |
1223 service_path; | |
1224 } | |
1225 } | |
1226 | |
1227 void ClearNetworks() { | |
1228 if (ethernet_) | |
1229 delete ethernet_; | |
1230 ethernet_ = NULL; | |
1231 wifi_ = NULL; | |
1232 cellular_ = NULL; | |
1233 STLDeleteElements(&wifi_networks_); | |
1234 wifi_networks_.clear(); | |
1235 STLDeleteElements(&cellular_networks_); | |
1236 cellular_networks_.clear(); | |
1237 STLDeleteElements(&remembered_wifi_networks_); | |
1238 remembered_wifi_networks_.clear(); | |
1239 } | |
1240 | |
1241 void UpdateNetworkStatus() { | |
1242 // Make sure we run on UI thread. | 1388 // Make sure we run on UI thread. |
1243 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 1389 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
1244 BrowserThread::PostTask( | 1390 BrowserThread::PostTask( |
1245 BrowserThread::UI, FROM_HERE, | 1391 BrowserThread::UI, FROM_HERE, |
1246 NewRunnableMethod(this, | 1392 NewRunnableMethod(this, |
1247 &NetworkLibraryImpl::UpdateNetworkStatus)); | 1393 &NetworkLibraryImpl::UpdateNetworkManagerStatus)); |
1248 return; | 1394 return; |
1249 } | 1395 } |
1250 | 1396 |
1251 SystemInfo* system = GetSystemInfo(); | 1397 SystemInfo* system = GetSystemInfo(); |
1252 if (!system) | 1398 if (!system) |
1253 return; | 1399 return; |
1254 | 1400 |
1255 | 1401 |
1256 std::string prev_cellular_service_path = cellular_ ? | 1402 std::string prev_cellular_service_path = cellular_ ? |
1257 cellular_->service_path() : std::string(); | 1403 cellular_->service_path() : std::string(); |
(...skipping 23 matching lines...) Expand all Loading... |
1281 } | 1427 } |
1282 break; // There is only one connected or connecting cellular network. | 1428 break; // There is only one connected or connecting cellular network. |
1283 } | 1429 } |
1284 } | 1430 } |
1285 | 1431 |
1286 available_devices_ = system->available_technologies; | 1432 available_devices_ = system->available_technologies; |
1287 enabled_devices_ = system->enabled_technologies; | 1433 enabled_devices_ = system->enabled_technologies; |
1288 connected_devices_ = system->connected_technologies; | 1434 connected_devices_ = system->connected_technologies; |
1289 offline_mode_ = system->offline_mode; | 1435 offline_mode_ = system->offline_mode; |
1290 | 1436 |
1291 NotifyNetworkChanged(); | 1437 NotifyNetworkManagerChanged(); |
1292 FreeSystemInfo(system); | 1438 FreeSystemInfo(system); |
1293 } | 1439 } |
1294 | 1440 |
| 1441 void UpdateNetworkStatus(const char* path, |
| 1442 const char* key, |
| 1443 const Value* value) { |
| 1444 if (key == NULL || value == NULL) |
| 1445 return; |
| 1446 // Make sure we run on UI thread. |
| 1447 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| 1448 BrowserThread::PostTask( |
| 1449 BrowserThread::UI, FROM_HERE, |
| 1450 NewRunnableMethod(this, |
| 1451 &NetworkLibraryImpl::UpdateNetworkStatus, |
| 1452 path, key, value)); |
| 1453 return; |
| 1454 } |
| 1455 |
| 1456 bool boolval = false; |
| 1457 int intval = 0; |
| 1458 std::string stringval; |
| 1459 Network* network; |
| 1460 if (ethernet_->service_path() == path) { |
| 1461 network = ethernet_; |
| 1462 } else { |
| 1463 CellularNetwork* cellular = |
| 1464 GetWirelessNetworkByPath(cellular_networks_, path); |
| 1465 WifiNetwork* wifi = |
| 1466 GetWirelessNetworkByPath(wifi_networks_, path); |
| 1467 if (cellular == NULL && wifi == NULL) |
| 1468 return; |
| 1469 |
| 1470 WirelessNetwork* wireless; |
| 1471 if (wifi != NULL) |
| 1472 wireless = static_cast<WirelessNetwork*>(wifi); |
| 1473 else |
| 1474 wireless = static_cast<WirelessNetwork*>(cellular); |
| 1475 |
| 1476 if (strcmp(key, kSignalStrengthProperty) == 0) { |
| 1477 if (value->GetAsInteger(&intval)) |
| 1478 wireless->set_strength(intval); |
| 1479 } else if (cellular != NULL) { |
| 1480 if (strcmp(key, kRestrictedPoolProperty) == 0) { |
| 1481 if (value->GetAsBoolean(&boolval)) |
| 1482 cellular->set_restricted_pool(boolval); |
| 1483 } else if (strcmp(key, kActivationStateProperty) == 0) { |
| 1484 if (value->GetAsString(&stringval)) |
| 1485 cellular->set_activation_state(ParseActivationState(stringval)); |
| 1486 } else if (strcmp(key, kPaymentURLProperty) == 0) { |
| 1487 if (value->GetAsString(&stringval)) |
| 1488 cellular->set_payment_url(stringval); |
| 1489 } else if (strcmp(key, kNetworkTechnologyProperty) == 0) { |
| 1490 if (value->GetAsString(&stringval)) |
| 1491 cellular->set_network_technology( |
| 1492 ParseNetworkTechnology(stringval)); |
| 1493 } else if (strcmp(key, kRoamingStateProperty) == 0) { |
| 1494 if (value->GetAsString(&stringval)) |
| 1495 cellular->set_roaming_state(ParseRoamingState(stringval)); |
| 1496 } |
| 1497 } |
| 1498 network = wireless; |
| 1499 } |
| 1500 if (strcmp(key, kIsActiveProperty) == 0) { |
| 1501 if (value->GetAsBoolean(&boolval)) |
| 1502 network->set_active(boolval); |
| 1503 } else if (strcmp(key, kStateProperty) == 0) { |
| 1504 if (value->GetAsString(&stringval)) |
| 1505 network->set_state(ParseState(stringval)); |
| 1506 } |
| 1507 NotifyNetworkChanged(network); |
| 1508 } |
| 1509 |
1295 void UpdateCellularDataPlan(const CellularDataPlanList& data_plans) { | 1510 void UpdateCellularDataPlan(const CellularDataPlanList& data_plans) { |
1296 DCHECK(cellular_); | 1511 DCHECK(cellular_); |
1297 cellular_->SetDataPlans(data_plans); | 1512 cellular_->SetDataPlans(data_plans); |
1298 NotifyCellularDataPlanChanged(); | 1513 NotifyCellularDataPlanChanged(); |
1299 } | 1514 } |
1300 | 1515 |
1301 ObserverList<Observer> observers_; | 1516 void ClearNetworks() { |
| 1517 if (ethernet_) |
| 1518 delete ethernet_; |
| 1519 ethernet_ = NULL; |
| 1520 wifi_ = NULL; |
| 1521 cellular_ = NULL; |
| 1522 STLDeleteElements(&wifi_networks_); |
| 1523 wifi_networks_.clear(); |
| 1524 STLDeleteElements(&cellular_networks_); |
| 1525 cellular_networks_.clear(); |
| 1526 STLDeleteElements(&remembered_wifi_networks_); |
| 1527 remembered_wifi_networks_.clear(); |
| 1528 } |
1302 | 1529 |
1303 // Property change observer map | 1530 // Network manager observer list |
1304 PropertyChangeObserverMap property_observers_; | 1531 ObserverList<NetworkManagerObserver> network_manager_observers_; |
1305 | 1532 |
1306 // The network status connection for monitoring network status changes. | 1533 // Cellular data plan observer list |
1307 MonitorNetworkConnection network_status_connection_; | 1534 ObserverList<CellularDataPlanObserver> data_plan_observers_; |
| 1535 |
| 1536 // Network observer map |
| 1537 NetworkObserverMap network_observers_; |
| 1538 |
| 1539 // For monitoring network manager status changes. |
| 1540 PropertyChangeMonitor network_manager_monitor_; |
1308 | 1541 |
1309 // For monitoring data plan changes to the connected cellular network. | 1542 // For monitoring data plan changes to the connected cellular network. |
1310 DataPlanUpdateMonitor data_plan_monitor_; | 1543 DataPlanUpdateMonitor data_plan_monitor_; |
1311 | 1544 |
1312 // The property change connection for monitoring service property changes. | |
1313 std::map<std::string, PropertyChangeMonitor> property_change_monitors_; | |
1314 | |
1315 // The ethernet network. | 1545 // The ethernet network. |
1316 EthernetNetwork* ethernet_; | 1546 EthernetNetwork* ethernet_; |
1317 | 1547 |
1318 // The list of available wifi networks. | 1548 // The list of available wifi networks. |
1319 WifiNetworkVector wifi_networks_; | 1549 WifiNetworkVector wifi_networks_; |
1320 | 1550 |
1321 // The current connected (or connecting) wifi network. | 1551 // The current connected (or connecting) wifi network. |
1322 WifiNetwork* wifi_; | 1552 WifiNetwork* wifi_; |
1323 | 1553 |
1324 // The remembered wifi networks. | 1554 // The remembered wifi networks. |
(...skipping 21 matching lines...) Expand all Loading... |
1346 | 1576 |
1347 class NetworkLibraryStubImpl : public NetworkLibrary { | 1577 class NetworkLibraryStubImpl : public NetworkLibrary { |
1348 public: | 1578 public: |
1349 NetworkLibraryStubImpl() | 1579 NetworkLibraryStubImpl() |
1350 : ip_address_("1.1.1.1"), | 1580 : ip_address_("1.1.1.1"), |
1351 ethernet_(new EthernetNetwork()), | 1581 ethernet_(new EthernetNetwork()), |
1352 wifi_(NULL), | 1582 wifi_(NULL), |
1353 cellular_(NULL) { | 1583 cellular_(NULL) { |
1354 } | 1584 } |
1355 ~NetworkLibraryStubImpl() { if (ethernet_) delete ethernet_; } | 1585 ~NetworkLibraryStubImpl() { if (ethernet_) delete ethernet_; } |
1356 virtual void AddObserver(Observer* observer) {} | 1586 virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) {} |
1357 virtual void RemoveObserver(Observer* observer) {} | 1587 virtual void RemoveNetworkManagerObserver(NetworkManagerObserver* observer) {} |
1358 virtual void AddProperyObserver(const char* service_path, | 1588 virtual void AddNetworkObserver(const std::string& service_path, |
1359 PropertyObserver* observer) {} | 1589 NetworkObserver* observer) {} |
1360 virtual void RemoveProperyObserver(PropertyObserver* observer) {} | 1590 virtual void RemoveNetworkObserver(const std::string& service_path, |
| 1591 NetworkObserver* observer) {} |
| 1592 virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) {} |
| 1593 virtual void AddCellularDataPlanObserver( |
| 1594 CellularDataPlanObserver* observer) {} |
| 1595 virtual void RemoveCellularDataPlanObserver( |
| 1596 CellularDataPlanObserver* observer) {} |
1361 virtual EthernetNetwork* ethernet_network() { | 1597 virtual EthernetNetwork* ethernet_network() { |
1362 return ethernet_; | 1598 return ethernet_; |
1363 } | 1599 } |
1364 virtual bool ethernet_connecting() const { return false; } | 1600 virtual bool ethernet_connecting() const { return false; } |
1365 virtual bool ethernet_connected() const { return true; } | 1601 virtual bool ethernet_connected() const { return true; } |
1366 virtual WifiNetwork* wifi_network() { | 1602 virtual WifiNetwork* wifi_network() { |
1367 return wifi_; | 1603 return wifi_; |
1368 } | 1604 } |
1369 virtual bool wifi_connecting() const { return false; } | 1605 virtual bool wifi_connecting() const { return false; } |
1370 virtual bool wifi_connected() const { return false; } | 1606 virtual bool wifi_connected() const { return false; } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1415 virtual void DisconnectFromWirelessNetwork(const WirelessNetwork* network) {} | 1651 virtual void DisconnectFromWirelessNetwork(const WirelessNetwork* network) {} |
1416 virtual void SaveCellularNetwork(const CellularNetwork* network) {} | 1652 virtual void SaveCellularNetwork(const CellularNetwork* network) {} |
1417 virtual void SaveWifiNetwork(const WifiNetwork* network) {} | 1653 virtual void SaveWifiNetwork(const WifiNetwork* network) {} |
1418 virtual void ForgetWifiNetwork(const std::string& service_path) {} | 1654 virtual void ForgetWifiNetwork(const std::string& service_path) {} |
1419 virtual bool ethernet_available() const { return true; } | 1655 virtual bool ethernet_available() const { return true; } |
1420 virtual bool wifi_available() const { return false; } | 1656 virtual bool wifi_available() const { return false; } |
1421 virtual bool cellular_available() const { return false; } | 1657 virtual bool cellular_available() const { return false; } |
1422 virtual bool ethernet_enabled() const { return true; } | 1658 virtual bool ethernet_enabled() const { return true; } |
1423 virtual bool wifi_enabled() const { return false; } | 1659 virtual bool wifi_enabled() const { return false; } |
1424 virtual bool cellular_enabled() const { return false; } | 1660 virtual bool cellular_enabled() const { return false; } |
| 1661 virtual const Network* active_network() const { return NULL; } |
1425 virtual bool offline_mode() const { return false; } | 1662 virtual bool offline_mode() const { return false; } |
1426 virtual void EnableEthernetNetworkDevice(bool enable) {} | 1663 virtual void EnableEthernetNetworkDevice(bool enable) {} |
1427 virtual void EnableWifiNetworkDevice(bool enable) {} | 1664 virtual void EnableWifiNetworkDevice(bool enable) {} |
1428 virtual void EnableCellularNetworkDevice(bool enable) {} | 1665 virtual void EnableCellularNetworkDevice(bool enable) {} |
1429 virtual void EnableOfflineMode(bool enable) {} | 1666 virtual void EnableOfflineMode(bool enable) {} |
1430 virtual NetworkIPConfigVector GetIPConfigs(const std::string& device_path, | 1667 virtual NetworkIPConfigVector GetIPConfigs(const std::string& device_path, |
1431 std::string* hardware_address) { | 1668 std::string* hardware_address) { |
1432 hardware_address->clear(); | 1669 hardware_address->clear(); |
1433 return NetworkIPConfigVector(); | 1670 return NetworkIPConfigVector(); |
1434 } | 1671 } |
(...skipping 15 matching lines...) Expand all Loading... |
1450 return new NetworkLibraryStubImpl(); | 1687 return new NetworkLibraryStubImpl(); |
1451 else | 1688 else |
1452 return new NetworkLibraryImpl(); | 1689 return new NetworkLibraryImpl(); |
1453 } | 1690 } |
1454 | 1691 |
1455 } // namespace chromeos | 1692 } // namespace chromeos |
1456 | 1693 |
1457 // Allows InvokeLater without adding refcounting. This class is a Singleton and | 1694 // Allows InvokeLater without adding refcounting. This class is a Singleton and |
1458 // won't be deleted until it's last InvokeLater is run. | 1695 // won't be deleted until it's last InvokeLater is run. |
1459 DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::NetworkLibraryImpl); | 1696 DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::NetworkLibraryImpl); |
OLD | NEW |