1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROMEOS_NETWORK_SHILL_PROPERTY_HANDLER_H_ 6 #define CHROMEOS_NETWORK_SHILL_PROPERTY_HANDLER_H_ 7 8 #include <list> 9 #include <map> 10 #include <set> 11 #include <string> 12 13 #include "base/memory/weak_ptr.h" 14 #include "chromeos/dbus/dbus_method_call_status.h" 15 #include "chromeos/dbus/shill_property_changed_observer.h" 16 #include "chromeos/network/managed_state.h" 17 #include "chromeos/network/network_handler_callbacks.h" 18 19 namespace base { 20 class DictionaryValue; 21 class ListValue; 22 class Value; 23 } 24 25 namespace chromeos { 26 27 class ShillManagerClient; 28 29 namespace internal { 30 31 class ShillPropertyObserver; 32 33 // This class handles Shill calls and observers to reflect the state of the 34 // Shill Manager and its services and devices. It observes Shill.Manager and 35 // requests properties for new devices/networks. It takes a Listener in its 36 // constructor (e.g. NetworkStateHandler) that it calls when properties change 37 // (including once to set their initial state after Init() gets called). 38 // It also observes Shill.Service for all services in Manager.ServiceWatchList. 39 // This class must not outlive the ShillManagerClient instance. 40 class CHROMEOS_EXPORT ShillPropertyHandler 41 : public ShillPropertyChangedObserver, 42 public base::SupportsWeakPtr<ShillPropertyHandler> { 43 public: 44 typedef std::map<std::string, ShillPropertyObserver*> 45 ShillPropertyObserverMap; 46 47 class CHROMEOS_EXPORT Listener { 48 public: 49 // Called when the entries in a managed list have changed. 50 virtual void UpdateManagedList(ManagedState::ManagedType type, 51 const base::ListValue& entries) = 0; 52 53 // Called when the properties for a managed state have changed. 54 virtual void UpdateManagedStateProperties( 55 ManagedState::ManagedType type, 56 const std::string& path, 57 const base::DictionaryValue& properties) = 0; 58 59 // Called when the list of profiles changes. 60 virtual void ProfileListChanged() = 0; 61 62 // Called when a property for a watched network service has changed. 63 virtual void UpdateNetworkServiceProperty( 64 const std::string& service_path, 65 const std::string& key, 66 const base::Value& value) = 0; 67 68 // Called when a property for a watched device has changed. 69 virtual void UpdateDeviceProperty( 70 const std::string& device_path, 71 const std::string& key, 72 const base::Value& value) = 0; 73 74 // Called when a watched network or device IPConfig property changes. 75 virtual void UpdateIPConfigProperties( 76 ManagedState::ManagedType type, 77 const std::string& path, 78 const std::string& ip_config_path, 79 const base::DictionaryValue& properties) = 0; 80 81 // Called when the list of devices with portal check enabled changes. 82 virtual void CheckPortalListChanged( 83 const std::string& check_portal_list) = 0; 84 85 // Called when a technology list changes. 86 virtual void TechnologyListChanged() = 0; 87 88 // Called when a managed state list has changed, after properties for any 89 // new entries in the list have been received and 90 // UpdateManagedStateProperties has been called for each new entry. 91 virtual void ManagedStateListChanged(ManagedState::ManagedType type) = 0; 92 93 // Called when the default network service changes. 94 virtual void DefaultNetworkServiceChanged( 95 const std::string& service_path) = 0; 96 97 protected: 98 virtual ~Listener() {} 99 }; 100 101 explicit ShillPropertyHandler(Listener* listener); 102 virtual ~ShillPropertyHandler(); 103 104 // Sets up the observer and calls UpdateManagerProperties(). 105 void Init(); 106 107 // Requests all Manager properties. Called from Init() and any time 108 // properties that do not signal changes might have been updated (e.g. 109 // ServiceCompleteList). 110 void UpdateManagerProperties(); 111 112 // Returns true if |technology| is available, enabled, etc. 113 bool IsTechnologyAvailable(const std::string& technology) const; 114 bool IsTechnologyEnabled(const std::string& technology) const; 115 bool IsTechnologyEnabling(const std::string& technology) const; 116 bool IsTechnologyUninitialized(const std::string& technology) const; 117 118 // Asynchronously sets the enabled state for |technology|. 119 // Note: Modifies Manager state. Calls |error_callback| on failure. 120 void SetTechnologyEnabled( 121 const std::string& technology, 122 bool enabled, 123 const network_handler::ErrorCallback& error_callback); 124 125 // Sets the list of devices on which portal check is enabled. 126 void SetCheckPortalList(const std::string& check_portal_list); 127 128 // Requests an immediate network scan. 129 void RequestScan() const; 130 131 // Calls Manager.ConnectToBestServices(). 132 void ConnectToBestServices() const; 133 134 // Requests all properties for the service or device (called for new items). 135 void RequestProperties(ManagedState::ManagedType type, 136 const std::string& path); 137 138 // ShillPropertyChangedObserver overrides 139 virtual void OnPropertyChanged(const std::string& key, 140 const base::Value& value) OVERRIDE; 141 142 private: 143 typedef std::map<ManagedState::ManagedType, std::set<std::string> > 144 TypeRequestMap; 145 146 // Callback for dbus method fetching properties. 147 void ManagerPropertiesCallback(DBusMethodCallStatus call_status, 148 const base::DictionaryValue& properties); 149 150 // Notifies the listener when a ManagedStateList has changed and all pending 151 // updates have been received. |key| can either identify the list that 152 // has changed or an empty string if multiple lists may have changed. 153 void CheckPendingStateListUpdates(const std::string& key); 154 155 // Called form OnPropertyChanged() and ManagerPropertiesCallback(). 156 void ManagerPropertyChanged(const std::string& key, 157 const base::Value& value); 158 159 // Requests properties for new entries in the list for |type|. 160 void UpdateProperties(ManagedState::ManagedType type, 161 const base::ListValue& entries); 162 163 // Updates the Shill property observers to observe any entries for |type|. 164 void UpdateObserved(ManagedState::ManagedType type, 165 const base::ListValue& entries); 166 167 168 // Sets |*_technologies_| to contain only entries in |technologies|. 169 void UpdateAvailableTechnologies(const base::ListValue& technologies); 170 void UpdateEnabledTechnologies(const base::ListValue& technologies); 171 void UpdateUninitializedTechnologies(const base::ListValue& technologies); 172 173 void EnableTechnologyFailed( 174 const std::string& technology, 175 const network_handler::ErrorCallback& error_callback, 176 const std::string& dbus_error_name, 177 const std::string& dbus_error_message); 178 179 // Called when Shill returns the properties for a service or device. 180 void GetPropertiesCallback(ManagedState::ManagedType type, 181 const std::string& path, 182 DBusMethodCallStatus call_status, 183 const base::DictionaryValue& properties); 184 185 // Callback invoked when a watched property changes. Calls appropriate 186 // handlers and signals observers. 187 void PropertyChangedCallback(ManagedState::ManagedType type, 188 const std::string& path, 189 const std::string& key, 190 const base::Value& value); 191 192 // Request a single IPConfig object corresponding to |ip_config_path_value| 193 // from Shill.IPConfigClient and trigger a call to UpdateIPConfigProperties 194 // for the network or device corresponding to |type| and |path|. 195 void RequestIPConfig(ManagedState::ManagedType type, 196 const std::string& path, 197 const base::Value& ip_config_path_value); 198 199 // Request the IPConfig objects corresponding to entries in 200 // |ip_config_list_value| from Shill.IPConfigClient and trigger a call to 201 // UpdateIPConfigProperties with each object for the network or device 202 // corresponding to |type| and |path|. 203 void RequestIPConfigsList(ManagedState::ManagedType type, 204 const std::string& path, 205 const base::Value& ip_config_list_value); 206 207 // Callback for getting the IPConfig property of a network or device. Handled 208 // here instead of in NetworkState so that all asynchronous requests are done 209 // in a single place (also simplifies NetworkState considerably). 210 void GetIPConfigCallback(ManagedState::ManagedType type, 211 const std::string& path, 212 const std::string& ip_config_path, 213 DBusMethodCallStatus call_status, 214 const base::DictionaryValue& properties); 215 216 // Pointer to containing class (owns this) 217 Listener* listener_; 218 219 // Convenience pointer for ShillManagerClient 220 ShillManagerClient* shill_manager_; 221 222 // Pending update list for each managed state type 223 TypeRequestMap pending_updates_; 224 225 // List of states for which properties have been requested, for each managed 226 // state type 227 TypeRequestMap requested_updates_; 228 229 // List of network services with Shill property changed observers 230 ShillPropertyObserverMap observed_networks_; 231 232 // List of network devices with Shill property changed observers 233 ShillPropertyObserverMap observed_devices_; 234 235 // Lists of available / enabled / uninitialized technologies 236 std::set<std::string> available_technologies_; 237 std::set<std::string> enabled_technologies_; 238 std::set<std::string> enabling_technologies_; 239 std::set<std::string> uninitialized_technologies_; 240 241 DISALLOW_COPY_AND_ASSIGN(ShillPropertyHandler); 242 }; 243 244 } // namespace internal 245 } // namespace chromeos 246 247 #endif // CHROMEOS_NETWORK_SHILL_PROPERTY_HANDLER_H_ 248