network_library.h revision dc0f95d653279beabeb9817299e2902918ba123e
1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/gtest_prod_util.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/observer_list.h"
14201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/scoped_vector.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/singleton.h"
164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/string16.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/timer.h"
1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "third_party/cros/chromeos_network.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass DictionaryValue;
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass Value;
22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Connection enums (see flimflam/include/service.h)
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenenum ConnectionType {
27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TYPE_UNKNOWN   = 0,
28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TYPE_ETHERNET  = 1,
29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TYPE_WIFI      = 2,
30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TYPE_WIMAX     = 3,
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TYPE_BLUETOOTH = 4,
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TYPE_CELLULAR  = 5,
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TYPE_VPN       = 6,
34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenenum ConnectionMode {
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  MODE_UNKNOWN = 0,
38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  MODE_MANAGED = 1,
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  MODE_ADHOC   = 2,
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenenum ConnectionSecurity {
43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SECURITY_UNKNOWN = 0,
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SECURITY_NONE    = 1,
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SECURITY_WEP     = 2,
46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SECURITY_WPA     = 3,
47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SECURITY_RSN     = 4,
48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SECURITY_8021X   = 5,
49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenenum ConnectionState {
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_UNKNOWN            = 0,
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_IDLE               = 1,
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_CARRIER            = 2,
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_ASSOCIATION        = 3,
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_CONFIGURATION      = 4,
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_READY              = 5,
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_DISCONNECT         = 6,
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_FAILURE            = 7,
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_ACTIVATION_FAILURE = 8
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenenum ConnectivityState {
64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CONN_STATE_UNKNOWN      = 0,
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CONN_STATE_UNRESTRICTED = 1,
66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CONN_STATE_RESTRICTED   = 2,
67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CONN_STATE_NONE         = 3
68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Network enums (see flimflam/include/network.h)
71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenenum NetworkTechnology {
72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_UNKNOWN      = 0,
73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_1XRTT        = 1,
74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_EVDO         = 2,
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_GPRS         = 3,
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_EDGE         = 4,
77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_UMTS         = 5,
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_HSPA         = 6,
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_HSPA_PLUS    = 7,
80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_LTE          = 8,
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_LTE_ADVANCED = 9,
82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenenum ActivationState {
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ACTIVATION_STATE_UNKNOWN             = 0,
86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ACTIVATION_STATE_ACTIVATED           = 1,
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ACTIVATION_STATE_ACTIVATING          = 2,
88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ACTIVATION_STATE_NOT_ACTIVATED       = 3,
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ACTIVATION_STATE_PARTIALLY_ACTIVATED = 4,
90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenenum NetworkRoamingState {
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ROAMING_STATE_UNKNOWN = 0,
94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ROAMING_STATE_HOME    = 1,
95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ROAMING_STATE_ROAMING = 2,
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// connection errors (see flimflam/include/service.h)
99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenenum ConnectionError {
100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_UNKNOWN           = 0,
101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_OUT_OF_RANGE      = 1,
102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_PIN_MISSING       = 2,
103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_DHCP_FAILED       = 3,
104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_CONNECT_FAILED    = 4,
105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_BAD_PASSPHRASE    = 5,
106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_BAD_WEPKEY        = 6,
107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_ACTIVATION_FAILED = 7,
108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_NEED_EVDO         = 8,
109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_NEED_HOME_NETWORK = 9,
110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_OTASP_FAILED      = 10,
111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_AAA_FAILED        = 11,
112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Cellular network is considered low data when less than 60 minues.
115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kCellularDataLowSecs = 60 * 60;
116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Cellular network is considered low data when less than 30 minues.
118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kCellularDataVeryLowSecs = 30 * 60;
119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Cellular network is considered low data when less than 100MB.
121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kCellularDataLowBytes = 100 * 1024 * 1024;
122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Cellular network is considered very low data when less than 50MB.
124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kCellularDataVeryLowBytes = 50 * 1024 * 1024;
125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Contains data related to the flimflam.Device interface,
127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// e.g. ethernet, wifi, cellular.
128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass NetworkDevice {
129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  explicit NetworkDevice(const std::string& device_path);
131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Device info.
133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& device_path() const { return device_path_; }
134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& name() const { return name_; }
135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ConnectionType type() const { return type_; }
136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool scanning() const { return scanning_; }
137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& meid() const { return MEID_; }
138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& imei() const { return IMEI_; }
139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& imsi() const { return IMSI_; }
140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& esn() const { return ESN_; }
141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& mdn() const { return MDN_; }
142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& min() const { return MIN_; }
143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& model_id() const { return model_id_; }
144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& manufacturer() const { return manufacturer_; }
145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& firmware_revision() const { return firmware_revision_; }
146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& hardware_revision() const { return hardware_revision_; }
147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& last_update() const { return last_update_; }
148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const unsigned int prl_version() const { return PRL_version_; }
149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool ParseValue(int index, const Value* value);
152dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void ParseInfo(const DictionaryValue* info);
153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // General device info.
155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string device_path_;
156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string name_;
157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ConnectionType type_;
158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool scanning_;
159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Cellular specific device info.
160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string carrier_;
161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string MEID_;
162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string IMEI_;
163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string IMSI_;
164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string ESN_;
165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string MDN_;
166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string MIN_;
167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string model_id_;
168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string manufacturer_;
169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string firmware_revision_;
170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string hardware_revision_;
171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string last_update_;
172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int PRL_version_;
173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  friend class NetworkLibraryImpl;
175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DISALLOW_COPY_AND_ASSIGN(NetworkDevice);
176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
177dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Contains data common to all network service types.
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Network {
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
181dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~Network() {}
182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& service_path() const { return service_path_; }
184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& name() const { return name_; }
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& device_path() const { return device_path_; }
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& ip_address() const { return ip_address_; }
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConnectionType type() const { return type_; }
188dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ConnectionMode mode() const { return mode_; }
189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ConnectionState connection_state() const { return state_; }
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool connecting() const { return state_ == STATE_ASSOCIATION ||
191dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   state_ == STATE_CONFIGURATION ||
192dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   state_ == STATE_CARRIER; }
193513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool configuring() const { return state_ == STATE_CONFIGURATION; }
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool connected() const { return state_ == STATE_READY; }
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool connecting_or_connected() const { return connecting() || connected(); }
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool failed() const { return state_ == STATE_FAILURE; }
197dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool failed_or_disconnected() const {
198dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return failed() || state_ == STATE_IDLE;
199dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConnectionError error() const { return error_; }
201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ConnectionState state() const { return state_; }
2024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Is this network connectable. Some networks are not yet ready to be
2034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // connected. For example, an 8021X network without certificates.
2044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool connectable() const { return connectable_; }
205513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Is this the active network, i.e, the one through which
206513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // network traffic is being routed? A network can be connected,
207513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // but not be carrying traffic.
208513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool is_active() const { return is_active_; }
209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool favorite() const { return favorite_; }
210dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool auto_connect() const { return auto_connect_; }
211dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ConnectivityState connectivity_state() const { return connectivity_state_; }
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
213dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // We don't have a setter for |favorite_| because to unfavorite a network is
214dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // equivalent to forget a network, so we call forget network on cros for
215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // that.  See ForgetWifiNetwork().
216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SetAutoConnect(bool auto_connect);
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return a string representation of the state code.
219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string GetStateString() const;
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return a string representation of the error code.
222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string GetErrorString() const;
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
225dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Network(const std::string& service_path, ConnectionType type)
226dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : state_(STATE_UNKNOWN),
227513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        error_(ERROR_UNKNOWN),
2284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        connectable_(true),
229dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        is_active_(false),
230dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        favorite_(false),
231dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        auto_connect_(false),
232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        connectivity_state_(CONN_STATE_UNKNOWN),
233dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        priority_(0),
234dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        service_path_(service_path),
235dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        type_(type) {}
236dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
237dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Parse name/value pairs from libcros.
238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool ParseValue(int index, const Value* value);
239dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void ParseInfo(const DictionaryValue* info);
240dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
241dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void SetStringProperty(const char* prop, const std::string& str);
242dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void SetBooleanProperty(const char* prop, bool b);
243dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void SetIntegerProperty(const char* prop, int i);
244dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void SetValueProperty(const char* prop, Value* val);
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string device_path_;
247dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string name_;
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string ip_address_;
249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ConnectionMode mode_;
250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ConnectionState state_;
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConnectionError error_;
2524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool connectable_;
253513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool is_active_;
254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool favorite_;
255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool auto_connect_;
256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ConnectivityState connectivity_state_;
257513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
258513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private:
259dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_name(const std::string& name) { name_ = name; }
260dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_connecting(bool connecting) {
261dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    state_ = (connecting ? STATE_ASSOCIATION : STATE_IDLE);
262dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
263dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_connected(bool connected) {
264dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    state_ = (connected ? STATE_READY : STATE_IDLE);
265dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
266513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void set_state(ConnectionState state) { state_ = state; }
2674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void set_connectable(bool connectable) { connectable_ = connectable; }
268513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void set_active(bool is_active) { is_active_ = is_active; }
269201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void set_error(ConnectionError error) { error_ = error; }
270dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_connectivity_state(ConnectivityState connectivity_state) {
271dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    connectivity_state_ = connectivity_state;
272dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
273513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
2744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Initialize the IP address field
2754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void InitIPAddress();
2764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
277dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Priority value, corresponds to index in list from flimflam (0 = highest)
278dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int priority_;
279dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // These must not be modified after construction.
281dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string service_path_;
282dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ConnectionType type_;
283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
284513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  friend class NetworkLibraryImpl;
285dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // ChangeAutoConnectSaveTest accesses |favorite_|.
286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(WifiConfigViewTest, ChangeAutoConnectSaveTest);
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Class for networks of TYPE_ETHERNET.
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass EthernetNetwork : public Network {
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
292dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  explicit EthernetNetwork(const std::string& service_path) :
293dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      Network(service_path, TYPE_ETHERNET) {
294513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
295dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
296513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
297dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Class for networks of TYPE_VPN.
298dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass VirtualNetwork : public Network {
299dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
300dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  explicit VirtualNetwork(const std::string& service_path) :
301dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      Network(service_path, TYPE_VPN) {
302513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
304dc0f95d653279beabeb9817299e2902918ba123eKristian Monsentypedef std::vector<VirtualNetwork*> VirtualNetworkVector;
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
306dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Base class for networks of TYPE_WIFI or TYPE_CELLULAR.
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WirelessNetwork : public Network {
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int strength() const { return strength_; }
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
312dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  WirelessNetwork(const std::string& service_path, ConnectionType type)
313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : Network(service_path, type),
314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        strength_(0) {}
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int strength_;
316513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
317dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Network overrides.
318dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool ParseValue(int index, const Value* value);
3194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
320dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
321513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void set_strength(int strength) { strength_ = strength; }
322513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
323513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  friend class NetworkLibraryImpl;
324513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
325513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
326dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Class for networks of TYPE_CELLULAR.
327dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass CellularDataPlan;
328513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CellularNetwork : public WirelessNetwork {
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
331731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  enum DataLeft {
33272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DATA_UNKNOWN,
333731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DATA_NORMAL,
334731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DATA_LOW,
335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DATA_VERY_LOW,
336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DATA_NONE
337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
339513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual ~CellularNetwork();
340dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
341dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  explicit CellularNetwork(const std::string& service_path)
342dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : WirelessNetwork(service_path, TYPE_CELLULAR),
343dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        activation_state_(ACTIVATION_STATE_UNKNOWN),
344dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        network_technology_(NETWORK_TECHNOLOGY_UNKNOWN),
345dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        roaming_state_(ROAMING_STATE_UNKNOWN),
346dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        data_left_(DATA_UNKNOWN) {
347dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Starts device activation process. Returns false if the device state does
3493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // not permit activation.
3503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool StartActivation() const;
3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const ActivationState activation_state() const { return activation_state_; }
352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const NetworkTechnology network_technology() const {
353731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return network_technology_;
354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const NetworkRoamingState roaming_state() const { return roaming_state_; }
356201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool restricted_pool() const {
357201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return connectivity_state() == CONN_STATE_RESTRICTED;
358201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
3594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool needs_new_plan() const {
3604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    return restricted_pool() && connected() &&
3614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        activation_state() == ACTIVATION_STATE_ACTIVATED;
3624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
363731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const std::string& operator_name() const { return operator_name_; }
364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const std::string& operator_code() const { return operator_code_; }
3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const std::string& payment_url() const { return payment_url_; }
366dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& usage_url() const { return usage_url_; }
367dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DataLeft data_left() const { return data_left_; }
368dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
369dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Misc.
370201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool is_gsm() const {
371201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return network_technology_ != NETWORK_TECHNOLOGY_EVDO &&
372201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        network_technology_ != NETWORK_TECHNOLOGY_1XRTT &&
373201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        network_technology_ != NETWORK_TECHNOLOGY_UNKNOWN;
374201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
376731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Return a string representation of network technology.
377731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string GetNetworkTechnologyString() const;
378201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Return a string representation of connectivity state.
379201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string GetConnectivityStateString() const;
380731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Return a string representation of activation state.
381731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string GetActivationStateString() const;
382731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Return a string representation of roaming state.
383731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string GetRoamingStateString() const;
384731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
385513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Return a string representation of |activation_state|.
386513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static std::string ActivationStateToString(ActivationState activation_state);
387513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
389dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // WirelessNetwork overrides.
390dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool ParseValue(int index, const Value* value);
391513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ActivationState activation_state_;
393731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NetworkTechnology network_technology_;
394731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NetworkRoamingState roaming_state_;
395731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Carrier Info
396731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string operator_name_;
397731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string operator_code_;
3983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string payment_url_;
399dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string usage_url_;
400dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Cached values
401dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DataLeft data_left_;  // Updated when data plans are updated.
402513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
403513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private:
404513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void set_activation_state(ActivationState state) {
405513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    activation_state_ = state;
406513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
407dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_payment_url(const std::string& url) { payment_url_ = url; }
408dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_usage_url(const std::string& url) { usage_url_ = url; }
409513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void set_network_technology(NetworkTechnology technology) {
410513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    network_technology_ = technology;
411513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
412dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_roaming_state(NetworkRoamingState state) { roaming_state_ = state; }
413dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_data_left(DataLeft data_left) { data_left_ = data_left; }
414513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
415513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  friend class NetworkLibraryImpl;
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
417dc0f95d653279beabeb9817299e2902918ba123eKristian Monsentypedef std::vector<CellularNetwork*> CellularNetworkVector;
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
419dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Class for networks of TYPE_WIFI.
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WifiNetwork : public WirelessNetwork {
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
422dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  explicit WifiNetwork(const std::string& service_path)
423dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : WirelessNetwork(service_path, TYPE_WIFI),
424dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        encryption_(SECURITY_NONE),
425dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        passphrase_required_(false) {
426dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool encrypted() const { return encryption_ != SECURITY_NONE; }
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConnectionSecurity encryption() const { return encryption_; }
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& passphrase() const { return passphrase_; }
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& identity() const { return identity_; }
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& cert_path() const { return cert_path_; }
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_encryption(ConnectionSecurity encryption) {
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    encryption_ = encryption;
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_passphrase(const std::string& passphrase) {
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    passphrase_ = passphrase;
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_identity(const std::string& identity) {
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    identity_ = identity;
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_cert_path(const std::string& cert_path) {
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    cert_path_ = cert_path;
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
447dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SetPassphrase(const std::string& passphrase);
448dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SetIdentity(const std::string& identity);
449dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SetCertPath(const std::string& cert_path);
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return a string representation of the encryption code.
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This not translated and should be only used for debugging purposes.
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string GetEncryptionString();
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Return true if a passphrase or other input is required to connect.
45621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  bool IsPassphraseRequired() const;
45721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
458731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Return true if cert_path_ indicates that we have loaded the certificate.
459731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool IsCertificateLoaded() const;
460731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
462dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // WirelessNetwork overrides.
463dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool ParseValue(int index, const Value* value);
464dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
465dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
466dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_passphrase_required(bool passphrase_required) {
467dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    passphrase_required_ = passphrase_required;
468dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
469dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConnectionSecurity encryption_;
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string passphrase_;
472513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool passphrase_required_;
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string identity_;
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string cert_path_;
475dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
476dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  friend class NetworkLibraryImpl;
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
478dc0f95d653279beabeb9817299e2902918ba123eKristian Monsentypedef std::vector<WifiNetwork*> WifiNetworkVector;
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
480dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Cellular Data Plan management.
481dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass CellularDataPlan {
482dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
483dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CellularDataPlan()
484dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : plan_name("Unknown"),
485dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        plan_type(CELLULAR_DATA_PLAN_UNLIMITED),
486dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        plan_data_bytes(0),
487dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        data_bytes_used(0) { }
488dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  explicit CellularDataPlan(const CellularDataPlanInfo &plan)
489dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : plan_name(plan.plan_name ? plan.plan_name : ""),
490dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        plan_type(plan.plan_type),
491dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        update_time(base::Time::FromInternalValue(plan.update_time)),
492dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        plan_start_time(base::Time::FromInternalValue(plan.plan_start_time)),
493dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        plan_end_time(base::Time::FromInternalValue(plan.plan_end_time)),
494dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        plan_data_bytes(plan.plan_data_bytes),
495dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        data_bytes_used(plan.data_bytes_used) { }
496dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Formats cellular plan description.
497dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  string16 GetPlanDesciption() const;
498dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Evaluates cellular plans status and returns warning string if it is near
499dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // expiration.
500dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  string16 GetRemainingWarning() const;
501dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Formats remaining plan data description.
502dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  string16 GetDataRemainingDesciption() const;
503dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Formats plan expiration description.
504dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  string16 GetPlanExpiration() const;
505dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Formats plan usage info.
506dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  string16 GetUsageInfo() const;
507dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Returns a unique string for this plan that can be used for comparisons.
508dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string GetUniqueIdentifier() const;
509dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::TimeDelta remaining_time() const;
510dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int64 remaining_minutes() const;
511dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Returns plan data remaining in bytes.
512dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int64 remaining_data() const;
513dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // TODO(stevenjb): Make these private with accessors and properly named.
514dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string plan_name;
515dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CellularDataPlanType plan_type;
516dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::Time update_time;
517dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::Time plan_start_time;
518dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::Time plan_end_time;
519dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int64 plan_data_bytes;
520dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int64 data_bytes_used;
521dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
522dc0f95d653279beabeb9817299e2902918ba123eKristian Monsentypedef ScopedVector<CellularDataPlan> CellularDataPlanVector;
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
524dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Geolocation data.
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct CellTower {
526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum RadioType {
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RADIOTYPE_GSM,
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RADIOTYPE_CDMA,
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RADIOTYPE_WCDMA,
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } radio_type;                   // GSM/WCDMA     CDMA
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int mobile_country_code;        //   MCC          MCC
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int mobile_network_code;        //   MNC          SID
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int location_area_code;         //   LAC          NID
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int cell_id;                    //   CID          BID
535731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  base::Time timestamp;  // Timestamp when this cell was primary
536731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int signal_strength;   // Radio signal strength measured in dBm.
537731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int timing_advance;    // Represents the distance from the cell tower.
538731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                         // Each unit is roughly 550 meters.
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct WifiAccessPoint {
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string mac_address;  // The mac address of the WiFi node.
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string name;         // The SSID of the WiFi node.
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Time timestamp;     // Timestamp when this AP was detected.
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int signal_strength;      // Radio signal strength measured in dBm.
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int signal_to_noise;      // Current signal to noise ratio measured in dB.
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int channel;              // Wifi channel number.
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef std::vector<CellTower> CellTowerVector;
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef std::vector<WifiAccessPoint> WifiAccessPointVector;
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
553dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// IP Configuration.
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct NetworkIPConfig {
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NetworkIPConfig(const std::string& device_path, IPConfigType type,
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const std::string& address, const std::string& netmask,
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const std::string& gateway, const std::string& name_servers)
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : device_path(device_path),
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        type(type),
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        address(address),
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        netmask(netmask),
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        gateway(gateway),
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        name_servers(name_servers) {}
564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NetworkIPConfigs are sorted by tyoe.
566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool operator< (const NetworkIPConfig& other) const {
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return type < other.type;
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string device_path;
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  IPConfigType type;
572731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string address;  // This looks like "/device/0011aa22bb33"
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string netmask;
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string gateway;
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string name_servers;
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef std::vector<NetworkIPConfig> NetworkIPConfigVector;
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This class handles the interaction with the ChromeOS network library APIs.
5803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Classes can add themselves as observers. Users can get an instance of the
5813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// library like this: chromeos::CrosLibrary::Get()->GetNetworkLibrary()
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NetworkLibrary {
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
584513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  class NetworkManagerObserver {
585513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch   public:
586513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Called when the state of the network manager has changed,
587513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // for example, networks have appeared or disappeared.
588513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    virtual void OnNetworkManagerChanged(NetworkLibrary* obj) = 0;
589513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  };
590513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
591513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  class NetworkObserver {
592513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch   public:
593513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Called when the state of a single network has changed,
594513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // for example signal strength or connection state.
595513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    virtual void OnNetworkChanged(NetworkLibrary* cros,
596513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                  const Network* network) = 0;
597513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  };
598513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
599513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  class CellularDataPlanObserver {
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
601731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Called when the cellular data plan has changed.
602513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    virtual void OnCellularDataPlanChanged(NetworkLibrary* obj) = 0;
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
605dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  class UserActionObserver {
606dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen   public:
607dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Called when user initiates a new connection.
608dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Network is NULL when we don't have an associated Network object.
609dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    virtual void OnConnectionInitiated(NetworkLibrary* cros,
610dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                       const Network* network) = 0;
611dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
612dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~NetworkLibrary() {}
614513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
615513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) = 0;
616513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveNetworkManagerObserver(
617513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      NetworkManagerObserver* observer) = 0;
618513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
619513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // An attempt to add an observer that has already been added for a
620513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // give service path will be ignored.
621513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddNetworkObserver(const std::string& service_path,
622513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                  NetworkObserver* observer) = 0;
623513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Remove an observer of a single network
624513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveNetworkObserver(const std::string& service_path,
625513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     NetworkObserver* observer) = 0;
626513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Stop |observer| from observing any networks
627513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) = 0;
628513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
62972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Temporarily locks down certain functionality in network library to prevent
63072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // unplanned side effects. During the lock down, Enable*Device() calls cannot
63172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // be made.
63272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Lock() = 0;
63372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Removes temporarily lock of network library.
63472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Unlock() = 0;
63572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Checks if access to network library is locked.
63672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool IsLocked() = 0;
63772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
638513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddCellularDataPlanObserver(
639513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      CellularDataPlanObserver* observer) = 0;
640513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveCellularDataPlanObserver(
641513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      CellularDataPlanObserver* observer) = 0;
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
643dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void AddUserActionObserver(UserActionObserver* observer) = 0;
644dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void RemoveUserActionObserver(UserActionObserver* observer) = 0;
645dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
646dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Return the active or default Ethernet network (or NULL if none).
64721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual const EthernetNetwork* ethernet_network() const = 0;
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool ethernet_connecting() const = 0;
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool ethernet_connected() const = 0;
650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
651dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Return the active Wifi network (or NULL if none active).
65221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual const WifiNetwork* wifi_network() const = 0;
653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool wifi_connecting() const = 0;
654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool wifi_connected() const = 0;
655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
656dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Return the active Cellular network (or NULL if none active).
65721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual const CellularNetwork* cellular_network() const = 0;
658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool cellular_connecting() const = 0;
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool cellular_connected() const = 0;
660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
661dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Return the active virtual network (or NULL if none active).
662dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const VirtualNetwork* virtual_network() const = 0;
663dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool virtual_network_connecting() const = 0;
664dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool virtual_network_connected() const = 0;
665dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return true if any network is currently connected.
667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool Connected() const = 0;
668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return true if any network is currently connecting.
670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool Connecting() const = 0;
671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the current IP address if connected. If not, returns empty string.
673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const std::string& IPAddress() const = 0;
674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the current list of wifi networks.
676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const WifiNetworkVector& wifi_networks() const = 0;
677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the list of remembered wifi networks.
679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const WifiNetworkVector& remembered_wifi_networks() const = 0;
680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the current list of cellular networks.
682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const CellularNetworkVector& cellular_networks() const = 0;
683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
684dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Returns the current list of virtual networks.
685dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const VirtualNetworkVector& virtual_networks() const = 0;
686dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
687dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Return a pointer to the device, if it exists, or NULL.
688dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const NetworkDevice* FindNetworkDeviceByPath(
689dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const = 0;
690dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
691dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Return a pointer to the network, if it exists, or NULL.
692dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual WifiNetwork* FindWifiNetworkByPath(
693dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const = 0;
694513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual CellularNetwork* FindCellularNetworkByPath(
695dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const = 0;
696513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
697dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Retrieves the data plans associated with |path|, NULL if there are no
698dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // associated plans.
699dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const CellularDataPlanVector* GetDataPlans(
700dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const = 0;
701dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
702dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // This returns the significant data plan. If the user only has the
703dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // base data plan, then return that. If there is a base and a paid data plan,
704dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // then the significant one is the paid one. So return the paid plan.
705dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // If there are no data plans, then this method returns NULL.
706dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // This returns a pointer to a member of data_plans_, so if SetDataPlans()
707dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // gets called, the result becomes invalid.
708dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const CellularDataPlan* GetSignificantDataPlan(
709dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const = 0;
710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Request a scan for new wifi networks.
712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void RequestWifiScan() = 0;
713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reads out the results of the last wifi scan. These results are not
715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // pre-cached in the library, so the call may block whilst the results are
716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // read over IPC.
717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns false if an error occurred in reading the results. Note that
718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a true return code only indicates the result set was successfully read,
719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // it does not imply a scan has successfully completed yet.
720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool GetWifiAccessPoints(WifiAccessPointVector* result) = 0;
721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(joth): Add GetCellTowers to retrieve a CellTowerVector.
723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
724dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // TODO(stevenjb): eliminate Network* version of Connect functions.
725dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Instead, always use service_path and improve the error handling.
726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Connect to the specified wireless network with password.
727201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Returns false if the attempt fails immediately (e.g. passphrase too short)
728201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // and sets network->error().
729201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual bool ConnectToWifiNetwork(WifiNetwork* network,
730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    const std::string& password,
731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    const std::string& identity,
732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    const std::string& certpath) = 0;
733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
734dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Same as above but searches for an existing network by name.
735dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool ConnectToWifiNetwork(const std::string& service_path,
736dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                    const std::string& password,
737dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                    const std::string& identity,
738dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                    const std::string& certpath) = 0;
739dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
740513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Connect to the specified network with security, ssid, and password.
741513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Returns false if the attempt fails immediately (e.g. passphrase too short).
742513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool ConnectToWifiNetwork(ConnectionSecurity security,
743513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                    const std::string& ssid,
744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    const std::string& password,
745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    const std::string& identity,
746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    const std::string& certpath,
747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    bool auto_connect) = 0;
748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Connect to the specified cellular network.
750513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Returns false if the attempt fails immediately.
751513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool ConnectToCellularNetwork(const CellularNetwork* network) = 0;
752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
753731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Initiates cellular data plan refresh. Plan data will be passed through
754731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Network::Observer::CellularDataPlanChanged callback.
755513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RefreshCellularDataPlans(const CellularNetwork* network) = 0;
756731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
75772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Records information that cellular play payment had happened.
75872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void SignalCellularPlanPayment() = 0;
75972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
76072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Returns true if cellular plan payment had been recorded recently.
76172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool HasRecentCellularPlanPayment() = 0;
76272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Disconnect from the specified wireless (either cellular or wifi) network.
764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DisconnectFromWirelessNetwork(
765513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      const WirelessNetwork* network) = 0;
766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
767513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Forget the wifi network corresponding to service_path.
768513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void ForgetWifiNetwork(const std::string& service_path) = 0;
769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool ethernet_available() const = 0;
771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool wifi_available() const = 0;
772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool cellular_available() const = 0;
773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool ethernet_enabled() const = 0;
775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool wifi_enabled() const = 0;
776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool cellular_enabled() const = 0;
777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
778201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual bool wifi_scanning() const = 0;
779201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
780513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual const Network* active_network() const = 0;
781513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool offline_mode() const = 0;
783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enables/disables the ethernet network device.
785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void EnableEthernetNetworkDevice(bool enable) = 0;
786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enables/disables the wifi network device.
788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void EnableWifiNetworkDevice(bool enable) = 0;
789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enables/disables the cellular network device.
791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void EnableCellularNetworkDevice(bool enable) = 0;
792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enables/disables offline mode.
794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void EnableOfflineMode(bool enable) = 0;
795c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
796731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Fetches IP configs and hardware address for a given device_path.
797731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // The hardware address is usually a MAC address like "0011AA22BB33".
798731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // |hardware_address| will be an empty string, if no hardware address is
799731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // found.
800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual NetworkIPConfigVector GetIPConfigs(
801731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      const std::string& device_path,
802731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      std::string* hardware_address) = 0;
803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Fetches debug network info for display in about:network.
805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The page will have a meta refresh of |refresh| seconds if |refresh| > 0.
806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual std::string GetHtmlInfo(int refresh) = 0;
807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Factory function, creates a new instance and returns ownership.
8093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // For normal usage, access the singleton via CrosLibrary::Get().
8103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static NetworkLibrary* GetImpl(bool stub);
811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_H_
816