Don't kill key events even when it's VKEY_UNKNOWN.
[chromium-blink-merge.git] / chromeos / network / shill_property_handler.h
blob5a78f190fa5e18eeee111234856ae60419a740ea
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.
5 #ifndef CHROMEOS_NETWORK_SHILL_PROPERTY_HANDLER_H_
6 #define CHROMEOS_NETWORK_SHILL_PROPERTY_HANDLER_H_
8 #include <list>
9 #include <map>
10 #include <set>
11 #include <string>
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"
19 namespace base {
20 class DictionaryValue;
21 class ListValue;
22 class Value;
25 namespace chromeos {
27 class ShillManagerClient;
29 namespace internal {
31 class ShillPropertyObserver;
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;
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;
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;
59 // Called when the list of profiles changes.
60 virtual void ProfileListChanged() = 0;
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;
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;
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;
81 // Called when the list of devices with portal check enabled changes.
82 virtual void CheckPortalListChanged(
83 const std::string& check_portal_list) = 0;
85 // Called when a technology list changes.
86 virtual void TechnologyListChanged() = 0;
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;
93 // Called when the default network service changes.
94 virtual void DefaultNetworkServiceChanged(
95 const std::string& service_path) = 0;
97 protected:
98 virtual ~Listener() {}
101 explicit ShillPropertyHandler(Listener* listener);
102 virtual ~ShillPropertyHandler();
104 // Sets up the observer and calls UpdateManagerProperties().
105 void Init();
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();
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;
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);
125 // Sets the list of devices on which portal check is enabled.
126 void SetCheckPortalList(const std::string& check_portal_list);
128 // Requests an immediate network scan.
129 void RequestScan() const;
131 // Calls Manager.ConnectToBestServices().
132 void ConnectToBestServices() const;
134 // Requests all properties for the service or device (called for new items).
135 void RequestProperties(ManagedState::ManagedType type,
136 const std::string& path);
138 // ShillPropertyChangedObserver overrides
139 virtual void OnPropertyChanged(const std::string& key,
140 const base::Value& value) OVERRIDE;
142 private:
143 typedef std::map<ManagedState::ManagedType, std::set<std::string> >
144 TypeRequestMap;
146 // Callback for dbus method fetching properties.
147 void ManagerPropertiesCallback(DBusMethodCallStatus call_status,
148 const base::DictionaryValue& properties);
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);
155 // Called form OnPropertyChanged() and ManagerPropertiesCallback().
156 void ManagerPropertyChanged(const std::string& key,
157 const base::Value& value);
159 // Requests properties for new entries in the list for |type| as follows:
160 // * Any new Device objects for MANAGED_TYPE_DEVICE
161 // * Any new Service objects for MANAGED_TYPE_NETWORK
162 // * Additional new Service objects for MANAGED_TYPE_FAVORITE that were not
163 // requested for MANAGED_TYPE_NETWORK (i.e. only request objects once).
164 // For this to avoid duplicate requests, this must be called with
165 // MANAGED_TYPE_NETWORK before MANAGED_TYPE_FAVORITE.
166 void UpdateProperties(ManagedState::ManagedType type,
167 const base::ListValue& entries);
169 // Updates the Shill property observers to observe any entries for |type|.
170 void UpdateObserved(ManagedState::ManagedType type,
171 const base::ListValue& entries);
174 // Sets |*_technologies_| to contain only entries in |technologies|.
175 void UpdateAvailableTechnologies(const base::ListValue& technologies);
176 void UpdateEnabledTechnologies(const base::ListValue& technologies);
177 void UpdateUninitializedTechnologies(const base::ListValue& technologies);
179 void EnableTechnologyFailed(
180 const std::string& technology,
181 const network_handler::ErrorCallback& error_callback,
182 const std::string& dbus_error_name,
183 const std::string& dbus_error_message);
185 // Called when Shill returns the properties for a service or device.
186 void GetPropertiesCallback(ManagedState::ManagedType type,
187 const std::string& path,
188 DBusMethodCallStatus call_status,
189 const base::DictionaryValue& properties);
191 // Callback invoked when a watched property changes. Calls appropriate
192 // handlers and signals observers.
193 void PropertyChangedCallback(ManagedState::ManagedType type,
194 const std::string& path,
195 const std::string& key,
196 const base::Value& value);
198 // Request a single IPConfig object corresponding to |ip_config_path_value|
199 // from Shill.IPConfigClient and trigger a call to UpdateIPConfigProperties
200 // for the network or device corresponding to |type| and |path|.
201 void RequestIPConfig(ManagedState::ManagedType type,
202 const std::string& path,
203 const base::Value& ip_config_path_value);
205 // Request the IPConfig objects corresponding to entries in
206 // |ip_config_list_value| from Shill.IPConfigClient and trigger a call to
207 // UpdateIPConfigProperties with each object for the network or device
208 // corresponding to |type| and |path|.
209 void RequestIPConfigsList(ManagedState::ManagedType type,
210 const std::string& path,
211 const base::Value& ip_config_list_value);
213 // Callback for getting the IPConfig property of a network or device. Handled
214 // here instead of in NetworkState so that all asynchronous requests are done
215 // in a single place (also simplifies NetworkState considerably).
216 void GetIPConfigCallback(ManagedState::ManagedType type,
217 const std::string& path,
218 const std::string& ip_config_path,
219 DBusMethodCallStatus call_status,
220 const base::DictionaryValue& properties);
222 // Pointer to containing class (owns this)
223 Listener* listener_;
225 // Convenience pointer for ShillManagerClient
226 ShillManagerClient* shill_manager_;
228 // Pending update list for each managed state type
229 TypeRequestMap pending_updates_;
231 // List of states for which properties have been requested, for each managed
232 // state type
233 TypeRequestMap requested_updates_;
235 // List of network services with Shill property changed observers
236 ShillPropertyObserverMap observed_networks_;
238 // List of network devices with Shill property changed observers
239 ShillPropertyObserverMap observed_devices_;
241 // Lists of available / enabled / uninitialized technologies
242 std::set<std::string> available_technologies_;
243 std::set<std::string> enabled_technologies_;
244 std::set<std::string> enabling_technologies_;
245 std::set<std::string> uninitialized_technologies_;
247 DISALLOW_COPY_AND_ASSIGN(ShillPropertyHandler);
250 } // namespace internal
251 } // namespace chromeos
253 #endif // CHROMEOS_NETWORK_SHILL_PROPERTY_HANDLER_H_