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 |
21 // Helper function to wrap Html with <th> tag. | 138 // Helper function to wrap Html with <th> tag. |
22 static std::string WrapWithTH(std::string text) { | 139 static std::string WrapWithTH(std::string text) { |
23 return "<th>" + text + "</th>"; | 140 return "<th>" + text + "</th>"; |
24 } | 141 } |
25 | 142 |
26 // Helper function to wrap Html with <td> tag. | 143 // Helper function to wrap Html with <td> tag. |
27 static std::string WrapWithTD(std::string text) { | 144 static std::string WrapWithTD(std::string text) { |
28 return "<td>" + text + "</td>"; | 145 return "<td>" + text + "</td>"; |
29 } | 146 } |
30 | 147 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 state_ = network.state(); | 209 state_ = network.state(); |
93 error_ = network.error(); | 210 error_ = network.error(); |
94 } | 211 } |
95 | 212 |
96 void Network::Clear() { | 213 void Network::Clear() { |
97 state_ = STATE_UNKNOWN; | 214 state_ = STATE_UNKNOWN; |
98 error_ = ERROR_UNKNOWN; | 215 error_ = ERROR_UNKNOWN; |
99 service_path_.clear(); | 216 service_path_.clear(); |
100 device_path_.clear(); | 217 device_path_.clear(); |
101 ip_address_.clear(); | 218 ip_address_.clear(); |
| 219 is_active_ = false; |
102 } | 220 } |
103 | 221 |
104 Network::Network(const ServiceInfo* service) { | 222 Network::Network(const ServiceInfo* service) { |
105 type_ = service->type; | 223 type_ = service->type; |
106 state_ = service->state; | 224 state_ = service->state; |
107 error_ = service->error; | 225 error_ = service->error; |
108 service_path_ = SafeString(service->service_path); | 226 service_path_ = SafeString(service->service_path); |
109 device_path_ = SafeString(service->device_path); | 227 device_path_ = SafeString(service->device_path); |
| 228 is_active_ = service->is_active; |
110 ip_address_.clear(); | 229 ip_address_.clear(); |
111 // If connected, get ip config. | 230 // If connected, get ip config. |
112 if (EnsureCrosLoaded() && connected() && service->device_path) { | 231 if (EnsureCrosLoaded() && connected() && service->device_path) { |
113 IPConfigStatus* ipconfig_status = ListIPConfigs(service->device_path); | 232 IPConfigStatus* ipconfig_status = ListIPConfigs(service->device_path); |
114 if (ipconfig_status) { | 233 if (ipconfig_status) { |
115 for (int i = 0; i < ipconfig_status->size; i++) { | 234 for (int i = 0; i < ipconfig_status->size; i++) { |
116 IPConfig ipconfig = ipconfig_status->ips[i]; | 235 IPConfig ipconfig = ipconfig_status->ips[i]; |
117 if (strlen(ipconfig.address) > 0) | 236 if (strlen(ipconfig.address) > 0) |
118 ip_address_ = ipconfig.address; | 237 ip_address_ = ipconfig.address; |
119 } | 238 } |
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 } | 626 } |
508 return false; | 627 return false; |
509 } | 628 } |
510 | 629 |
511 //////////////////////////////////////////////////////////////////////////////// | 630 //////////////////////////////////////////////////////////////////////////////// |
512 // NetworkLibrary | 631 // NetworkLibrary |
513 | 632 |
514 class NetworkLibraryImpl : public NetworkLibrary { | 633 class NetworkLibraryImpl : public NetworkLibrary { |
515 public: | 634 public: |
516 NetworkLibraryImpl() | 635 NetworkLibraryImpl() |
517 : network_status_connection_(NULL), | 636 : network_manager_monitor_(NULL), |
518 data_plan_monitor_(NULL), | 637 data_plan_monitor_(NULL), |
519 ethernet_(NULL), | 638 ethernet_(NULL), |
520 wifi_(NULL), | 639 wifi_(NULL), |
521 cellular_(NULL), | 640 cellular_(NULL), |
522 available_devices_(0), | 641 available_devices_(0), |
523 enabled_devices_(0), | 642 enabled_devices_(0), |
524 connected_devices_(0), | 643 connected_devices_(0), |
525 offline_mode_(false) { | 644 offline_mode_(false) { |
526 if (EnsureCrosLoaded()) { | 645 if (EnsureCrosLoaded()) { |
527 Init(); | 646 Init(); |
| 647 network_manager_monitor_ = |
| 648 MonitorNetworkManager(&NetworkManagerStatusChangedHandler, |
| 649 this); |
| 650 data_plan_monitor_ = MonitorCellularDataPlan(&DataPlanUpdateHandler, |
| 651 this); |
528 } else { | 652 } else { |
529 InitTestData(); | 653 InitTestData(); |
530 } | 654 } |
531 } | 655 } |
532 | 656 |
533 ~NetworkLibraryImpl() { | 657 ~NetworkLibraryImpl() { |
534 if (network_status_connection_) { | 658 network_manager_observers_.Clear(); |
535 DisconnectMonitorNetwork(network_status_connection_); | 659 if (network_manager_monitor_) |
536 } | 660 DisconnectPropertyChangeMonitor(network_manager_monitor_); |
537 if (data_plan_monitor_) { | 661 data_plan_observers_.Clear(); |
| 662 if (data_plan_monitor_) |
538 DisconnectDataPlanUpdateMonitor(data_plan_monitor_); | 663 DisconnectDataPlanUpdateMonitor(data_plan_monitor_); |
539 } | 664 STLDeleteValues(&network_observers_); |
540 // DCHECK(!observers_.size()); | |
541 DCHECK(!property_observers_.size()); | |
542 STLDeleteValues(&property_observers_); | |
543 ClearNetworks(); | 665 ClearNetworks(); |
544 } | 666 } |
545 | 667 |
546 void AddObserver(Observer* observer) { | 668 virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) { |
547 observers_.AddObserver(observer); | 669 if (!network_manager_observers_.HasObserver(observer)) |
| 670 network_manager_observers_.AddObserver(observer); |
548 } | 671 } |
549 | 672 |
550 void RemoveObserver(Observer* observer) { | 673 virtual void RemoveNetworkManagerObserver(NetworkManagerObserver* observer) { |
551 observers_.RemoveObserver(observer); | 674 network_manager_observers_.RemoveObserver(observer); |
552 } | 675 } |
553 | 676 |
554 virtual void AddProperyObserver(const char* service_path, | 677 virtual void AddNetworkObserver(const std::string& service_path, |
555 PropertyObserver* observer) { | 678 NetworkObserver* observer) { |
556 DCHECK(service_path); | |
557 DCHECK(observer); | 679 DCHECK(observer); |
558 if (!EnsureCrosLoaded()) | 680 if (!EnsureCrosLoaded()) |
559 return; | 681 return; |
560 // First, add the observer to the callback map. | 682 // First, add the observer to the callback map. |
561 PropertyChangeObserverMap::iterator iter = property_observers_.find( | 683 NetworkObserverMap::iterator iter = network_observers_.find(service_path); |
562 std::string(service_path)); | 684 NetworkObserverList* oblist; |
563 if (iter != property_observers_.end()) { | 685 if (iter != network_observers_.end()) { |
564 iter->second->AddObserver(observer); | 686 oblist = iter->second; |
565 } else { | 687 } else { |
566 std::pair<PropertyChangeObserverMap::iterator, bool> inserted = | 688 std::pair<NetworkObserverMap::iterator, bool> inserted = |
567 property_observers_.insert( | 689 network_observers_.insert( |
568 std::pair<std::string, PropertyObserverList*>( | 690 std::make_pair<std::string, NetworkObserverList*>( |
569 std::string(service_path), | 691 service_path, |
570 new PropertyObserverList(this, service_path))); | 692 new NetworkObserverList(this, service_path))); |
571 inserted.first->second->AddObserver(observer); | 693 oblist = inserted.first->second; |
| 694 } |
| 695 if (!oblist->HasObserver(observer)) |
| 696 oblist->AddObserver(observer); |
| 697 } |
| 698 |
| 699 virtual void RemoveNetworkObserver(const std::string& service_path, |
| 700 NetworkObserver* observer) { |
| 701 DCHECK(observer); |
| 702 DCHECK(service_path.size()); |
| 703 NetworkObserverMap::iterator map_iter = |
| 704 network_observers_.find(service_path); |
| 705 if (map_iter != network_observers_.end()) { |
| 706 map_iter->second->RemoveObserver(observer); |
| 707 if (!map_iter->second->size()) { |
| 708 delete map_iter->second; |
| 709 network_observers_.erase(map_iter++); |
| 710 } |
572 } | 711 } |
573 } | 712 } |
574 | 713 |
575 virtual void RemoveProperyObserver(PropertyObserver* observer) { | 714 virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) { |
576 DCHECK(observer); | 715 DCHECK(observer); |
577 PropertyChangeObserverMap::iterator map_iter = | 716 NetworkObserverMap::iterator map_iter = network_observers_.begin(); |
578 property_observers_.begin(); | 717 while (map_iter != network_observers_.end()) { |
579 while (map_iter != property_observers_.end()) { | |
580 map_iter->second->RemoveObserver(observer); | 718 map_iter->second->RemoveObserver(observer); |
581 if (!map_iter->second->size()) { | 719 if (!map_iter->second->size()) { |
582 delete map_iter->second; | 720 delete map_iter->second; |
583 property_observers_.erase(map_iter++); | 721 network_observers_.erase(map_iter++); |
584 } else { | 722 } else { |
585 ++map_iter; | 723 ++map_iter; |
586 } | 724 } |
587 } | 725 } |
588 } | 726 } |
589 | 727 |
| 728 virtual void AddCellularDataPlanObserver(CellularDataPlanObserver* observer) { |
| 729 if (!data_plan_observers_.HasObserver(observer)) |
| 730 data_plan_observers_.AddObserver(observer); |
| 731 } |
| 732 |
| 733 virtual void RemoveCellularDataPlanObserver( |
| 734 CellularDataPlanObserver* observer) { |
| 735 data_plan_observers_.RemoveObserver(observer); |
| 736 } |
| 737 |
590 virtual EthernetNetwork* ethernet_network() { return ethernet_; } | 738 virtual EthernetNetwork* ethernet_network() { return ethernet_; } |
591 virtual bool ethernet_connecting() const { | 739 virtual bool ethernet_connecting() const { |
592 return ethernet_ ? ethernet_->connecting() : false; | 740 return ethernet_ ? ethernet_->connecting() : false; |
593 } | 741 } |
594 virtual bool ethernet_connected() const { | 742 virtual bool ethernet_connected() const { |
595 return ethernet_ ? ethernet_->connected() : false; | 743 return ethernet_ ? ethernet_->connected() : false; |
596 } | 744 } |
597 | 745 |
598 virtual WifiNetwork* wifi_network() { return wifi_; } | 746 virtual WifiNetwork* wifi_network() { return wifi_; } |
599 virtual bool wifi_connecting() const { | 747 virtual bool wifi_connecting() const { |
(...skipping 13 matching lines...) Expand all Loading... |
613 | 761 |
614 bool Connected() const { | 762 bool Connected() const { |
615 return ethernet_connected() || wifi_connected() || cellular_connected(); | 763 return ethernet_connected() || wifi_connected() || cellular_connected(); |
616 } | 764 } |
617 | 765 |
618 bool Connecting() const { | 766 bool Connecting() const { |
619 return ethernet_connecting() || wifi_connecting() || cellular_connecting(); | 767 return ethernet_connecting() || wifi_connecting() || cellular_connecting(); |
620 } | 768 } |
621 | 769 |
622 const std::string& IPAddress() const { | 770 const std::string& IPAddress() const { |
623 // Returns highest priority IP address. | 771 // Returns IP address for the active network. |
624 if (ethernet_connected()) | 772 const Network* active = active_network(); |
| 773 if (active != NULL) |
| 774 return active->ip_address(); |
| 775 if (ethernet_) |
625 return ethernet_->ip_address(); | 776 return ethernet_->ip_address(); |
626 if (wifi_connected()) | 777 static std::string null_address("0.0.0.0"); |
627 return wifi_->ip_address(); | 778 return null_address; |
628 if (cellular_connected()) | |
629 return cellular_->ip_address(); | |
630 return ethernet_->ip_address(); | |
631 } | 779 } |
632 | 780 |
633 virtual const WifiNetworkVector& wifi_networks() const { | 781 virtual const WifiNetworkVector& wifi_networks() const { |
634 return wifi_networks_; | 782 return wifi_networks_; |
635 } | 783 } |
636 | 784 |
637 virtual const WifiNetworkVector& remembered_wifi_networks() const { | 785 virtual const WifiNetworkVector& remembered_wifi_networks() const { |
638 return remembered_wifi_networks_; | 786 return remembered_wifi_networks_; |
639 } | 787 } |
640 | 788 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
685 return true; | 833 return true; |
686 } | 834 } |
687 | 835 |
688 virtual void ConnectToWifiNetwork(const WifiNetwork* network, | 836 virtual void ConnectToWifiNetwork(const WifiNetwork* network, |
689 const std::string& password, | 837 const std::string& password, |
690 const std::string& identity, | 838 const std::string& identity, |
691 const std::string& certpath) { | 839 const std::string& certpath) { |
692 DCHECK(network); | 840 DCHECK(network); |
693 if (!EnsureCrosLoaded()) | 841 if (!EnsureCrosLoaded()) |
694 return; | 842 return; |
| 843 // TODO(ers) make wifi the highest priority service type |
695 if (ConnectToNetworkWithCertInfo(network->service_path().c_str(), | 844 if (ConnectToNetworkWithCertInfo(network->service_path().c_str(), |
696 password.empty() ? NULL : password.c_str(), | 845 password.empty() ? NULL : password.c_str(), |
697 identity.empty() ? NULL : identity.c_str(), | 846 identity.empty() ? NULL : identity.c_str(), |
698 certpath.empty() ? NULL : certpath.c_str())) { | 847 certpath.empty() ? NULL : certpath.c_str())) { |
699 // Update local cache and notify listeners. | 848 // Update local cache and notify listeners. |
700 WifiNetwork* wifi = GetWirelessNetworkByPath( | 849 WifiNetwork* wifi = GetWirelessNetworkByPath( |
701 wifi_networks_, network->service_path()); | 850 wifi_networks_, network->service_path()); |
702 if (wifi) { | 851 if (wifi) { |
703 wifi->set_passphrase(password); | 852 wifi->set_passphrase(password); |
704 wifi->set_identity(identity); | 853 wifi->set_identity(identity); |
705 wifi->set_cert_path(certpath); | 854 wifi->set_cert_path(certpath); |
706 wifi->set_connecting(true); | 855 wifi->set_connecting(true); |
707 wifi_ = wifi; | 856 wifi_ = wifi; |
708 } | 857 } |
709 NotifyNetworkChanged(); | 858 NotifyNetworkManagerChanged(); |
710 } | 859 } |
711 } | 860 } |
712 | 861 |
713 virtual void ConnectToWifiNetwork(ConnectionSecurity security, | 862 virtual void ConnectToWifiNetwork(ConnectionSecurity security, |
714 const std::string& ssid, | 863 const std::string& ssid, |
715 const std::string& password, | 864 const std::string& password, |
716 const std::string& identity, | 865 const std::string& identity, |
717 const std::string& certpath, | 866 const std::string& certpath, |
718 bool auto_connect) { | 867 bool auto_connect) { |
719 if (!EnsureCrosLoaded()) | 868 if (!EnsureCrosLoaded()) |
720 return; | 869 return; |
721 | 870 |
722 // First create a service from hidden network. | 871 // First create a service from hidden network. |
723 ServiceInfo* service = GetWifiService(ssid.c_str(), security); | 872 ServiceInfo* service = GetWifiService(ssid.c_str(), security); |
724 if (service) { | 873 if (service) { |
725 // Set auto-connect. | 874 // Set auto-connect. |
726 SetAutoConnect(service->service_path, auto_connect); | 875 SetAutoConnect(service->service_path, auto_connect); |
727 // Now connect to that service. | 876 // Now connect to that service. |
| 877 // TODO(ers) make wifi the highest priority service type |
728 ConnectToNetworkWithCertInfo(service->service_path, | 878 ConnectToNetworkWithCertInfo(service->service_path, |
729 password.empty() ? NULL : password.c_str(), | 879 password.empty() ? NULL : password.c_str(), |
730 identity.empty() ? NULL : identity.c_str(), | 880 identity.empty() ? NULL : identity.c_str(), |
731 certpath.empty() ? NULL : certpath.c_str()); | 881 certpath.empty() ? NULL : certpath.c_str()); |
732 | 882 |
733 // Clean up ServiceInfo object. | 883 // Clean up ServiceInfo object. |
734 FreeServiceInfo(service); | 884 FreeServiceInfo(service); |
735 } else { | 885 } else { |
736 LOG(WARNING) << "Cannot find hidden network: " << ssid; | 886 LOG(WARNING) << "Cannot find hidden network: " << ssid; |
737 // TODO(chocobo): Show error message. | 887 // TODO(chocobo): Show error message. |
738 } | 888 } |
739 } | 889 } |
740 | 890 |
741 virtual void ConnectToCellularNetwork(const CellularNetwork* network) { | 891 virtual void ConnectToCellularNetwork(const CellularNetwork* network) { |
742 DCHECK(network); | 892 DCHECK(network); |
743 if (!EnsureCrosLoaded()) | 893 if (!EnsureCrosLoaded()) |
744 return; | 894 return; |
| 895 // TODO(ers) make cellular the highest priority service type |
745 if (network && ConnectToNetwork(network->service_path().c_str(), NULL)) { | 896 if (network && ConnectToNetwork(network->service_path().c_str(), NULL)) { |
746 // Update local cache and notify listeners. | 897 // Update local cache and notify listeners. |
747 CellularNetwork* cellular = GetWirelessNetworkByPath( | 898 CellularNetwork* cellular = GetWirelessNetworkByPath( |
748 cellular_networks_, network->service_path()); | 899 cellular_networks_, network->service_path()); |
749 if (cellular) { | 900 if (cellular) { |
750 cellular->set_connecting(true); | 901 cellular->set_connecting(true); |
751 cellular_ = cellular; | 902 cellular_ = cellular; |
752 } | 903 } |
753 NotifyNetworkChanged(); | 904 NotifyNetworkManagerChanged(); |
754 } | 905 } |
755 } | 906 } |
756 | 907 |
757 virtual void RefreshCellularDataPlans(const CellularNetwork* network) { | 908 virtual void RefreshCellularDataPlans(const CellularNetwork* network) { |
758 DCHECK(network); | 909 DCHECK(network); |
759 if (!EnsureCrosLoaded() || !network) | 910 if (!EnsureCrosLoaded() || !network) |
760 return; | 911 return; |
761 RequestCellularDataPlanUpdate(network->service_path().c_str()); | 912 RequestCellularDataPlanUpdate(network->service_path().c_str()); |
762 } | 913 } |
763 | 914 |
764 virtual void DisconnectFromWirelessNetwork(const WirelessNetwork* network) { | 915 virtual void DisconnectFromWirelessNetwork(const WirelessNetwork* network) { |
765 DCHECK(network); | 916 DCHECK(network); |
766 if (!EnsureCrosLoaded() || !network) | 917 if (!EnsureCrosLoaded() || !network) |
767 return; | 918 return; |
| 919 // TODO(ers) restore default service type priority ordering? |
768 if (DisconnectFromNetwork(network->service_path().c_str())) { | 920 if (DisconnectFromNetwork(network->service_path().c_str())) { |
769 // Update local cache and notify listeners. | 921 // Update local cache and notify listeners. |
770 if (network->type() == TYPE_WIFI) { | 922 if (network->type() == TYPE_WIFI) { |
771 WifiNetwork* wifi = GetWirelessNetworkByPath( | 923 WifiNetwork* wifi = GetWirelessNetworkByPath( |
772 wifi_networks_, network->service_path()); | 924 wifi_networks_, network->service_path()); |
773 if (wifi) { | 925 if (wifi) { |
774 wifi->set_connected(false); | 926 wifi->set_connected(false); |
775 wifi_ = NULL; | 927 wifi_ = NULL; |
776 } | 928 } |
777 } else if (network->type() == TYPE_CELLULAR) { | 929 } else if (network->type() == TYPE_CELLULAR) { |
778 CellularNetwork* cellular = GetWirelessNetworkByPath( | 930 CellularNetwork* cellular = GetWirelessNetworkByPath( |
779 cellular_networks_, network->service_path()); | 931 cellular_networks_, network->service_path()); |
780 if (cellular) { | 932 if (cellular) { |
781 cellular->set_connected(false); | 933 cellular->set_connected(false); |
782 cellular_ = NULL; | 934 cellular_ = NULL; |
783 } | 935 } |
784 } | 936 } |
785 NotifyNetworkChanged(); | 937 NotifyNetworkManagerChanged(); |
786 } | 938 } |
787 } | 939 } |
788 | 940 |
789 virtual void SaveCellularNetwork(const CellularNetwork* network) { | 941 virtual void SaveCellularNetwork(const CellularNetwork* network) { |
790 DCHECK(network); | 942 DCHECK(network); |
791 // Update the cellular network with libcros. | 943 // Update the cellular network with libcros. |
792 if (!EnsureCrosLoaded() || !network) | 944 if (!EnsureCrosLoaded() || !network) |
793 return; | 945 return; |
794 | 946 |
795 SetAutoConnect(network->service_path().c_str(), network->auto_connect()); | 947 SetAutoConnect(network->service_path().c_str(), network->auto_connect()); |
(...skipping 21 matching lines...) Expand all Loading... |
817 for (WifiNetworkVector::iterator iter = | 969 for (WifiNetworkVector::iterator iter = |
818 remembered_wifi_networks_.begin(); | 970 remembered_wifi_networks_.begin(); |
819 iter != remembered_wifi_networks_.end(); | 971 iter != remembered_wifi_networks_.end(); |
820 ++iter) { | 972 ++iter) { |
821 if ((*iter)->service_path() == service_path) { | 973 if ((*iter)->service_path() == service_path) { |
822 delete (*iter); | 974 delete (*iter); |
823 remembered_wifi_networks_.erase(iter); | 975 remembered_wifi_networks_.erase(iter); |
824 break; | 976 break; |
825 } | 977 } |
826 } | 978 } |
827 NotifyNetworkChanged(); | 979 NotifyNetworkManagerChanged(); |
828 } | 980 } |
829 } | 981 } |
830 | 982 |
831 virtual bool ethernet_available() const { | 983 virtual bool ethernet_available() const { |
832 return available_devices_ & (1 << TYPE_ETHERNET); | 984 return available_devices_ & (1 << TYPE_ETHERNET); |
833 } | 985 } |
834 virtual bool wifi_available() const { | 986 virtual bool wifi_available() const { |
835 return available_devices_ & (1 << TYPE_WIFI); | 987 return available_devices_ & (1 << TYPE_WIFI); |
836 } | 988 } |
837 virtual bool cellular_available() const { | 989 virtual bool cellular_available() const { |
838 return available_devices_ & (1 << TYPE_CELLULAR); | 990 return available_devices_ & (1 << TYPE_CELLULAR); |
839 } | 991 } |
840 | 992 |
841 virtual bool ethernet_enabled() const { | 993 virtual bool ethernet_enabled() const { |
842 return enabled_devices_ & (1 << TYPE_ETHERNET); | 994 return enabled_devices_ & (1 << TYPE_ETHERNET); |
843 } | 995 } |
844 virtual bool wifi_enabled() const { | 996 virtual bool wifi_enabled() const { |
845 return enabled_devices_ & (1 << TYPE_WIFI); | 997 return enabled_devices_ & (1 << TYPE_WIFI); |
846 } | 998 } |
847 virtual bool cellular_enabled() const { | 999 virtual bool cellular_enabled() const { |
848 return enabled_devices_ & (1 << TYPE_CELLULAR); | 1000 return enabled_devices_ & (1 << TYPE_CELLULAR); |
849 } | 1001 } |
850 | 1002 |
851 virtual bool offline_mode() const { return offline_mode_; } | 1003 virtual bool offline_mode() const { return offline_mode_; } |
852 | 1004 |
| 1005 virtual const Network* active_network() const { |
| 1006 if (ethernet_ && ethernet_->is_active()) |
| 1007 return ethernet_; |
| 1008 if (wifi_ && wifi_->is_active()) |
| 1009 return wifi_; |
| 1010 if (cellular_ && cellular_->is_active()) |
| 1011 return cellular_; |
| 1012 return NULL; |
| 1013 } |
| 1014 |
853 virtual void EnableEthernetNetworkDevice(bool enable) { | 1015 virtual void EnableEthernetNetworkDevice(bool enable) { |
854 EnableNetworkDeviceType(TYPE_ETHERNET, enable); | 1016 EnableNetworkDeviceType(TYPE_ETHERNET, enable); |
855 } | 1017 } |
856 | 1018 |
857 virtual void EnableWifiNetworkDevice(bool enable) { | 1019 virtual void EnableWifiNetworkDevice(bool enable) { |
858 EnableNetworkDeviceType(TYPE_WIFI, enable); | 1020 EnableNetworkDeviceType(TYPE_WIFI, enable); |
859 } | 1021 } |
860 | 1022 |
861 virtual void EnableCellularNetworkDevice(bool enable) { | 1023 virtual void EnableCellularNetworkDevice(bool enable) { |
862 EnableNetworkDeviceType(TYPE_CELLULAR, enable); | 1024 EnableNetworkDeviceType(TYPE_CELLULAR, enable); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
948 output.append("<tr>" + ToHtmlTableRow(remembered_wifi_networks_[i]) + | 1110 output.append("<tr>" + ToHtmlTableRow(remembered_wifi_networks_[i]) + |
949 "</tr>"); | 1111 "</tr>"); |
950 } | 1112 } |
951 | 1113 |
952 output.append("</table></body></html>"); | 1114 output.append("</table></body></html>"); |
953 return output; | 1115 return output; |
954 } | 1116 } |
955 | 1117 |
956 private: | 1118 private: |
957 | 1119 |
958 class PropertyObserverList : public ObserverList<PropertyObserver> { | 1120 class NetworkObserverList : public ObserverList<NetworkObserver> { |
959 public: | 1121 public: |
960 PropertyObserverList(NetworkLibraryImpl* library, | 1122 NetworkObserverList(NetworkLibraryImpl* library, |
961 const char* service_path) { | 1123 const std::string& service_path) { |
962 DCHECK(service_path); | 1124 network_monitor_ = MonitorNetworkService(&NetworkStatusChangedHandler, |
963 property_change_monitor_ = MonitorNetworkService(&PropertyChangeHandler, | 1125 service_path.c_str(), |
964 service_path, | 1126 library); |
965 library); | |
966 } | 1127 } |
967 | 1128 |
968 virtual ~PropertyObserverList() { | 1129 virtual ~NetworkObserverList() { |
969 if (property_change_monitor_) | 1130 if (network_monitor_) |
970 DisconnectPropertyChangeMonitor(property_change_monitor_); | 1131 DisconnectPropertyChangeMonitor(network_monitor_); |
971 } | 1132 } |
972 | 1133 |
973 private: | 1134 private: |
974 static void PropertyChangeHandler(void* object, | 1135 static void NetworkStatusChangedHandler(void* object, |
975 const char* path, | 1136 const char* path, |
976 const char* key, | 1137 const char* key, |
977 const Value* value) { | 1138 const Value* value) { |
978 NetworkLibraryImpl* network = static_cast<NetworkLibraryImpl*>(object); | 1139 NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object); |
979 DCHECK(network); | 1140 DCHECK(networklib); |
980 network->NotifyPropertyChange(path, key, value); | 1141 networklib->UpdateNetworkStatus(path, key, value); |
981 } | 1142 } |
982 PropertyChangeMonitor property_change_monitor_; | 1143 PropertyChangeMonitor network_monitor_; |
983 }; | 1144 }; |
984 | 1145 |
985 typedef std::map<std::string, PropertyObserverList*> | 1146 typedef std::map<std::string, NetworkObserverList*> NetworkObserverMap; |
986 PropertyChangeObserverMap; | |
987 | 1147 |
988 static void NetworkStatusChangedHandler(void* object) { | 1148 static void NetworkManagerStatusChangedHandler(void* object, |
989 NetworkLibraryImpl* network = static_cast<NetworkLibraryImpl*>(object); | 1149 const char* path, |
990 DCHECK(network); | 1150 const char* key, |
991 network->UpdateNetworkStatus(); | 1151 const Value* value) { |
| 1152 NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object); |
| 1153 DCHECK(networklib); |
| 1154 networklib->UpdateNetworkManagerStatus(); |
992 } | 1155 } |
993 | 1156 |
994 static void DataPlanUpdateHandler(void* object, | 1157 static void DataPlanUpdateHandler(void* object, |
995 const char* modem_service_path, | 1158 const char* modem_service_path, |
996 const CellularDataPlanList* dataplan) { | 1159 const CellularDataPlanList* dataplan) { |
997 NetworkLibraryImpl* network = static_cast<NetworkLibraryImpl*>(object); | 1160 NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object); |
998 DCHECK(network && network->cellular_network()); | 1161 DCHECK(networklib && networklib->cellular_network()); |
999 // Store data plan for currently connected cellular network. | 1162 // Store data plan for currently connected cellular network. |
1000 if (network->cellular_network()->service_path() | 1163 if (networklib->cellular_network()->service_path() |
1001 .compare(modem_service_path) == 0) { | 1164 .compare(modem_service_path) == 0) { |
1002 if (dataplan != NULL) { | 1165 if (dataplan != NULL) { |
1003 network->UpdateCellularDataPlan(dataplan); | 1166 networklib->UpdateCellularDataPlan(dataplan); |
1004 } | 1167 } |
1005 } | 1168 } |
1006 } | 1169 } |
1007 | 1170 |
1008 static void ParseSystem(SystemInfo* system, | 1171 static void ParseSystem(SystemInfo* system, |
1009 EthernetNetwork** ethernet, | 1172 EthernetNetwork** ethernet, |
1010 WifiNetworkVector* wifi_networks, | 1173 WifiNetworkVector* wifi_networks, |
1011 CellularNetworkVector* cellular_networks, | 1174 CellularNetworkVector* cellular_networks, |
1012 WifiNetworkVector* remembered_wifi_networks) { | 1175 WifiNetworkVector* remembered_wifi_networks) { |
1013 DVLOG(1) << "ParseSystem:"; | 1176 DVLOG(1) << "ParseSystem:"; |
1014 DCHECK(!(*ethernet)); | 1177 DCHECK(!(*ethernet)); |
1015 for (int i = 0; i < system->service_size; i++) { | 1178 for (int i = 0; i < system->service_size; i++) { |
1016 const ServiceInfo* service = system->GetServiceInfo(i); | 1179 const ServiceInfo* service = system->GetServiceInfo(i); |
1017 DVLOG(1) << " (" << service->type << ") " << service->name | 1180 DVLOG(1) << " (" << service->type << ") " << service->name |
1018 << " mode=" << service->mode | 1181 << " mode=" << service->mode |
1019 << " state=" << service->state | 1182 << " state=" << service->state |
1020 << " sec=" << service->security | 1183 << " sec=" << service->security |
1021 << " req=" << service->passphrase_required | 1184 << " req=" << service->passphrase_required |
1022 << " pass=" << service->passphrase | 1185 << " pass=" << service->passphrase |
1023 << " id=" << service->identity | 1186 << " id=" << service->identity |
1024 << " certpath=" << service->cert_path | 1187 << " certpath=" << service->cert_path |
1025 << " str=" << service->strength | 1188 << " str=" << service->strength |
1026 << " fav=" << service->favorite | 1189 << " fav=" << service->favorite |
1027 << " auto=" << service->auto_connect | 1190 << " auto=" << service->auto_connect |
| 1191 << " is_active=" << service->is_active |
1028 << " error=" << service->error; | 1192 << " error=" << service->error; |
1029 // Once a connected ethernet service is found, disregard other ethernet | 1193 // Once a connected ethernet service is found, disregard other ethernet |
1030 // services that are also found | 1194 // services that are also found |
1031 if (service->type == TYPE_ETHERNET) | 1195 if (service->type == TYPE_ETHERNET) |
1032 (*ethernet) = new EthernetNetwork(service); | 1196 (*ethernet) = new EthernetNetwork(service); |
1033 else if (service->type == TYPE_WIFI) { | 1197 else if (service->type == TYPE_WIFI) { |
1034 wifi_networks->push_back(new WifiNetwork(service)); | 1198 wifi_networks->push_back(new WifiNetwork(service)); |
1035 } else if (service->type == TYPE_CELLULAR) { | 1199 } else if (service->type == TYPE_CELLULAR) { |
1036 cellular_networks->push_back(new CellularNetwork(service)); | 1200 cellular_networks->push_back(new CellularNetwork(service)); |
1037 } | 1201 } |
(...skipping 19 matching lines...) Expand all Loading... |
1057 << " certpath=" << service->cert_path | 1221 << " certpath=" << service->cert_path |
1058 << " auto=" << service->auto_connect; | 1222 << " auto=" << service->auto_connect; |
1059 if (service->type == TYPE_WIFI) { | 1223 if (service->type == TYPE_WIFI) { |
1060 remembered_wifi_networks->push_back(new WifiNetwork(service)); | 1224 remembered_wifi_networks->push_back(new WifiNetwork(service)); |
1061 } | 1225 } |
1062 } | 1226 } |
1063 } | 1227 } |
1064 } | 1228 } |
1065 | 1229 |
1066 void Init() { | 1230 void Init() { |
1067 // First, get the currently available networks. This data is cached | 1231 // First, get the currently available networks. This data is cached |
1068 // on the connman side, so the call should be quick. | 1232 // on the connman side, so the call should be quick. |
1069 VLOG(1) << "Getting initial CrOS network info."; | 1233 VLOG(1) << "Getting initial CrOS network info."; |
1070 UpdateSystemInfo(); | 1234 UpdateSystemInfo(); |
1071 | |
1072 VLOG(1) << "Registering for network status updates."; | |
1073 // Now, register to receive updates on network status. | |
1074 network_status_connection_ = MonitorNetwork(&NetworkStatusChangedHandler, | |
1075 this); | |
1076 VLOG(1) << "Registering for cellular data plan updates."; | |
1077 data_plan_monitor_ = MonitorCellularDataPlan(&DataPlanUpdateHandler, this); | |
1078 } | 1235 } |
1079 | 1236 |
1080 void InitTestData() { | 1237 void InitTestData() { |
1081 ethernet_ = new EthernetNetwork(); | 1238 ethernet_ = new EthernetNetwork(); |
1082 ethernet_->set_connected(true); | 1239 ethernet_->set_connected(true); |
1083 ethernet_->set_service_path("eth1"); | 1240 ethernet_->set_service_path("eth1"); |
1084 | 1241 |
1085 STLDeleteElements(&wifi_networks_); | 1242 STLDeleteElements(&wifi_networks_); |
1086 wifi_networks_.clear(); | 1243 wifi_networks_.clear(); |
1087 WifiNetwork* wifi1 = new WifiNetwork(); | 1244 WifiNetwork* wifi1 = new WifiNetwork(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1129 int devices = (1 << TYPE_ETHERNET) | (1 << TYPE_WIFI) | | 1286 int devices = (1 << TYPE_ETHERNET) | (1 << TYPE_WIFI) | |
1130 (1 << TYPE_CELLULAR); | 1287 (1 << TYPE_CELLULAR); |
1131 available_devices_ = devices; | 1288 available_devices_ = devices; |
1132 enabled_devices_ = devices; | 1289 enabled_devices_ = devices; |
1133 connected_devices_ = devices; | 1290 connected_devices_ = devices; |
1134 offline_mode_ = false; | 1291 offline_mode_ = false; |
1135 } | 1292 } |
1136 | 1293 |
1137 void UpdateSystemInfo() { | 1294 void UpdateSystemInfo() { |
1138 if (EnsureCrosLoaded()) { | 1295 if (EnsureCrosLoaded()) { |
1139 UpdateNetworkStatus(); | 1296 UpdateNetworkManagerStatus(); |
1140 } | 1297 } |
1141 } | 1298 } |
1142 | 1299 |
1143 WifiNetwork* GetWifiNetworkByName(const std::string& name) { | 1300 WifiNetwork* GetWifiNetworkByName(const std::string& name) { |
1144 for (size_t i = 0; i < wifi_networks_.size(); ++i) { | 1301 for (size_t i = 0; i < wifi_networks_.size(); ++i) { |
1145 if (wifi_networks_[i]->name().compare(name) == 0) { | 1302 if (wifi_networks_[i]->name().compare(name) == 0) { |
1146 return wifi_networks_[i]; | 1303 return wifi_networks_[i]; |
1147 } | 1304 } |
1148 } | 1305 } |
1149 return NULL; | 1306 return NULL; |
(...skipping 28 matching lines...) Expand all Loading... |
1178 } | 1335 } |
1179 if (!enable && !(enabled_devices_ & (1 << device))) { | 1336 if (!enable && !(enabled_devices_ & (1 << device))) { |
1180 LOG(WARNING) << "Trying to disable a device that's already disabled: " | 1337 LOG(WARNING) << "Trying to disable a device that's already disabled: " |
1181 << device; | 1338 << device; |
1182 return; | 1339 return; |
1183 } | 1340 } |
1184 | 1341 |
1185 EnableNetworkDevice(device, enable); | 1342 EnableNetworkDevice(device, enable); |
1186 } | 1343 } |
1187 | 1344 |
1188 void NotifyNetworkChanged() { | 1345 void NotifyNetworkManagerChanged() { |
1189 FOR_EACH_OBSERVER(Observer, observers_, NetworkChanged(this)); | 1346 FOR_EACH_OBSERVER(NetworkManagerObserver, |
| 1347 network_manager_observers_, |
| 1348 OnNetworkManagerChanged(this)); |
| 1349 } |
| 1350 |
| 1351 void NotifyNetworkChanged(Network* network) { |
| 1352 DCHECK(network); |
| 1353 NetworkObserverMap::const_iterator iter = network_observers_.find( |
| 1354 network->service_path()); |
| 1355 if (iter != network_observers_.end()) { |
| 1356 FOR_EACH_OBSERVER(NetworkObserver, |
| 1357 *(iter->second), |
| 1358 OnNetworkChanged(this, network)); |
| 1359 } else { |
| 1360 NOTREACHED() << |
| 1361 "There weren't supposed to be any property change observers of " << |
| 1362 network->service_path(); |
| 1363 } |
1190 } | 1364 } |
1191 | 1365 |
1192 void NotifyCellularDataPlanChanged() { | 1366 void NotifyCellularDataPlanChanged() { |
1193 FOR_EACH_OBSERVER(Observer, observers_, CellularDataPlanChanged(this)); | 1367 FOR_EACH_OBSERVER(CellularDataPlanObserver, |
| 1368 data_plan_observers_, |
| 1369 OnCellularDataPlanChanged(this)); |
1194 } | 1370 } |
1195 | 1371 |
1196 void NotifyPropertyChange(const char* service_path, | 1372 void UpdateNetworkManagerStatus() { |
1197 const char* key, | |
1198 const Value* value) { | |
1199 DCHECK(service_path); | |
1200 DCHECK(key); | |
1201 DCHECK(value); | |
1202 PropertyChangeObserverMap::const_iterator iter = property_observers_.find( | |
1203 std::string(service_path)); | |
1204 if (iter != property_observers_.end()) { | |
1205 FOR_EACH_OBSERVER(PropertyObserver, *(iter->second), | |
1206 PropertyChanged(service_path, key, value)); | |
1207 } else { | |
1208 NOTREACHED() << | |
1209 "There weren't supposed to be any property change observers of " << | |
1210 service_path; | |
1211 } | |
1212 } | |
1213 | |
1214 void ClearNetworks() { | |
1215 if (ethernet_) | |
1216 delete ethernet_; | |
1217 ethernet_ = NULL; | |
1218 wifi_ = NULL; | |
1219 cellular_ = NULL; | |
1220 STLDeleteElements(&wifi_networks_); | |
1221 wifi_networks_.clear(); | |
1222 STLDeleteElements(&cellular_networks_); | |
1223 cellular_networks_.clear(); | |
1224 STLDeleteElements(&remembered_wifi_networks_); | |
1225 remembered_wifi_networks_.clear(); | |
1226 } | |
1227 | |
1228 void UpdateNetworkStatus() { | |
1229 // Make sure we run on UI thread. | 1373 // Make sure we run on UI thread. |
1230 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 1374 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
1231 BrowserThread::PostTask( | 1375 BrowserThread::PostTask( |
1232 BrowserThread::UI, FROM_HERE, | 1376 BrowserThread::UI, FROM_HERE, |
1233 NewRunnableMethod(this, | 1377 NewRunnableMethod(this, |
1234 &NetworkLibraryImpl::UpdateNetworkStatus)); | 1378 &NetworkLibraryImpl::UpdateNetworkManagerStatus)); |
1235 return; | 1379 return; |
1236 } | 1380 } |
1237 | 1381 |
1238 SystemInfo* system = GetSystemInfo(); | 1382 SystemInfo* system = GetSystemInfo(); |
1239 if (!system) | 1383 if (!system) |
1240 return; | 1384 return; |
1241 | 1385 |
1242 | 1386 |
1243 std::string prev_cellular_service_path = cellular_ ? | 1387 std::string prev_cellular_service_path = cellular_ ? |
1244 cellular_->service_path() : std::string(); | 1388 cellular_->service_path() : std::string(); |
(...skipping 24 matching lines...) Expand all Loading... |
1269 } | 1413 } |
1270 break; // There is only one connected or connecting cellular network. | 1414 break; // There is only one connected or connecting cellular network. |
1271 } | 1415 } |
1272 } | 1416 } |
1273 | 1417 |
1274 available_devices_ = system->available_technologies; | 1418 available_devices_ = system->available_technologies; |
1275 enabled_devices_ = system->enabled_technologies; | 1419 enabled_devices_ = system->enabled_technologies; |
1276 connected_devices_ = system->connected_technologies; | 1420 connected_devices_ = system->connected_technologies; |
1277 offline_mode_ = system->offline_mode; | 1421 offline_mode_ = system->offline_mode; |
1278 | 1422 |
1279 NotifyNetworkChanged(); | 1423 NotifyNetworkManagerChanged(); |
1280 FreeSystemInfo(system); | 1424 FreeSystemInfo(system); |
1281 } | 1425 } |
1282 | 1426 |
| 1427 void UpdateNetworkStatus(const char* path, |
| 1428 const char* key, |
| 1429 const Value* value) { |
| 1430 if (key == NULL || value == NULL) |
| 1431 return; |
| 1432 // Make sure we run on UI thread. |
| 1433 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| 1434 BrowserThread::PostTask( |
| 1435 BrowserThread::UI, FROM_HERE, |
| 1436 NewRunnableMethod(this, |
| 1437 &NetworkLibraryImpl::UpdateNetworkStatus, |
| 1438 path, key, value)); |
| 1439 return; |
| 1440 } |
| 1441 |
| 1442 bool boolval = false; |
| 1443 int intval = 0; |
| 1444 std::string stringval; |
| 1445 Network* network; |
| 1446 if (ethernet_->service_path() == path) { |
| 1447 network = ethernet_; |
| 1448 } else { |
| 1449 CellularNetwork* cellular = |
| 1450 GetWirelessNetworkByPath(cellular_networks_, path); |
| 1451 WifiNetwork* wifi = |
| 1452 GetWirelessNetworkByPath(wifi_networks_, path); |
| 1453 if (cellular == NULL && wifi == NULL) |
| 1454 return; |
| 1455 |
| 1456 WirelessNetwork* wireless; |
| 1457 if (wifi != NULL) |
| 1458 wireless = static_cast<WirelessNetwork*>(wifi); |
| 1459 else |
| 1460 wireless = static_cast<WirelessNetwork*>(cellular); |
| 1461 |
| 1462 if (strcmp(key, kSignalStrengthProperty) == 0) { |
| 1463 if (value->GetAsInteger(&intval)) |
| 1464 wireless->set_strength(intval); |
| 1465 } else if (cellular != NULL) { |
| 1466 if (strcmp(key, kRestrictedPoolProperty) == 0) { |
| 1467 if (value->GetAsBoolean(&boolval)) |
| 1468 cellular->set_restricted_pool(boolval); |
| 1469 } else if (strcmp(key, kActivationStateProperty) == 0) { |
| 1470 if (value->GetAsString(&stringval)) |
| 1471 cellular->set_activation_state(ParseActivationState(stringval)); |
| 1472 } else if (strcmp(key, kPaymentURLProperty) == 0) { |
| 1473 if (value->GetAsString(&stringval)) |
| 1474 cellular->set_payment_url(stringval); |
| 1475 } else if (strcmp(key, kNetworkTechnologyProperty) == 0) { |
| 1476 if (value->GetAsString(&stringval)) |
| 1477 cellular->set_network_technology( |
| 1478 ParseNetworkTechnology(stringval)); |
| 1479 } else if (strcmp(key, kRoamingStateProperty) == 0) { |
| 1480 if (value->GetAsString(&stringval)) |
| 1481 cellular->set_roaming_state(ParseRoamingState(stringval)); |
| 1482 } |
| 1483 } |
| 1484 network = wireless; |
| 1485 } |
| 1486 if (strcmp(key, kIsActiveProperty) == 0) { |
| 1487 if (value->GetAsBoolean(&boolval)) |
| 1488 network->set_active(boolval); |
| 1489 } else if (strcmp(key, kStateProperty) == 0) { |
| 1490 if (value->GetAsString(&stringval)) |
| 1491 network->set_state(ParseState(stringval)); |
| 1492 } |
| 1493 NotifyNetworkChanged(network); |
| 1494 } |
| 1495 |
1283 void UpdateCellularDataPlan(const CellularDataPlanList* data_plans) { | 1496 void UpdateCellularDataPlan(const CellularDataPlanList* data_plans) { |
1284 DCHECK(cellular_); | 1497 DCHECK(cellular_); |
1285 cellular_->SetDataPlans(data_plans); | 1498 cellular_->SetDataPlans(data_plans); |
1286 NotifyCellularDataPlanChanged(); | 1499 NotifyCellularDataPlanChanged(); |
1287 } | 1500 } |
1288 | 1501 |
1289 ObserverList<Observer> observers_; | 1502 void ClearNetworks() { |
| 1503 if (ethernet_) |
| 1504 delete ethernet_; |
| 1505 ethernet_ = NULL; |
| 1506 wifi_ = NULL; |
| 1507 cellular_ = NULL; |
| 1508 STLDeleteElements(&wifi_networks_); |
| 1509 wifi_networks_.clear(); |
| 1510 STLDeleteElements(&cellular_networks_); |
| 1511 cellular_networks_.clear(); |
| 1512 STLDeleteElements(&remembered_wifi_networks_); |
| 1513 remembered_wifi_networks_.clear(); |
| 1514 } |
1290 | 1515 |
1291 // Property change observer map | 1516 // Network manager observer list |
1292 PropertyChangeObserverMap property_observers_; | 1517 ObserverList<NetworkManagerObserver> network_manager_observers_; |
1293 | 1518 |
1294 // The network status connection for monitoring network status changes. | 1519 // Cellular data plan observer list |
1295 MonitorNetworkConnection network_status_connection_; | 1520 ObserverList<CellularDataPlanObserver> data_plan_observers_; |
| 1521 |
| 1522 // Network observer map |
| 1523 NetworkObserverMap network_observers_; |
| 1524 |
| 1525 // For monitoring network manager status changes. |
| 1526 PropertyChangeMonitor network_manager_monitor_; |
1296 | 1527 |
1297 // For monitoring data plan changes to the connected cellular network. | 1528 // For monitoring data plan changes to the connected cellular network. |
1298 DataPlanUpdateMonitor data_plan_monitor_; | 1529 DataPlanUpdateMonitor data_plan_monitor_; |
1299 | 1530 |
1300 // The property change connection for monitoring service property changes. | |
1301 std::map<std::string, PropertyChangeMonitor> property_change_monitors_; | |
1302 | |
1303 // The ethernet network. | 1531 // The ethernet network. |
1304 EthernetNetwork* ethernet_; | 1532 EthernetNetwork* ethernet_; |
1305 | 1533 |
1306 // The list of available wifi networks. | 1534 // The list of available wifi networks. |
1307 WifiNetworkVector wifi_networks_; | 1535 WifiNetworkVector wifi_networks_; |
1308 | 1536 |
1309 // The current connected (or connecting) wifi network. | 1537 // The current connected (or connecting) wifi network. |
1310 WifiNetwork* wifi_; | 1538 WifiNetwork* wifi_; |
1311 | 1539 |
1312 // The remembered wifi networks. | 1540 // The remembered wifi networks. |
(...skipping 21 matching lines...) Expand all Loading... |
1334 | 1562 |
1335 class NetworkLibraryStubImpl : public NetworkLibrary { | 1563 class NetworkLibraryStubImpl : public NetworkLibrary { |
1336 public: | 1564 public: |
1337 NetworkLibraryStubImpl() | 1565 NetworkLibraryStubImpl() |
1338 : ip_address_("1.1.1.1"), | 1566 : ip_address_("1.1.1.1"), |
1339 ethernet_(new EthernetNetwork()), | 1567 ethernet_(new EthernetNetwork()), |
1340 wifi_(NULL), | 1568 wifi_(NULL), |
1341 cellular_(NULL) { | 1569 cellular_(NULL) { |
1342 } | 1570 } |
1343 ~NetworkLibraryStubImpl() { if (ethernet_) delete ethernet_; } | 1571 ~NetworkLibraryStubImpl() { if (ethernet_) delete ethernet_; } |
1344 virtual void AddObserver(Observer* observer) {} | 1572 virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) {} |
1345 virtual void RemoveObserver(Observer* observer) {} | 1573 virtual void RemoveNetworkManagerObserver(NetworkManagerObserver* observer) {} |
1346 virtual void AddProperyObserver(const char* service_path, | 1574 virtual void AddNetworkObserver(const std::string& service_path, |
1347 PropertyObserver* observer) {} | 1575 NetworkObserver* observer) {} |
1348 virtual void RemoveProperyObserver(PropertyObserver* observer) {} | 1576 virtual void RemoveNetworkObserver(const std::string& service_path, |
| 1577 NetworkObserver* observer) {} |
| 1578 virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) {} |
| 1579 virtual void AddCellularDataPlanObserver( |
| 1580 CellularDataPlanObserver* observer) {} |
| 1581 virtual void RemoveCellularDataPlanObserver( |
| 1582 CellularDataPlanObserver* observer) {} |
1349 virtual EthernetNetwork* ethernet_network() { | 1583 virtual EthernetNetwork* ethernet_network() { |
1350 return ethernet_; | 1584 return ethernet_; |
1351 } | 1585 } |
1352 virtual bool ethernet_connecting() const { return false; } | 1586 virtual bool ethernet_connecting() const { return false; } |
1353 virtual bool ethernet_connected() const { return true; } | 1587 virtual bool ethernet_connected() const { return true; } |
1354 virtual WifiNetwork* wifi_network() { | 1588 virtual WifiNetwork* wifi_network() { |
1355 return wifi_; | 1589 return wifi_; |
1356 } | 1590 } |
1357 virtual bool wifi_connecting() const { return false; } | 1591 virtual bool wifi_connecting() const { return false; } |
1358 virtual bool wifi_connected() const { return false; } | 1592 virtual bool wifi_connected() const { return false; } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1403 virtual void DisconnectFromWirelessNetwork(const WirelessNetwork* network) {} | 1637 virtual void DisconnectFromWirelessNetwork(const WirelessNetwork* network) {} |
1404 virtual void SaveCellularNetwork(const CellularNetwork* network) {} | 1638 virtual void SaveCellularNetwork(const CellularNetwork* network) {} |
1405 virtual void SaveWifiNetwork(const WifiNetwork* network) {} | 1639 virtual void SaveWifiNetwork(const WifiNetwork* network) {} |
1406 virtual void ForgetWifiNetwork(const std::string& service_path) {} | 1640 virtual void ForgetWifiNetwork(const std::string& service_path) {} |
1407 virtual bool ethernet_available() const { return true; } | 1641 virtual bool ethernet_available() const { return true; } |
1408 virtual bool wifi_available() const { return false; } | 1642 virtual bool wifi_available() const { return false; } |
1409 virtual bool cellular_available() const { return false; } | 1643 virtual bool cellular_available() const { return false; } |
1410 virtual bool ethernet_enabled() const { return true; } | 1644 virtual bool ethernet_enabled() const { return true; } |
1411 virtual bool wifi_enabled() const { return false; } | 1645 virtual bool wifi_enabled() const { return false; } |
1412 virtual bool cellular_enabled() const { return false; } | 1646 virtual bool cellular_enabled() const { return false; } |
| 1647 virtual const Network* active_network() const { return NULL; } |
1413 virtual bool offline_mode() const { return false; } | 1648 virtual bool offline_mode() const { return false; } |
1414 virtual void EnableEthernetNetworkDevice(bool enable) {} | 1649 virtual void EnableEthernetNetworkDevice(bool enable) {} |
1415 virtual void EnableWifiNetworkDevice(bool enable) {} | 1650 virtual void EnableWifiNetworkDevice(bool enable) {} |
1416 virtual void EnableCellularNetworkDevice(bool enable) {} | 1651 virtual void EnableCellularNetworkDevice(bool enable) {} |
1417 virtual void EnableOfflineMode(bool enable) {} | 1652 virtual void EnableOfflineMode(bool enable) {} |
1418 virtual NetworkIPConfigVector GetIPConfigs(const std::string& device_path, | 1653 virtual NetworkIPConfigVector GetIPConfigs(const std::string& device_path, |
1419 std::string* hardware_address) { | 1654 std::string* hardware_address) { |
1420 hardware_address->clear(); | 1655 hardware_address->clear(); |
1421 return NetworkIPConfigVector(); | 1656 return NetworkIPConfigVector(); |
1422 } | 1657 } |
(...skipping 15 matching lines...) Expand all Loading... |
1438 return new NetworkLibraryStubImpl(); | 1673 return new NetworkLibraryStubImpl(); |
1439 else | 1674 else |
1440 return new NetworkLibraryImpl(); | 1675 return new NetworkLibraryImpl(); |
1441 } | 1676 } |
1442 | 1677 |
1443 } // namespace chromeos | 1678 } // namespace chromeos |
1444 | 1679 |
1445 // Allows InvokeLater without adding refcounting. This class is a Singleton and | 1680 // Allows InvokeLater without adding refcounting. This class is a Singleton and |
1446 // won't be deleted until it's last InvokeLater is run. | 1681 // won't be deleted until it's last InvokeLater is run. |
1447 DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::NetworkLibraryImpl); | 1682 DISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::NetworkLibraryImpl); |
OLD | NEW |