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 CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_IMPL_CROS_H_
6#define CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_IMPL_CROS_H_
7
8#include "base/time/time.h"
9#include "chrome/browser/chromeos/cros/network_library_impl_base.h"
10
11namespace chromeos {
12
13class CrosNetworkWatcher;
14
15class NetworkLibraryImplCros : public NetworkLibraryImplBase  {
16 public:
17  NetworkLibraryImplCros();
18  virtual ~NetworkLibraryImplCros();
19
20  virtual void Init() OVERRIDE;
21  virtual bool IsCros() const OVERRIDE;
22
23  //////////////////////////////////////////////////////////////////////////////
24  // NetworkLibraryImplBase implementation.
25
26  virtual void MonitorNetworkStart(const std::string& service_path) OVERRIDE;
27  virtual void MonitorNetworkStop(const std::string& service_path) OVERRIDE;
28  virtual void MonitorNetworkDeviceStart(
29      const std::string& device_path) OVERRIDE;
30  virtual void MonitorNetworkDeviceStop(
31      const std::string& device_path) OVERRIDE;
32
33  virtual void CallConfigureService(const std::string& identifier,
34                                    const base::DictionaryValue* info) OVERRIDE;
35  virtual void CallConnectToNetwork(Network* network) OVERRIDE;
36  virtual void CallRequestWifiNetworkAndConnect(
37      const std::string& ssid, ConnectionSecurity security) OVERRIDE;
38  virtual void CallRequestVirtualNetworkAndConnect(
39      const std::string& service_name,
40      const std::string& server_hostname,
41      ProviderType provider_type) OVERRIDE;
42  virtual void CallDeleteRememberedNetwork(
43      const std::string& profile_path,
44      const std::string& service_path) OVERRIDE;
45
46  //////////////////////////////////////////////////////////////////////////////
47  // NetworkLibrary implementation.
48
49  virtual void ChangePin(const std::string& old_pin,
50                         const std::string& new_pin) OVERRIDE;
51  virtual void ChangeRequirePin(bool require_pin,
52                                const std::string& pin) OVERRIDE;
53  virtual void EnterPin(const std::string& pin) OVERRIDE;
54  virtual void UnblockPin(const std::string& puk,
55                          const std::string& new_pin) OVERRIDE;
56  virtual void RequestCellularScan() OVERRIDE;
57  virtual void RequestCellularRegister(const std::string& network_id) OVERRIDE;
58  virtual void SetCellularDataRoamingAllowed(bool new_value) OVERRIDE;
59  virtual void SetCarrier(const std::string& carrier,
60                          const NetworkOperationCallback& completed) OVERRIDE;
61  virtual bool IsCellularAlwaysInRoaming() OVERRIDE;
62  virtual void RequestNetworkScan() OVERRIDE;
63
64  virtual void DisconnectFromNetwork(const Network* network) OVERRIDE;
65  virtual void CallEnableNetworkDeviceType(
66      ConnectionType device, bool enable) OVERRIDE;
67  virtual void CallRemoveNetwork(const Network* network) OVERRIDE;
68
69  virtual void GetIPConfigs(
70      const std::string& device_path,
71      HardwareAddressFormat format,
72      const NetworkGetIPConfigsCallback& callback) OVERRIDE;
73  virtual void SetIPParameters(const std::string& service_path,
74                               const std::string& address,
75                               const std::string& netmask,
76                               const std::string& gateway,
77                               const std::string& name_servers,
78                               int dhcp_usage_mask) OVERRIDE;
79  virtual void RequestNetworkServiceProperties(
80      const std::string& service_path,
81      const NetworkServicePropertiesCallback& callback) OVERRIDE;
82
83  //////////////////////////////////////////////////////////////////////////////
84  // Callbacks.
85  void UpdateNetworkStatus(
86      const std::string& path, const std::string& key, const Value& value);
87
88  void UpdateNetworkDeviceStatus(
89      const std::string& path, const std::string& key, const Value& value);
90  // Cellular specific updates. Returns false if update was ignored / reverted
91  // and notification should be skipped.
92  bool UpdateCellularDeviceStatus(NetworkDevice* device, PropertyIndex index);
93
94  void GetIPConfigsCallback(const NetworkGetIPConfigsCallback& callback,
95                            HardwareAddressFormat format,
96                            const NetworkIPConfigVector& ipconfig_vector,
97                            const std::string& hardware_address);
98
99  void PinOperationCallback(const std::string& path,
100                            NetworkMethodErrorType error,
101                            const std::string& error_message);
102
103  void CellularRegisterCallback(const std::string& path,
104                                NetworkMethodErrorType error,
105                                const std::string& error_message);
106
107  void NetworkConnectCallback(const std::string& service_path,
108                              NetworkMethodErrorType error,
109                              const std::string& error_message);
110
111  void WifiServiceUpdateAndConnect(const std::string& service_path,
112                                   const base::DictionaryValue* properties);
113  void VPNServiceUpdateAndConnect(const std::string& service_path,
114                                  const base::DictionaryValue* properties);
115
116  void NetworkManagerStatusChangedHandler(const std::string& path,
117                                          const std::string& key,
118                                          const base::Value& value);
119  void NetworkManagerUpdate(const std::string& manager_path,
120                            const base::DictionaryValue* properties);
121
122  void NetworkServiceUpdate(const std::string& service_path,
123                            const base::DictionaryValue* properties);
124  void RememberedNetworkServiceUpdate(const std::string& profile_path,
125                                      const std::string& service_path,
126                                      const base::DictionaryValue* properties);
127  void NetworkDeviceUpdate(const std::string& device_path,
128                           const base::DictionaryValue* properties);
129
130 private:
131  // Structure used to pass IP parameter info to a DoSetIPParameters callback,
132  // since Bind only takes up to six parameters.
133  struct IPParameterInfo;
134
135  // Refresh the IP configuration of the given network after changes.  Puts
136  // newly configured properties into effect and renews DHCP lease.
137  void RefreshIPConfig(Network* network);
138
139  // Second half of setting IP Parameters.  SetIPParameters above kicks off
140  // an async information fetch, and this completes the operation when that
141  // fetch is complete.
142  void SetIPParametersCallback(const IPParameterInfo& info,
143                               const std::string& service_path,
144                               const base::DictionaryValue* properties);
145
146  // Second half of refreshing IPConfig for a network.  Refreshes all IP config
147  // paths found in properties.
148  void RefreshIPConfigCallback(const std::string& device_path,
149                               const base::DictionaryValue* properties);
150
151  // This processes all Manager update messages.
152  bool NetworkManagerStatusChanged(const std::string& key, const Value* value);
153  void ParseNetworkManager(const base::DictionaryValue& dict);
154  void UpdateTechnologies(const base::ListValue* technologies, int* bitfieldp);
155  void UpdateAvailableTechnologies(const base::ListValue* technologies);
156  void UpdateEnabledTechnologies(const base::ListValue* technologies);
157
158  // Update network lists.
159  void UpdateNetworkServiceList(const base::ListValue* services);
160  void UpdateWatchedNetworkServiceList(const base::ListValue* services);
161  Network* ParseNetwork(const std::string& service_path,
162                        const base::DictionaryValue& info);
163
164  void UpdateRememberedNetworks(const base::ListValue* profiles);
165  void RequestRememberedNetworksUpdate();
166  void UpdateProfile(const std::string& profile_path,
167                     const base::DictionaryValue* properties);
168  Network* ParseRememberedNetwork(const std::string& profile_path,
169                                  const std::string& service_path,
170                                  const base::DictionaryValue& info);
171
172  // NetworkDevice list management functions.
173  void UpdateNetworkDeviceList(const base::ListValue* devices);
174  void ParseNetworkDevice(const std::string& device_path,
175                          const base::DictionaryValue& info);
176
177  // Compare two network profiles by their path.
178  static bool AreProfilePathsEqual(const NetworkProfile& a,
179                                   const NetworkProfile& b);
180
181  // Empty device observer to ensure that device property updates are received.
182  class NetworkLibraryDeviceObserver : public NetworkDeviceObserver {
183   public:
184    virtual ~NetworkLibraryDeviceObserver() {}
185  };
186
187  typedef std::map<std::string, CrosNetworkWatcher*> NetworkWatcherMap;
188
189  base::WeakPtrFactory<NetworkLibraryImplCros> weak_ptr_factory_;
190
191  // For monitoring network manager status changes.
192  scoped_ptr<CrosNetworkWatcher> network_manager_watcher_;
193
194  // Network device observer.
195  scoped_ptr<NetworkLibraryDeviceObserver> network_device_observer_;
196
197  // Map of monitored networks.
198  NetworkWatcherMap monitored_networks_;
199
200  // Map of monitored devices.
201  NetworkWatcherMap monitored_devices_;
202
203  DISALLOW_COPY_AND_ASSIGN(NetworkLibraryImplCros);
204};
205
206}  // namespace chromeos
207
208#endif  // CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_IMPL_CROS_H_
209