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