Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(306)

Side by Side Diff: chromeos/network/network_state_handler.h

Issue 289383004: Merge FavoriteState into NetworkState (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 #ifndef CHROMEOS_NETWORK_NETWORK_STATE_HANDLER_H_ 5 #ifndef CHROMEOS_NETWORK_NETWORK_STATE_HANDLER_H_
6 #define CHROMEOS_NETWORK_NETWORK_STATE_HANDLER_H_ 6 #define CHROMEOS_NETWORK_NETWORK_STATE_HANDLER_H_
7 7
8 #include <map> 8 #include <map>
9 #include <set> 9 #include <set>
10 #include <string> 10 #include <string>
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 // 43 //
44 // This class maps essential properties from the connection manager (Shill) for 44 // This class maps essential properties from the connection manager (Shill) for
45 // each visible network. It is not used to change the properties of services or 45 // each visible network. It is not used to change the properties of services or
46 // devices, only global (manager) properties. 46 // devices, only global (manager) properties.
47 // 47 //
48 // All getters return the currently cached properties. This class is expected to 48 // All getters return the currently cached properties. This class is expected to
49 // keep properties up to date by managing the appropriate Shill observers. 49 // keep properties up to date by managing the appropriate Shill observers.
50 // It will invoke its own more specific observer methods when the specified 50 // It will invoke its own more specific observer methods when the specified
51 // changes occur. 51 // changes occur.
52 // 52 //
53 // Some notes about NetworkState, FavoriteState, and GUIDs: 53 // Some notes about NetworkState and GUIDs:
54 // * A FavoriteState exists for all network services stored in a profile, and 54 // * A NetworkState exists for all network services stored in a profile, and
55 // all "visible" networks (physically connected networks like ethernet and 55 // all "visible" networks (physically connected networks like ethernet and
56 // cellular or in-range wifi networks). If the network is stored in a profile, 56 // cellular or in-range wifi networks). If the network is stored in a profile,
57 // FavoriteState.IsInProfile() will return true. 57 // NetworkState.IsInProfile() will return true.
58 // * A NetworkState exists for "visible" networks only. There will always be a 58 // * "Visible" networks return true for NetworkState.IsVisible().
59 // corresponding FavoriteState with the same service_path() property.
60 // * All networks saved to a profile will have a saved GUID that is persistent 59 // * All networks saved to a profile will have a saved GUID that is persistent
61 // across sessions. 60 // across sessions.
62 // * Networks that are not saved to a profile will have a GUID assigned when 61 // * Networks that are not saved to a profile will have a GUID assigned when
63 // the initial properties are received. The GUID will be consistent for 62 // the initial properties are received. The GUID will be consistent for
64 // the duration of a session, even if the network drops out and returns. 63 // the duration of a session, even if the network drops out and returns.
65 // * Both FavoriteState and NetworkState store the GUID. It will always be the
66 // same for the same network (i.e. entries with the same service_path()).
67 64
68 class CHROMEOS_EXPORT NetworkStateHandler 65 class CHROMEOS_EXPORT NetworkStateHandler
69 : public internal::ShillPropertyHandler::Listener { 66 : public internal::ShillPropertyHandler::Listener {
70 public: 67 public:
71 typedef std::vector<ManagedState*> ManagedStateList; 68 typedef std::vector<ManagedState*> ManagedStateList;
72 typedef std::vector<const NetworkState*> NetworkStateList; 69 typedef std::vector<const NetworkState*> NetworkStateList;
73 typedef std::vector<const DeviceState*> DeviceStateList; 70 typedef std::vector<const DeviceState*> DeviceStateList;
74 typedef std::vector<const FavoriteState*> FavoriteStateList;
75 71
76 enum TechnologyState { 72 enum TechnologyState {
77 TECHNOLOGY_UNAVAILABLE, 73 TECHNOLOGY_UNAVAILABLE,
78 TECHNOLOGY_AVAILABLE, 74 TECHNOLOGY_AVAILABLE,
79 TECHNOLOGY_UNINITIALIZED, 75 TECHNOLOGY_UNINITIALIZED,
80 TECHNOLOGY_ENABLING, 76 TECHNOLOGY_ENABLING,
81 TECHNOLOGY_ENABLED 77 TECHNOLOGY_ENABLED
82 }; 78 };
83 79
84 virtual ~NetworkStateHandler(); 80 virtual ~NetworkStateHandler();
85 81
86 // Add/remove observers. 82 // Add/remove observers.
87 void AddObserver(NetworkStateHandlerObserver* observer, 83 void AddObserver(NetworkStateHandlerObserver* observer,
88 const tracked_objects::Location& from_here); 84 const tracked_objects::Location& from_here);
89 void RemoveObserver(NetworkStateHandlerObserver* observer, 85 void RemoveObserver(NetworkStateHandlerObserver* observer,
90 const tracked_objects::Location& from_here); 86 const tracked_objects::Location& from_here);
91 87
92 // Requests all Manager properties, specifically to update the complete 88 // Requests all Manager properties, specifically to update the complete
93 // list of services which determines the list of Favorites. This should be 89 // list of services which determines the list of Networks. This should be
94 // called any time a new service is configured or a Profile is loaded. 90 // called any time a new service is configured or a Profile is loaded.
95 void UpdateManagerProperties(); 91 void UpdateManagerProperties();
96 92
97 // Returns the state for technology |type|. Only 93 // Returns the state for technology |type|. Only
98 // NetworkTypePattern::Primitive, ::Mobile and ::Ethernet are supported. 94 // NetworkTypePattern::Primitive, ::Mobile and ::Ethernet are supported.
99 TechnologyState GetTechnologyState(const NetworkTypePattern& type) const; 95 TechnologyState GetTechnologyState(const NetworkTypePattern& type) const;
100 bool IsTechnologyAvailable(const NetworkTypePattern& type) const { 96 bool IsTechnologyAvailable(const NetworkTypePattern& type) const {
101 return GetTechnologyState(type) != TECHNOLOGY_UNAVAILABLE; 97 return GetTechnologyState(type) != TECHNOLOGY_UNAVAILABLE;
102 } 98 }
103 bool IsTechnologyEnabled(const NetworkTypePattern& type) const { 99 bool IsTechnologyEnabled(const NetworkTypePattern& type) const {
(...skipping 23 matching lines...) Expand all
127 // value for each property. To receive notifications when a property changes, 123 // value for each property. To receive notifications when a property changes,
128 // observe this class and implement NetworkPropertyChanged(). 124 // observe this class and implement NetworkPropertyChanged().
129 const NetworkState* GetNetworkState(const std::string& service_path) const; 125 const NetworkState* GetNetworkState(const std::string& service_path) const;
130 126
131 // Returns the default network (which includes VPNs) based on the Shill 127 // Returns the default network (which includes VPNs) based on the Shill
132 // Manager.DefaultNetwork property. Normally this is the same as 128 // Manager.DefaultNetwork property. Normally this is the same as
133 // ConnectedNetworkByType(NetworkTypePattern::Default()), but the timing might 129 // ConnectedNetworkByType(NetworkTypePattern::Default()), but the timing might
134 // differ. 130 // differ.
135 const NetworkState* DefaultNetwork() const; 131 const NetworkState* DefaultNetwork() const;
136 132
137 // Returns the FavoriteState associated to DefaultNetwork. Returns NULL if,
138 // and only if, DefaultNetwork returns NULL.
139 const FavoriteState* DefaultFavoriteNetwork() const;
140
141 // Returns the primary connected network of matching |type|, otherwise NULL. 133 // Returns the primary connected network of matching |type|, otherwise NULL.
142 const NetworkState* ConnectedNetworkByType( 134 const NetworkState* ConnectedNetworkByType(
143 const NetworkTypePattern& type) const; 135 const NetworkTypePattern& type) const;
144 136
145 // Like ConnectedNetworkByType() but returns a connecting network or NULL. 137 // Like ConnectedNetworkByType() but returns a connecting network or NULL.
146 const NetworkState* ConnectingNetworkByType( 138 const NetworkState* ConnectingNetworkByType(
147 const NetworkTypePattern& type) const; 139 const NetworkTypePattern& type) const;
148 140
149 // Like ConnectedNetworkByType() but returns any matching network or NULL. 141 // Like ConnectedNetworkByType() but returns any matching network or NULL.
150 // Mostly useful for mobile networks where there is generally only one 142 // Mostly useful for mobile networks where there is generally only one
151 // network. Note: O(N). 143 // network. Note: O(N).
152 const NetworkState* FirstNetworkByType(const NetworkTypePattern& type) const; 144 const NetworkState* FirstNetworkByType(const NetworkTypePattern& type) const;
153 145
154 // Returns the aa:bb formatted hardware (MAC) address for the first connected 146 // Returns the aa:bb formatted hardware (MAC) address for the first connected
155 // network matching |type|, or an empty string if none is connected. 147 // network matching |type|, or an empty string if none is connected.
156 std::string FormattedHardwareAddressForType( 148 std::string FormattedHardwareAddressForType(
157 const NetworkTypePattern& type) const; 149 const NetworkTypePattern& type) const;
158 150
159 // Sets |list| to contain the list of networks. The returned list contains 151 // Sets |list| to contain the list of visible networks. The returned list
160 // a copy of NetworkState pointers which should not be stored or used beyond 152 // contains a copy of NetworkState pointers which should not be stored or used
161 // the scope of the calling function (i.e. they may later become invalid, but 153 // beyond the scope of the calling function (i.e. they may later become
162 // only on the UI thread). 154 // invalid, but only on the UI thread).
163 void GetNetworkList(NetworkStateList* list) const; 155 void GetVisibleNetworkList(NetworkStateList* list) const;
164 156
165 // Like GetNetworkList() but only returns networks with matching |type|. 157 // Sets |list| to contain the list of networks with matching |type| and the
158 // following properties:
159 // |configured_only| - if true only include networks where IsInProfile is true
160 // |visible_only| - if true only include networks in the visible Services list
161 // |limit| - if > 0 limits the number of results.
166 void GetNetworkListByType(const NetworkTypePattern& type, 162 void GetNetworkListByType(const NetworkTypePattern& type,
163 bool configured_only,
164 bool visible_only,
165 int limit,
167 NetworkStateList* list) const; 166 NetworkStateList* list) const;
168 167
168 // Finds and returns the NetworkState associated with |service_path| or NULL
169 // if not found. If |configured_only| is true, only returns saved entries
170 // (IsInProfile is true).
171 const NetworkState* GetNetworkStateFromServicePath(
172 const std::string& service_path,
173 bool configured_only) const;
174
175 // Finds and returns the NetworkState associated with |guid| or NULL if not
176 // found. This returns all entries (IsInProfile() may be true or false).
177 const NetworkState* GetNetworkStateFromGuid(const std::string& guid) const;
178
169 // Sets |list| to contain the list of devices. The returned list contains 179 // Sets |list| to contain the list of devices. The returned list contains
170 // a copy of DeviceState pointers which should not be stored or used beyond 180 // a copy of DeviceState pointers which should not be stored or used beyond
171 // the scope of the calling function (i.e. they may later become invalid, but 181 // the scope of the calling function (i.e. they may later become invalid, but
172 // only on the UI thread). 182 // only on the UI thread).
173 void GetDeviceList(DeviceStateList* list) const; 183 void GetDeviceList(DeviceStateList* list) const;
174 184
175 // Like GetDeviceList() but only returns networks with matching |type|. 185 // Like GetDeviceList() but only returns networks with matching |type|.
176 void GetDeviceListByType(const NetworkTypePattern& type, 186 void GetDeviceListByType(const NetworkTypePattern& type,
177 DeviceStateList* list) const; 187 DeviceStateList* list) const;
178 188
179 // Sets |list| to contain the list of favorite (aka "preferred") networks.
180 // See GetNetworkList() for usage, and notes for |favorite_list_|.
181 // Favorites that are visible have the same path() as the entries in
182 // GetNetworkList(), so GetNetworkState() can be used to determine if a
183 // favorite is visible and retrieve the complete properties (and vice-versa).
184 void GetFavoriteList(FavoriteStateList* list) const;
185
186 // Like GetFavoriteList() but only returns favorites with matching |type| and
187 // the following properties:
188 // |configured_only| - if true only include networks where IsInProfile is true
189 // |visible_only| - if true only include networks in the visible Services list
190 // |limit| - if > 0 limits the number of results.
191 void GetFavoriteListByType(const NetworkTypePattern& type,
192 bool configured_only,
193 bool visible_only,
194 int limit,
195 FavoriteStateList* list) const;
196
197 // Finds and returns the FavoriteState associated with |service_path| or NULL
198 // if not found. If |configured_only| is true, only returns saved entries
199 // (IsInProfile is true).
200 const FavoriteState* GetFavoriteStateFromServicePath(
201 const std::string& service_path,
202 bool configured_only) const;
203
204 // Finds and returns the FavoriteState associated with |guid| or NULL if not
205 // found. This returns all entries (IsInProfile() may be true or false).
206 const FavoriteState* GetFavoriteStateFromGuid(const std::string& guid) const;
207
208 // Requests a network scan. This may trigger updates to the network 189 // Requests a network scan. This may trigger updates to the network
209 // list, which will trigger the appropriate observer calls. 190 // list, which will trigger the appropriate observer calls.
210 void RequestScan() const; 191 void RequestScan() const;
211 192
212 // Request a scan if not scanning and run |callback| when the Scanning state 193 // Request a scan if not scanning and run |callback| when the Scanning state
213 // for any Device of network type |type| completes. 194 // for any Device of network type |type| completes.
214 void WaitForScan(const std::string& type, const base::Closure& callback); 195 void WaitForScan(const std::string& type, const base::Closure& callback);
215 196
216 // Request a network scan then signal Shill to connect to the best available 197 // Request a network scan then signal Shill to connect to the best available
217 // networks when completed. 198 // networks when completed.
(...skipping 11 matching lines...) Expand all
229 // Clear the last_error value for the NetworkState for |service_path|. 210 // Clear the last_error value for the NetworkState for |service_path|.
230 void ClearLastErrorForNetwork(const std::string& service_path); 211 void ClearLastErrorForNetwork(const std::string& service_path);
231 212
232 // Set the list of devices on which portal check is enabled. 213 // Set the list of devices on which portal check is enabled.
233 void SetCheckPortalList(const std::string& check_portal_list); 214 void SetCheckPortalList(const std::string& check_portal_list);
234 215
235 const std::string& GetCheckPortalListForTest() const { 216 const std::string& GetCheckPortalListForTest() const {
236 return check_portal_list_; 217 return check_portal_list_;
237 } 218 }
238 219
239 // Returns the FavoriteState of the EthernetEAP service, which contains the 220 // Returns the NetworkState of the EthernetEAP service, which contains the
240 // EAP parameters used by the ethernet with |service_path|. If |service_path| 221 // EAP parameters used by the ethernet with |service_path|. If |service_path|
241 // doesn't refer to an ethernet service or if the ethernet service is not 222 // doesn't refer to an ethernet service or if the ethernet service is not
242 // connected using EAP, returns NULL. 223 // connected using EAP, returns NULL.
243 const FavoriteState* GetEAPForEthernet(const std::string& service_path) const; 224 const NetworkState* GetEAPForEthernet(const std::string& service_path) const;
244 225
245 // Construct and initialize an instance for testing. 226 // Construct and initialize an instance for testing.
246 static NetworkStateHandler* InitializeForTest(); 227 static NetworkStateHandler* InitializeForTest();
247 228
248 // Default set of comma separated interfaces on which to enable 229 // Default set of comma separated interfaces on which to enable
249 // portal checking. 230 // portal checking.
250 static const char kDefaultCheckPortalList[]; 231 static const char kDefaultCheckPortalList[];
251 232
252 protected: 233 protected:
253 friend class NetworkHandler; 234 friend class NetworkHandler;
254 NetworkStateHandler(); 235 NetworkStateHandler();
255 236
256 // ShillPropertyHandler::Listener overrides. 237 // ShillPropertyHandler::Listener overrides.
257 238
258 // This adds new entries to the managed list specified by |type| and deletes 239 // This adds new entries to device_list_ and deletes any entries that are no
259 // any entries that are no longer in the list. 240 // longer in the list.
260 virtual void UpdateManagedList(ManagedState::ManagedType type, 241 virtual void UpdateManagedDevices(const base::ListValue& entries) OVERRIDE;
261 const base::ListValue& entries) OVERRIDE; 242
243 // If |complete_list| is true then this adds new entries to network_list_ and
244 // deletes any entries that are no longer in the list. If |complete_list| is
245 // false then the visibility of existing entries is updated.
246 virtual void UpdateManagedNetworks(const base::ListValue& entries,
247 bool complete_list) OVERRIDE;
262 248
263 // The list of profiles changed (i.e. a user has logged in). Re-request 249 // The list of profiles changed (i.e. a user has logged in). Re-request
264 // properties for all services since they may have changed. 250 // properties for all services since they may have changed.
265 virtual void ProfileListChanged() OVERRIDE; 251 virtual void ProfileListChanged() OVERRIDE;
266 252
267 // Parses the properties for the network service or device. Mostly calls 253 // Parses the properties for the network service or device. Mostly calls
268 // managed->PropertyChanged(key, value) for each dictionary entry. 254 // managed->PropertyChanged(key, value) for each dictionary entry.
269 virtual void UpdateManagedStateProperties( 255 virtual void UpdateManagedStateProperties(
270 ManagedState::ManagedType type, 256 ManagedState::ManagedType type,
271 const std::string& path, 257 const std::string& path,
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 294
309 // Called when the default network service changes. Sets default_network_path_ 295 // Called when the default network service changes. Sets default_network_path_
310 // and notifies listeners. 296 // and notifies listeners.
311 virtual void DefaultNetworkServiceChanged( 297 virtual void DefaultNetworkServiceChanged(
312 const std::string& service_path) OVERRIDE; 298 const std::string& service_path) OVERRIDE;
313 299
314 // Called after construction. Called explicitly by tests after adding 300 // Called after construction. Called explicitly by tests after adding
315 // test observers. 301 // test observers.
316 void InitShillPropertyHandler(); 302 void InitShillPropertyHandler();
317 303
304 // Helper methods for UpdateManagedNetworks/Devices.
305 void UpdateManagedList(ManagedState::ManagedType type,
306 const base::ListValue& entries);
307 void UpdateVisibleNetworks(const base::ListValue& entries);
308
318 private: 309 private:
319 typedef std::list<base::Closure> ScanCallbackList; 310 typedef std::list<base::Closure> ScanCallbackList;
320 typedef std::map<std::string, ScanCallbackList> ScanCompleteCallbackMap; 311 typedef std::map<std::string, ScanCallbackList> ScanCompleteCallbackMap;
321 typedef std::map<std::string, std::string> SpecifierGuidMap; 312 typedef std::map<std::string, std::string> SpecifierGuidMap;
322 friend class NetworkStateHandlerTest; 313 friend class NetworkStateHandlerTest;
323 FRIEND_TEST_ALL_PREFIXES(NetworkStateHandlerTest, NetworkStateHandlerStub); 314 FRIEND_TEST_ALL_PREFIXES(NetworkStateHandlerTest, NetworkStateHandlerStub);
324 315
325 // NetworkState specific method for UpdateManagedStateProperties which 316 // NetworkState specific method for UpdateManagedStateProperties which
326 // notifies observers. 317 // notifies observers.
327 void UpdateNetworkStateProperties(NetworkState* network, 318 void UpdateNetworkStateProperties(NetworkState* network,
328 const base::DictionaryValue& properties); 319 const base::DictionaryValue& properties);
329 320
330 // Ensure a valid GUID for FavoriteState and update the NetworkState GUID from 321 // Ensure a valid GUID for NetworkState.
331 // the corresponding FavoriteState if necessary. 322 void UpdateGuid(NetworkState* network);
332 void UpdateGuid(ManagedState* managed);
333 323
334 // Sends DeviceListChanged() to observers and logs an event. 324 // Sends DeviceListChanged() to observers and logs an event.
335 void NotifyDeviceListChanged(); 325 void NotifyDeviceListChanged();
336 326
337 // Non-const getters for managed entries. These are const so that they can 327 // Non-const getters for managed entries. These are const so that they can
338 // be called by Get[Network|Device]State, even though they return non-const 328 // be called by Get[Network|Device]State, even though they return non-const
339 // pointers. 329 // pointers.
340 DeviceState* GetModifiableDeviceState(const std::string& device_path) const; 330 DeviceState* GetModifiableDeviceState(const std::string& device_path) const;
341 NetworkState* GetModifiableNetworkState( 331 NetworkState* GetModifiableNetworkState(
342 const std::string& service_path) const; 332 const std::string& service_path) const;
343 FavoriteState* GetModifiableFavoriteState(
344 const std::string& service_path) const;
345 ManagedState* GetModifiableManagedState(const ManagedStateList* managed_list, 333 ManagedState* GetModifiableManagedState(const ManagedStateList* managed_list,
346 const std::string& path) const; 334 const std::string& path) const;
347 335
348 // Gets the list specified by |type|. 336 // Gets the list specified by |type|.
349 ManagedStateList* GetManagedList(ManagedState::ManagedType type); 337 ManagedStateList* GetManagedList(ManagedState::ManagedType type);
350 338
351 // Helper function to notify observers. Calls CheckDefaultNetworkChanged(). 339 // Helper function to notify observers. Calls CheckDefaultNetworkChanged().
352 void OnNetworkConnectionStateChanged(NetworkState* network); 340 void OnNetworkConnectionStateChanged(NetworkState* network);
353 341
354 // Notifies observers when the default network or its properties change. 342 // Notifies observers when the default network or its properties change.
(...skipping 15 matching lines...) Expand all
370 358
371 // Shill property handler instance, owned by this class. 359 // Shill property handler instance, owned by this class.
372 scoped_ptr<internal::ShillPropertyHandler> shill_property_handler_; 360 scoped_ptr<internal::ShillPropertyHandler> shill_property_handler_;
373 361
374 // Observer list 362 // Observer list
375 ObserverList<NetworkStateHandlerObserver> observers_; 363 ObserverList<NetworkStateHandlerObserver> observers_;
376 364
377 // List of managed network states 365 // List of managed network states
378 ManagedStateList network_list_; 366 ManagedStateList network_list_;
379 367
380 // List of managed favorite states; this list includes all entries in
381 // Manager.ServiceCompleteList, but only entries with a non-empty Profile
382 // property are returned in GetFavoriteList().
383 ManagedStateList favorite_list_;
384
385 // List of managed device states 368 // List of managed device states
386 ManagedStateList device_list_; 369 ManagedStateList device_list_;
387 370
388 // Keeps track of the default network for notifying observers when it changes. 371 // Keeps track of the default network for notifying observers when it changes.
389 std::string default_network_path_; 372 std::string default_network_path_;
390 373
391 // List of interfaces on which portal check is enabled. 374 // List of interfaces on which portal check is enabled.
392 std::string check_portal_list_; 375 std::string check_portal_list_;
393 376
394 // Callbacks to run when a scan for the technology type completes. 377 // Callbacks to run when a scan for the technology type completes.
395 ScanCompleteCallbackMap scan_complete_callbacks_; 378 ScanCompleteCallbackMap scan_complete_callbacks_;
396 379
397 // Map of network specifiers to guids. Contains an entry for each 380 // Map of network specifiers to guids. Contains an entry for each
398 // FavoriteState that is not saved in a profile. 381 // NetworkState that is not saved in a profile.
399 SpecifierGuidMap specifier_guid_map_; 382 SpecifierGuidMap specifier_guid_map_;
400 383
401 DISALLOW_COPY_AND_ASSIGN(NetworkStateHandler); 384 DISALLOW_COPY_AND_ASSIGN(NetworkStateHandler);
402 }; 385 };
403 386
404 } // namespace chromeos 387 } // namespace chromeos
405 388
406 #endif // CHROMEOS_NETWORK_NETWORK_STATE_HANDLER_H_ 389 #endif // CHROMEOS_NETWORK_NETWORK_STATE_HANDLER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698