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) 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (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" 165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/memory/scoped_vector.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/chromeos_export.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/network/managed_state.h" 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/network/network_handler.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_handler_callbacks.h" 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chromeos/network/network_type_pattern.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/network/shill_property_handler.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace tracked_objects { 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class Location; 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DeviceState; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkState; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkStateHandlerObserver; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetworkStateHandlerTest; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Class for tracking the list of visible networks and their properties. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class maps essential properties from the connection manager (Shill) for 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// each visible network. It is not used to change the properties of services or 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// devices, only global (manager) properties. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// All getters return the currently cached properties. This class is expected to 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// keep properties up to date by managing the appropriate Shill observers. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It will invoke its own more specific observer methods when the specified 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// changes occur. 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Some notes about NetworkState and GUIDs: 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// * A NetworkState exists for all network services stored in a profile, and 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// all "visible" networks (physically connected networks like ethernet and 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// cellular or in-range wifi networks). If the network is stored in a profile, 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// NetworkState.IsInProfile() will return true. 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// * "Visible" networks return true for NetworkState.visible(). 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// * All networks saved to a profile will have a saved GUID that is persistent 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// across sessions. 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// * Networks that are not saved to a profile will have a GUID assigned when 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// the initial properties are received. The GUID will be consistent for 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// the duration of a session, even if the network drops out and returns. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CHROMEOS_EXPORT NetworkStateHandler 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public internal::ShillPropertyHandler::Listener { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<ManagedState*> ManagedStateList; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<const NetworkState*> NetworkStateList; 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch typedef std::vector<const DeviceState*> DeviceStateList; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enum TechnologyState { 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TECHNOLOGY_UNAVAILABLE, 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TECHNOLOGY_AVAILABLE, 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TECHNOLOGY_UNINITIALIZED, 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TECHNOLOGY_ENABLING, 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TECHNOLOGY_ENABLED 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~NetworkStateHandler(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add/remove observers. 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void AddObserver(NetworkStateHandlerObserver* observer, 847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const tracked_objects::Location& from_here); 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void RemoveObserver(NetworkStateHandlerObserver* observer, 867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const tracked_objects::Location& from_here); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns the state for technology |type|. Only 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // NetworkTypePattern::Primitive, ::Mobile and ::Ethernet are supported. 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TechnologyState GetTechnologyState(const NetworkTypePattern& type) const; 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool IsTechnologyAvailable(const NetworkTypePattern& type) const { 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return GetTechnologyState(type) != TECHNOLOGY_UNAVAILABLE; 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool IsTechnologyEnabled(const NetworkTypePattern& type) const { 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return GetTechnologyState(type) == TECHNOLOGY_ENABLED; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Asynchronously sets the technology enabled property for |type|. Only 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // NetworkTypePattern::Primitive, ::Mobile and ::Ethernet are supported. 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note: Modifies Manager state. Calls |error_callback| on failure. 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetTechnologyEnabled( 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const NetworkTypePattern& type, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool enabled, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const network_handler::ErrorCallback& error_callback); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finds and returns a device state by |device_path| or NULL if not found. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DeviceState* GetDeviceState(const std::string& device_path) const; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finds and returns a device state by |type|. Returns NULL if not found. 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const DeviceState* GetDeviceStateByType(const NetworkTypePattern& type) const; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true if any device of |type| is scanning. 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool GetScanningByType(const NetworkTypePattern& type) const; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finds and returns a network state by |service_path| or NULL if not found. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: NetworkState is frequently updated asynchronously, i.e. properties 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are not always updated all at once. This will contain the most recent 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // value for each property. To receive notifications when a property changes, 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // observe this class and implement NetworkPropertyChanged(). 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NetworkState* GetNetworkState(const std::string& service_path) const; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Returns the default network (which includes VPNs) based on the Shill 123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Manager.DefaultNetwork property. Normally this is the same as 124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // ConnectedNetworkByType(NetworkTypePattern::Default()), but the timing might 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // differ. 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NetworkState* DefaultNetwork() const; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the primary connected network of matching |type|, otherwise NULL. 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const NetworkState* ConnectedNetworkByType( 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const NetworkTypePattern& type) const; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Like ConnectedNetworkByType() but returns a connecting network or NULL. 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const NetworkState* ConnectingNetworkByType( 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const NetworkTypePattern& type) const; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Like ConnectedNetworkByType() but returns any matching visible network or 137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // NULL. Mostly useful for mobile networks where there is generally only one 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // network. Note: O(N). 1396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const NetworkState* FirstNetworkByType(const NetworkTypePattern& type); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns the aa:bb formatted hardware (MAC) address for the first connected 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // network matching |type|, or an empty string if none is connected. 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string FormattedHardwareAddressForType( 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const NetworkTypePattern& type) const; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Convenience method to call GetNetworkListByType(visible=true). 147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void GetVisibleNetworkListByType(const NetworkTypePattern& type, 1486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) NetworkStateList* list); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Convenience method for GetVisibleNetworkListByType(Default). 1516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) void GetVisibleNetworkList(NetworkStateList* list); 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Sets |list| to contain the list of networks with matching |type| and the 154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // following properties: 155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |configured_only| - if true only include networks where IsInProfile is true 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |visible_only| - if true only include networks in the visible Services list 157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |limit| - if > 0 limits the number of results. 158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The returned list contains a copy of NetworkState pointers which should not 159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // be stored or used beyond the scope of the calling function (i.e. they may 1606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // later become invalid, but only on the UI thread). SortNetworkList() will be 1616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // called if necessary to provide the states in a convenient order (see 1626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // SortNetworkList for details). 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void GetNetworkListByType(const NetworkTypePattern& type, 164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool configured_only, 165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool visible_only, 166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int limit, 1676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) NetworkStateList* list); 168424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Finds and returns the NetworkState associated with |service_path| or NULL 170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // if not found. If |configured_only| is true, only returns saved entries 171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // (IsInProfile is true). 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const NetworkState* GetNetworkStateFromServicePath( 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& service_path, 174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool configured_only) const; 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Finds and returns the NetworkState associated with |guid| or NULL if not 177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // found. This returns all entries (IsInProfile() may be true or false). 178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const NetworkState* GetNetworkStateFromGuid(const std::string& guid) const; 179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Sets |list| to contain the list of devices. The returned list contains 1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // a copy of DeviceState pointers which should not be stored or used beyond 1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // the scope of the calling function (i.e. they may later become invalid, but 1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // only on the UI thread). 1847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void GetDeviceList(DeviceStateList* list) const; 1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Like GetDeviceList() but only returns networks with matching |type|. 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void GetDeviceListByType(const NetworkTypePattern& type, 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeviceStateList* list) const; 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Requests a network scan. This may trigger updates to the network 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // list, which will trigger the appropriate observer calls. 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RequestScan() const; 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Request a scan if not scanning and run |callback| when the Scanning state 19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // for any Device of network type |type| completes. 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void WaitForScan(const std::string& type, const base::Closure& callback); 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Request a network scan then signal Shill to connect to the best available 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // networks when completed. 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ConnectToBestWifiNetwork(); 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Request an update for an existing NetworkState, e.g. after configuring 2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // a network. This is a no-op if an update request is already pending. To 2043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // ensure that a change is picked up, this must be called after Shill 2053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // acknowledged it (e.g. in the callback of a SetProperties). 20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // When the properties are received, NetworkPropertiesUpdated will be 20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // signaled for each member of |observers_|, regardless of whether any 20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // properties actually changed. 2093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void RequestUpdateForNetwork(const std::string& service_path); 21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Clear the last_error value for the NetworkState for |service_path|. 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void ClearLastErrorForNetwork(const std::string& service_path); 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Set the list of devices on which portal check is enabled. 215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void SetCheckPortalList(const std::string& check_portal_list); 216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string& GetCheckPortalListForTest() const { 218d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return check_portal_list_; 219d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Returns the NetworkState of the EthernetEAP service, which contains the 2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // EAP parameters used by the ethernet with |service_path|. If |service_path| 2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // doesn't refer to an ethernet service or if the ethernet service is not 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // connected using EAP, returns NULL. 2256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const NetworkState* GetEAPForEthernet(const std::string& service_path); 2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 22746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& default_network_path() const { 22846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return default_network_path_; 22946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Construct and initialize an instance for testing. 23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static NetworkStateHandler* InitializeForTest(); 23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Default set of comma separated interfaces on which to enable 235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // portal checking. 236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static const char kDefaultCheckPortalList[]; 237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) friend class NetworkHandler; 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkStateHandler(); 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ShillPropertyHandler::Listener overrides. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // This adds new entries to |network_list_| or |device_list_| and deletes any 245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // entries that are no longer in the list. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateManagedList(ManagedState::ManagedType type, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue& entries) OVERRIDE; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The list of profiles changed (i.e. a user has logged in). Re-request 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // properties for all services since they may have changed. 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ProfileListChanged() OVERRIDE; 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parses the properties for the network service or device. Mostly calls 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // managed->PropertyChanged(key, value) for each dictionary entry. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateManagedStateProperties( 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ManagedState::ManagedType type, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& properties) OVERRIDE; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by ShillPropertyHandler when a watched service property changes. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateNetworkServiceProperty( 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& service_path, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) OVERRIDE; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called by ShillPropertyHandler when a watched device property changes. 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void UpdateDeviceProperty( 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_path, 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& key, 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value& value) OVERRIDE; 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Called by ShillPropertyHandler when a watched network or device 273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // IPConfig property changes. 274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void UpdateIPConfigProperties( 275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ManagedState::ManagedType type, 276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& path, 277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& ip_config_path, 278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::DictionaryValue& properties) OVERRIDE; 279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Called by ShillPropertyHandler when the portal check list manager property 281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // changes. 282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void CheckPortalListChanged( 283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& check_portal_list) OVERRIDE; 284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 285d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Called by ShillPropertyHandler when a technology list changes. 286d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void TechnologyListChanged() OVERRIDE; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by |shill_property_handler_| when the service or device list has 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // changed and all entries have been updated. This updates the list and 2906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // notifies observers. 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ManagedStateListChanged( 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ManagedState::ManagedType type) OVERRIDE; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Called when the default network service changes. Sets default_network_path_ 295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // and notifies listeners. 296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DefaultNetworkServiceChanged( 297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& service_path) OVERRIDE; 298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Called after construction. Called explicitly by tests after adding 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // test observers. 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void InitShillPropertyHandler(); 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef std::list<base::Closure> ScanCallbackList; 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef std::map<std::string, ScanCallbackList> ScanCompleteCallbackMap; 306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) typedef std::map<std::string, std::string> SpecifierGuidMap; 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class NetworkStateHandlerTest; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(NetworkStateHandlerTest, NetworkStateHandlerStub); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Sorts the network list. Called when all network updates have been received, 3116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // or when the network list is requested but the list is in an unsorted state. 3126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Networks are sorted as follows, maintaining the existing relative ordering: 3136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // * Connected or connecting networks (should be listed first by Shill) 3146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // * Visible non-wifi networks 3156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // * Visible wifi networks 3166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // * Hidden (wifi) networks 3176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) void SortNetworkList(); 3186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Updates UMA stats. Called once after all requested networks are updated. 3206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) void UpdateNetworkStats(); 3216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // NetworkState specific method for UpdateManagedStateProperties which 3232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // notifies observers. 3242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch void UpdateNetworkStateProperties(NetworkState* network, 3252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const base::DictionaryValue& properties); 3262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Ensure a valid GUID for NetworkState. 328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void UpdateGuid(NetworkState* network); 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 330d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Sends DeviceListChanged() to observers and logs an event. 331d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void NotifyDeviceListChanged(); 332d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Non-const getters for managed entries. These are const so that they can 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be called by Get[Network|Device]State, even though they return non-const 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointers. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeviceState* GetModifiableDeviceState(const std::string& device_path) const; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkState* GetModifiableNetworkState( 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& service_path) const; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ManagedState* GetModifiableManagedState(const ManagedStateList* managed_list, 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path) const; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the list specified by |type|. 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ManagedStateList* GetManagedList(ManagedState::ManagedType type); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Helper function to notify observers. Calls CheckDefaultNetworkChanged(). 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnNetworkConnectionStateChanged(NetworkState* network); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Notifies observers when the default network or its properties change. 349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void NotifyDefaultNetworkChanged(const NetworkState* default_network); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Notifies observers about changes to |network|, including IPConfg. 352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void NotifyNetworkPropertiesUpdated(const NetworkState* network); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Notifies observers about changes to |device|, including IPConfigs. 355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void NotifyDevicePropertiesUpdated(const DeviceState* device); 356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Called whenever Device.Scanning state transitions to false. 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ScanCompleted(const std::string& type); 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Returns one technology type for |type|. This technology will be the 3615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // highest priority technology in the type pattern. 36258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string GetTechnologyForType(const NetworkTypePattern& type) const; 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Returns all the technology types for |type|. 3655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ScopedVector<std::string> GetTechnologiesForType( 3665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const NetworkTypePattern& type) const; 3675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shill property handler instance, owned by this class. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<internal::ShillPropertyHandler> shill_property_handler_; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Observer list 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverList<NetworkStateHandlerObserver> observers_; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // List of managed network states 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ManagedStateList network_list_; 376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Set to true when the network list is sorted, cleared when network updates 3786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // arrive. Used to trigger sorting when needed. 3796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bool network_list_sorted_; 3806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // List of managed device states 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ManagedStateList device_list_; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Keeps track of the default network for notifying observers when it changes. 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string default_network_path_; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // List of interfaces on which portal check is enabled. 388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string check_portal_list_; 389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Callbacks to run when a scan for the technology type completes. 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScanCompleteCallbackMap scan_complete_callbacks_; 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Map of network specifiers to guids. Contains an entry for each 394f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // NetworkState that is not saved in a profile. 395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SpecifierGuidMap specifier_guid_map_; 396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NetworkStateHandler); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROMEOS_NETWORK_NETWORK_STATE_HANDLER_H_ 403