network_state_handler.h revision 2385ea399aae016c0806a4f9ef3c9cfe3d2a39df
14d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek// Use of this source code is governed by a BSD-style license that can be 3f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek// found in the LICENSE file. 4f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 5f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek#ifndef CHROMEOS_NETWORK_NETWORK_STATE_HANDLER_H_ 6f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek#define CHROMEOS_NETWORK_NETWORK_STATE_HANDLER_H_ 7f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 8f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek#include <map> 9f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek#include <set> 10f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek#include <string> 118e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek#include <vector> 12f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 13f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek#include "base/callback_forward.h" 14f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek#include "base/gtest_prod_util.h" 15f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek#include "base/memory/scoped_ptr.h" 16f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek#include "base/observer_list.h" 17f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek#include "chromeos/chromeos_export.h" 1899c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek#include "chromeos/network/managed_state.h" 19f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek#include "chromeos/network/network_handler.h" 20f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek#include "chromeos/network/network_handler_callbacks.h" 218e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek#include "chromeos/network/shill_property_handler.h" 22e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek 23f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremeneknamespace base { 24f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenekclass DictionaryValue; 25f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenekclass ListValue; 26f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenekclass Value; 27f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek} 287d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek 29754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremeneknamespace tracked_objects { 30daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenekclass Location; 3111062b118476368fa5b294954713e5df97d8599fTed Kremenek} 32f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 3324f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremeneknamespace chromeos { 3424f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenek 354d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenekclass DeviceState; 3624f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenekclass NetworkState; 374d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenekclass NetworkStateHandlerObserver; 384d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenekclass NetworkStateHandlerTest; 3924f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenek 4024f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenek// Class for tracking the list of visible networks and their properties. 4124f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenek// 4224f1a967741ff9f8025ee23be12ba6feacc31f77Ted Kremenek// This class maps essential properties from the connection manager (Shill) for 434d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek// each visible network. It is not used to change the properties of services or 44f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek// devices, only global (manager) properties. 45f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek// 467d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek// All getters return the currently cached properties. This class is expected to 47754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek// keep properties up to date by managing the appropriate Shill observers. 48daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek// It will invoke its own more specific observer methods when the specified 4911062b118476368fa5b294954713e5df97d8599fTed Kremenek// changes occur. 50f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek// 51f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek// Most *ByType or *ForType methods will accept any of the following for 52f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek// |type|. See individual methods for specific notes. 53f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek// * Any type defined in service_constants.h (e.g. flimflam::kTypeWifi) 54f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek// * kMatchTypeDefault returns the default (active) network 55f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek// * kMatchTypeNonVirtual returns the primary non virtual network 56f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek// * kMatchTypeWireless returns the primary wireless network 57f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek// * kMatchTypeMobile returns the primary cellular or wimax network 58f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 59f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenekclass CHROMEOS_EXPORT NetworkStateHandler 60f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek : public internal::ShillPropertyHandler::Listener { 61f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek public: 62f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek typedef std::vector<ManagedState*> ManagedStateList; 63f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek typedef std::vector<const NetworkState*> NetworkStateList; 64f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek typedef std::vector<const DeviceState*> DeviceStateList; 65f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek typedef std::vector<const FavoriteState*> FavoriteStateList; 66f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 67f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek enum TechnologyState { 688e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek TECHNOLOGY_UNAVAILABLE, 698e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek TECHNOLOGY_AVAILABLE, 708e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek TECHNOLOGY_UNINITIALIZED, 718e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek TECHNOLOGY_ENABLING, 728e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek TECHNOLOGY_ENABLED 738e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek }; 74f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 75f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek virtual ~NetworkStateHandler(); 76f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 77f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Add/remove observers. 784d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek void AddObserver(NetworkStateHandlerObserver* observer, 79f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek const tracked_objects::Location& from_here); 80f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek void RemoveObserver(NetworkStateHandlerObserver* observer, 81f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek const tracked_objects::Location& from_here); 82f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 83f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Requests all Manager properties, specifically to update the complete 84425c08c53ccbfb84e52129406b259ec59da22e64Ted Kremenek // list of services which determines the list of Favorites. This should be 85f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // called any time a new service is configured or a Profile is loaded. 86f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek void UpdateManagerProperties(); 877d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek 88f233d48cfc513b045e2c2cfca5c175220fbd0a82Ted Kremenek // Returns the state for technology |type|. kMatchTypeMobile (only) is 897d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek // also supported. 907d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek TechnologyState GetTechnologyState(const std::string& type) const; 9111062b118476368fa5b294954713e5df97d8599fTed Kremenek bool IsTechnologyAvailable(const std::string& type) const { 926a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek return GetTechnologyState(type) != TECHNOLOGY_UNAVAILABLE; 936a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek } 946a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek bool IsTechnologyEnabled(const std::string& type) const { 95f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek return GetTechnologyState(type) == TECHNOLOGY_ENABLED; 966a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek } 977d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek 986a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek // Asynchronously sets the technology enabled property for |type|. 996a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek // kMatchTypeMobile (only) is also supported. 100f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Note: Modifies Manager state. Calls |error_callback| on failure. 101754607e7cff2d902d9af8b771409449fb2f8d2bfTed Kremenek void SetTechnologyEnabled( 102daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek const std::string& type, 103daeb9a7376830d637e02b5bc51faf4750a7bce70Ted Kremenek bool enabled, 104f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek const network_handler::ErrorCallback& error_callback); 105f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 1064d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek // Finds and returns a device state by |device_path| or NULL if not found. 1074d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek const DeviceState* GetDeviceState(const std::string& device_path) const; 108f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 109f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Finds and returns a device state by |type|. Returns NULL if not found. 1104d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek // See note above for valid types. 1118e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek const DeviceState* GetDeviceStateByType(const std::string& type) const; 112f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 113f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Returns true if any device of |type| is scanning. 114f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // See note above for valid types. 115f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek bool GetScanningByType(const std::string& type) const; 11650a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek 117f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Finds and returns a network state by |service_path| or NULL if not found. 1184d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek // Note: NetworkState is frequently updated asynchronously, i.e. properties 119cb48b9c9c3c95f2650b74530264c288d1f58c73cTed Kremenek // are not always updated all at once. This will contain the most recent 120cb48b9c9c3c95f2650b74530264c288d1f58c73cTed Kremenek // value for each property. To receive notifications when a property changes, 121f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // observe this class and implement NetworkPropertyChanged(). 122f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek const NetworkState* GetNetworkState(const std::string& service_path) const; 123f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek 1244d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek // Returns the default connected network (which includes VPNs) or NULL. 125f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // This is equivalent to ConnectedNetworkByType(kMatchTypeDefault). 126f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek const NetworkState* DefaultNetwork() const; 1273bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek 128f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Returns the primary connected network of matching |type|, otherwise NULL. 129f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // See note above for valid types. 130f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek const NetworkState* ConnectedNetworkByType(const std::string& type) const; 131f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 132f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Like ConnectedNetworkByType() but returns a connecting network or NULL. 133f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek const NetworkState* ConnectingNetworkByType(const std::string& type) const; 134f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 135f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Like ConnectedNetworkByType() but returns any matching network or NULL. 136f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Mostly useful for mobile networks where there is generally only one 137f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // network. Note: O(N). 138f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek const NetworkState* FirstNetworkByType(const std::string& type) const; 1394d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek 140f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Returns the hardware (MAC) address for the first connected network 141f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek // matching |type|, or an empty string if none. 142f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // See note above for valid types. 1433bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek std::string HardwareAddressForType(const std::string& type) const; 1443bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek // Same as above but in aa:bb format. 1453bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek std::string FormattedHardwareAddressForType(const std::string& type) const; 146b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek 147f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Sets |list| to contain the list of networks. The returned list contains 148f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // a copy of NetworkState pointers which should not be stored or used beyond 14900a3a5f024ac54088ab887712b292171188064f0Ted Kremenek // the scope of the calling function (i.e. they may later become invalid, but 15000a3a5f024ac54088ab887712b292171188064f0Ted Kremenek // only on the UI thread). 15100a3a5f024ac54088ab887712b292171188064f0Ted Kremenek void GetNetworkList(NetworkStateList* list) const; 15200a3a5f024ac54088ab887712b292171188064f0Ted Kremenek 15300a3a5f024ac54088ab887712b292171188064f0Ted Kremenek // Sets |list| to contain the list of devices. The returned list contains 15400a3a5f024ac54088ab887712b292171188064f0Ted Kremenek // a copy of DeviceState pointers which should not be stored or used beyond 155f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // the scope of the calling function (i.e. they may later become invalid, but 156f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // only on the UI thread). 157f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek void GetDeviceList(DeviceStateList* list) const; 158f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 159f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Sets |list| to contain the list of favorite (aka "preferred") networks. 160f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // See GetNetworkList() for usage, and notes for |favorite_list_|. 161f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Favorites that are visible have the same path() as the entries in 162f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // GetNetworkList(), so GetNetworkState() can be used to determine if a 163f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // favorite is visible and retrieve the complete properties (and vice-versa). 164f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek void GetFavoriteList(FavoriteStateList* list) const; 165f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 166f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Finds and returns a favorite state by |service_path| or NULL if not found. 167f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek const FavoriteState* GetFavoriteState(const std::string& service_path) const; 16899c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek 16999c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek // Requests a network scan. This may trigger updates to the network 170f116bd654bcdb5d7c22656f224deeb7a67f7d0cdTed Kremenek // list, which will trigger the appropriate observer calls. 171f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek void RequestScan() const; 172f116bd654bcdb5d7c22656f224deeb7a67f7d0cdTed Kremenek 173f116bd654bcdb5d7c22656f224deeb7a67f7d0cdTed Kremenek // Request a scan if not scanning and run |callback| when the Scanning state 174f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // for any Device matching |type| completes. 175f4b7a6940070f04d7845ac55f0d1e300a8bee0d9Ted Kremenek void WaitForScan(const std::string& type, const base::Closure& callback); 1763bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek 177f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Request a network scan then signal Shill to connect to the best available 178e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek // networks when completed. 179e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek void ConnectToBestWifiNetwork(); 18099c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek 181f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Request an update for an existing NetworkState, e.g. after configuring 18299c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek // a network. This is a no-op if an update request is already pending. 18399c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek // Returns true if the network exists and an update is requested or pending. 18499c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek // When the properties are received, NetworkPropertiesUpdated will be 18599c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek // signaled for each member of |observers_|, regardless of whether any 1863bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek // properties actually changed. 1873bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek bool RequestUpdateForNetwork(const std::string& service_path); 18899c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek 189e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek // Request an update for all existing NetworkState entries, e.g. after 190e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek // loading an ONC configuration file that may have updated one or more 19199c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek // existing networks. 19299c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek void RequestUpdateForAllNetworks(); 19399c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek 19499c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek // Set the user initiated connecting network. 195e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek void SetConnectingNetwork(const std::string& service_path); 196e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek 19799c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek // Set the list of devices on which portal check is enabled. 19899c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek void SetCheckPortalList(const std::string& check_portal_list); 19999c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek 200f116bd654bcdb5d7c22656f224deeb7a67f7d0cdTed Kremenek const std::string& connecting_network() const { return connecting_network_; } 201f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek const std::string& check_portal_list() const { return check_portal_list_; } 202f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 203f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Generates a DictionaryValue of all NetworkState properties. Currently 204f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // provided for debugging purposes only. 205e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek void GetNetworkStatePropertiesForTest( 206e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek base::DictionaryValue* dictionary) const; 207f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek 208f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek // Construct and initialize an instance for testing. 209e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek static NetworkStateHandler* InitializeForTest(); 210e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek 2115c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek static const char kMatchTypeDefault[]; 2125c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek static const char kMatchTypeWireless[]; 21300a3a5f024ac54088ab887712b292171188064f0Ted Kremenek static const char kMatchTypeMobile[]; 21400a3a5f024ac54088ab887712b292171188064f0Ted Kremenek static const char kMatchTypeNonVirtual[]; 21500a3a5f024ac54088ab887712b292171188064f0Ted Kremenek 21600a3a5f024ac54088ab887712b292171188064f0Ted Kremenek // Default set of comma separated interfaces on which to enable 21700a3a5f024ac54088ab887712b292171188064f0Ted Kremenek // portal checking. 21800a3a5f024ac54088ab887712b292171188064f0Ted Kremenek static const char kDefaultCheckPortalList[]; 21900a3a5f024ac54088ab887712b292171188064f0Ted Kremenek 22000a3a5f024ac54088ab887712b292171188064f0Ted Kremenek protected: 2213bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek friend class NetworkHandler; 2223bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek NetworkStateHandler(); 2233bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek 2243bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek // ShillPropertyHandler::Listener overrides. 2253bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek 2263bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek // This adds new entries to the managed list specified by |type| and deletes 2273bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek // any entries that are no longer in the list. 2283bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek virtual void UpdateManagedList(ManagedState::ManagedType type, 2293bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek const base::ListValue& entries) OVERRIDE; 2303bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek 2313bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek // The list of profiles changed (i.e. a user has logged in). Re-request 2320e561a3e6755c4f248a8bb05d49071ddf4f2ef7bTed Kremenek // properties for all services since they may have changed. 2335dc7f8b2d6a4f94ab4d1377912499a23cf8bc024Ted Kremenek virtual void ProfileListChanged() OVERRIDE; 2345dc7f8b2d6a4f94ab4d1377912499a23cf8bc024Ted Kremenek 2353bbad550be7edc628be31b51d2a51b6d7d46eafbTed Kremenek // Parses the properties for the network service or device. Mostly calls 2365c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek // managed->PropertyChanged(key, value) for each dictionary entry. 237e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek virtual void UpdateManagedStateProperties( 238e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek ManagedState::ManagedType type, 239e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek const std::string& path, 240e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek const base::DictionaryValue& properties) OVERRIDE; 241e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek 242e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek // Called by ShillPropertyHandler when a watched service property changes. 243e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek virtual void UpdateNetworkServiceProperty( 244e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek const std::string& service_path, 245e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek const std::string& key, 246e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek const base::Value& value) OVERRIDE; 247e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek 248e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek // Called by ShillPropertyHandler when a watched device property changes. 249e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek virtual void UpdateDeviceProperty( 250e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek const std::string& device_path, 2515c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek const std::string& key, 252e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek const base::Value& value) OVERRIDE; 2535c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek 2545c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek // Called by ShillPropertyHandler when the portal check list manager property 2555c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek // changes. 2565c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek virtual void CheckPortalListChanged( 2575c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek const std::string& check_portal_list) OVERRIDE; 2584bf38da038cebf9396470630c3c39519e41706daTed Kremenek 2595dc7f8b2d6a4f94ab4d1377912499a23cf8bc024Ted Kremenek // Sends NetworkManagerChanged() to observers and logs an event. 2605dc7f8b2d6a4f94ab4d1377912499a23cf8bc024Ted Kremenek virtual void NotifyManagerPropertyChanged() OVERRIDE; 2615dc7f8b2d6a4f94ab4d1377912499a23cf8bc024Ted Kremenek 26299c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek // Called by |shill_property_handler_| when the service or device list has 2635dc7f8b2d6a4f94ab4d1377912499a23cf8bc024Ted Kremenek // changed and all entries have been updated. This updates the list and 26499c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek // notifies observers. If |type| == TYPE_NETWORK this also calls 265e5d5c204c761cc3b2a6374a15b035420f207c7afTed Kremenek // CheckDefaultNetworkChanged(). 26684867e60a466fa1199eb4e838ddf873a2f7658a9Ted Kremenek virtual void ManagedStateListChanged( 26784867e60a466fa1199eb4e838ddf873a2f7658a9Ted Kremenek ManagedState::ManagedType type) OVERRIDE; 26899c6ad3f22b865d0f4cce52bc36904403c9ed4c4Ted Kremenek 2695dc7f8b2d6a4f94ab4d1377912499a23cf8bc024Ted Kremenek // Called after construction. Called explicitly by tests after adding 2704bf38da038cebf9396470630c3c39519e41706daTed Kremenek // test observers. 2715c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek void InitShillPropertyHandler(); 2725c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek 2735c684c4be01fb98077a9b5e07ca1fdc01d8d97cbTed Kremenek private: 2744bf38da038cebf9396470630c3c39519e41706daTed Kremenek typedef std::list<base::Closure> ScanCallbackList; 275f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek typedef std::map<std::string, ScanCallbackList> ScanCompleteCallbackMap; 276f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek friend class NetworkStateHandlerTest; 2777d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek FRIEND_TEST_ALL_PREFIXES(NetworkStateHandlerTest, NetworkStateHandlerStub); 2784d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek 2797d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek // NetworkState specific method for UpdateManagedStateProperties which 2807d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek // notifies observers. 2817d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek void UpdateNetworkStateProperties(NetworkState* network, 2827d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek const base::DictionaryValue& properties); 28352a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek 2843b4f6702860208692f6ef28401e68de4e3ff9af9Ted Kremenek // Non-const getters for managed entries. These are const so that they can 2853b4f6702860208692f6ef28401e68de4e3ff9af9Ted Kremenek // be called by Get[Network|Device]State, even though they return non-const 2863b4f6702860208692f6ef28401e68de4e3ff9af9Ted Kremenek // pointers. 28771c29bdc931bc49644c581ec7d698f0dbf01a0aaTed Kremenek DeviceState* GetModifiableDeviceState(const std::string& device_path) const; 28871c29bdc931bc49644c581ec7d698f0dbf01a0aaTed Kremenek NetworkState* GetModifiableNetworkState( 28971c29bdc931bc49644c581ec7d698f0dbf01a0aaTed Kremenek const std::string& service_path) const; 2907d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek ManagedState* GetModifiableManagedState(const ManagedStateList* managed_list, 2917d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek const std::string& path) const; 2924d4dd85923ecfc9c38ac0e94fb2602e1cce4406bTed Kremenek 29371c29bdc931bc49644c581ec7d698f0dbf01a0aaTed Kremenek // Gets the list specified by |type|. 29471c29bdc931bc49644c581ec7d698f0dbf01a0aaTed Kremenek ManagedStateList* GetManagedList(ManagedState::ManagedType type); 2957d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek 29671c29bdc931bc49644c581ec7d698f0dbf01a0aaTed Kremenek // Helper function to notify observers. Calls CheckDefaultNetworkChanged(). 2977d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek void OnNetworkConnectionStateChanged(NetworkState* network); 298b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek 2997d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek // If the default network changed returns true and sets 3008e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek // |default_network_path_|. 3017d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek bool CheckDefaultNetworkChanged(); 3028e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek 3038e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek // Logs an event and notifies observers. 3048e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek void OnDefaultNetworkChanged(); 3058e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek 3068e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek // Notifies observers and updates connecting_network_. 30752a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek void NetworkPropertiesUpdated(const NetworkState* network); 30852a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek 30952a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek // Called whenever Device.Scanning state transitions to false. 31052a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek void ScanCompleted(const std::string& type); 31152a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek 3127d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek // Returns the technology type for |type|. 3137d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek std::string GetTechnologyForType(const std::string& type) const; 31450a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek 3157d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek // Shill property handler instance, owned by this class. 31650a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek scoped_ptr<internal::ShillPropertyHandler> shill_property_handler_; 31750a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek 3187d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek // Observer list 3197d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek ObserverList<NetworkStateHandlerObserver> observers_; 3207d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek 3217d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek // List of managed network states 3227d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek ManagedStateList network_list_; 3237d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek 3247d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek // List of managed favorite states; this list includes all entries in 3257d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek // Manager.ServiceCompleteList, but only entries with a non-empty Profile 3267d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek // property are returned in GetFavoriteList(). 3277d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek ManagedStateList favorite_list_; 328b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek 329b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek // List of managed device states 330b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek ManagedStateList device_list_; 331b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek 332b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek // Keeps track of the default network for notifying observers when it changes. 333e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek std::string default_network_path_; 334b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek 335b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek // Convenience member to track the user initiated connecting network. Set 3367d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek // externally when a connection is requested and cleared here when the state 337e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek // changes to something other than Connecting (after observers are notified). 338e5f4dcb6bd73a10df6eb6c3cfe057c88cb2362ccTed Kremenek // TODO(stevenjb): Move this to NetworkConfigurationHandler. 3397d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek std::string connecting_network_; 34052a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek 3418e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek // List of interfaces on which portal check is enabled. 3428e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek std::string check_portal_list_; 3438e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek 3448e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek // Callbacks to run when a scan for the technology type completes. 3458e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek ScanCompleteCallbackMap scan_complete_callbacks_; 3468e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek 3478e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek DISALLOW_COPY_AND_ASSIGN(NetworkStateHandler); 3488e49dd6e7e73b275a74338a5127a524f0765303cTed Kremenek}; 34952a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek 35052a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek} // namespace chromeos 35152a16499df87730c0252b431abdf2b2e32d756a6Ted Kremenek 3527d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek#endif // CHROMEOS_NETWORK_NETWORK_STATE_HANDLER_H_ 3537d7fe6d539b3bdb1701835223cca306c325614a7Ted Kremenek