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