• 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 the list of devices with portal check enabled changes.
75     virtual void CheckPortalListChanged(
76          const std::string& check_portal_list) = 0;
77 
78     // Called when a technology list changes.
79     virtual void TechnologyListChanged() = 0;
80 
81     // Called when a managed state list has changed, after properties for any
82     // new entries in the list have been received and
83     // UpdateManagedStateProperties has been called for each new entry.
84     virtual void ManagedStateListChanged(ManagedState::ManagedType type) = 0;
85 
86    protected:
~Listener()87     virtual ~Listener() {}
88   };
89 
90   explicit ShillPropertyHandler(Listener* listener);
91   virtual ~ShillPropertyHandler();
92 
93   // Sets up the observer and calls UpdateManagerProperties().
94   void Init();
95 
96   // Requests all Manager properties. Called from Init() and any time
97   // properties that do not signal changes might have been updated (e.g.
98   // ServiceCompleteList).
99   void UpdateManagerProperties();
100 
101   // Returns true if |technology| is available, enabled, etc.
102   bool IsTechnologyAvailable(const std::string& technology) const;
103   bool IsTechnologyEnabled(const std::string& technology) const;
104   bool IsTechnologyEnabling(const std::string& technology) const;
105   bool IsTechnologyUninitialized(const std::string& technology) const;
106 
107   // Asynchronously sets the enabled state for |technology|.
108   // Note: Modifies Manager state. Calls |error_callback| on failure.
109   void SetTechnologyEnabled(
110       const std::string& technology,
111       bool enabled,
112       const network_handler::ErrorCallback& error_callback);
113 
114   // Sets the list of devices on which portal check is enabled.
115   void SetCheckPortalList(const std::string& check_portal_list);
116 
117   // Requests an immediate network scan.
118   void RequestScan() const;
119 
120   // Calls Manager.ConnectToBestServices().
121   void ConnectToBestServices() const;
122 
123   // Requests all properties for the service or device (called for new items).
124   void RequestProperties(ManagedState::ManagedType type,
125                          const std::string& path);
126 
127   // ShillPropertyChangedObserver overrides
128   virtual void OnPropertyChanged(const std::string& key,
129                                  const base::Value& value) OVERRIDE;
130 
131  private:
132   typedef std::map<ManagedState::ManagedType, std::set<std::string> >
133       TypeRequestMap;
134 
135   // Callback for dbus method fetching properties.
136   void ManagerPropertiesCallback(DBusMethodCallStatus call_status,
137                                  const base::DictionaryValue& properties);
138 
139   // Notifies the listener when a ManagedStateList has changed and all pending
140   // updates have been received. |key| can either identify the list that
141   // has changed or an empty string if multiple lists may have changed.
142   void CheckPendingStateListUpdates(const std::string& key);
143 
144   // Called form OnPropertyChanged() and ManagerPropertiesCallback().
145   void ManagerPropertyChanged(const std::string& key,
146                               const base::Value& value);
147 
148   // Requests properties for new entries in the list for |type| as follows:
149   // * Any new Device objects for MANAGED_TYPE_DEVICE
150   // * Any new Service objects for MANAGED_TYPE_NETWORK
151   // * Additional new Service objects for MANAGED_TYPE_FAVORITE that were not
152   //   requested for MANAGED_TYPE_NETWORK (i.e. only request objects once).
153   // For this to avoid duplicate requests, this must be called with
154   // MANAGED_TYPE_NETWORK before MANAGED_TYPE_FAVORITE.
155   void UpdateProperties(ManagedState::ManagedType type,
156                         const base::ListValue& entries);
157 
158   // Updates the Shill property observers to observe any entries for |type|.
159   void UpdateObserved(ManagedState::ManagedType type,
160                       const base::ListValue& entries);
161 
162 
163   // Sets |*_technologies_| to contain only entries in |technologies|.
164   void UpdateAvailableTechnologies(const base::ListValue& technologies);
165   void UpdateEnabledTechnologies(const base::ListValue& technologies);
166   void UpdateUninitializedTechnologies(const base::ListValue& technologies);
167 
168   void EnableTechnologyFailed(
169       const std::string& technology,
170       const network_handler::ErrorCallback& error_callback,
171       const std::string& dbus_error_name,
172       const std::string& dbus_error_message);
173 
174   // Called when Shill returns the properties for a service or device.
175   void GetPropertiesCallback(ManagedState::ManagedType type,
176                              const std::string& path,
177                              DBusMethodCallStatus call_status,
178                              const base::DictionaryValue& properties);
179 
180   // Callback invoked when a watched property changes. Calls appropriate
181   // handlers and signals observers.
182   void PropertyChangedCallback(ManagedState::ManagedType type,
183                                const std::string& path,
184                                const std::string& key,
185                                const base::Value& value);
186   void NetworkServicePropertyChangedCallback(const std::string& path,
187                                              const std::string& key,
188                                              const base::Value& value);
189 
190   // Callback for getting the IPConfig property of a Network. Handled here
191   // instead of in NetworkState so that all asynchronous requests are done
192   // in a single place (also simplifies NetworkState considerably).
193   void GetIPConfigCallback(const std::string& service_path,
194                            DBusMethodCallStatus call_status,
195                            const base::DictionaryValue& properties);
196   void UpdateIPConfigProperty(const std::string& service_path,
197                               const base::DictionaryValue& properties,
198                               const char* property);
199 
200   void NetworkDevicePropertyChangedCallback(const std::string& path,
201                                             const std::string& key,
202                                             const base::Value& value);
203 
204   // Pointer to containing class (owns this)
205   Listener* listener_;
206 
207   // Convenience pointer for ShillManagerClient
208   ShillManagerClient* shill_manager_;
209 
210   // Pending update list for each managed state type
211   TypeRequestMap pending_updates_;
212 
213   // List of states for which properties have been requested, for each managed
214   // state type
215   TypeRequestMap requested_updates_;
216 
217   // List of network services with Shill property changed observers
218   ShillPropertyObserverMap observed_networks_;
219 
220   // List of network devices with Shill property changed observers
221   ShillPropertyObserverMap observed_devices_;
222 
223   // Lists of available / enabled / uninitialized technologies
224   std::set<std::string> available_technologies_;
225   std::set<std::string> enabled_technologies_;
226   std::set<std::string> enabling_technologies_;
227   std::set<std::string> uninitialized_technologies_;
228 
229   DISALLOW_COPY_AND_ASSIGN(ShillPropertyHandler);
230 };
231 
232 }  // namespace internal
233 }  // namespace chromeos
234 
235 #endif  // CHROMEOS_NETWORK_SHILL_PROPERTY_HANDLER_H_
236