Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef CHROMEOS_NETWORK_NETWORK_STATE_MANAGER_H_ | |
| 6 #define CHROMEOS_NETWORK_NETWORK_STATE_MANAGER_H_ | |
| 7 | |
| 8 #include <list> | |
| 9 #include <map> | |
| 10 #include <set> | |
| 11 #include <string> | |
| 12 | |
| 13 #include "base/gtest_prod_util.h" | |
| 14 #include "base/memory/weak_ptr.h" | |
| 15 #include "base/observer_list.h" | |
| 16 #include "chromeos/chromeos_export.h" | |
| 17 #include "chromeos/dbus/dbus_method_call_status.h" | |
| 18 #include "chromeos/dbus/shill_property_changed_observer.h" | |
| 19 #include "chromeos/network/managed_state.h" | |
| 20 | |
| 21 // Class for tracking the list of visible networks and their state. | |
|
Greg Spencer (Chromium)
2012/10/23 23:19:10
Move down to class declaration.
stevenjb
2012/10/25 00:41:58
Done.
| |
| 22 // This class maps essential state from the connection manager (Shill) for | |
| 23 // each visible network. It is not used to change state, and should not be | |
|
pneubeck (no reviews)
2012/10/24 14:41:42
Actually, SetTechnologyEnabled does change state.
stevenjb
2012/10/25 00:41:58
Done.
| |
| 24 // used to track local state for networks. | |
| 25 // This class must not outlive the ShillManagerClient instance. | |
|
pneubeck (no reviews)
2012/10/24 14:41:42
Maybe give also a comment on what the class guaran
stevenjb
2012/10/25 00:41:58
We will ensure this is not true.
| |
| 26 | |
| 27 namespace base { | |
| 28 class DictionaryValue; | |
| 29 class ListValue; | |
| 30 class Value; | |
| 31 } | |
| 32 | |
| 33 namespace chromeos { | |
| 34 | |
| 35 class DeviceState; | |
| 36 class NetworkState; | |
| 37 class NetworkServiceObserver; | |
| 38 class ShillManagerClient; | |
| 39 | |
| 40 class CHROMEOS_EXPORT NetworkStateManager | |
|
stevenjb
2012/10/23 22:59:38
Per discussion, will rename this NetworkStateHandl
stevenjb
2012/10/25 00:41:58
Done.
| |
| 41 : public ShillPropertyChangedObserver { | |
| 42 public: | |
| 43 typedef std::list<ManagedState*> ManagedStateList; | |
| 44 typedef std::list<NetworkState*> NetworkStateList; | |
| 45 typedef std::list<DeviceState*> DeviceStateList; | |
| 46 | |
| 47 // Observer class for all network state changes, including changes to | |
| 48 // active (connecting or connected) services. | |
| 49 class Observer { | |
|
Greg Spencer (Chromium)
2012/10/23 23:19:10
It may be better to move this outside of the class
stevenjb
2012/10/25 00:41:58
Done.
| |
| 50 public: | |
|
pneubeck (no reviews)
2012/10/24 14:41:42
You could disallow copy/assign here, otherwise the
stevenjb
2012/10/25 00:41:58
Done
| |
| 51 virtual ~Observer() {} | |
| 52 | |
| 53 // If |property| is non empty than that property has changed. Otherwise | |
| 54 // multiple properties may have changed. | |
| 55 virtual void NetworkManagerChanged(const std::string& property) {} | |
| 56 // The list of networks changed. | |
| 57 virtual void NetworkListChanged(const NetworkStateList& networks) {} | |
| 58 // The active network changed. |network| will be NULL if there is no longer | |
| 59 // an active network. | |
| 60 virtual void ActiveNetworkChanged(const NetworkState* network) {} | |
| 61 // The state of the active network changed. | |
| 62 virtual void ActiveNetworkStateChanged(const NetworkState* network) {} | |
| 63 // A network service property changed. |property| is the name of the changed | |
| 64 // property (from service_constants.h). Note: for the active network, | |
| 65 // this will be called in *addition* to ActiveNetworkStateChanged() if | |
| 66 // property == flimflam::kStateProperty. | |
| 67 virtual void NetworkServicePropertyChanged(const NetworkState* network, | |
| 68 const std::string& property) {} | |
| 69 }; | |
| 70 | |
| 71 NetworkStateManager(); | |
| 72 ~NetworkStateManager(); | |
| 73 | |
| 74 // Initialize NetworkStateManager. Sends an initial property request. | |
| 75 void Init(); | |
| 76 | |
| 77 // Add remove observers. | |
| 78 void AddObserver(Observer* observer); | |
| 79 void RemoveObserver(Observer* observer); | |
| 80 | |
| 81 // Request an immediate network scan. | |
| 82 void RequestScan() const; | |
|
stevenjb
2012/10/23 23:12:09
Will remove and make implicit in GetNetworkList().
stevenjb
2012/10/25 00:41:58
Done.
| |
| 83 | |
| 84 // Manage the state of enabled / available technologies. | |
|
pneubeck (no reviews)
2012/10/24 14:41:42
A bit misleading. Better split into separate comme
| |
| 85 bool TechnologyAvailable(const std::string& technology) const; | |
| 86 bool TechnologyEnabled(const std::string& technology) const; | |
| 87 void SetTechnologyEnabled(const std::string& technology, bool enabled); | |
|
stevenjb
2012/10/23 23:12:09
Add TODO: Add an error handler callback for SetTec
pneubeck (no reviews)
2012/10/24 14:41:42
Emphasize, that this does not change which technol
Greg Spencer (Chromium)
2012/10/24 22:27:42
As a general rule, how will we know about DBus cal
stevenjb
2012/10/25 00:41:58
It is the responsibility of this class to maintain
Greg Spencer (Chromium)
2012/10/25 21:51:42
On 2012/10/25 00:41:58, stevenjb (chromium) wrote:
| |
| 88 | |
| 89 // Finds and returns a device by |path|. Returns NULL if not found. | |
| 90 const DeviceState* GetDeviceState(const std::string& path) const; | |
| 91 | |
| 92 // Finds and returns a device by |type|. Returns NULL if not found. | |
| 93 const DeviceState* GetDeviceStateByType(const std::string& type) const; | |
| 94 | |
| 95 // Finds and returns a network by |path|. Returns NULL if not found. | |
| 96 const NetworkState* GetNetworkState(const std::string& path) const; | |
| 97 | |
| 98 // Returns the "active" network (first network in the list if connected). | |
|
Greg Spencer (Chromium)
2012/10/25 21:51:42
What does this return if not connected? (I'm assum
stevenjb
2012/10/25 22:05:22
Done.
| |
| 99 const NetworkState* ActiveNetwork() const; | |
| 100 | |
| 101 // Returns the first connected network of type |type|, otherwise NULL. | |
| 102 // An empty type will return any connected non-ethernet network. | |
| 103 const NetworkState* ConnectedNetworkByType(const std::string& type) const; | |
| 104 | |
| 105 // Returns the first connecting network of type |type|, otherwise NULL. | |
| 106 // An empty type will return any connecting non-ethernet network. | |
| 107 const NetworkState* ConnectingNetworkByType(const std::string& type) const; | |
| 108 | |
| 109 // Returns the hardware (MAC) address for the first connected network | |
| 110 // matching |type|, or an empty string if none. | |
| 111 std::string HardwareAddress(const std::string& type) const; | |
| 112 // Same as above but in aa:bb format. | |
| 113 std::string HardwareAddressFormatted(const std::string& type) const; | |
| 114 | |
| 115 const NetworkStateList& network_list() const { return network_list_; } | |
|
stevenjb
2012/10/23 23:12:09
Will change to GetNetworkList() and have this requ
stevenjb
2012/10/25 00:41:58
Done.
| |
| 116 | |
| 117 // ShillPropertyChangedObserver overrides. | |
| 118 virtual void OnPropertyChanged(const std::string& key, | |
| 119 const base::Value& value); | |
|
Greg Spencer (Chromium)
2012/10/23 23:19:10
Add OVERRIDE
stevenjb
2012/10/25 00:41:58
Done.
| |
| 120 | |
| 121 private: | |
|
pneubeck (no reviews)
2012/10/24 14:41:42
Since this is a rather central manager. Should the
stevenjb
2012/10/25 00:41:58
In general in Chrome we rely on fast compilation t
| |
| 122 FRIEND_TEST_ALL_PREFIXES(NetworkStateManagerTest, NetworkStateManagerStub); | |
| 123 | |
| 124 typedef std::map<std::string, NetworkServiceObserver*> | |
| 125 NetworkServiceObservers; | |
|
Greg Spencer (Chromium)
2012/10/23 23:19:10
nit: NetworkServiceObserverMap instead?
stevenjb
2012/10/25 00:41:58
Done.
| |
| 126 | |
| 127 // Non-const getters for managed entries. | |
| 128 DeviceState* GetModifiableDeviceState(const std::string& path); | |
|
pneubeck (no reviews)
2012/10/24 14:41:42
Make these two methods const (using const_iterator
stevenjb
2012/10/25 00:41:58
The const cast is for the return values, to avoid
| |
| 129 NetworkState* GetModifiableNetworkState(const std::string& path); | |
| 130 | |
| 131 // Callback for dbus method fetching properties. | |
| 132 void ManagerPropertiesCallback(DBusMethodCallStatus call_status, | |
| 133 const base::DictionaryValue& properties); | |
| 134 // Called form OnPropertyChanged() and ManagerPropertiesCallback(). | |
| 135 // Returns true if observers should be notified. | |
| 136 bool ManagerPropertyChanged(const std::string& key, const base::Value& value); | |
| 137 | |
| 138 // Casts the list specified by |type| to a list of base ManagedState pointers. | |
| 139 ManagedStateList* GetManagedList(ManagedState::ManagedType type); | |
| 140 | |
| 141 // Adds new entries to the managed list specified by |type| and deletes any | |
| 142 // entries that are no longer in the list. | |
| 143 void UpdateManagedList(ManagedState::ManagedType type, | |
| 144 const base::ListValue& entries); | |
| 145 | |
| 146 // Updates the Shill service property observers to observe any connected | |
| 147 // or connecting networks. | |
| 148 void UpdateObservedNetworkServices(); | |
| 149 | |
| 150 // Sets |available_technologies_| to contain only entries in |technologies|. | |
| 151 void UpdateAvailableTechnologies(const base::ListValue& technologies); | |
| 152 | |
| 153 // Sets |enabled_technologies_| to contain only entries in |technologies|. | |
| 154 void UpdateEnabledTechnologies(const base::ListValue& technologies); | |
| 155 | |
| 156 // Requests all properties for the service or device (called for new items). | |
| 157 void RequestProperties(ManagedState::ManagedType type, | |
| 158 const std::string& path); | |
| 159 | |
| 160 // Called when Shill returns the properties for a service or device. | |
| 161 void GetPropertiesCallback(ManagedState::ManagedType type, | |
| 162 const std::string& path, | |
| 163 DBusMethodCallStatus call_status, | |
| 164 const base::DictionaryValue& properties); | |
| 165 | |
| 166 // Parses the properties for the service or device. Mostly calls | |
| 167 // managed->PropertyChanged(key, value) for each dictionary entry. | |
| 168 void ParseProperties(ManagedState* managed, | |
| 169 const base::DictionaryValue& properties); | |
| 170 | |
| 171 // Callback invoked when a watched service property changes. Calls | |
| 172 // network->PropertyChanged(key, value) and signals observers. | |
| 173 void NetworkServicePropertyChanged(const std::string& path, | |
| 174 const std::string& key, | |
| 175 const base::Value& value); | |
| 176 | |
| 177 // Callback for getting the IPConfig property of a Network. Handled here | |
| 178 // instead of in NetworkState so that all asynchronous requests are done | |
| 179 // in a single place (also simplifies NetworkState considerably). | |
| 180 void GetIPConfigCallback(const std::string& path, | |
| 181 DBusMethodCallStatus call_status, | |
| 182 const base::DictionaryValue& properties); | |
| 183 | |
| 184 // Test accessors | |
| 185 int NumObservedNetworksForTest() const { return observed_networks_.size(); } | |
| 186 | |
| 187 // Convenince pointer for ShillManagerClient | |
|
pneubeck (no reviews)
2012/10/24 14:41:42
nit: Convenience
stevenjb
2012/10/25 00:41:58
Done.
| |
| 188 ShillManagerClient* shill_manager_; | |
| 189 | |
| 190 // Observer list | |
| 191 ObserverList<Observer> observers_; | |
| 192 | |
| 193 // Lists of managed states | |
| 194 NetworkStateList network_list_; | |
|
pneubeck (no reviews)
2012/10/24 14:41:42
These lists are never modified, but only new ones
stevenjb
2012/10/25 00:41:58
Evolutionary artifact. scoped_vector<> is high ove
| |
| 195 DeviceStateList device_list_; | |
| 196 | |
| 197 // Pending update count for each managed state type | |
| 198 std::map<ManagedState::ManagedType, int> pending_updates_; | |
| 199 | |
| 200 // Lists of available / enabled technologies | |
| 201 std::set<std::string> available_technologies_; | |
| 202 std::set<std::string> enabled_technologies_; | |
| 203 | |
| 204 // List of network services with Shill property changed observers | |
| 205 NetworkServiceObservers observed_networks_; | |
| 206 | |
| 207 // Keep track of the active network for notifying observers when it changes. | |
| 208 std::string active_network_path_; | |
| 209 | |
| 210 // For Shill client callbacks | |
| 211 base::WeakPtrFactory<NetworkStateManager> weak_ptr_factory_; | |
| 212 | |
| 213 DISALLOW_COPY_AND_ASSIGN(NetworkStateManager); | |
| 214 }; | |
| 215 | |
| 216 } // namespace chromeos | |
| 217 | |
| 218 #endif // CHROMEOS_NETWORK_NETWORK_STATE_MANAGER_H_ | |
| OLD | NEW |