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