network_state_handler.h revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROMEOS_NETWORK_NETWORK_STATE_HANDLER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROMEOS_NETWORK_NETWORK_STATE_HANDLER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/chromeos_export.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/network/managed_state.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/network/network_handler.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/network/network_handler_callbacks.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/network/shill_property_handler.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tracked_objects { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Location; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DeviceState; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkState; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkStateHandlerObserver; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkStateHandlerTest; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Class for tracking the list of visible networks and their properties. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class maps essential properties from the connection manager (Shill) for 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// each visible network. It is not used to change the properties of services or 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// devices, only global (manager) properties. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All getters return the currently cached properties. This class is expected to 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// keep properties up to date by managing the appropriate Shill observers. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It will invoke its own more specific observer methods when the specified 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// changes occur. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Most *ByType or *ForType methods will accept any of the following for 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |type|. See individual methods for specific notes. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Any type defined in service_constants.h (e.g. flimflam::kTypeWifi) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * kMatchTypeDefault returns the default (active) network 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * kMatchTypeNonVirtual returns the primary non virtual network 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * kMatchTypeWireless returns the primary wireless network 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * kMatchTypeMobile returns the primary cellular or wimax network 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CHROMEOS_EXPORT NetworkStateHandler 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public internal::ShillPropertyHandler::Listener { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<ManagedState*> ManagedStateList; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<const NetworkState*> NetworkStateList; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum TechnologyState { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TECHNOLOGY_UNAVAILABLE, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TECHNOLOGY_AVAILABLE, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TECHNOLOGY_UNINITIALIZED, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TECHNOLOGY_ENABLING, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TECHNOLOGY_ENABLED 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~NetworkStateHandler(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add/remove observers. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddObserver(NetworkStateHandlerObserver* observer, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& from_here); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveObserver(NetworkStateHandlerObserver* observer, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& from_here); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the state for technology |type|. kMatchTypeMobile (only) is 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // also supported. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TechnologyState GetTechnologyState(const std::string& type) const; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsTechnologyEnabled(const std::string& type) const { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetTechnologyState(type) == TECHNOLOGY_ENABLED; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Asynchronously sets the technology enabled property for |type|. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // kMatchTypeMobile (only) is also supported. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: Modifies Manager state. Calls |error_callback| on failure. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetTechnologyEnabled( 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& type, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool enabled, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const network_handler::ErrorCallback& error_callback); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finds and returns a device state by |device_path| or NULL if not found. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DeviceState* GetDeviceState(const std::string& device_path) const; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finds and returns a device state by |type|. Returns NULL if not found. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See note above for valid types. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DeviceState* GetDeviceStateByType(const std::string& type) const; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if any device of |type| is scanning. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See note above for valid types. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetScanningByType(const std::string& type) const; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finds and returns a network state by |service_path| or NULL if not found. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: NetworkState is frequently updated asynchronously, i.e. properties 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are not always updated all at once. This will contain the most recent 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // value for each property. To receive notifications when a property changes, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // observe this class and implement NetworkPropertyChanged(). 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NetworkState* GetNetworkState(const std::string& service_path) const; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the default connected network (which includes VPNs) or NULL. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is equivalent to ConnectedNetworkByType(kMatchTypeDefault). 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NetworkState* DefaultNetwork() const; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the primary connected network of matching |type|, otherwise NULL. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See note above for valid types. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NetworkState* ConnectedNetworkByType(const std::string& type) const; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Like ConnectedNetworkByType() but returns a connecting network or NULL. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NetworkState* ConnectingNetworkByType(const std::string& type) const; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Like ConnectedNetworkByType() but returns any matching network or NULL. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mostly useful for mobile networks where there is generally only one 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // network. Note: O(N). 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NetworkState* FirstNetworkByType(const std::string& type) const; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the hardware (MAC) address for the first connected network 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // matching |type|, or an empty string if none. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See note above for valid types. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string HardwareAddressForType(const std::string& type) const; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same as above but in aa:bb format. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string FormattedHardwareAddressForType(const std::string& type) const; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets |list| to contain the list of networks. The returned list contains 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a copy of NetworkState pointers which should not be stored or used beyond 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the scope of the calling function (i.e. they may later become invalid, but 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only on the UI thread). 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetNetworkList(NetworkStateList* list) const; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests a network scan. This may trigger updates to the network 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // list, which will trigger the appropriate observer calls. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RequestScan() const; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request a scan if not scanning and run |callback| when the Scanning state 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for any Device matching |type| completes. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForScan(const std::string& type, const base::Closure& callback); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request a network scan then signal Shill to connect to the best available 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // networks when completed. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ConnectToBestWifiNetwork(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request an update for an existing NetworkState, e.g. after configuring 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a network. This is a no-op if an update request is already pending. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the network exists and an update is requested or pending. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the properties are received, NetworkPropertiesUpdated will be 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // signaled for each member of |observers_|, regardless of whether any 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // properties actually changed. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool RequestUpdateForNetwork(const std::string& service_path); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request an update for all existing NetworkState entries, e.g. after 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loading an ONC configuration file that may have updated one or more 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // existing networks. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RequestUpdateForAllNetworks(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the user initiated connecting network. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetConnectingNetwork(const std::string& service_path); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the list of devices on which portal check is enabled. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetCheckPortalList(const std::string& check_portal_list); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& connecting_network() const { return connecting_network_; } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& check_portal_list() const { return check_portal_list_; } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generates a DictionaryValue of all NetworkState properties. Currently 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // provided for debugging purposes only. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetNetworkStatePropertiesForTest( 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* dictionary) const; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct and initialize an instance for testing. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static NetworkStateHandler* InitializeForTest(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kMatchTypeDefault[]; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kMatchTypeWireless[]; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kMatchTypeMobile[]; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kMatchTypeNonVirtual[]; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Default set of comma separated interfaces on which to enable 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // portal checking. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kDefaultCheckPortalList[]; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class NetworkHandler; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkStateHandler(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ShillPropertyHandler::Listener overrides. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This adds new entries to the managed list specified by |type| and deletes 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // any entries that are no longer in the list. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateManagedList(ManagedState::ManagedType type, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue& entries) OVERRIDE; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The list of profiles changed (i.e. a user has logged in). Re-request 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // properties for all services since they may have changed. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ProfileListChanged() OVERRIDE; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parses the properties for the network service or device. Mostly calls 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // managed->PropertyChanged(key, value) for each dictionary entry. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateManagedStateProperties( 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ManagedState::ManagedType type, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& properties) OVERRIDE; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by ShillPropertyHandler when a watched service property changes. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateNetworkServiceProperty( 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& service_path, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) OVERRIDE; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by ShillPropertyHandler when a watched device property changes. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateDeviceProperty( 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& device_path, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) OVERRIDE; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by ShillPropertyHandler when the portal check list manager property 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changes. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CheckPortalListChanged( 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& check_portal_list) OVERRIDE; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sends NetworkManagerChanged() to observers and logs an event. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void NotifyManagerPropertyChanged() OVERRIDE; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by |shill_property_handler_| when the service or device list has 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changed and all entries have been updated. This updates the list and 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notifies observers. If |type| == TYPE_NETWORK this also calls 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CheckDefaultNetworkChanged(). 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ManagedStateListChanged( 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ManagedState::ManagedType type) OVERRIDE; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called after construction. Called explicitly by tests after adding 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test observers. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitShillPropertyHandler(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::list<base::Closure> ScanCallbackList; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<std::string, ScanCallbackList> ScanCompleteCallbackMap; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class NetworkStateHandlerTest; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(NetworkStateHandlerTest, NetworkStateHandlerStub); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Non-const getters for managed entries. These are const so that they can 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be called by Get[Network|Device]State, even though they return non-const 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointers. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeviceState* GetModifiableDeviceState(const std::string& device_path) const; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkState* GetModifiableNetworkState( 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& service_path) const; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ManagedState* GetModifiableManagedState(const ManagedStateList* managed_list, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path) const; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the list specified by |type|. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ManagedStateList* GetManagedList(ManagedState::ManagedType type); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper function to notify observers. Calls CheckDefaultNetworkChanged(). 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnNetworkConnectionStateChanged(NetworkState* network); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the default network changed returns true and sets 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |default_network_path_|. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CheckDefaultNetworkChanged(); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Logs an event and notifies observers. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDefaultNetworkChanged(); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifies observers and updates connecting_network_. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NetworkPropertiesUpdated(const NetworkState* network); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called whenever Device.Scanning state transitions to false. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ScanCompleted(const std::string& type); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the technology type for |type|. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetTechnologyForType(const std::string& type) const; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shill property handler instance, owned by this class. 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<internal::ShillPropertyHandler> shill_property_handler_; 286 287 // Observer list 288 ObserverList<NetworkStateHandlerObserver> observers_; 289 290 // Lists of managed states 291 ManagedStateList network_list_; 292 ManagedStateList device_list_; 293 294 // Keeps track of the default network for notifying observers when it changes. 295 std::string default_network_path_; 296 297 // Convenience member to track the user initiated connecting network. Set 298 // externally when a connection is requested and cleared here when the state 299 // changes to something other than Connecting (after observers are notified). 300 // TODO(stevenjb): Move this to NetworkConfigurationHandler. 301 std::string connecting_network_; 302 303 // List of interfaces on which portal check is enabled. 304 std::string check_portal_list_; 305 306 // Callbacks to run when a scan for the technology type completes. 307 ScanCompleteCallbackMap scan_complete_callbacks_; 308 309 DISALLOW_COPY_AND_ASSIGN(NetworkStateHandler); 310}; 311 312} // namespace chromeos 313 314#endif // CHROMEOS_NETWORK_NETWORK_STATE_HANDLER_H_ 315