• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
~Listener()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