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"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_vector.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/observer_list.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,
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SECURITY_PSK     = 6,
50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenenum ConnectionState {
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_UNKNOWN            = 0,
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_IDLE               = 1,
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_CARRIER            = 2,
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_ASSOCIATION        = 3,
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_CONFIGURATION      = 4,
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_READY              = 5,
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_DISCONNECT         = 6,
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_FAILURE            = 7,
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  STATE_ACTIVATION_FAILURE = 8
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenenum ConnectivityState {
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CONN_STATE_UNKNOWN      = 0,
66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CONN_STATE_UNRESTRICTED = 1,
67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CONN_STATE_RESTRICTED   = 2,
68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CONN_STATE_NONE         = 3
69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Network enums (see flimflam/include/network.h)
72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenenum NetworkTechnology {
73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_UNKNOWN      = 0,
74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_1XRTT        = 1,
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_EVDO         = 2,
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_GPRS         = 3,
77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_EDGE         = 4,
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_UMTS         = 5,
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_HSPA         = 6,
80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_HSPA_PLUS    = 7,
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_LTE          = 8,
82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NETWORK_TECHNOLOGY_LTE_ADVANCED = 9,
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenenum ActivationState {
86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ACTIVATION_STATE_UNKNOWN             = 0,
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ACTIVATION_STATE_ACTIVATED           = 1,
88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ACTIVATION_STATE_ACTIVATING          = 2,
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ACTIVATION_STATE_NOT_ACTIVATED       = 3,
90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ACTIVATION_STATE_PARTIALLY_ACTIVATED = 4,
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenenum NetworkRoamingState {
94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ROAMING_STATE_UNKNOWN = 0,
95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ROAMING_STATE_HOME    = 1,
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ROAMING_STATE_ROAMING = 2,
97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// SIMLock states (see gobi-cromo-plugin/gobi_gsm_modem.cc)
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenenum SIMLockState {
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIM_UNKNOWN    = 0,
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIM_UNLOCKED   = 1,
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIM_LOCKED_PIN = 2,
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIM_LOCKED_PUK = 3,  // also when SIM is blocked, then retries = 0.
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// SIM PinRequire states. Since PinRequire current state is not exposed as a
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// cellular property, we initialize it's value based on the SIMLockState
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// initial value.
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// SIM_PIN_REQUIRE_UNKNOWN - SIM card is absent or SIMLockState initial value
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//                           hasn't been received yet.
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// SIM_PIN_REQUIRED - SIM card is locked when booted/wake from sleep and
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//                    requires user to enter PIN.
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// SIM_PIN_NOT_REQUIRED - SIM card is unlocked all the time and requires PIN
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// only on certain operations, such as ChangeRequirePin, ChangePin, EnterPin.
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenenum SIMPinRequire {
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIM_PIN_REQUIRE_UNKNOWN = 0,
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIM_PIN_NOT_REQUIRED    = 1,
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIM_PIN_REQUIRED        = 2,
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Any PIN operation result (EnterPin, UnblockPin etc.).
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenenum PinOperationError {
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PIN_ERROR_NONE           = 0,
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PIN_ERROR_UNKNOWN        = 1,
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PIN_ERROR_INCORRECT_CODE = 2,  // Either PIN/PUK specified is incorrect.
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PIN_ERROR_BLOCKED        = 3,  // No more PIN retries left, SIM is blocked.
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// connection errors (see flimflam/include/service.h)
131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenenum ConnectionError {
1323dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  ERROR_NO_ERROR          = 0,
133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_OUT_OF_RANGE      = 1,
134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_PIN_MISSING       = 2,
135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_DHCP_FAILED       = 3,
136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_CONNECT_FAILED    = 4,
137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_BAD_PASSPHRASE    = 5,
138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_BAD_WEPKEY        = 6,
139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_ACTIVATION_FAILED = 7,
140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_NEED_EVDO         = 8,
141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_NEED_HOME_NETWORK = 9,
142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_OTASP_FAILED      = 10,
143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ERROR_AAA_FAILED        = 11,
144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// We are currently only supporting setting a single EAP Method.
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenenum EAPMethod {
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EAP_METHOD_UNKNOWN = 0,
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EAP_METHOD_PEAP    = 1,
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EAP_METHOD_TLS     = 2,
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EAP_METHOD_TTLS    = 3,
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EAP_METHOD_LEAP    = 4
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// We are currently only supporting setting a single EAP phase 2 authentication.
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenenum EAPPhase2Auth {
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EAP_PHASE_2_AUTH_AUTO     = 0,
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EAP_PHASE_2_AUTH_MD5      = 1,
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EAP_PHASE_2_AUTH_MSCHAPV2 = 2,
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EAP_PHASE_2_AUTH_MSCHAP   = 3,
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EAP_PHASE_2_AUTH_PAP      = 4,
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EAP_PHASE_2_AUTH_CHAP     = 5
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Simple wrapper for property Cellular.FoundNetworks.
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstruct FoundCellularNetwork {
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string status;
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string network_id;
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string short_name;
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string long_name;
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string technology;
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsentypedef std::vector<FoundCellularNetwork> CellularNetworkList;
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Cellular network is considered low data when less than 60 minues.
177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kCellularDataLowSecs = 60 * 60;
178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Cellular network is considered low data when less than 30 minues.
180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kCellularDataVeryLowSecs = 30 * 60;
181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Cellular network is considered low data when less than 100MB.
183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kCellularDataLowBytes = 100 * 1024 * 1024;
184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Cellular network is considered very low data when less than 50MB.
186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const int kCellularDataVeryLowBytes = 50 * 1024 * 1024;
187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
188dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Contains data related to the flimflam.Device interface,
189dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// e.g. ethernet, wifi, cellular.
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// TODO(dpolukhin): refactor to make base class and device specific derivatives.
191dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass NetworkDevice {
192dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
193dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  explicit NetworkDevice(const std::string& device_path);
194dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Device info.
196dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& device_path() const { return device_path_; }
197dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& name() const { return name_; }
198dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ConnectionType type() const { return type_; }
199dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool scanning() const { return scanning_; }
200dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& meid() const { return MEID_; }
201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& imei() const { return IMEI_; }
202dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& imsi() const { return IMSI_; }
203dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& esn() const { return ESN_; }
204dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& mdn() const { return MDN_; }
205dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& min() const { return MIN_; }
206dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& model_id() const { return model_id_; }
207dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& manufacturer() const { return manufacturer_; }
208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIMLockState sim_lock_state() const { return sim_lock_state_; }
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool is_sim_locked() const {
210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return sim_lock_state_ == SIM_LOCKED_PIN ||
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        sim_lock_state_ == SIM_LOCKED_PUK;
212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const int sim_retries_left() const { return sim_retries_left_; }
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIMPinRequire sim_pin_required() const { return sim_pin_required_; }
215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& firmware_revision() const { return firmware_revision_; }
216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& hardware_revision() const { return hardware_revision_; }
217dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const unsigned int prl_version() const { return PRL_version_; }
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& home_provider() const { return home_provider_; }
219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& home_provider_code() const { return home_provider_code_; }
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& home_provider_country() const {
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return home_provider_country_;
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& home_provider_id() const { return home_provider_id_; }
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& home_provider_name() const { return home_provider_name_; }
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& selected_cellular_network() const {
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return selected_cellular_network_;
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const CellularNetworkList& found_cellular_networks() const {
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return found_cellular_networks_;
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool data_roaming_allowed() const { return data_roaming_allowed_; }
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool support_network_scan() const { return support_network_scan_; }
233dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
234dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
235dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool ParseValue(int index, const Value* value);
236dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void ParseInfo(const DictionaryValue* info);
237dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // General device info.
239dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string device_path_;
240dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string name_;
241dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ConnectionType type_;
242dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool scanning_;
243dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Cellular specific device info.
244dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string carrier_;
245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string home_provider_;
246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string home_provider_code_;
247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string home_provider_country_;
248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string home_provider_id_;
249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string home_provider_name_;
250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string MEID_;
251dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string IMEI_;
252dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string IMSI_;
253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string ESN_;
254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string MDN_;
255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string MIN_;
256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string model_id_;
257dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string manufacturer_;
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIMLockState sim_lock_state_;
259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int sim_retries_left_;
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIMPinRequire sim_pin_required_;
261dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string firmware_revision_;
262dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string hardware_revision_;
263dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int PRL_version_;
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string selected_cellular_network_;
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CellularNetworkList found_cellular_networks_;
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool data_roaming_allowed_;
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool support_network_scan_;
268dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
269dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  friend class NetworkLibraryImpl;
270dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DISALLOW_COPY_AND_ASSIGN(NetworkDevice);
271dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
272dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
273dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Contains data common to all network service types.
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Network {
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
276dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~Network() {}
277dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& service_path() const { return service_path_; }
279dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& name() const { return name_; }
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& device_path() const { return device_path_; }
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& ip_address() const { return ip_address_; }
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConnectionType type() const { return type_; }
283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ConnectionMode mode() const { return mode_; }
284731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ConnectionState connection_state() const { return state_; }
285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool connecting() const { return IsConnectingState(state_); }
286513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool configuring() const { return state_ == STATE_CONFIGURATION; }
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool connected() const { return state_ == STATE_READY; }
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool connecting_or_connected() const { return connecting() || connected(); }
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool failed() const { return state_ == STATE_FAILURE; }
290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool failed_or_disconnected() const {
291dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return failed() || state_ == STATE_IDLE;
292dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConnectionError error() const { return error_; }
294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ConnectionState state() const { return state_; }
295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Is this network connectable. Currently, this is mainly used by 802.1x
296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // networks to specify that the network is not configured yet.
2974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool connectable() const { return connectable_; }
298513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Is this the active network, i.e, the one through which
299513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // network traffic is being routed? A network can be connected,
300513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // but not be carrying traffic.
301513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool is_active() const { return is_active_; }
302dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool favorite() const { return favorite_; }
303dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool auto_connect() const { return auto_connect_; }
304dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ConnectivityState connectivity_state() const { return connectivity_state_; }
305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool added() const { return added_; }
306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& unique_id() const { return unique_id_; }
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
309dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // We don't have a setter for |favorite_| because to unfavorite a network is
310dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // equivalent to forget a network, so we call forget network on cros for
311dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // that.  See ForgetWifiNetwork().
312dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SetAutoConnect(bool auto_connect);
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Sets network name.
315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetName(const std::string& name);
316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return a string representation of the state code.
318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string GetStateString() const;
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return a string representation of the error code.
321731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string GetErrorString() const;
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static bool IsConnectingState(ConnectionState state) {
324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return (state == STATE_ASSOCIATION ||
325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            state == STATE_CONFIGURATION ||
326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            state == STATE_CARRIER);
327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
330dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Network(const std::string& service_path, ConnectionType type)
331dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : state_(STATE_UNKNOWN),
3323dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        error_(ERROR_NO_ERROR),
3334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        connectable_(true),
334dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        is_active_(false),
335dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        favorite_(false),
336dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        auto_connect_(false),
337dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        connectivity_state_(CONN_STATE_UNKNOWN),
338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        priority_order_(0),
339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        added_(false),
340dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        service_path_(service_path),
341dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        type_(type) {}
342dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
343dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Parse name/value pairs from libcros.
344dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool ParseValue(int index, const Value* value);
345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ParseInfo(const DictionaryValue* info);
346dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Methods to asynchronously set network service properties
348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetStringProperty(const char* prop, const std::string& str,
349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 std::string* dest);
350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetBooleanProperty(const char* prop, bool b, bool* dest);
351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetIntegerProperty(const char* prop, int i, int* dest);
352dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void SetValueProperty(const char* prop, Value* val);
353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ClearProperty(const char* prop);
354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // This will clear the property if string is empty. Otherwise, it will set it.
356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetOrClearStringProperty(const char* prop,
357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        const std::string& str,
358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        std::string* dest);
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string device_path_;
361dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string name_;
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string ip_address_;
363dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ConnectionMode mode_;
364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ConnectionState state_;
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConnectionError error_;
3664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool connectable_;
367513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool is_active_;
368dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool favorite_;
369dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool auto_connect_;
370dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ConnectivityState connectivity_state_;
371513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Unique identifier, set the first time the network is parsed.
373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string unique_id_;
374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
375513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private:
376dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_name(const std::string& name) { name_ = name; }
377dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_connecting(bool connecting) {
378dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    state_ = (connecting ? STATE_ASSOCIATION : STATE_IDLE);
379dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
380dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_connected(bool connected) {
381dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    state_ = (connected ? STATE_READY : STATE_IDLE);
382dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
383513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void set_state(ConnectionState state) { state_ = state; }
3844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void set_connectable(bool connectable) { connectable_ = connectable; }
385513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void set_active(bool is_active) { is_active_ = is_active; }
386201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void set_error(ConnectionError error) { error_ = error; }
387dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_connectivity_state(ConnectivityState connectivity_state) {
388dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    connectivity_state_ = connectivity_state;
389dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_added(bool added) { added_ = added; }
391513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Initialize the IP address field
3934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void InitIPAddress();
3944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Priority value, corresponds to index in list from flimflam (0 = first)
396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int priority_order_;
397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Set to true if the UI requested this as a new network.
399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool added_;
400dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
401dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // These must not be modified after construction.
402dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string service_path_;
403dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ConnectionType type_;
404dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
405513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  friend class NetworkLibraryImpl;
406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  friend class NetworkLibraryStubImpl;
407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(Network);
408dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // ChangeAutoConnectSaveTest accesses |favorite_|.
409dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FRIEND_TEST_ALL_PREFIXES(WifiConfigViewTest, ChangeAutoConnectSaveTest);
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
412dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Class for networks of TYPE_ETHERNET.
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass EthernetNetwork : public Network {
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
415dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  explicit EthernetNetwork(const std::string& service_path) :
416dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      Network(service_path, TYPE_ETHERNET) {
417513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  friend class NetworkLibraryImpl;
420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(EthernetNetwork);
421dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
422513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
423dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Class for networks of TYPE_VPN.
424dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass VirtualNetwork : public Network {
425dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  enum ProviderType {
427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PROVIDER_TYPE_L2TP_IPSEC_PSK,
428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PROVIDER_TYPE_L2TP_IPSEC_USER_CERT,
429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PROVIDER_TYPE_OPEN_VPN,
430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Add new provider types before PROVIDER_TYPE_MAX.
431ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PROVIDER_TYPE_MAX,
432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
434dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  explicit VirtualNetwork(const std::string& service_path) :
435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Network(service_path, TYPE_VPN),
436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      provider_type_(PROVIDER_TYPE_L2TP_IPSEC_PSK) {
437513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
439ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& server_hostname() const { return server_hostname_; }
440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ProviderType provider_type() const { return provider_type_; }
441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& ca_cert() const { return ca_cert_; }
442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& psk_passphrase() const { return psk_passphrase_; }
443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& user_cert() const { return user_cert_; }
444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& user_cert_key() const { return user_cert_key_; }
445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& username() const { return username_; }
446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& user_passphrase() const { return user_passphrase_; }
447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
448ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool NeedMoreInfoToConnect() const;
449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
450ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Public setters.
451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetCACert(const std::string& ca_cert);
452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetPSKPassphrase(const std::string& psk_passphrase);
453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetUserCert(const std::string& user_cert);
454ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetUserCertKey(const std::string& key);
455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetUsername(const std::string& username);
456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetUserPassphrase(const std::string& user_passphrase);
457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string GetProviderTypeString() const;
459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Network overrides.
462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool ParseValue(int index, const Value* value);
463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ParseInfo(const DictionaryValue* info);
464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // VirtualNetwork private methods.
466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool ParseProviderValue(int index, const Value* value);
467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_server_hostname(const std::string& server_hostname) {
469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    server_hostname_ = server_hostname;
470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_provider_type(ProviderType provider_type) {
472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    provider_type_ = provider_type;
473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_ca_cert(const std::string& ca_cert) {
475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ca_cert_ = ca_cert;
476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_psk_passphrase(const std::string& psk_passphrase) {
478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    psk_passphrase_ = psk_passphrase;
479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_user_cert(const std::string& user_cert) {
481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    user_cert_ = user_cert;
482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_user_cert_key(const std::string& key) {
484ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    user_cert_key_ = key;
485ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
486ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_username(const std::string& username) {
487ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    username_ = username;
488ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
489ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_user_passphrase(const std::string& user_passphrase) {
490ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    user_passphrase_ = user_passphrase;
491ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
492ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
493ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string server_hostname_;
494ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ProviderType provider_type_;
495ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string ca_cert_;
496ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string psk_passphrase_;
497ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string user_cert_;
498ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string user_cert_key_;
499ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string username_;
500ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string user_passphrase_;
501ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
502ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  friend class NetworkLibraryImpl;
503ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(VirtualNetwork);
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
505dc0f95d653279beabeb9817299e2902918ba123eKristian Monsentypedef std::vector<VirtualNetwork*> VirtualNetworkVector;
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
507dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Base class for networks of TYPE_WIFI or TYPE_CELLULAR.
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WirelessNetwork : public Network {
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int strength() const { return strength_; }
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
513dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  WirelessNetwork(const std::string& service_path, ConnectionType type)
514dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : Network(service_path, type),
515dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        strength_(0) {}
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int strength_;
517513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
518dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Network overrides.
519dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool ParseValue(int index, const Value* value);
5204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
521dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
522513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void set_strength(int strength) { strength_ = strength; }
523513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
524513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  friend class NetworkLibraryImpl;
525ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  friend class NetworkLibraryStubImpl;
526ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(WirelessNetwork);
527513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
528513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
529dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Class for networks of TYPE_CELLULAR.
530dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass CellularDataPlan;
531513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CellularNetwork : public WirelessNetwork {
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
534731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  enum DataLeft {
53572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DATA_UNKNOWN,
536731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DATA_NORMAL,
537731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DATA_LOW,
538731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DATA_VERY_LOW,
539731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DATA_NONE
540731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  };
541731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
542ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  struct Apn {
543ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string apn;
544ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string network_id;
545ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string username;
546ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string password;
547ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
548ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Apn() {}
549ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Apn(const std::string& apn, const std::string& network_id,
550ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        const std::string& username, const std::string& password)
551ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        : apn(apn), network_id(network_id),
552ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          username(username), password(password) {
553ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
554ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    void Set(const DictionaryValue& dict);
555ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
556ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
557513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual ~CellularNetwork();
558dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
559dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  explicit CellularNetwork(const std::string& service_path)
560dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : WirelessNetwork(service_path, TYPE_CELLULAR),
561dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        activation_state_(ACTIVATION_STATE_UNKNOWN),
562dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        network_technology_(NETWORK_TECHNOLOGY_UNKNOWN),
563dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        roaming_state_(ROAMING_STATE_UNKNOWN),
564dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        data_left_(DATA_UNKNOWN) {
565dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
5663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Starts device activation process. Returns false if the device state does
5673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // not permit activation.
5683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool StartActivation() const;
569ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Requests data plans if the network is conencted and activated.
570ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Plan data will be passed through Network::Observer::CellularDataPlanChanged
571ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // callback.
572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void RefreshDataPlansIfNeeded() const;
573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const ActivationState activation_state() const { return activation_state_; }
575ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool activated() const {
576ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return activation_state() == ACTIVATION_STATE_ACTIVATED;
577ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
578731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const NetworkTechnology network_technology() const {
579731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return network_technology_;
580731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
581731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const NetworkRoamingState roaming_state() const { return roaming_state_; }
582201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool restricted_pool() const {
583201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return connectivity_state() == CONN_STATE_RESTRICTED;
584201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
5854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool needs_new_plan() const {
586ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return restricted_pool() && connected() && activated();
5874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
588731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const std::string& operator_name() const { return operator_name_; }
589731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const std::string& operator_code() const { return operator_code_; }
590ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& operator_country() const { return operator_country_; }
5913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const std::string& payment_url() const { return payment_url_; }
592dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string& usage_url() const { return usage_url_; }
593dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DataLeft data_left() const { return data_left_; }
594ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const Apn& apn() const { return apn_; }
595ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const Apn& last_good_apn() const { return last_good_apn_; }
596ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetApn(const Apn& apn);
597ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool SupportsDataPlan() const;
598dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
599dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Misc.
600201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool is_gsm() const {
601201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return network_technology_ != NETWORK_TECHNOLOGY_EVDO &&
602201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        network_technology_ != NETWORK_TECHNOLOGY_1XRTT &&
603201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        network_technology_ != NETWORK_TECHNOLOGY_UNKNOWN;
604201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
606731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Return a string representation of network technology.
607731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string GetNetworkTechnologyString() const;
608201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Return a string representation of connectivity state.
609201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string GetConnectivityStateString() const;
610731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Return a string representation of activation state.
611731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string GetActivationStateString() const;
612731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Return a string representation of roaming state.
613731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string GetRoamingStateString() const;
614731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
615513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Return a string representation of |activation_state|.
616513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static std::string ActivationStateToString(ActivationState activation_state);
617513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
6183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
619dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // WirelessNetwork overrides.
620dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool ParseValue(int index, const Value* value);
621513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
6223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ActivationState activation_state_;
623731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NetworkTechnology network_technology_;
624731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NetworkRoamingState roaming_state_;
625731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Carrier Info
626731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string operator_name_;
627731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string operator_code_;
628ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string operator_country_;
6293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string payment_url_;
630dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string usage_url_;
631dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Cached values
632dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DataLeft data_left_;  // Updated when data plans are updated.
633ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Apn apn_;
634ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Apn last_good_apn_;
635513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
636513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private:
637513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void set_activation_state(ActivationState state) {
638513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    activation_state_ = state;
639513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
640dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_payment_url(const std::string& url) { payment_url_ = url; }
641dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_usage_url(const std::string& url) { usage_url_ = url; }
642513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void set_network_technology(NetworkTechnology technology) {
643513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    network_technology_ = technology;
644513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
645dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_roaming_state(NetworkRoamingState state) { roaming_state_ = state; }
646dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_data_left(DataLeft data_left) { data_left_ = data_left; }
647ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_apn(const Apn& apn) { apn_ = apn; }
648ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_last_good_apn(const Apn& apn) { last_good_apn_ = apn; }
649513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
650513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  friend class NetworkLibraryImpl;
651ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  friend class NetworkLibraryStubImpl;
652ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(CellularNetwork);
653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
654dc0f95d653279beabeb9817299e2902918ba123eKristian Monsentypedef std::vector<CellularNetwork*> CellularNetworkVector;
655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
656dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Class for networks of TYPE_WIFI.
657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WifiNetwork : public WirelessNetwork {
658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
659dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  explicit WifiNetwork(const std::string& service_path)
660dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : WirelessNetwork(service_path, TYPE_WIFI),
661dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        encryption_(SECURITY_NONE),
662ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        passphrase_required_(false),
663ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        eap_method_(EAP_METHOD_UNKNOWN),
664ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        eap_phase_2_auth_(EAP_PHASE_2_AUTH_AUTO),
665ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        eap_use_system_cas_(true),
666ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        save_credentials_(false) {
667dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool encrypted() const { return encryption_ != SECURITY_NONE; }
670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConnectionSecurity encryption() const { return encryption_; }
671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& passphrase() const { return passphrase_; }
672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& identity() const { return identity_; }
673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& cert_path() const { return cert_path_; }
674ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool passphrase_required() const { return passphrase_required_; }
675ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
676ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EAPMethod eap_method() const { return eap_method_; }
677ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EAPPhase2Auth eap_phase_2_auth() const { return eap_phase_2_auth_; }
678ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& eap_server_ca_cert_nss_nickname() const {
679ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return eap_server_ca_cert_nss_nickname_; }
680ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& eap_client_cert_pkcs11_id() const {
681ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return eap_client_cert_pkcs11_id_; }
682ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const bool eap_use_system_cas() const { return eap_use_system_cas_; }
683ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& eap_identity() const { return eap_identity_; }
684ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& eap_anonymous_identity() const {
685ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return eap_anonymous_identity_; }
686ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& eap_passphrase() const { return eap_passphrase_; }
687ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool save_credentials() const { return save_credentials_; }
688ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
689ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const std::string& GetPassphrase() const;
690ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
691ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool SetSsid(const std::string& ssid);
692ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool SetHexSsid(const std::string& ssid_hex);
693dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SetPassphrase(const std::string& passphrase);
694dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SetIdentity(const std::string& identity);
695dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SetCertPath(const std::string& cert_path);
696c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
697ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // 802.1x properties
698ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetEAPMethod(EAPMethod method);
699ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetEAPPhase2Auth(EAPPhase2Auth auth);
700ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetEAPServerCaCertNssNickname(const std::string& nss_nickname);
701ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetEAPClientCertPkcs11Id(const std::string& pkcs11_id);
702ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetEAPUseSystemCAs(bool use_system_cas);
703ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetEAPIdentity(const std::string& identity);
704ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetEAPAnonymousIdentity(const std::string& identity);
705ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetEAPPassphrase(const std::string& passphrase);
706ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetSaveCredentials(bool save_credentials);
707ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
708ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Erase cached credentials, used when "Save password" is unchecked.
709ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void EraseCredentials();
710ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return a string representation of the encryption code.
712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This not translated and should be only used for debugging purposes.
713ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string GetEncryptionString() const;
714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Return true if a passphrase or other input is required to connect.
71621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  bool IsPassphraseRequired() const;
71721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
718731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Return true if cert_path_ indicates that we have loaded the certificate.
719731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool IsCertificateLoaded() const;
720731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
721ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
722dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // WirelessNetwork overrides.
723dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool ParseValue(int index, const Value* value);
724ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ParseInfo(const DictionaryValue* info);
725dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
726ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void CalculateUniqueId();
727ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
728ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_encryption(ConnectionSecurity encryption) {
729ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    encryption_ = encryption;
730ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
731ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_passphrase(const std::string& passphrase) {
732ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    passphrase_ = passphrase;
733ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
734dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void set_passphrase_required(bool passphrase_required) {
735dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    passphrase_required_ = passphrase_required;
736dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
737ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_identity(const std::string& identity) {
738ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    identity_ = identity;
739ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
740ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_cert_path(const std::string& cert_path) {
741ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cert_path_ = cert_path;
742ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
743dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ConnectionSecurity encryption_;
745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string passphrase_;
746513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool passphrase_required_;
747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string identity_;
748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string cert_path_;
749dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
750ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EAPMethod eap_method_;
751ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EAPPhase2Auth eap_phase_2_auth_;
752ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string eap_server_ca_cert_nss_nickname_;
753ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string eap_client_cert_pkcs11_id_;
754ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool eap_use_system_cas_;
755ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string eap_identity_;
756ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string eap_anonymous_identity_;
757ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string eap_passphrase_;
758ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Tells flimflam to save passphrase and EAP credentials to disk.
759ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool save_credentials_;
760ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
761ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Internal state (not stored in flimflam).
762ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Passphrase set by user (stored for UI).
763ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string user_passphrase_;
764ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
765dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  friend class NetworkLibraryImpl;
766ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(WifiNetwork);
767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
768dc0f95d653279beabeb9817299e2902918ba123eKristian Monsentypedef std::vector<WifiNetwork*> WifiNetworkVector;
769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
770dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Cellular Data Plan management.
771dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass CellularDataPlan {
772dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
773dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CellularDataPlan()
774dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : plan_name("Unknown"),
775dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        plan_type(CELLULAR_DATA_PLAN_UNLIMITED),
776dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        plan_data_bytes(0),
777dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        data_bytes_used(0) { }
778dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  explicit CellularDataPlan(const CellularDataPlanInfo &plan)
779dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : plan_name(plan.plan_name ? plan.plan_name : ""),
780dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        plan_type(plan.plan_type),
781dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        update_time(base::Time::FromInternalValue(plan.update_time)),
782dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        plan_start_time(base::Time::FromInternalValue(plan.plan_start_time)),
783dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        plan_end_time(base::Time::FromInternalValue(plan.plan_end_time)),
784dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        plan_data_bytes(plan.plan_data_bytes),
785dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        data_bytes_used(plan.data_bytes_used) { }
786dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Formats cellular plan description.
787dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  string16 GetPlanDesciption() const;
788dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Evaluates cellular plans status and returns warning string if it is near
789dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // expiration.
790dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  string16 GetRemainingWarning() const;
791dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Formats remaining plan data description.
792dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  string16 GetDataRemainingDesciption() const;
793dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Formats plan expiration description.
794dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  string16 GetPlanExpiration() const;
795dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Formats plan usage info.
796dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  string16 GetUsageInfo() const;
797dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Returns a unique string for this plan that can be used for comparisons.
798dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string GetUniqueIdentifier() const;
799dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::TimeDelta remaining_time() const;
800dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int64 remaining_minutes() const;
801dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Returns plan data remaining in bytes.
802dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int64 remaining_data() const;
803dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // TODO(stevenjb): Make these private with accessors and properly named.
804dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string plan_name;
805dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CellularDataPlanType plan_type;
806dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::Time update_time;
807dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::Time plan_start_time;
808dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::Time plan_end_time;
809dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int64 plan_data_bytes;
810dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int64 data_bytes_used;
811dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
812dc0f95d653279beabeb9817299e2902918ba123eKristian Monsentypedef ScopedVector<CellularDataPlan> CellularDataPlanVector;
813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
814dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Geolocation data.
815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct CellTower {
816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum RadioType {
817c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RADIOTYPE_GSM,
818c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RADIOTYPE_CDMA,
819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RADIOTYPE_WCDMA,
820c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } radio_type;                   // GSM/WCDMA     CDMA
821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int mobile_country_code;        //   MCC          MCC
822c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int mobile_network_code;        //   MNC          SID
823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int location_area_code;         //   LAC          NID
824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int cell_id;                    //   CID          BID
825731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  base::Time timestamp;  // Timestamp when this cell was primary
826731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int signal_strength;   // Radio signal strength measured in dBm.
827731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int timing_advance;    // Represents the distance from the cell tower.
828731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                         // Each unit is roughly 550 meters.
829c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
830c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
831c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct WifiAccessPoint {
832c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string mac_address;  // The mac address of the WiFi node.
833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string name;         // The SSID of the WiFi node.
834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Time timestamp;     // Timestamp when this AP was detected.
835c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int signal_strength;      // Radio signal strength measured in dBm.
836c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int signal_to_noise;      // Current signal to noise ratio measured in dB.
837c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int channel;              // Wifi channel number.
838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
839c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
840c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef std::vector<CellTower> CellTowerVector;
841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef std::vector<WifiAccessPoint> WifiAccessPointVector;
842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
843dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// IP Configuration.
844c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct NetworkIPConfig {
845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NetworkIPConfig(const std::string& device_path, IPConfigType type,
846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const std::string& address, const std::string& netmask,
847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const std::string& gateway, const std::string& name_servers)
848c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : device_path(device_path),
849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        type(type),
850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        address(address),
851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        netmask(netmask),
852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        gateway(gateway),
853c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        name_servers(name_servers) {}
854c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NetworkIPConfigs are sorted by tyoe.
856c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool operator< (const NetworkIPConfig& other) const {
857c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return type < other.type;
858c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
859c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
860c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string device_path;
861c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  IPConfigType type;
862731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string address;  // This looks like "/device/0011aa22bb33"
863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string netmask;
864c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string gateway;
865c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string name_servers;
866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef std::vector<NetworkIPConfig> NetworkIPConfigVector;
868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This class handles the interaction with the ChromeOS network library APIs.
8703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Classes can add themselves as observers. Users can get an instance of the
8713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// library like this: chromeos::CrosLibrary::Get()->GetNetworkLibrary()
872c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NetworkLibrary {
873c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
874ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  enum HardwareAddressFormat {
875ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    FORMAT_RAW_HEX,
876ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    FORMAT_COLON_SEPARATED_HEX
877ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
878ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
879513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  class NetworkManagerObserver {
880513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch   public:
881513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Called when the state of the network manager has changed,
882513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // for example, networks have appeared or disappeared.
883513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    virtual void OnNetworkManagerChanged(NetworkLibrary* obj) = 0;
884513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  };
885513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
886513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  class NetworkObserver {
887513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch   public:
888513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Called when the state of a single network has changed,
889513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // for example signal strength or connection state.
890513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    virtual void OnNetworkChanged(NetworkLibrary* cros,
891513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                  const Network* network) = 0;
892513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  };
893513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
894ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  class NetworkDeviceObserver {
895ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   public:
896ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Called when the state of a single device has changed,
897ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // for example SIMLock state for cellular.
898ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    virtual void OnNetworkDeviceChanged(NetworkLibrary* cros,
899ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        const NetworkDevice* device) = 0;
900ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
901ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
902513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  class CellularDataPlanObserver {
903c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
904731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Called when the cellular data plan has changed.
905513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    virtual void OnCellularDataPlanChanged(NetworkLibrary* obj) = 0;
906c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
907c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
908ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  class PinOperationObserver {
909ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   public:
910ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Called when pin async operation has completed.
911ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Network is NULL when we don't have an associated Network object.
912ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    virtual void OnPinOperationCompleted(NetworkLibrary* cros,
913ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                         PinOperationError error) = 0;
914ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
915ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
916dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  class UserActionObserver {
917dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen   public:
918dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Called when user initiates a new connection.
919dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Network is NULL when we don't have an associated Network object.
920dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    virtual void OnConnectionInitiated(NetworkLibrary* cros,
921dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                       const Network* network) = 0;
922dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
923dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
924c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~NetworkLibrary() {}
925513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
926513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) = 0;
927513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveNetworkManagerObserver(
928513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      NetworkManagerObserver* observer) = 0;
929513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
930513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // An attempt to add an observer that has already been added for a
931513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // give service path will be ignored.
932513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddNetworkObserver(const std::string& service_path,
933513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                  NetworkObserver* observer) = 0;
934513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Remove an observer of a single network
935513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveNetworkObserver(const std::string& service_path,
936513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     NetworkObserver* observer) = 0;
937513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Stop |observer| from observing any networks
938513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) = 0;
939513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
940ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Add an observer for a single network device.
941ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void AddNetworkDeviceObserver(const std::string& device_path,
942ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        NetworkDeviceObserver* observer) = 0;
943ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Remove an observer for a single network device.
944ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RemoveNetworkDeviceObserver(const std::string& device_path,
945ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                           NetworkDeviceObserver* observer) = 0;
946ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
94772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Temporarily locks down certain functionality in network library to prevent
94872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // unplanned side effects. During the lock down, Enable*Device() calls cannot
94972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // be made.
95072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Lock() = 0;
95172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Removes temporarily lock of network library.
95272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Unlock() = 0;
95372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Checks if access to network library is locked.
95472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool IsLocked() = 0;
95572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
956513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddCellularDataPlanObserver(
957513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      CellularDataPlanObserver* observer) = 0;
958513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveCellularDataPlanObserver(
959513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      CellularDataPlanObserver* observer) = 0;
960c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
961ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void AddPinOperationObserver(PinOperationObserver* observer) = 0;
962ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RemovePinOperationObserver(PinOperationObserver* observer) = 0;
963ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
964dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void AddUserActionObserver(UserActionObserver* observer) = 0;
965dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void RemoveUserActionObserver(UserActionObserver* observer) = 0;
966dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
967dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Return the active or default Ethernet network (or NULL if none).
96821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual const EthernetNetwork* ethernet_network() const = 0;
969c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool ethernet_connecting() const = 0;
970c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool ethernet_connected() const = 0;
971c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
972dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Return the active Wifi network (or NULL if none active).
97321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual const WifiNetwork* wifi_network() const = 0;
974c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool wifi_connecting() const = 0;
975c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool wifi_connected() const = 0;
976c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
977dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Return the active Cellular network (or NULL if none active).
97821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual const CellularNetwork* cellular_network() const = 0;
979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool cellular_connecting() const = 0;
980c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool cellular_connected() const = 0;
981c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
982dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Return the active virtual network (or NULL if none active).
983dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const VirtualNetwork* virtual_network() const = 0;
984dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool virtual_network_connecting() const = 0;
985dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool virtual_network_connected() const = 0;
986dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return true if any network is currently connected.
988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool Connected() const = 0;
989c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
990c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return true if any network is currently connecting.
991c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool Connecting() const = 0;
992c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
993c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the current IP address if connected. If not, returns empty string.
994c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const std::string& IPAddress() const = 0;
995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
996c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the current list of wifi networks.
997c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const WifiNetworkVector& wifi_networks() const = 0;
998c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
999c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the list of remembered wifi networks.
1000c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const WifiNetworkVector& remembered_wifi_networks() const = 0;
1001c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1002c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the current list of cellular networks.
1003c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const CellularNetworkVector& cellular_networks() const = 0;
1004c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1005dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Returns the current list of virtual networks.
1006dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const VirtualNetworkVector& virtual_networks() const = 0;
1007dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1008dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Return a pointer to the device, if it exists, or NULL.
1009dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const NetworkDevice* FindNetworkDeviceByPath(
1010dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const = 0;
1011dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1012ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns device with TYPE_CELLULAR. Returns NULL if none exists.
1013ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const NetworkDevice* FindCellularDevice() const = 0;
1014ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1015ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns device with TYPE_ETHERNET. Returns NULL if none exists.
1016ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const NetworkDevice* FindEthernetDevice() const = 0;
1017ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1018ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns device with TYPE_WIFI. Returns NULL if none exists.
1019ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const NetworkDevice* FindWifiDevice() const = 0;
1020ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1021dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Return a pointer to the network, if it exists, or NULL.
1022ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // NOTE: Never store these results, store service paths instead.
1023ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The pattern for doing an operation on a Network is:
1024ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Network* network = cros->FindNetworkByPath(service_path);
1025ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // network->SetFoo();
1026ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // network->Connect();
1027ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // As long as this is done in sequence on the UI thread it will be safe;
1028ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // the network list only gets updated on the UI thread.
1029ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual Network* FindNetworkByPath(const std::string& path) const = 0;
1030ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual WifiNetwork* FindWifiNetworkByPath(const std::string& path) const = 0;
1031513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual CellularNetwork* FindCellularNetworkByPath(
1032dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const = 0;
1033ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual VirtualNetwork* FindVirtualNetworkByPath(
1034ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& path) const = 0;
1035ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1036ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns the visible wifi network corresponding to the remembered
1037ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // wifi network, or NULL if the remembered network is not visible.
1038ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual Network* FindNetworkFromRemembered(
1039ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const Network* remembered) const = 0;
1040513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1041dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Retrieves the data plans associated with |path|, NULL if there are no
1042dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // associated plans.
1043dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const CellularDataPlanVector* GetDataPlans(
1044dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const = 0;
1045dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1046dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // This returns the significant data plan. If the user only has the
1047dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // base data plan, then return that. If there is a base and a paid data plan,
1048dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // then the significant one is the paid one. So return the paid plan.
1049dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // If there are no data plans, then this method returns NULL.
1050dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // This returns a pointer to a member of data_plans_, so if SetDataPlans()
1051dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // gets called, the result becomes invalid.
1052dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const CellularDataPlan* GetSignificantDataPlan(
1053dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const = 0;
1054c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1055ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Passes |old_pin|, |new_pin| to change SIM card PIM.
1056ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ChangePin(const std::string& old_pin,
1057ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         const std::string& new_pin) = 0;
1058ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1059ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Passes |pin|, |require_pin| value to change SIM card RequirePin setting.
1060ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ChangeRequirePin(bool require_pin,
1061ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                const std::string& pin) = 0;
1062ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1063ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Passes |pin| to unlock SIM card.
1064ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void EnterPin(const std::string& pin) = 0;
1065ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1066ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Passes |puk|, |new_pin| to unblock SIM card.
1067ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void UnblockPin(const std::string& puk,
1068ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          const std::string& new_pin) = 0;
1069ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1070ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Request a scan for available cellular networks.
1071ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RequestCellularScan() = 0;
1072ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1073ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Request a register in cellular network with |network_id|.
1074ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RequestCellularRegister(const std::string& network_id) = 0;
1075ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1076ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Change data roaming restriction for current cellular device.
1077ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetCellularDataRoamingAllowed(bool new_value) = 0;
1078ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1079c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Request a scan for new wifi networks.
1080ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RequestNetworkScan() = 0;
1081c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1082c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reads out the results of the last wifi scan. These results are not
1083c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // pre-cached in the library, so the call may block whilst the results are
1084c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // read over IPC.
1085c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns false if an error occurred in reading the results. Note that
1086c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a true return code only indicates the result set was successfully read,
1087c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // it does not imply a scan has successfully completed yet.
1088c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool GetWifiAccessPoints(WifiAccessPointVector* result) = 0;
1089c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1090c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(joth): Add GetCellTowers to retrieve a CellTowerVector.
1091c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1092ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Connect to the specified wireless network.
1093ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToWifiNetwork(WifiNetwork* network) = 0;
1094c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1095dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Same as above but searches for an existing network by name.
1096ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToWifiNetwork(const std::string& service_path) = 0;
1097dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1098ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Connect to the specified network with security, ssid, passphrase, identity,
1099ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // and (optionally) certpath.
1100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToWifiNetwork(ConnectionSecurity security,
1101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                    const std::string& ssid,
1102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    const std::string& passphrase,
1103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    const std::string& identity,
1104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    const std::string& certpath) = 0;
1105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Connect to the specified cellular network.
1107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToCellularNetwork(CellularNetwork* network) = 0;
1108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
110972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Records information that cellular play payment had happened.
111072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void SignalCellularPlanPayment() = 0;
111172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
111272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Returns true if cellular plan payment had been recorded recently.
111372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool HasRecentCellularPlanPayment() = 0;
111472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Connect to the specified virtual network.
1116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToVirtualNetwork(VirtualNetwork* network) = 0;
1117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Connect to the specified virtual network with service name,
1119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // server hostname, provider_type, PSK passphrase, username and passphrase.
1120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToVirtualNetworkPSK(
1121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& service_name,
1122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& server_hostname,
1123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& psk,
1124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& username,
1125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& user_passphrase) = 0;
1126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Disconnect from the specified network.
1128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void DisconnectFromNetwork(const Network* network) = 0;
1129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1130513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Forget the wifi network corresponding to service_path.
1131513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void ForgetWifiNetwork(const std::string& service_path) = 0;
1132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns home carrier ID if available, otherwise empty string is returned.
1134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Carrier ID format: <carrier name> (country). Ex.: "Verizon (us)".
1135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual std::string GetCellularHomeCarrierId() const = 0;
1136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool ethernet_available() const = 0;
1138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool wifi_available() const = 0;
1139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool cellular_available() const = 0;
1140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool ethernet_enabled() const = 0;
1142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool wifi_enabled() const = 0;
1143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool cellular_enabled() const = 0;
1144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1145201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual bool wifi_scanning() const = 0;
1146201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual const Network* active_network() const = 0;
1148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const Network* connected_network() const = 0;
1149513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool offline_mode() const = 0;
1151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enables/disables the ethernet network device.
1153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void EnableEthernetNetworkDevice(bool enable) = 0;
1154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enables/disables the wifi network device.
1156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void EnableWifiNetworkDevice(bool enable) = 0;
1157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enables/disables the cellular network device.
1159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void EnableCellularNetworkDevice(bool enable) = 0;
1160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enables/disables offline mode.
1162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void EnableOfflineMode(bool enable) = 0;
1163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Fetches IP configs and hardware address for a given device_path.
1165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // The hardware address is usually a MAC address like "0011AA22BB33".
1166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // |hardware_address| will be an empty string, if no hardware address is
1167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // found.
1168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual NetworkIPConfigVector GetIPConfigs(
1169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      const std::string& device_path,
1170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::string* hardware_address,
1171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      HardwareAddressFormat) = 0;
1172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Factory function, creates a new instance and returns ownership.
11743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // For normal usage, access the singleton via CrosLibrary::Get().
11753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static NetworkLibrary* GetImpl(bool stub);
1176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
1177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
1179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_CHROMEOS_CROS_NETWORK_LIBRARY_H_
1181