network_library.cc revision ddb351dbec246cf1fab5ec20d2d5520909041de1
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#include "chrome/browser/chromeos/cros/network_library.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <algorithm>
8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <map>
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/i18n/icu_encoding_detection.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/i18n/icu_string_conversions.h"
124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/i18n/time_formatting.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/metrics/histogram.h"
14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/stl_util-inl.h"
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/stringprintf.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/utf_string_conversion_utils.h"
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/values.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/cros/cros_library.h"
2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/chromeos/login/user_manager.h"
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/network_login_observer.h"
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/user_cros_settings_provider.h"
254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/common/time_format.h"
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "grit/generated_resources.h"
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen////////////////////////////////////////////////////////////////////////////////
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Implementation notes.
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// NetworkLibraryImpl manages a series of classes that describe network devices
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// and services:
34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// NetworkDevice: e.g. ethernet, wifi modem, cellular modem
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//  device_map_: canonical map<path,NetworkDevice*> for devices
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//
38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Network: a network service ("network").
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//  network_map_: canonical map<path,Network*> for all visible networks.
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//  EthernetNetwork
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//   ethernet_: EthernetNetwork* to the active ethernet network in network_map_.
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//  WirelessNetwork: a Wifi or Cellular Network.
43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//  WifiNetwork
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//   active_wifi_: WifiNetwork* to the active wifi network in network_map_.
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//   wifi_networks_: ordered vector of WifiNetwork* entries in network_map_,
46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//       in descending order of importance.
47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//  CellularNetwork
48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//   active_cellular_: Cellular version of wifi_.
49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//   cellular_networks_: Cellular version of wifi_.
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// network_unique_id_map_: map<unique_id,Network*> for visible networks.
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// remembered_network_map_: a canonical map<path,Network*> for all networks
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//     remembered in the active Profile ("favorites").
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// remembered_wifi_networks_: ordered vector of WifiNetwork* entries in
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//     remembered_network_map_, in descending order of preference.
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// network_manager_monitor_: a handle to the libcros network Manager handler.
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// NetworkManagerStatusChanged: This handles all messages from the Manager.
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//   Messages are parsed here and the appropriate updates are then requested.
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// UpdateNetworkServiceList: This is the primary Manager handler. It handles
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//  the "Services" message which list all visible networks. The handler
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//  rebuilds the network lists without destroying existing Network structures,
63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//  then requests neccessary updates to be fetched asynchronously from
64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//  libcros (RequestNetworkServiceInfo).
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//
66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// TODO(stevenjb): Document cellular data plan handlers.
67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//
68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// AddNetworkObserver: Adds an observer for a specific network.
69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// NetworkObserverList: A monitor and list of observers of a network.
70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// network_monitor_: a handle to the libcros network Service handler.
71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// UpdateNetworkStatus: This handles changes to a monitored service, typically
72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//     changes to transient states like Strength. (Note: also updates State).
73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// AddNetworkDeviceObserver: Adds an observer for a specific device.
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//                           Will be called on any device property change.
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// NetworkDeviceObserverList: A monitor and list of observers of a device.
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// UpdateNetworkDeviceStatus: Handles changes to a monitored device, like
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//     SIM lock state and updates device state.
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// All *Pin(...) methods use internal callback that would update cellular
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//    device state once async call is completed and notify all device observers.
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen////////////////////////////////////////////////////////////////////////////////
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Local constants.
88513209b27ff55e2841eac0e4120199c23acce758Ben Murdochnamespace {
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Only send network change notifications to observers once every 50ms.
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst int kNetworkNotifyDelayMs = 50;
92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// How long we should remember that cellular plan payment was received.
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst int kRecentPlanPaymentHours = 6;
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Default value of the SIM unlock retries count. It is updated to the real
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// retries count once cellular device with SIM card is initialized.
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// If cellular device doesn't have SIM card, then retries are never used.
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst int kDefaultSimUnlockRetriesCount = 999;
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Format of the Carrier ID: <carrier name> (<carrier country>).
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kCarrierIdFormat = "%s (%s)";
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Type of a pending SIM operation.
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenenum SimOperationType {
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIM_OPERATION_NONE               = 0,
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIM_OPERATION_CHANGE_PIN         = 1,
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIM_OPERATION_CHANGE_REQUIRE_PIN = 2,
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIM_OPERATION_ENTER_PIN          = 3,
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIM_OPERATION_UNBLOCK_PIN        = 4,
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// D-Bus interface string constants.
114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Flimflam property names.
116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kSecurityProperty = "Security";
117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kPassphraseProperty = "Passphrase";
118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kIdentityProperty = "Identity";
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kCertPathProperty = "CertPath";
120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kPassphraseRequiredProperty = "PassphraseRequired";
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kSaveCredentialsProperty = "SaveCredentials";
122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kProfilesProperty = "Profiles";
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kServicesProperty = "Services";
124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kServiceWatchListProperty = "ServiceWatchList";
125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kAvailableTechnologiesProperty = "AvailableTechnologies";
126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kEnabledTechnologiesProperty = "EnabledTechnologies";
127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kConnectedTechnologiesProperty = "ConnectedTechnologies";
128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kDefaultTechnologyProperty = "DefaultTechnology";
129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kOfflineModeProperty = "OfflineMode";
130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kSignalStrengthProperty = "Strength";
131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kNameProperty = "Name";
132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kStateProperty = "State";
133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kConnectivityStateProperty = "ConnectivityState";
134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kTypeProperty = "Type";
135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kDeviceProperty = "Device";
136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kActivationStateProperty = "Cellular.ActivationState";
137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kNetworkTechnologyProperty = "Cellular.NetworkTechnology";
138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kRoamingStateProperty = "Cellular.RoamingState";
139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kOperatorNameProperty = "Cellular.OperatorName";
140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kOperatorCodeProperty = "Cellular.OperatorCode";
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kServingOperatorProperty = "Cellular.ServingOperator";
142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kPaymentURLProperty = "Cellular.OlpUrl";
143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kUsageURLProperty = "Cellular.UsageUrl";
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kCellularApnProperty = "Cellular.APN";
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kCellularLastGoodApnProperty = "Cellular.LastGoodAPN";
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kWifiHexSsid = "WiFi.HexSSID";
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kWifiFrequency = "WiFi.Frequency";
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kWifiHiddenSsid = "WiFi.HiddenSSID";
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kWifiPhyMode = "WiFi.PhyMode";
150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kFavoriteProperty = "Favorite";
151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kConnectableProperty = "Connectable";
152dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kAutoConnectProperty = "AutoConnect";
153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kIsActiveProperty = "IsActive";
154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kModeProperty = "Mode";
155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kErrorProperty = "Error";
156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kActiveProfileProperty = "ActiveProfile";
157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kEntriesProperty = "Entries";
158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kDevicesProperty = "Devices";
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kProviderProperty = "Provider";
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kHostProperty = "Host";
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Flimflam property names for SIMLock status.
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kSIMLockStatusProperty = "Cellular.SIMLockStatus";
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kSIMLockTypeProperty = "LockType";
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kSIMLockRetriesLeftProperty = "RetriesLeft";
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Flimflam property names for Cellular.FoundNetworks.
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kLongNameProperty = "long_name";
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kStatusProperty = "status";
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kShortNameProperty = "short_name";
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kTechnologyProperty = "technology";
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Flimflam SIMLock status types.
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kSIMLockPin = "sim-pin";
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kSIMLockPuk = "sim-puk";
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// APN info property names.
178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kApnProperty = "apn";
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kNetworkIdProperty = "network_id";
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kUsernameProperty = "username";
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kPasswordProperty = "password";
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Operator info property names.
184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kOperatorNameKey = "name";
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kOperatorCodeKey = "code";
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kOperatorCountryKey = "country";
187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
188dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Flimflam device info property names.
189dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kScanningProperty = "Scanning";
190dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kCarrierProperty = "Cellular.Carrier";
191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kCellularAllowRoamingProperty = "Cellular.AllowRoaming";
192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kHomeProviderProperty = "Cellular.HomeProvider";
193dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kMeidProperty = "Cellular.MEID";
194dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kImeiProperty = "Cellular.IMEI";
195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kImsiProperty = "Cellular.IMSI";
196dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kEsnProperty = "Cellular.ESN";
197dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kMdnProperty = "Cellular.MDN";
198dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kMinProperty = "Cellular.MIN";
199dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kModelIDProperty = "Cellular.ModelID";
200dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kManufacturerProperty = "Cellular.Manufacturer";
201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kFirmwareRevisionProperty = "Cellular.FirmwareRevision";
202dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kHardwareRevisionProperty = "Cellular.HardwareRevision";
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kPoweredProperty = "Powered";
204dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kPRLVersionProperty = "Cellular.PRLVersion"; // (INT16)
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kSelectedNetworkProperty = "Cellular.SelectedNetwork";
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kSupportNetworkScanProperty = "Cellular.SupportNetworkScan";
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kFoundNetworksProperty = "Cellular.FoundNetworks";
208dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Flimflam type options.
210dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kTypeEthernet = "ethernet";
211dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kTypeWifi = "wifi";
212dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kTypeWimax = "wimax";
213dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kTypeBluetooth = "bluetooth";
214dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kTypeCellular = "cellular";
215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kTypeVPN = "vpn";
216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
217dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Flimflam mode options.
218dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kModeManaged = "managed";
219dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kModeAdhoc = "adhoc";
220dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
221dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Flimflam security options.
222dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kSecurityWpa = "wpa";
223dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kSecurityWep = "wep";
224dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kSecurityRsn = "rsn";
225dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kSecurity8021x = "802_1x";
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kSecurityPsk = "psk";
227dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kSecurityNone = "none";
228dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Flimflam L2TPIPsec property names.
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kL2TPIPSecCACertProperty = "L2TPIPsec.CACert";
231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kL2TPIPSecCertProperty = "L2TPIPsec.Cert";
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kL2TPIPSecKeyProperty = "L2TPIPsec.Key";
233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kL2TPIPSecPSKProperty = "L2TPIPsec.PSK";
234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kL2TPIPSecUserProperty = "L2TPIPsec.User";
235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kL2TPIPSecPasswordProperty = "L2TPIPsec.Password";
236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Flimflam EAP property names.
238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// See src/third_party/flimflam/doc/service-api.txt.
239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapIdentityProperty = "EAP.Identity";
240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapMethodProperty = "EAP.EAP";
241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapPhase2AuthProperty = "EAP.InnerEAP";
242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapAnonymousIdentityProperty = "EAP.AnonymousIdentity";
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapClientCertProperty = "EAP.ClientCert";  // path
244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapCertIDProperty = "EAP.CertID";  // PKCS#11 ID
245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapClientCertNssProperty = "EAP.ClientCertNSS";  // NSS nickname
246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapPrivateKeyProperty = "EAP.PrivateKey";
247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapPrivateKeyPasswordProperty = "EAP.PrivateKeyPassword";
248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapKeyIDProperty = "EAP.KeyID";
249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapCaCertProperty = "EAP.CACert";  // server CA cert path
250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapCaCertIDProperty = "EAP.CACertID";  // server CA PKCS#11 ID
251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapCaCertNssProperty = "EAP.CACertNSS";  // server CA NSS nickname
252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapUseSystemCAsProperty = "EAP.UseSystemCAs";
253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapPinProperty = "EAP.PIN";
254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapPasswordProperty = "EAP.Password";
255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kEapKeyMgmtProperty = "EAP.KeyMgmt";
256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Flimflam EAP method options.
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string& kEapMethodPEAP = "PEAP";
259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string& kEapMethodTLS = "TLS";
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string& kEapMethodTTLS = "TTLS";
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string& kEapMethodLEAP = "LEAP";
262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Flimflam EAP phase 2 auth options.
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string& kEapPhase2AuthPEAPMD5 = "auth=MD5";
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string& kEapPhase2AuthPEAPMSCHAPV2 = "auth=MSCHAPV2";
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string& kEapPhase2AuthTTLSMD5 = "autheap=MD5";
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string& kEapPhase2AuthTTLSMSCHAPV2 = "autheap=MSCHAPV2";
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string& kEapPhase2AuthTTLSMSCHAP = "autheap=MSCHAP";
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string& kEapPhase2AuthTTLSPAP = "autheap=PAP";
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string& kEapPhase2AuthTTLSCHAP = "autheap=CHAP";
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Flimflam VPN provider types.
273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kProviderL2tpIpsec = "l2tpipsec";
274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kProviderOpenVpn = "openvpn";
275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
277dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Flimflam state options.
278dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kStateIdle = "idle";
279dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kStateCarrier = "carrier";
280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kStateAssociation = "association";
281dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kStateConfiguration = "configuration";
282dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kStateReady = "ready";
283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kStateDisconnect = "disconnect";
284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kStateFailure = "failure";
285dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kStateActivationFailure = "activation-failure";
286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Flimflam connectivity state options.
288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kConnStateUnrestricted = "unrestricted";
289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kConnStateRestricted = "restricted";
290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kConnStateNone = "none";
291dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
292dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Flimflam network technology options.
293dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kNetworkTechnology1Xrtt = "1xRTT";
294dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kNetworkTechnologyEvdo = "EVDO";
295dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kNetworkTechnologyGprs = "GPRS";
296dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kNetworkTechnologyEdge = "EDGE";
297dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kNetworkTechnologyUmts = "UMTS";
298dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kNetworkTechnologyHspa = "HSPA";
299dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kNetworkTechnologyHspaPlus = "HSPA+";
300dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kNetworkTechnologyLte = "LTE";
301dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kNetworkTechnologyLteAdvanced = "LTE Advanced";
302dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
303dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Flimflam roaming state options
304dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kRoamingStateHome = "home";
305dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kRoamingStateRoaming = "roaming";
306dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kRoamingStateUnknown = "unknown";
307dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
308dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Flimflam activation state options
309dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kActivationStateActivated = "activated";
310dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kActivationStateActivating = "activating";
311dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kActivationStateNotActivated = "not-activated";
312dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kActivationStatePartiallyActivated = "partially-activated";
313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kActivationStateUnknown = "unknown";
314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Flimflam error options.
316dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kErrorOutOfRange = "out-of-range";
317dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kErrorPinMissing = "pin-missing";
318dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kErrorDhcpFailed = "dhcp-failed";
319dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kErrorConnectFailed = "connect-failed";
320dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kErrorBadPassphrase = "bad-passphrase";
321dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kErrorBadWEPKey = "bad-wepkey";
322dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kErrorActivationFailed = "activation-failed";
323dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kErrorNeedEvdo = "need-evdo";
324dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kErrorNeedHomeNetwork = "need-home-network";
325dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kErrorOtaspFailed = "otasp-failed";
326dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kErrorAaaFailed = "aaa-failed";
327dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Flimflam error messages.
329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kErrorPassphraseRequiredMsg = "Passphrase required";
330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kErrorIncorrectPinMsg = "org.chromium.flimflam.Error.IncorrectPin";
331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kErrorPinBlockedMsg = "org.chromium.flimflam.Error.PinBlocked";
332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst char* kErrorPinRequiredMsg = "org.chromium.flimflam.Error.PinRequired";
333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
334dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst char* kUnknownString = "UNKNOWN";
335dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
336dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen////////////////////////////////////////////////////////////////////////////
337dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
338dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstatic const char* ConnectionTypeToString(ConnectionType type) {
339dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  switch (type) {
340dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case TYPE_UNKNOWN:
341dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
342dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case TYPE_ETHERNET:
343dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return kTypeEthernet;
344dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case TYPE_WIFI:
345dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return kTypeWifi;
346dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case TYPE_WIMAX:
347dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return kTypeWimax;
348dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case TYPE_BLUETOOTH:
349dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return kTypeBluetooth;
350dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case TYPE_CELLULAR:
351dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return kTypeCellular;
352dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case TYPE_VPN:
353dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return kTypeVPN;
354dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
355dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  LOG(ERROR) << "ConnectionTypeToString called with unknown type: " << type;
356dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return kUnknownString;
357dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
358dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
359dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// TODO(stevenjb/njw): Deprecate in favor of setting EAP properties.
360dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstatic const char* SecurityToString(ConnectionSecurity security) {
361dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  switch (security) {
362dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case SECURITY_NONE:
363dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return kSecurityNone;
364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case SECURITY_WEP:
365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return kSecurityWep;
366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case SECURITY_WPA:
367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return kSecurityWpa;
368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case SECURITY_RSN:
369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return kSecurityRsn;
370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case SECURITY_8021X:
371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return kSecurity8021x;
372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case SECURITY_PSK:
373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return kSecurityPsk;
374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case SECURITY_UNKNOWN:
375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
376dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
377dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  LOG(ERROR) << "SecurityToString called with unknown type: " << security;
378dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return kUnknownString;
379dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
380dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic const char* ProviderTypeToString(VirtualNetwork::ProviderType type) {
382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (type) {
383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_PSK:
384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_USER_CERT:
385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return kProviderL2tpIpsec;
386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case VirtualNetwork::PROVIDER_TYPE_OPEN_VPN:
387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return kProviderOpenVpn;
388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case VirtualNetwork::PROVIDER_TYPE_MAX:
389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  LOG(ERROR) << "ProviderTypeToString called with unknown type: " << type;
392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return kUnknownString;
393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
395dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen////////////////////////////////////////////////////////////////////////////
396dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
397dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Helper class to cache maps of strings to enums.
398dc0f95d653279beabeb9817299e2902918ba123eKristian Monsentemplate <typename Type>
399dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass StringToEnum {
400dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
401dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  struct Pair {
402dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const char* key;
403dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const Type value;
404dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
405dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
406dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  explicit StringToEnum(const Pair* list, size_t num_entries, Type unknown)
407dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : unknown_value_(unknown) {
408dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (size_t i = 0; i < num_entries; ++i, ++list)
409dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      enum_map_[list->key] = list->value;
410dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
411dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
412dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Type Get(const std::string& type) const {
413dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    EnumMapConstIter iter = enum_map_.find(type);
414dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (iter != enum_map_.end())
415dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return iter->second;
416dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return unknown_value_;
417dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
418dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
419dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
420dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  typedef typename std::map<std::string, Type> EnumMap;
421dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  typedef typename std::map<std::string, Type>::const_iterator EnumMapConstIter;
422dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EnumMap enum_map_;
423dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Type unknown_value_;
424dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DISALLOW_COPY_AND_ASSIGN(StringToEnum);
425dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
426dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
427dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen////////////////////////////////////////////////////////////////////////////
428dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
429dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenenum PropertyIndex {
430dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_ACTIVATION_STATE,
431dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_ACTIVE_PROFILE,
432dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_AUTO_CONNECT,
433dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_AVAILABLE_TECHNOLOGIES,
434dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_CARRIER,
435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_CELLULAR_ALLOW_ROAMING,
436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_CELLULAR_APN,
437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_CELLULAR_LAST_GOOD_APN,
438dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_CERT_PATH,
439dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_CONNECTABLE,
440dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_CONNECTED_TECHNOLOGIES,
441dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_CONNECTIVITY_STATE,
442dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_DEFAULT_TECHNOLOGY,
443dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_DEVICE,
444dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_DEVICES,
445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_IDENTITY,
446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_METHOD,
447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_PHASE_2_AUTH,
448ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY,
449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_CLIENT_CERT,
450ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_CERT_ID,
451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_CLIENT_CERT_NSS,
452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_PRIVATE_KEY,
453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_PRIVATE_KEY_PASSWORD,
454ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_KEY_ID,
455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_CA_CERT,
456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_CA_CERT_ID,
457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_CA_CERT_NSS,
458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_USE_SYSTEM_CAS,
459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_PIN,
460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_PASSWORD,
461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_EAP_KEY_MGMT,
462dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_ENABLED_TECHNOLOGIES,
463dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_ERROR,
464dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_ESN,
465dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_FAVORITE,
466dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_FIRMWARE_REVISION,
467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_FOUND_NETWORKS,
468dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_HARDWARE_REVISION,
469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_HOME_PROVIDER,
470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_HOST,
471dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_IDENTITY,
472dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_IMEI,
473dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_IMSI,
474dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_IS_ACTIVE,
475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_L2TPIPSEC_CA_CERT,
476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_L2TPIPSEC_CERT,
477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_L2TPIPSEC_KEY,
478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_L2TPIPSEC_PASSWORD,
479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_L2TPIPSEC_PSK,
480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_L2TPIPSEC_USER,
481dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_MANUFACTURER,
482dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_MDN,
483dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_MEID,
484dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_MIN,
485dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_MODE,
486dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_MODEL_ID,
487dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_NAME,
488dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_NETWORK_TECHNOLOGY,
489dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_OFFLINE_MODE,
490dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_OPERATOR_CODE,
491dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_OPERATOR_NAME,
492dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_PASSPHRASE,
493dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_PASSPHRASE_REQUIRED,
494dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_PAYMENT_URL,
495ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_POWERED,
496dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_PRL_VERSION,
497dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_PROFILES,
498ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_PROVIDER,
499dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_ROAMING_STATE,
500ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_SAVE_CREDENTIALS,
501dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_SCANNING,
502dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_SECURITY,
503ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_SELECTED_NETWORK,
504dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_SERVICES,
505dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_SERVICE_WATCH_LIST,
506ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_SERVING_OPERATOR,
507dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_SIGNAL_STRENGTH,
508ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_SIM_LOCK,
509dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_STATE,
510ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_SUPPORT_NETWORK_SCAN,
511dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_TYPE,
512dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_UNKNOWN,
513dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PROPERTY_INDEX_USAGE_URL,
514ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_WIFI_FREQUENCY,
515ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_WIFI_HEX_SSID,
516ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_WIFI_HIDDEN_SSID,
517ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PROPERTY_INDEX_WIFI_PHY_MODE,
518dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
519dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
520dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenStringToEnum<PropertyIndex>::Pair property_index_table[] = {
521dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kActivationStateProperty, PROPERTY_INDEX_ACTIVATION_STATE },
522dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kActiveProfileProperty, PROPERTY_INDEX_ACTIVE_PROFILE },
523dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kAutoConnectProperty, PROPERTY_INDEX_AUTO_CONNECT },
524dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kAvailableTechnologiesProperty, PROPERTY_INDEX_AVAILABLE_TECHNOLOGIES },
525ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kCellularAllowRoamingProperty, PROPERTY_INDEX_CELLULAR_ALLOW_ROAMING },
526ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kCellularApnProperty, PROPERTY_INDEX_CELLULAR_APN },
527ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kCellularLastGoodApnProperty, PROPERTY_INDEX_CELLULAR_LAST_GOOD_APN },
528dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kCarrierProperty, PROPERTY_INDEX_CARRIER },
529dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kCertPathProperty, PROPERTY_INDEX_CERT_PATH },
530dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kConnectableProperty, PROPERTY_INDEX_CONNECTABLE },
531dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kConnectedTechnologiesProperty, PROPERTY_INDEX_CONNECTED_TECHNOLOGIES },
532dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kConnectivityStateProperty, PROPERTY_INDEX_CONNECTIVITY_STATE },
533dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kDefaultTechnologyProperty, PROPERTY_INDEX_DEFAULT_TECHNOLOGY },
534dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kDeviceProperty, PROPERTY_INDEX_DEVICE },
535dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kDevicesProperty, PROPERTY_INDEX_DEVICES },
536ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapIdentityProperty, PROPERTY_INDEX_EAP_IDENTITY },
537ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapMethodProperty, PROPERTY_INDEX_EAP_METHOD },
538ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapPhase2AuthProperty, PROPERTY_INDEX_EAP_PHASE_2_AUTH },
539ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapAnonymousIdentityProperty, PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY },
540ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapClientCertProperty, PROPERTY_INDEX_EAP_CLIENT_CERT },
541ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapCertIDProperty, PROPERTY_INDEX_EAP_CERT_ID },
542ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapClientCertNssProperty, PROPERTY_INDEX_EAP_CLIENT_CERT_NSS },
543ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapPrivateKeyProperty, PROPERTY_INDEX_EAP_PRIVATE_KEY },
544ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapPrivateKeyPasswordProperty, PROPERTY_INDEX_EAP_PRIVATE_KEY_PASSWORD },
545ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapKeyIDProperty, PROPERTY_INDEX_EAP_KEY_ID },
546ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapCaCertProperty, PROPERTY_INDEX_EAP_CA_CERT },
547ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapCaCertIDProperty, PROPERTY_INDEX_EAP_CA_CERT_ID },
548ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapCaCertNssProperty, PROPERTY_INDEX_EAP_CA_CERT_NSS },
549ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapUseSystemCAsProperty, PROPERTY_INDEX_EAP_USE_SYSTEM_CAS },
550ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapPinProperty, PROPERTY_INDEX_EAP_PIN },
551ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapPasswordProperty, PROPERTY_INDEX_EAP_PASSWORD },
552ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kEapKeyMgmtProperty, PROPERTY_INDEX_EAP_KEY_MGMT },
553dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kEnabledTechnologiesProperty, PROPERTY_INDEX_ENABLED_TECHNOLOGIES },
554dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kErrorProperty, PROPERTY_INDEX_ERROR },
555dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kEsnProperty, PROPERTY_INDEX_ESN },
556dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kFavoriteProperty, PROPERTY_INDEX_FAVORITE },
557dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kFirmwareRevisionProperty, PROPERTY_INDEX_FIRMWARE_REVISION },
558ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kFoundNetworksProperty, PROPERTY_INDEX_FOUND_NETWORKS },
559dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kHardwareRevisionProperty, PROPERTY_INDEX_HARDWARE_REVISION },
560ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kHomeProviderProperty, PROPERTY_INDEX_HOME_PROVIDER },
561ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kHostProperty, PROPERTY_INDEX_HOST },
562dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kIdentityProperty, PROPERTY_INDEX_IDENTITY },
563dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kImeiProperty, PROPERTY_INDEX_IMEI },
564dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kImsiProperty, PROPERTY_INDEX_IMSI },
565dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kIsActiveProperty, PROPERTY_INDEX_IS_ACTIVE },
566ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kL2TPIPSecCACertProperty, PROPERTY_INDEX_L2TPIPSEC_CA_CERT },
567ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kL2TPIPSecCertProperty, PROPERTY_INDEX_L2TPIPSEC_CERT },
568ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kL2TPIPSecKeyProperty, PROPERTY_INDEX_L2TPIPSEC_KEY },
569ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kL2TPIPSecPasswordProperty, PROPERTY_INDEX_L2TPIPSEC_PASSWORD },
570ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kL2TPIPSecPSKProperty, PROPERTY_INDEX_L2TPIPSEC_PSK },
571ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kL2TPIPSecUserProperty, PROPERTY_INDEX_L2TPIPSEC_USER },
572dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kManufacturerProperty, PROPERTY_INDEX_MANUFACTURER },
573dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kMdnProperty, PROPERTY_INDEX_MDN },
574dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kMeidProperty, PROPERTY_INDEX_MEID },
575dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kMinProperty, PROPERTY_INDEX_MIN },
576dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kModeProperty, PROPERTY_INDEX_MODE },
577dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kModelIDProperty, PROPERTY_INDEX_MODEL_ID },
578dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kNameProperty, PROPERTY_INDEX_NAME },
579dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kNetworkTechnologyProperty, PROPERTY_INDEX_NETWORK_TECHNOLOGY },
580dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kOfflineModeProperty, PROPERTY_INDEX_OFFLINE_MODE },
581dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kOperatorCodeProperty, PROPERTY_INDEX_OPERATOR_CODE },
582dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kOperatorNameProperty, PROPERTY_INDEX_OPERATOR_NAME },
583dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kPRLVersionProperty, PROPERTY_INDEX_PRL_VERSION },
584dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kPassphraseProperty, PROPERTY_INDEX_PASSPHRASE },
585dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kPassphraseRequiredProperty, PROPERTY_INDEX_PASSPHRASE_REQUIRED },
586dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kPaymentURLProperty, PROPERTY_INDEX_PAYMENT_URL },
587ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kPoweredProperty, PROPERTY_INDEX_POWERED },
588dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kProfilesProperty, PROPERTY_INDEX_PROFILES },
589ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kProviderProperty, PROPERTY_INDEX_PROVIDER },
590dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kRoamingStateProperty, PROPERTY_INDEX_ROAMING_STATE },
591ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kSaveCredentialsProperty, PROPERTY_INDEX_SAVE_CREDENTIALS },
592dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kScanningProperty, PROPERTY_INDEX_SCANNING },
593dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kSecurityProperty, PROPERTY_INDEX_SECURITY },
594ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kSelectedNetworkProperty, PROPERTY_INDEX_SELECTED_NETWORK },
595dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kServiceWatchListProperty, PROPERTY_INDEX_SERVICE_WATCH_LIST },
596dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kServicesProperty, PROPERTY_INDEX_SERVICES },
597ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kServingOperatorProperty, PROPERTY_INDEX_SERVING_OPERATOR },
598dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kSignalStrengthProperty, PROPERTY_INDEX_SIGNAL_STRENGTH },
599ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kSIMLockStatusProperty, PROPERTY_INDEX_SIM_LOCK },
600dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kStateProperty, PROPERTY_INDEX_STATE },
601ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kSupportNetworkScanProperty, PROPERTY_INDEX_SUPPORT_NETWORK_SCAN },
602dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kTypeProperty, PROPERTY_INDEX_TYPE },
603dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  { kUsageURLProperty, PROPERTY_INDEX_USAGE_URL },
604ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kWifiFrequency, PROPERTY_INDEX_WIFI_FREQUENCY },
605ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kWifiHexSsid, PROPERTY_INDEX_WIFI_HEX_SSID },
606ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kWifiHiddenSsid, PROPERTY_INDEX_WIFI_HIDDEN_SSID },
607ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  { kWifiPhyMode, PROPERTY_INDEX_WIFI_PHY_MODE },
608dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
609dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
610dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenStringToEnum<PropertyIndex>& property_index_parser() {
611dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<PropertyIndex> parser(property_index_table,
612dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                            arraysize(property_index_table),
613dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                            PROPERTY_INDEX_UNKNOWN);
614dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return parser;
615dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
616dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
617dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen////////////////////////////////////////////////////////////////////////////
618dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Parse strings from libcros.
619dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
620dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Network.
621dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstatic ConnectionType ParseType(const std::string& type) {
622dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<ConnectionType>::Pair table[] = {
623dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kTypeEthernet, TYPE_ETHERNET },
624dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kTypeWifi, TYPE_WIFI },
625dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kTypeWimax, TYPE_WIMAX },
626dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kTypeBluetooth, TYPE_BLUETOOTH },
627dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kTypeCellular, TYPE_CELLULAR },
628dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kTypeVPN, TYPE_VPN },
629dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
630dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<ConnectionType> parser(
631dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      table, arraysize(table), TYPE_UNKNOWN);
632dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return parser.Get(type);
633dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
634dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
635dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenConnectionType ParseTypeFromDictionary(const DictionaryValue* info) {
636dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string type_string;
637dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  info->GetString(kTypeProperty, &type_string);
638dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return ParseType(type_string);
639dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
640dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
641dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstatic ConnectionMode ParseMode(const std::string& mode) {
642dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<ConnectionMode>::Pair table[] = {
643dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kModeManaged, MODE_MANAGED },
644dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kModeAdhoc, MODE_ADHOC },
645dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
646dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<ConnectionMode> parser(
647dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      table, arraysize(table), MODE_UNKNOWN);
648dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return parser.Get(mode);
649dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
650dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
651513209b27ff55e2841eac0e4120199c23acce758Ben Murdochstatic ConnectionState ParseState(const std::string& state) {
652dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<ConnectionState>::Pair table[] = {
653dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kStateIdle, STATE_IDLE },
654dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kStateCarrier, STATE_CARRIER },
655dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kStateAssociation, STATE_ASSOCIATION },
656dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kStateConfiguration, STATE_CONFIGURATION },
657dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kStateReady, STATE_READY },
658dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kStateDisconnect, STATE_DISCONNECT },
659dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kStateFailure, STATE_FAILURE },
660dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kStateActivationFailure, STATE_ACTIVATION_FAILURE },
661dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
662dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<ConnectionState> parser(
663dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      table, arraysize(table), STATE_UNKNOWN);
664dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return parser.Get(state);
665dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
666dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
667dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstatic ConnectionError ParseError(const std::string& error) {
668dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<ConnectionError>::Pair table[] = {
669dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kErrorOutOfRange, ERROR_OUT_OF_RANGE },
670dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kErrorPinMissing, ERROR_PIN_MISSING },
671dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kErrorDhcpFailed, ERROR_DHCP_FAILED },
672dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kErrorConnectFailed, ERROR_CONNECT_FAILED },
673dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kErrorBadPassphrase, ERROR_BAD_PASSPHRASE },
674dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kErrorBadWEPKey, ERROR_BAD_WEPKEY },
675dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kErrorActivationFailed, ERROR_ACTIVATION_FAILED },
676dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kErrorNeedEvdo, ERROR_NEED_EVDO },
677dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kErrorNeedHomeNetwork, ERROR_NEED_HOME_NETWORK },
678dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kErrorOtaspFailed, ERROR_OTASP_FAILED },
679dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kErrorAaaFailed, ERROR_AAA_FAILED },
680dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
681dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<ConnectionError> parser(
682dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      table, arraysize(table), ERROR_UNKNOWN);
683dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return parser.Get(error);
684513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
685513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
686ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// VirtualNetwork
687ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic VirtualNetwork::ProviderType ParseProviderType(const std::string& mode) {
688ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static StringToEnum<VirtualNetwork::ProviderType>::Pair table[] = {
689ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kProviderL2tpIpsec, VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_PSK },
690ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kProviderOpenVpn, VirtualNetwork::PROVIDER_TYPE_OPEN_VPN },
691ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
692ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static StringToEnum<VirtualNetwork::ProviderType> parser(
693ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      table, arraysize(table), VirtualNetwork::PROVIDER_TYPE_MAX);
694ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return parser.Get(mode);
695ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
696ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
697dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// CellularNetwork.
698dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstatic ActivationState ParseActivationState(const std::string& state) {
699dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<ActivationState>::Pair table[] = {
700dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kActivationStateActivated, ACTIVATION_STATE_ACTIVATED },
701dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kActivationStateActivating, ACTIVATION_STATE_ACTIVATING },
702dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kActivationStateNotActivated, ACTIVATION_STATE_NOT_ACTIVATED },
703dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kActivationStatePartiallyActivated, ACTIVATION_STATE_PARTIALLY_ACTIVATED},
704dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kActivationStateUnknown, ACTIVATION_STATE_UNKNOWN},
705dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
706dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<ActivationState> parser(
707dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      table, arraysize(table), ACTIVATION_STATE_UNKNOWN);
708dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return parser.Get(state);
709513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
710513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
711201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochstatic ConnectivityState ParseConnectivityState(const std::string& state) {
712dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<ConnectivityState>::Pair table[] = {
713dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kConnStateUnrestricted, CONN_STATE_UNRESTRICTED },
714dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kConnStateRestricted, CONN_STATE_RESTRICTED },
715dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kConnStateNone, CONN_STATE_NONE },
716dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
717dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<ConnectivityState> parser(
718dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      table, arraysize(table), CONN_STATE_UNKNOWN);
719dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return parser.Get(state);
720201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
721201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
722dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstatic NetworkTechnology ParseNetworkTechnology(const std::string& technology) {
723dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<NetworkTechnology>::Pair table[] = {
724dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kNetworkTechnology1Xrtt, NETWORK_TECHNOLOGY_1XRTT },
725dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kNetworkTechnologyEvdo, NETWORK_TECHNOLOGY_EVDO },
726dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kNetworkTechnologyGprs, NETWORK_TECHNOLOGY_GPRS },
727dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kNetworkTechnologyEdge, NETWORK_TECHNOLOGY_EDGE },
728dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kNetworkTechnologyUmts, NETWORK_TECHNOLOGY_UMTS },
729dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kNetworkTechnologyHspa, NETWORK_TECHNOLOGY_HSPA },
730dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kNetworkTechnologyHspaPlus, NETWORK_TECHNOLOGY_HSPA_PLUS },
731dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kNetworkTechnologyLte, NETWORK_TECHNOLOGY_LTE },
732dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kNetworkTechnologyLteAdvanced, NETWORK_TECHNOLOGY_LTE_ADVANCED },
733dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
734dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<NetworkTechnology> parser(
735dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      table, arraysize(table), NETWORK_TECHNOLOGY_UNKNOWN);
736dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return parser.Get(technology);
737513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
738201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
739ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic SIMLockState ParseSimLockState(const std::string& state) {
740ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static StringToEnum<SIMLockState>::Pair table[] = {
741ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { "", SIM_UNLOCKED },
742ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kSIMLockPin, SIM_LOCKED_PIN },
743ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kSIMLockPuk, SIM_LOCKED_PUK },
744ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
745ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static StringToEnum<SIMLockState> parser(
746ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      table, arraysize(table), SIM_UNKNOWN);
747ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SIMLockState parsed_state = parser.Get(state);
748ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(parsed_state != SIM_UNKNOWN) << "Unknown SIMLock state encountered";
749ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return parsed_state;
750ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
751ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
752ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic bool ParseSimLockStateFromDictionary(const DictionaryValue* info,
753ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            SIMLockState* out_state,
754ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            int* out_retries) {
755ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string state_string;
756ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!info->GetString(kSIMLockTypeProperty, &state_string) ||
757ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !info->GetInteger(kSIMLockRetriesLeftProperty, out_retries)) {
758ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    LOG(ERROR) << "Error parsing SIMLock state";
759ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
760ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
761ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  *out_state = ParseSimLockState(state_string);
762ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
763ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
764ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
765ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic bool ParseFoundNetworksFromList(const ListValue* list,
766ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       CellularNetworkList* found_networks_) {
767ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  found_networks_->clear();
768ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  found_networks_->reserve(list->GetSize());
769ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (ListValue::const_iterator it = list->begin(); it != list->end(); ++it) {
770ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if ((*it)->IsType(Value::TYPE_DICTIONARY)) {
771ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      found_networks_->resize(found_networks_->size() + 1);
772ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DictionaryValue* dict = static_cast<const DictionaryValue*>(*it);
773ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      dict->GetStringWithoutPathExpansion(
774ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          kStatusProperty, &found_networks_->back().status);
775ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      dict->GetStringWithoutPathExpansion(
776ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          kNetworkIdProperty, &found_networks_->back().network_id);
777ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      dict->GetStringWithoutPathExpansion(
778ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          kShortNameProperty, &found_networks_->back().short_name);
779ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      dict->GetStringWithoutPathExpansion(
780ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          kLongNameProperty, &found_networks_->back().long_name);
781ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      dict->GetStringWithoutPathExpansion(
782ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          kTechnologyProperty, &found_networks_->back().technology);
783ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
784ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return false;
785ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
786ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
787ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
788ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
789ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
790dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstatic NetworkRoamingState ParseRoamingState(const std::string& roaming_state) {
791dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<NetworkRoamingState>::Pair table[] = {
792dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kRoamingStateHome, ROAMING_STATE_HOME },
793dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kRoamingStateRoaming, ROAMING_STATE_ROAMING },
794dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kRoamingStateUnknown, ROAMING_STATE_UNKNOWN },
795dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
796dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<NetworkRoamingState> parser(
797dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      table, arraysize(table), ROAMING_STATE_UNKNOWN);
798dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return parser.Get(roaming_state);
799513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
800201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
801dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// WifiNetwork
802dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstatic ConnectionSecurity ParseSecurity(const std::string& security) {
803dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<ConnectionSecurity>::Pair table[] = {
804dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    { kSecurityNone, SECURITY_NONE },
805ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kSecurityWep, SECURITY_WEP },
806ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kSecurityWpa, SECURITY_WPA },
807ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kSecurityRsn, SECURITY_RSN },
808ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kSecurityPsk, SECURITY_PSK },
809ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kSecurity8021x, SECURITY_8021X },
810dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
811dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static StringToEnum<ConnectionSecurity> parser(
812dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      table, arraysize(table), SECURITY_UNKNOWN);
813dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return parser.Get(security);
814dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
815dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
816ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic EAPMethod ParseEAPMethod(const std::string& method) {
817ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static StringToEnum<EAPMethod>::Pair table[] = {
818ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kEapMethodPEAP.c_str(), EAP_METHOD_PEAP },
819ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kEapMethodTLS.c_str(), EAP_METHOD_TLS },
820ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kEapMethodTTLS.c_str(), EAP_METHOD_TTLS },
821ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kEapMethodLEAP.c_str(), EAP_METHOD_LEAP },
822ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
823ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static StringToEnum<EAPMethod> parser(
824ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      table, arraysize(table), EAP_METHOD_UNKNOWN);
825ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return parser.Get(method);
826ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
827ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
828ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic EAPPhase2Auth ParseEAPPhase2Auth(const std::string& auth) {
829ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static StringToEnum<EAPPhase2Auth>::Pair table[] = {
830ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kEapPhase2AuthPEAPMD5.c_str(), EAP_PHASE_2_AUTH_MD5 },
831ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kEapPhase2AuthPEAPMSCHAPV2.c_str(), EAP_PHASE_2_AUTH_MSCHAPV2 },
832ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kEapPhase2AuthTTLSMD5.c_str(), EAP_PHASE_2_AUTH_MD5 },
833ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kEapPhase2AuthTTLSMSCHAPV2.c_str(), EAP_PHASE_2_AUTH_MSCHAPV2 },
834ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kEapPhase2AuthTTLSMSCHAP.c_str(), EAP_PHASE_2_AUTH_MSCHAP },
835ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kEapPhase2AuthTTLSPAP.c_str(), EAP_PHASE_2_AUTH_PAP },
836ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    { kEapPhase2AuthTTLSCHAP.c_str(), EAP_PHASE_2_AUTH_CHAP },
837ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
838ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static StringToEnum<EAPPhase2Auth> parser(
839ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      table, arraysize(table), EAP_PHASE_2_AUTH_AUTO);
840ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return parser.Get(auth);
841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
843dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen////////////////////////////////////////////////////////////////////////////////
844dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Misc.
845dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
846731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Safe string constructor since we can't rely on non NULL pointers
847731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// for string values from libcros.
848731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic std::string SafeString(const char* s) {
849731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return s ? std::string(s) : std::string();
850731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
851731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
852ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Erase the memory used by a string, then clear it.
853ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic void WipeString(std::string* str) {
854ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  str->assign(str->size(), '\0');
855ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  str->clear();
856ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
857ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
858731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic bool EnsureCrosLoaded() {
859731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!CrosLibrary::Get()->EnsureLoaded()) {
860731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return false;
861731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  } else {
862731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
863731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      LOG(ERROR) << "chromeos_library calls made from non UI thread!";
864731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NOTREACHED();
865731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
866731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return true;
867731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
868731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
869731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
870ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic void ValidateUTF8(const std::string& str, std::string* output) {
871ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  output->clear();
872ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
873ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (int32 index = 0; index < static_cast<int32>(str.size()); ++index) {
874ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    uint32 code_point_out;
875ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    bool is_unicode_char = base::ReadUnicodeCharacter(str.c_str(), str.size(),
876ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                      &index, &code_point_out);
877ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (is_unicode_char && (code_point_out >= 0x20))
878ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      base::WriteUnicodeCharacter(code_point_out, output);
879ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    else
880ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Puts REPLACEMENT CHARACTER (U+FFFD) if character is not readable UTF-8
881ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      base::WriteUnicodeCharacter(0xFFFD, output);
882ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
883ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
884ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
885dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}  // namespace
886dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
887dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen////////////////////////////////////////////////////////////////////////////////
888dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// NetworkDevice
889dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
890dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenNetworkDevice::NetworkDevice(const std::string& device_path)
891dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    : device_path_(device_path),
892dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      type_(TYPE_UNKNOWN),
893dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      scanning_(false),
894ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      sim_lock_state_(SIM_UNKNOWN),
895ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      sim_retries_left_(kDefaultSimUnlockRetriesCount),
896ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      sim_pin_required_(SIM_PIN_REQUIRE_UNKNOWN),
897ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      PRL_version_(0),
898ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      data_roaming_allowed_(false),
899ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      support_network_scan_(false) {
900dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
901dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
902dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool NetworkDevice::ParseValue(int index, const Value* value) {
903dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  switch (index) {
904dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_TYPE: {
905dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string type_string;
906dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (value->GetAsString(&type_string)) {
907dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        type_ = ParseType(type_string);
908dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return true;
909dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
910dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
911dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
912dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_NAME:
913dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&name_);
914dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_CARRIER:
915dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&carrier_);
916ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_SCANNING:
917ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsBoolean(&scanning_);
918ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_CELLULAR_ALLOW_ROAMING:
919ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsBoolean(&data_roaming_allowed_);
920ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_FOUND_NETWORKS:
921ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->IsType(Value::TYPE_LIST)) {
922ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return ParseFoundNetworksFromList(
923ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            static_cast<const ListValue*>(value),
924ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            &found_cellular_networks_);
925ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
926ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
927ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_HOME_PROVIDER: {
928ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->IsType(Value::TYPE_DICTIONARY)) {
929ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        const DictionaryValue *dict =
930ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            static_cast<const DictionaryValue*>(value);
931ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        home_provider_code_.clear();
932ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        home_provider_country_.clear();
933ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        home_provider_name_.clear();
934ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        dict->GetStringWithoutPathExpansion(kOperatorCodeKey,
935ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            &home_provider_code_);
936ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        dict->GetStringWithoutPathExpansion(kOperatorCountryKey,
937ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            &home_provider_country_);
938ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        dict->GetStringWithoutPathExpansion(kOperatorNameKey,
939ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            &home_provider_name_);
940ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        if (!home_provider_name_.empty() && !home_provider_country_.empty()) {
941ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          home_provider_id_ = base::StringPrintf(
942ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              kCarrierIdFormat,
943ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              home_provider_name_.c_str(),
944ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              home_provider_country_.c_str());
945ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        } else {
946ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          home_provider_id_ = home_provider_code_;
947ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          LOG(WARNING) << "Carrier ID not defined, using code instead: "
948ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       << home_provider_id_;
949ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        }
950ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
951ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
952ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
953ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
954dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_MEID:
955dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&MEID_);
956dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_IMEI:
957dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&IMEI_);
958dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_IMSI:
959dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&IMSI_);
960dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_ESN:
961dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&ESN_);
962dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_MDN:
963dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&MDN_);
964dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_MIN:
965dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&MIN_);
966dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_MODEL_ID:
967dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&model_id_);
968dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_MANUFACTURER:
969dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&manufacturer_);
970ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_SIM_LOCK:
971ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->IsType(Value::TYPE_DICTIONARY)) {
972ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        bool result = ParseSimLockStateFromDictionary(
973ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            static_cast<const DictionaryValue*>(value),
974ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            &sim_lock_state_,
975ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            &sim_retries_left_);
976ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // Initialize PinRequired value only once.
977ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // See SIMPinRequire enum comments.
978ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        if (sim_pin_required_ == SIM_PIN_REQUIRE_UNKNOWN) {
979ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          if (sim_lock_state_ == SIM_UNLOCKED) {
980ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            sim_pin_required_ = SIM_PIN_NOT_REQUIRED;
981ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          } else if (sim_lock_state_ == SIM_LOCKED_PIN ||
982ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     sim_lock_state_ == SIM_LOCKED_PUK) {
983ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            sim_pin_required_ = SIM_PIN_REQUIRED;
984ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          }
985ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        }
986ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return result;
987ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
988ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
989dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_FIRMWARE_REVISION:
990dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&firmware_revision_);
991dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_HARDWARE_REVISION:
992dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&hardware_revision_);
993ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_POWERED:
994ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // we don't care about the value, just the fact that it changed
995ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return true;
996dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_PRL_VERSION:
997dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsInteger(&PRL_version_);
998ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_SELECTED_NETWORK:
999ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&selected_cellular_network_);
1000ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_SUPPORT_NETWORK_SCAN:
1001ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsBoolean(&support_network_scan_);
1002dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    default:
1003dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1004dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
1005dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return false;
1006dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1007dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1008dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid NetworkDevice::ParseInfo(const DictionaryValue* info) {
1009dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (DictionaryValue::key_iterator iter = info->begin_keys();
1010dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen       iter != info->end_keys(); ++iter) {
1011dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const std::string& key = *iter;
1012dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Value* value;
1013dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    bool res = info->GetWithoutPathExpansion(key, &value);
1014ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(res);
1015ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (res) {
1016ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      int index = property_index_parser().Get(key);
1017ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!ParseValue(index, value))
1018ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        VLOG(1) << "NetworkDevice: Unhandled key: " << key;
1019ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1020dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
1021dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1022dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1023c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
1024c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Network
1025c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1026ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid Network::SetName(const std::string& name) {
1027ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string name_utf8;
1028ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ValidateUTF8(name, &name_utf8);
1029ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  set_name(name_utf8);
1030ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1031ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1032dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool Network::ParseValue(int index, const Value* value) {
1033dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  switch (index) {
1034dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_TYPE: {
1035dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string type_string;
1036dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (value->GetAsString(&type_string)) {
1037dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        ConnectionType type = ParseType(type_string);
1038dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        LOG_IF(ERROR, type != type_)
1039dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            << "Network with mismatched type: " << service_path_
1040dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            << " " << type << " != " << type_;
1041dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return true;
1042dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
1043dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1044dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
1045dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_DEVICE:
1046dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&device_path_);
1047ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_NAME: {
1048ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::string name;
1049ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->GetAsString(&name)) {
1050ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        SetName(name);
1051ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1052ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1053ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1054ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1055dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_STATE: {
1056dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string state_string;
1057dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (value->GetAsString(&state_string)) {
1058dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        ConnectionState prev_state = state_;
1059dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        state_ = ParseState(state_string);
1060dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        if (state_ != prev_state) {
1061dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          // State changed, so refresh IP address.
1062dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          // Note: blocking DBus call. TODO(stevenjb): refactor this.
1063dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          InitIPAddress();
1064dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        }
1065dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return true;
1066dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
1067dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1068dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
1069dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_MODE: {
1070dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string mode_string;
1071dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (value->GetAsString(&mode_string)) {
1072dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        mode_ = ParseMode(mode_string);
1073dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return true;
1074dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
1075dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1076dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
1077dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_ERROR: {
1078dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string error_string;
1079dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (value->GetAsString(&error_string)) {
1080dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        error_ = ParseError(error_string);
1081dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return true;
1082dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
1083dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1084dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
1085dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_CONNECTABLE:
1086dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsBoolean(&connectable_);
1087dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_IS_ACTIVE:
1088dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsBoolean(&is_active_);
1089dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_FAVORITE:
1090dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsBoolean(&favorite_);
1091dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_AUTO_CONNECT:
1092dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsBoolean(&auto_connect_);
1093dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_CONNECTIVITY_STATE: {
1094dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string connectivity_state_string;
1095dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (value->GetAsString(&connectivity_state_string)) {
1096dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        connectivity_state_ = ParseConnectivityState(connectivity_state_string);
1097dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return true;
1098dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
1099dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
1101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    default:
1102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
1104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return false;
1105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid Network::ParseInfo(const DictionaryValue* info) {
1108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (DictionaryValue::key_iterator iter = info->begin_keys();
1109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen       iter != info->end_keys(); ++iter) {
1110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const std::string& key = *iter;
1111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Value* value;
1112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    bool res = info->GetWithoutPathExpansion(key, &value);
1113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(res);
1114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (res) {
1115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      int index = property_index_parser().Get(key);
1116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!ParseValue(index, value))  // virtual.
1117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        VLOG(1) << "Network: " << name()
1118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                << " Type: " << ConnectionTypeToString(type())
1119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                << " Unhandled key: " << key;
1120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
1122513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
1123513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid Network::SetValueProperty(const char* prop, Value* val) {
1125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(prop);
1126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(val);
1127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!EnsureCrosLoaded())
1128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
1129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetNetworkServiceProperty(service_path_.c_str(), prop, val);
1130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid Network::ClearProperty(const char* prop) {
1133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(prop);
1134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!EnsureCrosLoaded())
1135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
1136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ClearNetworkServiceProperty(service_path_.c_str(), prop);
1137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid Network::SetStringProperty(
1140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const char* prop, const std::string& str, std::string* dest) {
1141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (dest)
1142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    *dest = str;
1143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  scoped_ptr<Value> value(Value::CreateStringValue(str));
1144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SetValueProperty(prop, value.get());
1145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid Network::SetOrClearStringProperty(const char* prop,
1148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       const std::string& str,
1149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       std::string* dest) {
1150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (str.empty()) {
1151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ClearProperty(prop);
1152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (dest)
1153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      dest->clear();
1154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
1155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SetStringProperty(prop, str, dest);
1156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid Network::SetBooleanProperty(const char* prop, bool b, bool* dest) {
1160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (dest)
1161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    *dest = b;
1162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  scoped_ptr<Value> value(Value::CreateBooleanValue(b));
1163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SetValueProperty(prop, value.get());
1164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid Network::SetIntegerProperty(const char* prop, int i, int* dest) {
1167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (dest)
1168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    *dest = i;
1169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  scoped_ptr<Value> value(Value::CreateIntegerValue(i));
1170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SetValueProperty(prop, value.get());
1171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid Network::SetAutoConnect(bool auto_connect) {
1174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetBooleanProperty(kAutoConnectProperty, auto_connect, &auto_connect_);
1175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstd::string Network::GetStateString() const {
1178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (state_) {
1179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case STATE_UNKNOWN:
1180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_UNKNOWN);
1181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case STATE_IDLE:
1182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_IDLE);
1183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case STATE_CARRIER:
1184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_CARRIER);
1185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case STATE_ASSOCIATION:
1186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_ASSOCIATION);
1187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case STATE_CONFIGURATION:
1188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_CONFIGURATION);
1189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case STATE_READY:
1190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_READY);
1191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case STATE_DISCONNECT:
1192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_DISCONNECT);
1193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case STATE_FAILURE:
1194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_FAILURE);
1195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case STATE_ACTIVATION_FAILURE:
1196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_STATE_ACTIVATION_FAILURE);
1198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_UNRECOGNIZED);
1200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstd::string Network::GetErrorString() const {
1203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (error_) {
1204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ERROR_UNKNOWN:
1205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_UNKNOWN);
1206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ERROR_OUT_OF_RANGE:
1207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_OUT_OF_RANGE);
1208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ERROR_PIN_MISSING:
1209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_PIN_MISSING);
1210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ERROR_DHCP_FAILED:
1211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_DHCP_FAILED);
1212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ERROR_CONNECT_FAILED:
1213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ERROR_CONNECT_FAILED);
12153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case ERROR_BAD_PASSPHRASE:
1216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ERROR_BAD_PASSPHRASE);
12183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case ERROR_BAD_WEPKEY:
1219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_BAD_WEPKEY);
1220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ERROR_ACTIVATION_FAILED:
1221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ERROR_ACTIVATION_FAILED);
1223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ERROR_NEED_EVDO:
1224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_NEED_EVDO);
1225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ERROR_NEED_HOME_NETWORK:
1226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ERROR_NEED_HOME_NETWORK);
1228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ERROR_OTASP_FAILED:
1229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_OTASP_FAILED);
1230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ERROR_AAA_FAILED:
1231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_AAA_FAILED);
1232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1233731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_UNRECOGNIZED);
1234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid Network::InitIPAddress() {
12374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ip_address_.clear();
12384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // If connected, get ip config.
1239201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (EnsureCrosLoaded() && connected() && !device_path_.empty()) {
12404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    IPConfigStatus* ipconfig_status = ListIPConfigs(device_path_.c_str());
12414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    if (ipconfig_status) {
12424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      for (int i = 0; i < ipconfig_status->size; i++) {
12434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        IPConfig ipconfig = ipconfig_status->ips[i];
12444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        if (strlen(ipconfig.address) > 0) {
12454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          ip_address_ = ipconfig.address;
12464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          break;
12474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        }
12484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      }
12494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      FreeIPConfigStatus(ipconfig_status);
12504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
12514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
12524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
12534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
1255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// VirtualNetwork
1256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool VirtualNetwork::ParseProviderValue(int index, const Value* value) {
1258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (index) {
1259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_HOST:
1260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&server_hostname_);
1261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_NAME:
1262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Note: shadows Network::name_ property.
1263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&name_);
1264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_TYPE: {
1265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::string provider_type_string;
1266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->GetAsString(&provider_type_string)) {
1267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        provider_type_ = ParseProviderType(provider_type_string);
1268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    default:
1273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return false;
1276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool VirtualNetwork::ParseValue(int index, const Value* value) {
1279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (index) {
1280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_PROVIDER: {
1281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DCHECK_EQ(value->GetType(), Value::TYPE_DICTIONARY);
1282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const DictionaryValue* dict = static_cast<const DictionaryValue*>(value);
1283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      for (DictionaryValue::key_iterator iter = dict->begin_keys();
1284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen           iter != dict->end_keys(); ++iter) {
1285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        const std::string& key = *iter;
1286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        Value* v;
1287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        bool res = dict->GetWithoutPathExpansion(key, &v);
1288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        DCHECK(res);
1289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        if (res) {
1290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          int index = property_index_parser().Get(key);
1291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          if (!ParseProviderValue(index, v))
1292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            VLOG(1) << name() << ": Provider unhandled key: " << key
1293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    << " Type: " << v->GetType();
1294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        }
1295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return true;
1297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_L2TPIPSEC_CA_CERT:
1299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&ca_cert_);
1300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_L2TPIPSEC_PSK:
1301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&psk_passphrase_);
1302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_L2TPIPSEC_CERT:
1303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&user_cert_);
1304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_L2TPIPSEC_KEY:
1305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&user_cert_key_);
1306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_L2TPIPSEC_USER:
1307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&username_);
1308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_L2TPIPSEC_PASSWORD:
1309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&user_passphrase_);
1310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    default:
1311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return Network::ParseValue(index, value);
1312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return false;
1315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VirtualNetwork::ParseInfo(const DictionaryValue* info) {
1318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Network::ParseInfo(info);
1319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  VLOG(1) << "VPN: " << name()
1320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          << " Type: " << ProviderTypeToString(provider_type());
1321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (provider_type_ == PROVIDER_TYPE_L2TP_IPSEC_PSK) {
1322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!user_cert_.empty())
1323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      provider_type_ = PROVIDER_TYPE_L2TP_IPSEC_USER_CERT;
1324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool VirtualNetwork::NeedMoreInfoToConnect() const {
1328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (server_hostname_.empty() || username_.empty() || user_passphrase_.empty())
1329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return true;
1330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (provider_type_) {
1331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROVIDER_TYPE_L2TP_IPSEC_PSK:
1332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (psk_passphrase_.empty())
1333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROVIDER_TYPE_L2TP_IPSEC_USER_CERT:
1336ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROVIDER_TYPE_OPEN_VPN:
1337ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (user_cert_.empty())
1338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROVIDER_TYPE_MAX:
1341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return false;
1344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VirtualNetwork::SetCACert(const std::string& ca_cert) {
1347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetStringProperty(kL2TPIPSecCACertProperty, ca_cert, &ca_cert_);
1348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VirtualNetwork::SetPSKPassphrase(const std::string& psk_passphrase) {
1351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetStringProperty(kL2TPIPSecPSKProperty, psk_passphrase,
1352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           &psk_passphrase_);
1353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VirtualNetwork::SetUserCert(const std::string& user_cert) {
1356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetStringProperty(kL2TPIPSecCertProperty, user_cert, &user_cert_);
1357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1359ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VirtualNetwork::SetUserCertKey(const std::string& key) {
1360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetStringProperty(kL2TPIPSecKeyProperty, key, &user_cert_key_);
1361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1363ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VirtualNetwork::SetUsername(const std::string& username) {
1364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetStringProperty(kL2TPIPSecUserProperty, username, &username_);
1365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VirtualNetwork::SetUserPassphrase(const std::string& user_passphrase) {
1368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetStringProperty(kL2TPIPSecPasswordProperty, user_passphrase,
1369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    &user_passphrase_);
1370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstd::string VirtualNetwork::GetProviderTypeString() const {
1373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (this->provider_type_) {
1374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROVIDER_TYPE_L2TP_IPSEC_PSK:
1375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringUTF8(
1376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_L2TP_IPSEC_PSK);
1377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROVIDER_TYPE_L2TP_IPSEC_USER_CERT:
1379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringUTF8(
1380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_L2TP_IPSEC_USER_CERT);
1381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROVIDER_TYPE_OPEN_VPN:
1383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringUTF8(
1384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_OPEN_VPN);
1385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    default:
1387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringUTF8(
1388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          IDS_CHROMEOS_NETWORK_ERROR_UNKNOWN);
1389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen////////////////////////////////////////////////////////////////////////////////
1394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WirelessNetwork
1395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1396dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool WirelessNetwork::ParseValue(int index, const Value* value) {
1397dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  switch (index) {
1398dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_SIGNAL_STRENGTH:
1399dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsInteger(&strength_);
1400dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    default:
1401dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return Network::ParseValue(index, value);
1402dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1403dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
1404dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return false;
1405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch////////////////////////////////////////////////////////////////////////////////
14084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// CellularDataPlan
14094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
14104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochstring16 CellularDataPlan::GetPlanDesciption() const {
14114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  switch (plan_type) {
14124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case chromeos::CELLULAR_DATA_PLAN_UNLIMITED: {
14134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      return l10n_util::GetStringFUTF16(
14144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PURCHASE_UNLIMITED_DATA,
141521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          base::TimeFormatFriendlyDate(plan_start_time));
14164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      break;
14174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
14184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case chromeos::CELLULAR_DATA_PLAN_METERED_PAID: {
14194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      return l10n_util::GetStringFUTF16(
14204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PURCHASE_DATA,
14214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                FormatBytes(plan_data_bytes,
14224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                            GetByteDisplayUnits(plan_data_bytes),
14234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                            true),
142421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                base::TimeFormatFriendlyDate(plan_start_time));
14254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
14264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case chromeos::CELLULAR_DATA_PLAN_METERED_BASE: {
14274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      return l10n_util::GetStringFUTF16(
14284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_RECEIVED_FREE_DATA,
14294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                FormatBytes(plan_data_bytes,
14304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                            GetByteDisplayUnits(plan_data_bytes),
14314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                            true),
143221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                base::TimeFormatFriendlyDate(plan_start_time));
14334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    default:
14344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      break;
14354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
14364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
14374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  return string16();
14384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
14394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
14404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochstring16 CellularDataPlan::GetRemainingWarning() const {
14414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (plan_type == chromeos::CELLULAR_DATA_PLAN_UNLIMITED) {
14424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Time based plan. Show nearing expiration and data expiration.
1443201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (remaining_time().InSeconds() <= chromeos::kCellularDataVeryLowSecs) {
1444201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return GetPlanExpiration();
14454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
14464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  } else if (plan_type == chromeos::CELLULAR_DATA_PLAN_METERED_PAID ||
14474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch             plan_type == chromeos::CELLULAR_DATA_PLAN_METERED_BASE) {
14484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Metered plan. Show low data and out of data.
1449201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (remaining_data() <= chromeos::kCellularDataVeryLowBytes) {
1450dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      int64 remaining_mbytes = remaining_data() / (1024 * 1024);
14514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      return l10n_util::GetStringFUTF16(
14524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          IDS_NETWORK_DATA_REMAINING_MESSAGE,
1453dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          UTF8ToUTF16(base::Int64ToString(remaining_mbytes)));
14544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
14554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
14564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  return string16();
14574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
14584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
14594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochstring16 CellularDataPlan::GetDataRemainingDesciption() const {
1460201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int64 remaining_bytes = remaining_data();
14614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  switch (plan_type) {
14624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case chromeos::CELLULAR_DATA_PLAN_UNLIMITED: {
14634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      return l10n_util::GetStringUTF16(
14644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_UNLIMITED);
14654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
14664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case chromeos::CELLULAR_DATA_PLAN_METERED_PAID: {
1467201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return FormatBytes(remaining_bytes,
1468201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          GetByteDisplayUnits(remaining_bytes),
14694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          true);
14704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
14714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case chromeos::CELLULAR_DATA_PLAN_METERED_BASE: {
1472201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return FormatBytes(remaining_bytes,
1473201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          GetByteDisplayUnits(remaining_bytes),
14744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          true);
14754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
14764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    default:
14774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      break;
14784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
14794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  return string16();
14804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
14814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
14824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochstring16 CellularDataPlan::GetUsageInfo() const {
14834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (plan_type == chromeos::CELLULAR_DATA_PLAN_UNLIMITED) {
14844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Time based plan. Show nearing expiration and data expiration.
1485201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return GetPlanExpiration();
14864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  } else if (plan_type == chromeos::CELLULAR_DATA_PLAN_METERED_PAID ||
14874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch             plan_type == chromeos::CELLULAR_DATA_PLAN_METERED_BASE) {
14884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Metered plan. Show low data and out of data.
1489dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    int64 remaining_bytes = remaining_data();
1490dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (remaining_bytes == 0) {
1491dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return l10n_util::GetStringUTF16(
1492dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          IDS_NETWORK_DATA_NONE_AVAILABLE_MESSAGE);
1493dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (remaining_bytes < 1024 * 1024) {
1494dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return l10n_util::GetStringUTF16(
1495dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          IDS_NETWORK_DATA_LESS_THAN_ONE_MB_AVAILABLE_MESSAGE);
1496dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else {
1497dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      int64 remaining_mb = remaining_bytes / (1024 * 1024);
1498dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return l10n_util::GetStringFUTF16(
1499dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          IDS_NETWORK_DATA_MB_AVAILABLE_MESSAGE,
1500dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          UTF8ToUTF16(base::Int64ToString(remaining_mb)));
1501dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
15024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
15034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  return string16();
15044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
15054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
150672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstd::string CellularDataPlan::GetUniqueIdentifier() const {
150772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // A cellular plan is uniquely described by the union of name, type,
150872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // start time, end time, and max bytes.
150972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // So we just return a union of all these variables.
151072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return plan_name + "|" +
151172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      base::Int64ToString(plan_type) + "|" +
151272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      base::Int64ToString(plan_start_time.ToInternalValue()) + "|" +
151372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      base::Int64ToString(plan_end_time.ToInternalValue()) + "|" +
151472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      base::Int64ToString(plan_data_bytes);
151572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
151672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1517201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbase::TimeDelta CellularDataPlan::remaining_time() const {
1518201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  base::TimeDelta time = plan_end_time - base::Time::Now();
1519201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return time.InMicroseconds() < 0 ? base::TimeDelta() : time;
1520201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
1521201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
15224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochint64 CellularDataPlan::remaining_minutes() const {
1523201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return remaining_time().InMinutes();
1524201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
1525201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1526201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochint64 CellularDataPlan::remaining_data() const {
1527201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int64 data = plan_data_bytes - data_bytes_used;
1528201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return data < 0 ? 0 : data;
15294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
15304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
15314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochstring16 CellularDataPlan::GetPlanExpiration() const {
1532201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return TimeFormat::TimeRemaining(remaining_time());
15334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
1534731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
1536ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// CellularNetwork::Apn
1537ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1538ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CellularNetwork::Apn::Set(const DictionaryValue& dict) {
1539ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!dict.GetStringWithoutPathExpansion(kApnProperty, &apn))
1540ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    apn.clear();
1541ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!dict.GetStringWithoutPathExpansion(kNetworkIdProperty, &network_id))
1542ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    network_id.clear();
1543ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!dict.GetStringWithoutPathExpansion(kUsernameProperty, &username))
1544ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    username.clear();
1545ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!dict.GetStringWithoutPathExpansion(kPasswordProperty, &password))
1546ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    password.clear();
1547ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1548ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1549ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen////////////////////////////////////////////////////////////////////////////////
1550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CellularNetwork
1551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1552dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCellularNetwork::~CellularNetwork() {
1553513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
1554513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1555dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool CellularNetwork::ParseValue(int index, const Value* value) {
1556dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  switch (index) {
1557dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_ACTIVATION_STATE: {
1558dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string activation_state_string;
1559dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (value->GetAsString(&activation_state_string)) {
1560ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        ActivationState prev_state = activation_state_;
1561dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        activation_state_ = ParseActivationState(activation_state_string);
1562ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        if (activation_state_ != prev_state)
1563ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          RefreshDataPlansIfNeeded();
1564ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1565ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1566ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1567ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1568ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_CELLULAR_APN: {
1569ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->IsType(Value::TYPE_DICTIONARY)) {
1570ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        apn_.Set(*static_cast<const DictionaryValue*>(value));
1571ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1574ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1575ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_CELLULAR_LAST_GOOD_APN: {
1576ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->IsType(Value::TYPE_DICTIONARY)) {
1577ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        last_good_apn_.Set(*static_cast<const DictionaryValue*>(value));
1578dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return true;
1579dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
1580dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1581dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
1582dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_NETWORK_TECHNOLOGY: {
1583dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string network_technology_string;
1584dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (value->GetAsString(&network_technology_string)) {
1585dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        network_technology_ = ParseNetworkTechnology(network_technology_string);
1586dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return true;
1587dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
1588dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1589dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
1590dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_ROAMING_STATE: {
1591dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string roaming_state_string;
1592dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (value->GetAsString(&roaming_state_string)) {
1593dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        roaming_state_ = ParseRoamingState(roaming_state_string);
1594dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return true;
1595dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
1596dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1597dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
1598dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_OPERATOR_NAME:
1599dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&operator_name_);
1600dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_OPERATOR_CODE:
1601dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&operator_code_);
1602ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_SERVING_OPERATOR: {
1603ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->IsType(Value::TYPE_DICTIONARY)) {
1604ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        const DictionaryValue *dict =
1605ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            static_cast<const DictionaryValue*>(value);
1606ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        operator_code_.clear();
1607ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        operator_country_.clear();
1608ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        operator_name_.clear();
1609ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        dict->GetStringWithoutPathExpansion(kOperatorNameKey,
1610ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            &operator_name_);
1611ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        dict->GetStringWithoutPathExpansion(kOperatorCodeKey,
1612ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            &operator_code_);
1613ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        dict->GetStringWithoutPathExpansion(kOperatorCountryKey,
1614ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            &operator_country_);
1615ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1616ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1617ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1618ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1619dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_PAYMENT_URL:
1620dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&payment_url_);
1621dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_USAGE_URL:
1622dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&usage_url_);
1623ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_STATE: {
1624ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Save previous state before calling WirelessNetwork::ParseValue.
1625ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ConnectionState prev_state = state_;
1626ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (WirelessNetwork::ParseValue(index, value)) {
1627ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        if (state_ != prev_state)
1628ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          RefreshDataPlansIfNeeded();
1629ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1630ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1631ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1632ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1633ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_CONNECTIVITY_STATE: {
1634ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Save previous state before calling WirelessNetwork::ParseValue.
1635ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ConnectivityState prev_state = connectivity_state_;
1636ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (WirelessNetwork::ParseValue(index, value)) {
1637ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        if (connectivity_state_ != prev_state)
1638ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          RefreshDataPlansIfNeeded();
1639ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1640ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1641ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1642ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1643dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    default:
1644dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return WirelessNetwork::ParseValue(index, value);
1645dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
1646dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return false;
1647513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
1648513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
16493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool CellularNetwork::StartActivation() const {
1650731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!EnsureCrosLoaded())
1651731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return false;
1652dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return ActivateCellularModem(service_path().c_str(), NULL);
1653731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
1654731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1655ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CellularNetwork::RefreshDataPlansIfNeeded() const {
1656ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!EnsureCrosLoaded())
1657ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
1658ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (connected() && activated())
1659ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    RequestCellularDataPlanUpdate(service_path().c_str());
1660ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1661ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1662ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CellularNetwork::SetApn(const Apn& apn) {
1663ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!EnsureCrosLoaded())
1664ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
1665ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1666ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!apn.apn.empty()) {
1667ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue value;
1668ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    value.SetString(kApnProperty, apn.apn);
1669ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    value.SetString(kNetworkIdProperty, apn.network_id);
1670ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    value.SetString(kUsernameProperty, apn.username);
1671ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    value.SetString(kPasswordProperty, apn.password);
1672ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SetValueProperty(kCellularApnProperty, &value);
1673ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
1674ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ClearProperty(kCellularApnProperty);
1675ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1676ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1677ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1678ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool CellularNetwork::SupportsDataPlan() const {
1679ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(nkostylev): Are there cases when only one of this is defined?
1680ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return !usage_url().empty() || !payment_url().empty();
1681ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1682ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1683731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstd::string CellularNetwork::GetNetworkTechnologyString() const {
1684731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // No need to localize these cellular technology abbreviations.
1685731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  switch (network_technology_) {
1686731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_1XRTT:
1687731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "1xRTT";
1688731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1689731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_EVDO:
1690731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "EVDO";
1691731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1692731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_GPRS:
1693731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "GPRS";
1694731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1695731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_EDGE:
1696731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "EDGE";
1697731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1698731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_UMTS:
1699731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "UMTS";
1700731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1701731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_HSPA:
1702731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "HSPA";
1703731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1704731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_HSPA_PLUS:
1705731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "HSPA Plus";
1706731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1707731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_LTE:
1708731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "LTE";
1709731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1710731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_LTE_ADVANCED:
1711731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "LTE Advanced";
1712731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1713731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    default:
1714731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1715731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_CELLULAR_TECHNOLOGY_UNKNOWN);
1716731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1717731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
1718731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
1719731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1720201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochstd::string CellularNetwork::GetConnectivityStateString() const {
1721201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // These strings do not appear in the UI, so no need to localize them
1722201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  switch (connectivity_state_) {
1723201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case CONN_STATE_UNRESTRICTED:
1724201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return "unrestricted";
1725201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      break;
1726201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case CONN_STATE_RESTRICTED:
1727201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return "restricted";
1728201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      break;
1729201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case CONN_STATE_NONE:
1730201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return "none";
1731201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      break;
1732201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case CONN_STATE_UNKNOWN:
1733201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    default:
1734201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return "unknown";
1735201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
1736201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
1737201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1738513209b27ff55e2841eac0e4120199c23acce758Ben Murdochstd::string CellularNetwork::ActivationStateToString(
1739513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ActivationState activation_state) {
1740513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  switch (activation_state) {
1741731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ACTIVATION_STATE_ACTIVATED:
1742731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1743731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ACTIVATION_STATE_ACTIVATED);
1744731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1745731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ACTIVATION_STATE_ACTIVATING:
1746731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1747731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ACTIVATION_STATE_ACTIVATING);
1748731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1749731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ACTIVATION_STATE_NOT_ACTIVATED:
1750731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1751731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ACTIVATION_STATE_NOT_ACTIVATED);
1752731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1753731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ACTIVATION_STATE_PARTIALLY_ACTIVATED:
1754731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1755731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ACTIVATION_STATE_PARTIALLY_ACTIVATED);
1756731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1757731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    default:
1758731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1759731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ACTIVATION_STATE_UNKNOWN);
1760731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1761731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
1762731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
1763731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1764513209b27ff55e2841eac0e4120199c23acce758Ben Murdochstd::string CellularNetwork::GetActivationStateString() const {
1765513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return ActivationStateToString(this->activation_state_);
1766513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
1767513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1768731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstd::string CellularNetwork::GetRoamingStateString() const {
1769731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  switch (this->roaming_state_) {
1770731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ROAMING_STATE_HOME:
1771731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1772731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ROAMING_STATE_HOME);
1773731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1774731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ROAMING_STATE_ROAMING:
1775731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1776731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ROAMING_STATE_ROAMING);
1777731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1778731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    default:
1779731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1780731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ROAMING_STATE_UNKNOWN);
1781731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1782dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
1783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
1786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WifiNetwork
1787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1788ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Called from ParseNetwork after calling ParseInfo.
1789ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::CalculateUniqueId() {
1790ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ConnectionSecurity encryption = encryption_;
1791ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Flimflam treats wpa and rsn as psk internally, so convert those types
1792ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // to psk for unique naming.
1793ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (encryption == SECURITY_WPA || encryption == SECURITY_RSN)
1794ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    encryption = SECURITY_PSK;
1795ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string security = std::string(SecurityToString(encryption));
1796ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  unique_id_ = security + "|" + name_;
1797ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1798ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1799ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool WifiNetwork::SetSsid(const std::string& ssid) {
1800ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Detects encoding and convert to UTF-8.
1801ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string ssid_utf8;
1802ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!IsStringUTF8(ssid)) {
1803ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string encoding;
1804ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (base::DetectEncoding(ssid, &encoding)) {
1805ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!base::ConvertToUtf8AndNormalize(ssid, encoding, &ssid_utf8)) {
1806ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        ssid_utf8.clear();
1807ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1808ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1809ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1810ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1811ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (ssid_utf8.empty())
1812ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SetName(ssid);
1813ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  else
1814ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SetName(ssid_utf8);
1815ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1816ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
1817ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1818ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1819ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool WifiNetwork::SetHexSsid(const std::string& ssid_hex) {
1820ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Converts ascii hex dump (eg. "49656c6c6f") to string (eg. "Hello").
1821ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<uint8> ssid_raw;
1822ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!base::HexStringToBytes(ssid_hex, &ssid_raw)) {
1823ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    LOG(ERROR) << "Iligal hex char is found in WiFi.HexSSID.";
1824ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ssid_raw.clear();
1825ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
1826ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1827ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1828ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return SetSsid(std::string(ssid_raw.begin(), ssid_raw.end()));
1829ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1830ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1831dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool WifiNetwork::ParseValue(int index, const Value* value) {
1832dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  switch (index) {
1833ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_WIFI_HEX_SSID: {
1834ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::string ssid_hex;
1835ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!value->GetAsString(&ssid_hex))
1836ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return false;
1837ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1838ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetHexSsid(ssid_hex);
1839ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return true;
1840ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1841ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_NAME: {
1842ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Does not change network name when it was already set by WiFi.HexSSID.
1843ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!name().empty())
1844ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1845ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      else
1846ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return WirelessNetwork::ParseValue(index, value);
1847ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1848dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_SECURITY: {
1849dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string security_string;
1850dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (value->GetAsString(&security_string)) {
1851dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        encryption_ = ParseSecurity(security_string);
1852dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return true;
1853dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
1854dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1855dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
1856ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_PASSPHRASE: {
1857ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::string passphrase;
1858ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->GetAsString(&passphrase)) {
1859ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // Only store the passphrase if we are the owner.
1860ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // TODO(stevenjb): Remove this when chromium-os:12948 is resolved.
1861ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        if (chromeos::UserManager::Get()->current_user_is_owner())
1862ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          passphrase_ = passphrase;
1863ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1864ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1865ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1866ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1867dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_PASSPHRASE_REQUIRED:
1868dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsBoolean(&passphrase_required_);
1869ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_SAVE_CREDENTIALS:
1870ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsBoolean(&save_credentials_);
1871dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_IDENTITY:
1872dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&identity_);
1873dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_CERT_PATH:
1874dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&cert_path_);
1875ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_IDENTITY:
1876ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&eap_identity_);
1877ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_METHOD: {
1878ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::string method;
1879ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->GetAsString(&method)) {
1880ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        eap_method_ = ParseEAPMethod(method);
1881ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1882ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1883ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1884ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1885ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_PHASE_2_AUTH: {
1886ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::string auth;
1887ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->GetAsString(&auth)) {
1888ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        eap_phase_2_auth_ = ParseEAPPhase2Auth(auth);
1889ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1890ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1891ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1892ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1893ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY:
1894ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&eap_anonymous_identity_);
1895ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_CERT_ID:
1896ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&eap_client_cert_pkcs11_id_);
1897ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_CA_CERT_NSS:
1898ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&eap_server_ca_cert_nss_nickname_);
1899ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_USE_SYSTEM_CAS:
1900ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsBoolean(&eap_use_system_cas_);
1901ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_PASSWORD:
1902ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&eap_passphrase_);
1903ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_CLIENT_CERT:
1904ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_CLIENT_CERT_NSS:
1905ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_PRIVATE_KEY:
1906ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_PRIVATE_KEY_PASSWORD:
1907ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_KEY_ID:
1908ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_CA_CERT:
1909ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_CA_CERT_ID:
1910ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_PIN:
1911ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_KEY_MGMT:
1912ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // These properties are currently not used in the UI.
1913ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return true;
1914dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    default:
1915dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return WirelessNetwork::ParseValue(index, value);
1916dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
1917dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return false;
1918731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
1919731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1920ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::ParseInfo(const DictionaryValue* info) {
1921ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Network::ParseInfo(info);
1922ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CalculateUniqueId();
1923ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1924ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1925ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string& WifiNetwork::GetPassphrase() const {
1926ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!user_passphrase_.empty())
1927ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return user_passphrase_;
1928ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return passphrase_;
1929ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1930ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1931dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid WifiNetwork::SetPassphrase(const std::string& passphrase) {
1932ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Set the user_passphrase_ only; passphrase_ stores the flimflam value.
1933ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // If the user sets an empty passphrase, restore it to the passphrase
1934ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // remembered by flimflam.
1935ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!passphrase.empty()) {
1936ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    user_passphrase_ = passphrase;
1937ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    passphrase_ = passphrase;
1938ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
1939ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    user_passphrase_ = passphrase_;
1940ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1941ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Send the change to flimflam. If the format is valid, it will propagate to
1942ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // passphrase_ with a service update.
1943ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetOrClearStringProperty(kPassphraseProperty, passphrase, NULL);
1944ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1945ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1946ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetSaveCredentials(bool save_credentials) {
1947ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetBooleanProperty(kSaveCredentialsProperty, save_credentials,
1948ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     &save_credentials_);
1949ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1950ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1951ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// See src/third_party/flimflam/doc/service-api.txt for properties that
1952ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// flimflam will forget when SaveCredentials is false.
1953ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::EraseCredentials() {
1954ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WipeString(&passphrase_);
1955ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WipeString(&user_passphrase_);
1956ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WipeString(&eap_client_cert_pkcs11_id_);
1957ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WipeString(&eap_identity_);
1958ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WipeString(&eap_anonymous_identity_);
1959ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WipeString(&eap_passphrase_);
1960513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
1961513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1962dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid WifiNetwork::SetIdentity(const std::string& identity) {
1963ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetStringProperty(kIdentityProperty, identity, &identity_);
1964731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
1965731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1966dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid WifiNetwork::SetCertPath(const std::string& cert_path) {
1967ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetStringProperty(kCertPathProperty, cert_path, &cert_path_);
1968ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1969ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1970ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetEAPMethod(EAPMethod method) {
1971ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  eap_method_ = method;
1972ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (method) {
1973ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_METHOD_PEAP:
1974ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapMethodProperty, kEapMethodPEAP, NULL);
1975ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1976ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_METHOD_TLS:
1977ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapMethodProperty, kEapMethodTLS, NULL);
1978ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1979ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_METHOD_TTLS:
1980ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapMethodProperty, kEapMethodTTLS, NULL);
1981ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1982ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_METHOD_LEAP:
1983ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapMethodProperty, kEapMethodLEAP, NULL);
1984ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1985ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    default:
1986ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ClearProperty(kEapMethodProperty);
1987ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1988ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1989ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1990ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1991ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetEAPPhase2Auth(EAPPhase2Auth auth) {
1992ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  eap_phase_2_auth_ = auth;
1993ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool is_peap = (eap_method_ == EAP_METHOD_PEAP);
1994ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (auth) {
1995ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_PHASE_2_AUTH_AUTO:
1996ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ClearProperty(kEapPhase2AuthProperty);
1997ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1998ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_PHASE_2_AUTH_MD5:
1999ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapPhase2AuthProperty,
2000ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        is_peap ? kEapPhase2AuthPEAPMD5
2001ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                : kEapPhase2AuthTTLSMD5,
2002ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        NULL);
2003ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
2004ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_PHASE_2_AUTH_MSCHAPV2:
2005ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapPhase2AuthProperty,
2006ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        is_peap ? kEapPhase2AuthPEAPMSCHAPV2
2007ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                : kEapPhase2AuthTTLSMSCHAPV2,
2008ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        NULL);
2009ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
2010ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_PHASE_2_AUTH_MSCHAP:
2011ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapPhase2AuthProperty, kEapPhase2AuthTTLSMSCHAP, NULL);
2012ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
2013ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_PHASE_2_AUTH_PAP:
2014ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapPhase2AuthProperty, kEapPhase2AuthTTLSPAP, NULL);
2015ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
2016ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_PHASE_2_AUTH_CHAP:
2017ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapPhase2AuthProperty, kEapPhase2AuthTTLSCHAP, NULL);
2018ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
2019ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2020ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
2021ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2022ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetEAPServerCaCertNssNickname(
2023ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const std::string& nss_nickname) {
2024ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  VLOG(1) << "SetEAPServerCaCertNssNickname " << nss_nickname;
2025ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetOrClearStringProperty(kEapCaCertNssProperty, nss_nickname,
2026ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           &eap_server_ca_cert_nss_nickname_);
2027ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
2028ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2029ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetEAPClientCertPkcs11Id(const std::string& pkcs11_id) {
2030ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  VLOG(1) << "SetEAPClientCertPkcs11Id " << pkcs11_id;
2031ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetOrClearStringProperty(kEapCertIDProperty, pkcs11_id,
2032ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           &eap_client_cert_pkcs11_id_);
2033ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
2034ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2035ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetEAPUseSystemCAs(bool use_system_cas) {
2036ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetBooleanProperty(kEapUseSystemCAsProperty, use_system_cas,
2037ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     &eap_use_system_cas_);
2038ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
2039ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2040ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetEAPIdentity(const std::string& identity) {
2041ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetOrClearStringProperty(kEapIdentityProperty, identity, &eap_identity_);
2042ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
2043ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2044ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetEAPAnonymousIdentity(const std::string& identity) {
2045ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetOrClearStringProperty(kEapAnonymousIdentityProperty, identity,
2046ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           &eap_anonymous_identity_);
2047ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
2048ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2049ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetEAPPassphrase(const std::string& passphrase) {
2050ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetOrClearStringProperty(kEapPasswordProperty, passphrase, &eap_passphrase_);
2051c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2052c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2053ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstd::string WifiNetwork::GetEncryptionString() const {
2054c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (encryption_) {
2055c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SECURITY_UNKNOWN:
2056c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
2057c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SECURITY_NONE:
2058c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "";
2059c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SECURITY_WEP:
2060c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "WEP";
2061c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SECURITY_WPA:
2062c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "WPA";
2063c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SECURITY_RSN:
2064c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "RSN";
2065c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SECURITY_8021X:
2066c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "8021X";
2067ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case SECURITY_PSK:
2068ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return "PSK";
2069c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2070731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return "Unknown";
2071731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
2072731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
207321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool WifiNetwork::IsPassphraseRequired() const {
207421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // TODO(stevenjb): Remove error_ tests when fixed in flimflam
207521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // (http://crosbug.com/10135).
207621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (error_ == ERROR_BAD_PASSPHRASE || error_ == ERROR_BAD_WEPKEY)
207721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return true;
2078ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // For 802.1x networks, configuration is required if connectable is false.
2079ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (encryption_ == SECURITY_8021X)
2080ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return !connectable_;
208121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return passphrase_required_;
208221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
208321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
2084731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Parse 'path' to determine if the certificate is stored in a pkcs#11 device.
2085731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// flimflam recognizes the string "SETTINGS:" to specify authentication
2086731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// parameters. 'key_id=' indicates that the certificate is stored in a pkcs#11
2087731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// device. See src/third_party/flimflam/files/doc/service-api.txt.
2088731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool WifiNetwork::IsCertificateLoaded() const {
2089731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static const std::string settings_string("SETTINGS:");
2090731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static const std::string pkcs11_key("key_id");
2091731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (cert_path_.find(settings_string) == 0) {
2092731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    std::string::size_type idx = cert_path_.find(pkcs11_key);
2093731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (idx != std::string::npos)
2094731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      idx = cert_path_.find_first_not_of(kWhitespaceASCII,
2095731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                         idx + pkcs11_key.length());
2096731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (idx != std::string::npos && cert_path_[idx] == '=')
2097731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return true;
2098731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
2099731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return false;
2100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
2101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
2103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NetworkLibrary
2104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass NetworkLibraryImpl : public NetworkLibrary  {
21063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
21073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  NetworkLibraryImpl()
2108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      : network_manager_monitor_(NULL),
2109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        data_plan_monitor_(NULL),
2110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        ethernet_(NULL),
2111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_wifi_(NULL),
2112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_cellular_(NULL),
2113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_virtual_(NULL),
21143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        available_devices_(0),
21153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        enabled_devices_(0),
21163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        connected_devices_(0),
2117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        wifi_scanning_(false),
2118513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        offline_mode_(false),
211972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        is_locked_(false),
2120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        sim_operation_(SIM_OPERATION_NONE),
2121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        notify_task_(NULL) {
2122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (EnsureCrosLoaded()) {
21233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      Init();
2124513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      network_manager_monitor_ =
2125513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          MonitorNetworkManager(&NetworkManagerStatusChangedHandler,
2126513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                this);
2127513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      data_plan_monitor_ = MonitorCellularDataPlan(&DataPlanUpdateHandler,
2128513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                                   this);
212972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      network_login_observer_.reset(new NetworkLoginObserver(this));
21303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    } else {
21313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      InitTestData();
21323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
21333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~NetworkLibraryImpl() {
2136513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    network_manager_observers_.Clear();
2137513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (network_manager_monitor_)
2138513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      DisconnectPropertyChangeMonitor(network_manager_monitor_);
2139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    data_plan_observers_.Clear();
2140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    pin_operation_observers_.Clear();
2141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    user_action_observers_.Clear();
2142513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (data_plan_monitor_)
2143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      DisconnectDataPlanUpdateMonitor(data_plan_monitor_);
2144513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    STLDeleteValues(&network_observers_);
2145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    STLDeleteValues(&network_device_observers_);
2146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ClearNetworks(true /*delete networks*/);
2147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ClearRememberedNetworks(true /*delete networks*/);
2148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    STLDeleteValues(&data_plan_map_);
2149513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2150513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
2151513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) {
2152513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!network_manager_observers_.HasObserver(observer))
2153513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      network_manager_observers_.AddObserver(observer);
2154513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2155513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
2156513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveNetworkManagerObserver(NetworkManagerObserver* observer) {
2157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    network_manager_observers_.RemoveObserver(observer);
2158513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2159513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
2160513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddNetworkObserver(const std::string& service_path,
2161513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                  NetworkObserver* observer) {
2162513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DCHECK(observer);
2163513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!EnsureCrosLoaded())
2164513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return;
2165513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // First, add the observer to the callback map.
2166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NetworkObserverMap::iterator iter = network_observers_.find(service_path);
2167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NetworkObserverList* oblist;
2168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (iter != network_observers_.end()) {
2169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      oblist = iter->second;
2170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    } else {
2171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      oblist = new NetworkObserverList(this, service_path);
2172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      network_observers_[service_path] = oblist;
2173513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
2174513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!oblist->HasObserver(observer))
2175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      oblist->AddObserver(observer);
2176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
2178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveNetworkObserver(const std::string& service_path,
2179513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     NetworkObserver* observer) {
2180513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DCHECK(observer);
2181513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DCHECK(service_path.size());
2182513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NetworkObserverMap::iterator map_iter =
2183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        network_observers_.find(service_path);
2184513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (map_iter != network_observers_.end()) {
2185513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      map_iter->second->RemoveObserver(observer);
2186513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      if (!map_iter->second->size()) {
2187513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        delete map_iter->second;
2188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_observers_.erase(map_iter);
2189513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
2190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
2191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void AddNetworkDeviceObserver(const std::string& device_path,
2194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        NetworkDeviceObserver* observer) {
2195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(observer);
2196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!EnsureCrosLoaded())
2197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // First, add the observer to the callback map.
2199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDeviceObserverMap::iterator iter =
2200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_device_observers_.find(device_path);
2201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDeviceObserverList* oblist;
2202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (iter != network_device_observers_.end()) {
2203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      oblist = iter->second;
2204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!oblist->HasObserver(observer))
2205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        oblist->AddObserver(observer);
2206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
2207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(WARNING) << "No NetworkDeviceObserverList found for "
2208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   << device_path;
2209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RemoveNetworkDeviceObserver(const std::string& device_path,
2213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                           NetworkDeviceObserver* observer) {
2214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(observer);
2215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(device_path.size());
2216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDeviceObserverMap::iterator map_iter =
2217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_device_observers_.find(device_path);
2218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (map_iter != network_device_observers_.end()) {
2219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      map_iter->second->RemoveObserver(observer);
2220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2223513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) {
2224513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DCHECK(observer);
2225513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NetworkObserverMap::iterator map_iter = network_observers_.begin();
2226513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    while (map_iter != network_observers_.end()) {
2227513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      map_iter->second->RemoveObserver(observer);
2228513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      if (!map_iter->second->size()) {
2229513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        delete map_iter->second;
2230513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        network_observers_.erase(map_iter++);
2231513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      } else {
2232513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        ++map_iter;
2233513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
2234513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
22353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
223772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Lock() {
223872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (is_locked_)
223972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return;
224072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    is_locked_ = true;
2241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotifyNetworkManagerChanged(true);  // Forced update.
224272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
224372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
224472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Unlock() {
224572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DCHECK(is_locked_);
224672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (!is_locked_)
224772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return;
224872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    is_locked_ = false;
2249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotifyNetworkManagerChanged(true);  // Forced update.
225072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
225172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
225272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool IsLocked() {
225372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return is_locked_;
225472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
225572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2256513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddCellularDataPlanObserver(CellularDataPlanObserver* observer) {
2257513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!data_plan_observers_.HasObserver(observer))
2258513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      data_plan_observers_.AddObserver(observer);
22593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2261513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveCellularDataPlanObserver(
2262513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      CellularDataPlanObserver* observer) {
2263513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    data_plan_observers_.RemoveObserver(observer);
2264513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void AddPinOperationObserver(PinOperationObserver* observer) {
2267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!pin_operation_observers_.HasObserver(observer))
2268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      pin_operation_observers_.AddObserver(observer);
2269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RemovePinOperationObserver(PinOperationObserver* observer) {
2272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    pin_operation_observers_.RemoveObserver(observer);
2273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2275dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void AddUserActionObserver(UserActionObserver* observer) {
2276dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!user_action_observers_.HasObserver(observer))
2277dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      user_action_observers_.AddObserver(observer);
2278dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2279dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void RemoveUserActionObserver(UserActionObserver* observer) {
2281dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    user_action_observers_.RemoveObserver(observer);
2282dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
228421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual const EthernetNetwork* ethernet_network() const { return ethernet_; }
2285513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool ethernet_connecting() const {
2286513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return ethernet_ ? ethernet_->connecting() : false;
2287513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2288513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool ethernet_connected() const {
2289513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return ethernet_ ? ethernet_->connected() : false;
2290513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2292dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const WifiNetwork* wifi_network() const { return active_wifi_; }
2293513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool wifi_connecting() const {
2294dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_wifi_ ? active_wifi_->connecting() : false;
2295513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2296513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool wifi_connected() const {
2297dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_wifi_ ? active_wifi_->connected() : false;
2298513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2299513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
2300dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const CellularNetwork* cellular_network() const {
2301dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_cellular_;
2302dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2303513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool cellular_connecting() const {
2304dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_cellular_ ? active_cellular_->connecting() : false;
2305513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2306513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool cellular_connected() const {
2307dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_cellular_ ? active_cellular_->connected() : false;
2308dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2309dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const VirtualNetwork* virtual_network() const {
2310dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_virtual_;
2311dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2312dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool virtual_network_connecting() const {
2313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_virtual_ ? active_virtual_->connecting() : false;
2314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool virtual_network_connected() const {
2316dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_virtual_ ? active_virtual_->connected() : false;
2317513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool Connected() const {
23203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return ethernet_connected() || wifi_connected() || cellular_connected();
23213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool Connecting() const {
23243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return ethernet_connecting() || wifi_connecting() || cellular_connecting();
23253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const std::string& IPAddress() const {
2328513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Returns IP address for the active network.
2329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // TODO(stevenjb): Fix this for VPNs. See chromium-os:13972.
2330dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const Network* result = active_network();
2331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!result)
2332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      result = connected_network();  // happens if we are connected to a VPN.
2333dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!result)
2334dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      result = ethernet_;  // Use non active ethernet addr if no active network.
2335dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (result)
2336dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return result->ip_address();
2337513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    static std::string null_address("0.0.0.0");
2338513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return null_address;
23393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual const WifiNetworkVector& wifi_networks() const {
23423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return wifi_networks_;
23433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual const WifiNetworkVector& remembered_wifi_networks() const {
23463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return remembered_wifi_networks_;
2347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual const CellularNetworkVector& cellular_networks() const {
23503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return cellular_networks_;
2351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2353dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const VirtualNetworkVector& virtual_networks() const {
2354dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return virtual_networks_;
2355dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2356dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
23573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  /////////////////////////////////////////////////////////////////////////////
23583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2359dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const NetworkDevice* FindNetworkDeviceByPath(
2360dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const {
2361dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkDeviceMap::const_iterator iter = device_map_.find(path);
2362dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (iter != device_map_.end())
2363dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return iter->second;
2364dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    LOG(WARNING) << "Device path not found: " << path;
2365dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return NULL;
2366dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2367dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const NetworkDevice* FindCellularDevice() const {
2369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    for (NetworkDeviceMap::const_iterator iter = device_map_.begin();
2370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         iter != device_map_.end(); ++iter) {
2371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (iter->second->type() == TYPE_CELLULAR)
2372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return iter->second;
2373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const NetworkDevice* FindEthernetDevice() const {
2378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    for (NetworkDeviceMap::const_iterator iter = device_map_.begin();
2379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         iter != device_map_.end(); ++iter) {
2380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (iter->second->type() == TYPE_ETHERNET)
2381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return iter->second;
2382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const NetworkDevice* FindWifiDevice() const {
2387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    for (NetworkDeviceMap::const_iterator iter = device_map_.begin();
2388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         iter != device_map_.end(); ++iter) {
2389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (iter->second->type() == TYPE_WIFI)
2390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return iter->second;
2391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual Network* FindNetworkByPath(const std::string& path) const {
2396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkMap::const_iterator iter = network_map_.find(path);
2397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (iter != network_map_.end())
2398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return iter->second;
2399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WirelessNetwork* FindWirelessNetworkByPath(const std::string& path) const {
2403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* network = FindNetworkByPath(path);
2404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (network &&
2405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        (network->type() == TYPE_WIFI || network->type() == TYPE_CELLULAR))
2406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return static_cast<WirelessNetwork*>(network);
2407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual WifiNetwork* FindWifiNetworkByPath(const std::string& path) const {
2411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* network = FindNetworkByPath(path);
2412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (network && network->type() == TYPE_WIFI)
2413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return static_cast<WifiNetwork*>(network);
2414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual CellularNetwork* FindCellularNetworkByPath(
2418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& path) const {
2419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* network = FindNetworkByPath(path);
2420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (network && network->type() == TYPE_CELLULAR)
2421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return static_cast<CellularNetwork*>(network);
2422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2424ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual VirtualNetwork* FindVirtualNetworkByPath(
2426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& path) const {
2427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* network = FindNetworkByPath(path);
2428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (network && network->type() == TYPE_VPN)
2429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return static_cast<VirtualNetwork*>(network);
2430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2431ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual Network* FindNetworkFromRemembered(
2434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const Network* remembered) const {
2435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkMap::const_iterator found =
2436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_unique_id_map_.find(remembered->unique_id());
2437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (found != network_unique_id_map_.end())
2438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return found->second;
2439ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const CellularDataPlanVector* GetDataPlans(
2443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& path) const {
2444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CellularDataPlanMap::const_iterator iter = data_plan_map_.find(path);
2445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (iter == data_plan_map_.end())
2446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return NULL;
2447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // If we need a new plan, then ignore any data plans we have.
2448ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CellularNetwork* cellular = FindCellularNetworkByPath(path);
2449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (cellular && cellular->needs_new_plan())
2450ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return NULL;
2451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return iter->second;
2452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2454ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const CellularDataPlan* GetSignificantDataPlan(
2455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& path) const {
2456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const CellularDataPlanVector* plans = GetDataPlans(path);
2457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (plans)
2458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return GetSignificantDataPlanFromVector(plans);
2459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  /////////////////////////////////////////////////////////////////////////////
2463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ChangePin(const std::string& old_pin,
2465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         const std::string& new_pin) {
2466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
2467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!cellular) {
2468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() << "Calling ChangePin method w/o cellular device.";
2469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    sim_operation_ = SIM_OPERATION_CHANGE_PIN;
2472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    chromeos::RequestChangePin(cellular->device_path().c_str(),
2473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               old_pin.c_str(), new_pin.c_str(),
2474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               PinOperationCallback, this);
2475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ChangeRequirePin(bool require_pin,
2478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                const std::string& pin) {
2479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "ChangeRequirePin require_pin: " << require_pin
2480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            << " pin: " << pin;
2481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
2482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!cellular) {
2483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() << "Calling ChangeRequirePin method w/o cellular device.";
2484ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2485ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2486ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    sim_operation_ = SIM_OPERATION_CHANGE_REQUIRE_PIN;
2487ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    chromeos::RequestRequirePin(cellular->device_path().c_str(),
2488ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                pin.c_str(), require_pin,
2489ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                PinOperationCallback, this);
2490ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2491ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2492ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void EnterPin(const std::string& pin) {
2493ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
2494ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!cellular) {
2495ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() << "Calling EnterPin method w/o cellular device.";
2496ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2497ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2498ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    sim_operation_ = SIM_OPERATION_ENTER_PIN;
2499ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    chromeos::RequestEnterPin(cellular->device_path().c_str(),
2500ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              pin.c_str(),
2501ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              PinOperationCallback, this);
2502ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2503ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2504ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void UnblockPin(const std::string& puk,
2505ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          const std::string& new_pin) {
2506ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
2507ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!cellular) {
2508ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() << "Calling UnblockPin method w/o cellular device.";
2509ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2510ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2511ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    sim_operation_ = SIM_OPERATION_UNBLOCK_PIN;
2512ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    chromeos::RequestUnblockPin(cellular->device_path().c_str(),
2513ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                puk.c_str(), new_pin.c_str(),
2514ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                PinOperationCallback, this);
2515ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2516ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2517ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static void PinOperationCallback(void* object,
2518ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   const char* path,
2519ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   NetworkMethodErrorType error,
2520ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   const char* error_message) {
2521ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
2522ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(networklib);
2523ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PinOperationError pin_error;
2524ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "PinOperationCallback, error: " << error
2525ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            << " error_msg: " << error_message;
2526ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (error == chromeos::NETWORK_METHOD_ERROR_NONE) {
2527ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      pin_error = PIN_ERROR_NONE;
2528ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      VLOG(1) << "Pin operation completed successfuly";
2529ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // TODO(nkostylev): Might be cleaned up and exposed in flimflam API.
2530ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // http://crosbug.com/14253
2531ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Since this option state is not exposed we have to update it manually.
2532ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      networklib->FlipSimPinRequiredStateIfNeeded();
2533ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
2534ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (error_message &&
2535ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            (strcmp(error_message, kErrorIncorrectPinMsg) == 0 ||
2536ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen             strcmp(error_message, kErrorPinRequiredMsg) == 0)) {
2537ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        pin_error = PIN_ERROR_INCORRECT_CODE;
2538ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      } else if (error_message &&
2539ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                 strcmp(error_message, kErrorPinBlockedMsg) == 0) {
2540ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        pin_error = PIN_ERROR_BLOCKED;
2541ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      } else {
2542ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        pin_error = PIN_ERROR_UNKNOWN;
2543ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        NOTREACHED() << "Unknown PIN error: " << error_message;
2544ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
2545ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2546ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    networklib->NotifyPinOperationCompleted(pin_error);
2547ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2548ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2549ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RequestCellularScan() {
2550ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
2551ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!cellular) {
2552ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() << "Calling RequestCellularScan method w/o cellular device.";
2553ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2554ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2555ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    chromeos::ProposeScan(cellular->device_path().c_str());
25563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2558ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RequestCellularRegister(const std::string& network_id) {
2559ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
2560ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!cellular) {
2561ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() << "Calling CellularRegister method w/o cellular device.";
2562ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2563ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2564ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    chromeos::RequestCellularRegister(cellular->device_path().c_str(),
2565ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      network_id.c_str(),
2566ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      CellularRegisterCallback,
2567ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      this);
2568dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2569dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2570ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static void CellularRegisterCallback(void* object,
2571ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       const char* path,
2572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       NetworkMethodErrorType error,
2573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       const char* error_message) {
2574ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
2575ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(networklib);
2576ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // TODO(dpolukhin): Notify observers about network registration status
2577ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // but not UI doesn't assume such notification so just ignore result.
2578dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2579dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2580ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetCellularDataRoamingAllowed(bool new_value) {
2581ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
2582ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!cellular) {
2583ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() << "Calling SetCellularDataRoamingAllowed method "
2584ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "w/o cellular device.";
2585ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2586ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2587ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_ptr<Value> value(Value::CreateBooleanValue(new_value));
2588ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    chromeos::SetNetworkDeviceProperty(cellular->device_path().c_str(),
2589ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       kCellularAllowRoamingProperty,
2590ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       value.get());
25913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2593ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  /////////////////////////////////////////////////////////////////////////////
2594ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2595ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RequestNetworkScan() {
2596ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (EnsureCrosLoaded()) {
2597ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (wifi_enabled()) {
2598ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        wifi_scanning_ = true;  // Cleared when updates are received.
2599ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        chromeos::RequestNetworkScan(kTypeWifi);
2600ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        RequestRememberedNetworksUpdate();
2601ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
2602ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (cellular_network())
2603ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        cellular_network()->RefreshDataPlansIfNeeded();
2604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
26053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2607731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual bool GetWifiAccessPoints(WifiAccessPointVector* result) {
2608731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!EnsureCrosLoaded())
26093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return false;
2610dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
26113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DeviceNetworkList* network_list = GetDeviceNetworkList();
26123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (network_list == NULL)
2613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return false;
26143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    result->clear();
26153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    result->reserve(network_list->network_size);
26163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const base::Time now = base::Time::Now();
26173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    for (size_t i = 0; i < network_list->network_size; ++i) {
26183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      DCHECK(network_list->networks[i].address);
26193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      DCHECK(network_list->networks[i].name);
26203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      WifiAccessPoint ap;
2621731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ap.mac_address = SafeString(network_list->networks[i].address);
2622731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ap.name = SafeString(network_list->networks[i].name);
26233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      ap.timestamp = now -
26243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          base::TimeDelta::FromSeconds(network_list->networks[i].age_seconds);
26253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      ap.signal_strength = network_list->networks[i].strength;
26263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      ap.channel = network_list->networks[i].channel;
26273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      result->push_back(ap);
2628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
26293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    FreeDeviceNetworkList(network_list);
26303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return true;
26313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2633ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static void NetworkConnectCallback(void *object,
2634ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     const char *path,
2635ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     NetworkMethodErrorType error,
2636ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     const char* error_message) {
2637ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
2638ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(networklib);
2639ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2640ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* network = networklib->FindNetworkByPath(path);
2641ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!network) {
2642ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(ERROR) << "No network for path: " << path;
2643ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2644dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
2645ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2646ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (error != NETWORK_METHOD_ERROR_NONE) {
2647ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(WARNING) << "Error from ServiceConnect callback for: "
2648ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   << network->name()
2649ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   << " Error: " << error << " Message: " << error_message;
2650ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (error_message &&
2651ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          strcmp(error_message, kErrorPassphraseRequiredMsg) == 0) {
2652ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // This will trigger the connection failed notification.
2653ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // TODO(stevenjb): Remove if chromium-os:13203 gets fixed.
2654ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network->set_state(STATE_FAILURE);
2655ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network->set_error(ERROR_BAD_PASSPHRASE);
2656ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        networklib->NotifyNetworkManagerChanged(true);  // Forced update.
2657ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
2658ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2659ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2660ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2661ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "Connected to service: " << network->name();
2662ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2663ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Update local cache and notify listeners.
2664ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (network->type() == TYPE_WIFI) {
2665ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      WifiNetwork* wifi = static_cast<WifiNetwork *>(network);
2666ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // If the user asked not to save credentials, flimflam will have
2667ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // forgotten them.  Wipe our cache as well.
2668ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!wifi->save_credentials()) {
2669ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        wifi->EraseCredentials();
2670ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
2671ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      networklib->active_wifi_ = wifi;
2672ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else if (network->type() == TYPE_CELLULAR) {
2673ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      networklib->active_cellular_ = static_cast<CellularNetwork *>(network);
2674ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else if (network->type() == TYPE_VPN) {
2675ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      networklib->active_virtual_ = static_cast<VirtualNetwork *>(network);
2676ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
2677ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(ERROR) << "Network of unexpected type: " << network->type();
2678ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2679ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2680ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // If we succeed, this network will be remembered; request an update.
2681ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // TODO(stevenjb): flimflam should do this automatically.
2682ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    networklib->RequestRememberedNetworksUpdate();
2683ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Notify observers.
2684ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    networklib->NotifyNetworkManagerChanged(true);  // Forced update.
2685ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    networklib->NotifyUserConnectionInitiated(network);
2686dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2687dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2688ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2689ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void CallConnectToNetwork(Network* network) {
2690dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(network);
2691dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!EnsureCrosLoaded() || !network)
2692ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2693ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // In order to be certain to trigger any notifications, set the connecting
2694ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // state locally and notify observers. Otherwise there might be a state
2695ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // change without a forced notify.
2696ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    network->set_connecting(true);
2697ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotifyNetworkManagerChanged(true);  // Forced update.
2698ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    RequestNetworkServiceConnect(network->service_path().c_str(),
2699ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 NetworkConnectCallback, this);
2700ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2701ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2702ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToWifiNetwork(WifiNetwork* wifi) {
2703ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // This will happen if a network resets or gets out of range.
2704ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (wifi->user_passphrase_ != wifi->passphrase_ ||
2705ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        wifi->passphrase_required())
2706ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      wifi->SetPassphrase(wifi->user_passphrase_);
2707ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CallConnectToNetwork(wifi);
2708dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2709dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2710dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Use this to connect to a wifi network by service path.
2711ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToWifiNetwork(const std::string& service_path) {
2712ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    WifiNetwork* wifi = FindWifiNetworkByPath(service_path);
2713dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!wifi) {
2714dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      LOG(WARNING) << "Attempt to connect to non existing network: "
2715dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                   << service_path;
2716ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2717dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
2718ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ConnectToWifiNetwork(wifi);
27193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2721dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Use this to connect to an unlisted wifi network.
2722dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // This needs to request information about the named service.
2723dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // The connection attempt will occur in the callback.
2724ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToWifiNetwork(ConnectionSecurity security,
2725513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                    const std::string& ssid,
2726ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    const std::string& passphrase,
2727731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                    const std::string& identity,
2728ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    const std::string& certpath) {
2729513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!EnsureCrosLoaded())
2730ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2731ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Store the connection data to be used by the callback.
2732ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.service_name = ssid;
2733ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.passphrase = passphrase;
2734ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.identity = identity;
2735ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.cert_path = certpath;
2736ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Asynchronously request service properties and call
2737ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // WifiServiceUpdateAndConnect.
2738dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    RequestHiddenWifiNetwork(ssid.c_str(),
2739dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             SecurityToString(security),
2740dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             WifiServiceUpdateAndConnect,
2741dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             this);
2742dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2743dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2744dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Callback
2745dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void WifiServiceUpdateAndConnect(void* object,
2746dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                          const char* service_path,
2747dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                          const Value* info) {
2748dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
2749dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(networklib);
2750dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (service_path && info) {
2751dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      DCHECK_EQ(info->GetType(), Value::TYPE_DICTIONARY);
2752dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const DictionaryValue* dict = static_cast<const DictionaryValue*>(info);
2753dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      Network* network =
2754dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          networklib->ParseNetwork(std::string(service_path), dict);
2755ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DCHECK(network->type() == TYPE_WIFI);
2756ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      networklib->ConnectToWifiNetworkUsingConnectData(
2757ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          static_cast<WifiNetwork*>(network));
2758dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
2759dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2760dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2761ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void ConnectToWifiNetworkUsingConnectData(WifiNetwork* wifi) {
2762dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ConnectData& data = connect_data_;
2763ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (wifi->name() != data.service_name) {
2764ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(WARNING) << "Wifi network name does not match ConnectData: "
2765ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   << wifi->name() << " != " << data.service_name;
2766dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return;
2767dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
2768ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi->set_added(true);
2769ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi->SetIdentity(data.identity);
2770ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi->SetPassphrase(data.passphrase);
2771ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!data.cert_path.empty())
2772ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      wifi->SetCertPath(data.cert_path);
2773ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2774ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ConnectToWifiNetwork(wifi);
2775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2777ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToCellularNetwork(CellularNetwork* cellular) {
2778ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CallConnectToNetwork(cellular);
2779731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
2780731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
278172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Records information that cellular play payment had happened.
278272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void SignalCellularPlanPayment() {
278372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DCHECK(!HasRecentCellularPlanPayment());
278472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    cellular_plan_payment_time_ = base::Time::Now();
278572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
278672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
278772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Returns true if cellular plan payment had been recorded recently.
278872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool HasRecentCellularPlanPayment() {
278972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return (base::Time::Now() -
2790dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            cellular_plan_payment_time_).InHours() < kRecentPlanPaymentHours;
279172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
279272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2793ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToVirtualNetwork(VirtualNetwork* vpn) {
2794ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CallConnectToNetwork(vpn);
2795ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2796ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2797ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToVirtualNetworkPSK(
2798ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& service_name,
2799ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& server,
2800ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& psk,
2801ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& username,
2802ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& user_passphrase) {
2803ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!EnsureCrosLoaded())
2804ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2805ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Store the connection data to be used by the callback.
2806ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.service_name = service_name;
2807ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.psk_key = psk;
2808ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.server_hostname = server;
2809ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.identity = username;
2810ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.passphrase = user_passphrase;
2811ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    RequestVirtualNetwork(service_name.c_str(),
2812ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          server.c_str(),
2813ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          kProviderL2tpIpsec,
2814ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          VPNServiceUpdateAndConnect,
2815ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          this);
2816ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2817ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2818ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback
2819ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static void VPNServiceUpdateAndConnect(void* object,
2820ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                         const char* service_path,
2821ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                         const Value* info) {
2822ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
2823ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(networklib);
2824ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (service_path && info) {
2825ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      VLOG(1) << "Connecting to new VPN Service: " << service_path;
2826ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DCHECK_EQ(info->GetType(), Value::TYPE_DICTIONARY);
2827ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const DictionaryValue* dict = static_cast<const DictionaryValue*>(info);
2828ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Network* network =
2829ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          networklib->ParseNetwork(std::string(service_path), dict);
2830ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DCHECK(network->type() == TYPE_VPN);
2831ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      networklib->ConnectToVirtualNetworkUsingConnectData(
2832ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          static_cast<VirtualNetwork*>(network));
2833ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
2834ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(WARNING) << "Unable to create VPN Service: " << service_path;
2835ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2836ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2837ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2838ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void ConnectToVirtualNetworkUsingConnectData(VirtualNetwork* vpn) {
2839ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ConnectData& data = connect_data_;
2840ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (vpn->name() != data.service_name) {
2841ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(WARNING) << "Virtual network name does not match ConnectData: "
2842ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   << vpn->name() << " != " << data.service_name;
2843ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2844ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2845ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2846ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->set_added(true);
2847ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->set_server_hostname(data.server_hostname);
2848ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->SetCACert("");
2849ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->SetUserCert("");
2850ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->SetUserCertKey("");
2851ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->SetPSKPassphrase(data.psk_key);
2852ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->SetUsername(data.identity);
2853ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->SetUserPassphrase(data.passphrase);
2854ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2855ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CallConnectToNetwork(vpn);
2856ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2857ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2858ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void DisconnectFromNetwork(const Network* network) {
2859513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DCHECK(network);
2860513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!EnsureCrosLoaded() || !network)
2861513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return;
2862ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "Disconnect from network: " << network->service_path();
2863ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (chromeos::DisconnectFromNetwork(network->service_path().c_str())) {
2864513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // Update local cache and notify listeners.
2865ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Network* found_network = FindNetworkByPath(network->service_path());
2866ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (found_network) {
2867ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        found_network->set_connected(false);
2868ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        if (found_network == active_wifi_)
2869dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          active_wifi_ = NULL;
2870ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        else if (found_network == active_cellular_)
2871dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          active_cellular_ = NULL;
2872ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        else if (found_network == active_virtual_)
2873ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          active_virtual_ = NULL;
28743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      }
2875ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NotifyNetworkManagerChanged(true);  // Forced update.
28763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
28773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2878c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2879513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void ForgetWifiNetwork(const std::string& service_path) {
2880513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!EnsureCrosLoaded())
2881513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return;
2882ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DeleteRememberedService(service_path.c_str());
2883ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DeleteRememberedWifiNetwork(service_path);
2884ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotifyNetworkManagerChanged(true);  // Forced update.
2885ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2886ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2887ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual std::string GetCellularHomeCarrierId() const {
2888ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string carrier_id;
2889ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
2890ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (cellular) {
2891ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return cellular->home_provider_id();
2892ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
28933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
2894ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return carrier_id;
2895c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2896c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool ethernet_available() const {
28983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return available_devices_ & (1 << TYPE_ETHERNET);
28993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
29003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool wifi_available() const {
29013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return available_devices_ & (1 << TYPE_WIFI);
29023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
29033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool cellular_available() const {
29043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return available_devices_ & (1 << TYPE_CELLULAR);
2905c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2906c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool ethernet_enabled() const {
29083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return enabled_devices_ & (1 << TYPE_ETHERNET);
29093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
29103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool wifi_enabled() const {
29113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return enabled_devices_ & (1 << TYPE_WIFI);
29123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
29133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool cellular_enabled() const {
29143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return enabled_devices_ & (1 << TYPE_CELLULAR);
2915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2916c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2917201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual bool wifi_scanning() const {
2918201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return wifi_scanning_;
2919201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
2920201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
29213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool offline_mode() const { return offline_mode_; }
2922c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2923dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Note: This does not include any virtual networks.
2924513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual const Network* active_network() const {
2925dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Use flimflam's ordering of the services to determine what the active
2926dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // network is (i.e. don't assume priority of network types).
2927dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Network* result = NULL;
2928513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (ethernet_ && ethernet_->is_active())
2929dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      result = ethernet_;
2930ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if ((active_wifi_ && active_wifi_->is_active()) &&
2931ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        (!result ||
2932ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         active_wifi_->priority_order_ < result->priority_order_))
2933ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      result = active_wifi_;
2934ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if ((active_cellular_ && active_cellular_->is_active()) &&
2935ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        (!result ||
2936ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         active_cellular_->priority_order_ < result->priority_order_))
2937ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      result = active_cellular_;
2938ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return result;
2939ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2940ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2941ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const Network* connected_network() const {
2942ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Use flimflam's ordering of the services to determine what the connected
2943ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // network is (i.e. don't assume priority of network types).
2944ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* result = NULL;
2945ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (ethernet_ && ethernet_->connected())
2946ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      result = ethernet_;
2947ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if ((active_wifi_ && active_wifi_->connected()) &&
2948ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        (!result ||
2949ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         active_wifi_->priority_order_ < result->priority_order_))
2950dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      result = active_wifi_;
2951ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if ((active_cellular_ && active_cellular_->connected()) &&
2952ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        (!result ||
2953ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         active_cellular_->priority_order_ < result->priority_order_))
2954dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      result = active_cellular_;
2955dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return result;
2956513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2957513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
2958731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void EnableEthernetNetworkDevice(bool enable) {
295972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (is_locked_)
296072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return;
29613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EnableNetworkDeviceType(TYPE_ETHERNET, enable);
2962c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2963c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2964731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void EnableWifiNetworkDevice(bool enable) {
296572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (is_locked_)
296672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return;
29673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EnableNetworkDeviceType(TYPE_WIFI, enable);
2968c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2969c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2970731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void EnableCellularNetworkDevice(bool enable) {
297172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (is_locked_)
297272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return;
29733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EnableNetworkDeviceType(TYPE_CELLULAR, enable);
29743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2975c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2976731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void EnableOfflineMode(bool enable) {
2977731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!EnsureCrosLoaded())
29783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
2979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // If network device is already enabled/disabled, then don't do anything.
29813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (enable && offline_mode_) {
2982513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      VLOG(1) << "Trying to enable offline mode when it's already enabled.";
29833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
29843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
29853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!enable && !offline_mode_) {
2986513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      VLOG(1) << "Trying to disable offline mode when it's already disabled.";
29873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
29883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
2989c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (SetOfflineMode(enable)) {
29913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      offline_mode_ = enable;
29923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
2993c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2994c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2995731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual NetworkIPConfigVector GetIPConfigs(const std::string& device_path,
2996ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             std::string* hardware_address,
2997ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             HardwareAddressFormat format) {
2998ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(hardware_address);
2999731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    hardware_address->clear();
30003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    NetworkIPConfigVector ipconfig_vector;
3001731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (EnsureCrosLoaded() && !device_path.empty()) {
30023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      IPConfigStatus* ipconfig_status = ListIPConfigs(device_path.c_str());
30033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (ipconfig_status) {
30043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        for (int i = 0; i < ipconfig_status->size; i++) {
30053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          IPConfig ipconfig = ipconfig_status->ips[i];
30063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          ipconfig_vector.push_back(
30073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              NetworkIPConfig(device_path, ipconfig.type, ipconfig.address,
30083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              ipconfig.netmask, ipconfig.gateway,
30093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              ipconfig.name_servers));
30103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        }
3011731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        *hardware_address = ipconfig_status->hardware_address;
30123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        FreeIPConfigStatus(ipconfig_status);
30133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        // Sort the list of ip configs by type.
30143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        std::sort(ipconfig_vector.begin(), ipconfig_vector.end());
3015c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
3016c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
3017c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3018ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    for (size_t i = 0; i < hardware_address->size(); ++i)
3019ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      (*hardware_address)[i] = toupper((*hardware_address)[i]);
3020ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (format == FORMAT_COLON_SEPARATED_HEX) {
3021ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (hardware_address->size() % 2 == 0) {
3022ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        std::string output;
3023ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        for (size_t i = 0; i < hardware_address->size(); ++i) {
3024ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          if ((i != 0) && (i % 2 == 0))
3025ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            output.push_back(':');
3026ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          output.push_back((*hardware_address)[i]);
3027ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        }
3028ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        *hardware_address = output;
30294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      }
3030ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
3031ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DCHECK(format == FORMAT_RAW_HEX);
30323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
3033ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return ipconfig_vector;
3034c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
3035c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
3037513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3038dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  typedef std::map<std::string, Network*> NetworkMap;
3039dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  typedef std::map<std::string, int> PriorityMap;
3040dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  typedef std::map<std::string, NetworkDevice*> NetworkDeviceMap;
3041dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  typedef std::map<std::string, CellularDataPlanVector*> CellularDataPlanMap;
3042dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3043513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  class NetworkObserverList : public ObserverList<NetworkObserver> {
3044513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch   public:
3045513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NetworkObserverList(NetworkLibraryImpl* library,
3046513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                        const std::string& service_path) {
3047513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      network_monitor_ = MonitorNetworkService(&NetworkStatusChangedHandler,
3048513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                               service_path.c_str(),
3049513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                               library);
3050513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
3051513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3052513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    virtual ~NetworkObserverList() {
3053513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      if (network_monitor_)
3054513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        DisconnectPropertyChangeMonitor(network_monitor_);
3055513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
3056513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3057513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch   private:
3058513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    static void NetworkStatusChangedHandler(void* object,
3059513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            const char* path,
3060513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            const char* key,
3061513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            const Value* value) {
3062513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3063513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      DCHECK(networklib);
3064513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      networklib->UpdateNetworkStatus(path, key, value);
3065513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
3066513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    PropertyChangeMonitor network_monitor_;
3067ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DISALLOW_COPY_AND_ASSIGN(NetworkObserverList);
3068513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  };
3069513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3070513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  typedef std::map<std::string, NetworkObserverList*> NetworkObserverMap;
3071513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3072ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  class NetworkDeviceObserverList : public ObserverList<NetworkDeviceObserver> {
3073ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   public:
3074ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDeviceObserverList(NetworkLibraryImpl* library,
3075ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              const std::string& device_path) {
3076ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      device_monitor_ = MonitorNetworkDevice(
3077ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          &NetworkDevicePropertyChangedHandler,
3078ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          device_path.c_str(),
3079ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          library);
3080ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3081ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3082ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    virtual ~NetworkDeviceObserverList() {
3083ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (device_monitor_)
3084ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        DisconnectPropertyChangeMonitor(device_monitor_);
3085ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3086ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3087ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   private:
3088ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    static void NetworkDevicePropertyChangedHandler(void* object,
3089ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                    const char* path,
3090ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                    const char* key,
3091ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                    const Value* value) {
3092ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3093ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DCHECK(networklib);
3094ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      networklib->UpdateNetworkDeviceStatus(path, key, value);
3095ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3096ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PropertyChangeMonitor device_monitor_;
3097ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DISALLOW_COPY_AND_ASSIGN(NetworkDeviceObserverList);
3098ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
3099ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef std::map<std::string, NetworkDeviceObserverList*>
3101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NetworkDeviceObserverMap;
3102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
3104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Callbacks.
3105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static void NetworkManagerStatusChangedHandler(void* object,
3107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                                 const char* path,
3108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                                 const char* key,
3109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                                 const Value* value) {
3110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DCHECK(networklib);
3112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    networklib->NetworkManagerStatusChanged(key, value);
31133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // This processes all Manager update messages.
3116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void NetworkManagerStatusChanged(const char* key, const Value* value) {
3117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    base::TimeTicks start = base::TimeTicks::Now();
3119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    VLOG(1) << "NetworkManagerStatusChanged: KEY=" << key;
3120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!key)
3121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return;
3122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    int index = property_index_parser().Get(std::string(key));
3123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    switch (index) {
3124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_STATE:
3125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Currently we ignore the network manager state.
3126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_AVAILABLE_TECHNOLOGIES: {
3128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(value->GetType(), Value::TYPE_LIST);
3129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const ListValue* vlist = static_cast<const ListValue*>(value);
3130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        UpdateAvailableTechnologies(vlist);
3131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      }
3133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_ENABLED_TECHNOLOGIES: {
3134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(value->GetType(), Value::TYPE_LIST);
3135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const ListValue* vlist = static_cast<const ListValue*>(value);
3136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        UpdateEnabledTechnologies(vlist);
3137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_CONNECTED_TECHNOLOGIES: {
3140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(value->GetType(), Value::TYPE_LIST);
3141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const ListValue* vlist = static_cast<const ListValue*>(value);
3142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        UpdateConnectedTechnologies(vlist);
3143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_DEFAULT_TECHNOLOGY:
3146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Currently we ignore DefaultTechnology.
3147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_OFFLINE_MODE: {
3149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(value->GetType(), Value::TYPE_BOOLEAN);
3150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        value->GetAsBoolean(&offline_mode_);
3151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        NotifyNetworkManagerChanged(false);  // Not forced.
3152dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_ACTIVE_PROFILE: {
3155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(value->GetType(), Value::TYPE_STRING);
3156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        value->GetAsString(&active_profile_path_);
3157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        RequestRememberedNetworksUpdate();
3158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_PROFILES:
3161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Currently we ignore Profiles (list of all profiles).
3162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_SERVICES: {
3164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(value->GetType(), Value::TYPE_LIST);
3165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const ListValue* vlist = static_cast<const ListValue*>(value);
3166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        UpdateNetworkServiceList(vlist);
3167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_SERVICE_WATCH_LIST: {
3170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(value->GetType(), Value::TYPE_LIST);
3171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const ListValue* vlist = static_cast<const ListValue*>(value);
3172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        UpdateWatchedNetworkServiceList(vlist);
3173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_DEVICE:
3176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_DEVICES: {
3177dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(value->GetType(), Value::TYPE_LIST);
3178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const ListValue* vlist = static_cast<const ListValue*>(value);
3179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        UpdateNetworkDeviceList(vlist);
3180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3181dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      default:
3183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        LOG(WARNING) << "Unhandled key: " << key;
3184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
3186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    base::TimeDelta delta = base::TimeTicks::Now() - start;
3187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    VLOG(1) << "  time: " << delta.InMilliseconds() << " ms.";
3188dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    HISTOGRAM_TIMES("CROS_NETWORK_UPDATE", delta);
3189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
3190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
3191dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void NetworkManagerUpdate(void* object,
3192dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   const char* manager_path,
3193dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   const Value* info) {
3194dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(networklib);
3196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!info) {
3197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(ERROR) << "Error retrieving manager properties: " << manager_path;
3198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
3199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "Received NetworkManagerUpdate.";
3201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK_EQ(info->GetType(), Value::TYPE_DICTIONARY);
3202dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const DictionaryValue* dict = static_cast<const DictionaryValue*>(info);
3203dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    networklib->ParseNetworkManager(dict);
3204dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3205dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3206dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void ParseNetworkManager(const DictionaryValue* dict) {
3207dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (DictionaryValue::key_iterator iter = dict->begin_keys();
3208dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != dict->end_keys(); ++iter) {
3209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& key = *iter;
3210dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      Value* value;
3211dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      bool res = dict->GetWithoutPathExpansion(key, &value);
3212dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      CHECK(res);
3213dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      NetworkManagerStatusChanged(key.c_str(), value);
3214dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3217dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void ProfileUpdate(void* object,
3218dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                            const char* profile_path,
3219dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                            const Value* info) {
3220dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3221dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(networklib);
3222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!info) {
3223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(ERROR) << "Error retrieving profile: " << profile_path;
3224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
3225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "Received ProfileUpdate for: " << profile_path;
3227dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK_EQ(info->GetType(), Value::TYPE_DICTIONARY);
3228dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const DictionaryValue* dict = static_cast<const DictionaryValue*>(info);
3229dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ListValue* entries(NULL);
3230dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    dict->GetList(kEntriesProperty, &entries);
3231dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(entries);
3232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    networklib->UpdateRememberedServiceList(profile_path, entries);
3233dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3234dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3235dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void NetworkServiceUpdate(void* object,
3236dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   const char* service_path,
3237dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   const Value* info) {
3238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3239dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(networklib);
3240dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (service_path) {
3241dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!info) {
3242dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Network no longer exists.
3243dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        networklib->DeleteNetwork(std::string(service_path));
3244dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      } else {
3245dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(info->GetType(), Value::TYPE_DICTIONARY);
3246dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const DictionaryValue* dict = static_cast<const DictionaryValue*>(info);
3247dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        networklib->ParseNetwork(std::string(service_path), dict);
3248201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      }
3249201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
3250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3251201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
3252dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void RememberedNetworkServiceUpdate(void* object,
3253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                             const char* service_path,
3254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                             const Value* info) {
3255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(networklib);
3257dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (service_path) {
3258dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!info) {
3259dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Remembered network no longer exists.
3260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        networklib->DeleteRememberedWifiNetwork(std::string(service_path));
3261dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      } else {
3262dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(info->GetType(), Value::TYPE_DICTIONARY);
3263dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const DictionaryValue* dict = static_cast<const DictionaryValue*>(info);
3264dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        networklib->ParseRememberedNetwork(std::string(service_path), dict);
3265513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
32663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
3267dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3268513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3269dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void NetworkDeviceUpdate(void* object,
3270dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                  const char* device_path,
3271dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                  const Value* info) {
3272dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3273dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(networklib);
3274dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (device_path) {
3275dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!info) {
3276dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // device no longer exists.
3277dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        networklib->DeleteDevice(std::string(device_path));
3278dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      } else {
3279dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(info->GetType(), Value::TYPE_DICTIONARY);
3280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const DictionaryValue* dict = static_cast<const DictionaryValue*>(info);
3281dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        networklib->ParseNetworkDevice(std::string(device_path), dict);
3282201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      }
3283201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
3284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3285201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
3286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void DataPlanUpdateHandler(void* object,
3287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                    const char* modem_service_path,
3288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                    const CellularDataPlanList* dataplan) {
3289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(networklib);
3291dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (modem_service_path && dataplan) {
3292dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      networklib->UpdateCellularDataPlan(std::string(modem_service_path),
3293dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                         dataplan);
3294dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3295dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3296dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3297dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
3298dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Network technology functions.
3299dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3300dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateTechnologies(const ListValue* technologies, int* bitfieldp) {
3301dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(bitfieldp);
3302dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!technologies)
3303dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return;
3304dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    int bitfield = 0;
3305dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (ListValue::const_iterator iter = technologies->begin();
3306dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != technologies->end(); ++iter) {
3307dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string technology;
3308dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      (*iter)->GetAsString(&technology);
3309dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!technology.empty()) {
3310dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        ConnectionType type = ParseType(technology);
3311dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        bitfield |= 1 << type;
3312201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      }
3313201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
3314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    *bitfieldp = bitfield;
3315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotifyNetworkManagerChanged(false);  // Not forced.
3316dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3317201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
3318dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateAvailableTechnologies(const ListValue* technologies) {
3319dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    UpdateTechnologies(technologies, &available_devices_);
3320dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3321dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3322dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateEnabledTechnologies(const ListValue* technologies) {
3323dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    UpdateTechnologies(technologies, &enabled_devices_);
3324dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!ethernet_enabled())
3325dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      ethernet_ = NULL;
3326dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!wifi_enabled()) {
3327dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      active_wifi_ = NULL;
3328dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      wifi_networks_.clear();
3329dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3330dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!cellular_enabled()) {
3331dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      active_cellular_ = NULL;
3332dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      cellular_networks_.clear();
3333dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3334dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3335dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3336dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateConnectedTechnologies(const ListValue* technologies) {
3337dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    UpdateTechnologies(technologies, &connected_devices_);
3338dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3339dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3340dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
3341dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Network list management functions.
3342dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3343dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Note: sometimes flimflam still returns networks when the device type is
3344dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // disabled. Always check the appropriate enabled() state before adding
3345dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // networks to a list or setting an active network so that we do not show them
3346dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // in the UI.
3347dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3348dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // This relies on services being requested from flimflam in priority order,
3349dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // and the updates getting processed and received in order.
3350dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateActiveNetwork(Network* network) {
3351dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ConnectionType type(network->type());
3352dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (type == TYPE_ETHERNET) {
3353dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (ethernet_enabled()) {
3354dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Set ethernet_ to the first connected ethernet service, or the first
3355dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // disconnected ethernet service if none are connected.
3356dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        if (ethernet_ == NULL || !ethernet_->connected())
3357dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          ethernet_ = static_cast<EthernetNetwork*>(network);
3358dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3359dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (type == TYPE_WIFI) {
3360dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (wifi_enabled()) {
3361dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Set active_wifi_ to the first connected or connecting wifi service.
3362dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        if (active_wifi_ == NULL && network->connecting_or_connected())
3363dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          active_wifi_ = static_cast<WifiNetwork*>(network);
33643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      }
3365dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (type == TYPE_CELLULAR) {
3366dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (cellular_enabled()) {
3367dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Set active_cellular_ to first connected/connecting celluar service.
3368dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        if (active_cellular_ == NULL && network->connecting_or_connected())
3369dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          active_cellular_ = static_cast<CellularNetwork*>(network);
3370dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3371dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (type == TYPE_VPN) {
3372dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // Set active_virtual_ to the first connected or connecting vpn service.
3373dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (active_virtual_ == NULL && network->connecting_or_connected())
3374dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_virtual_ = static_cast<VirtualNetwork*>(network);
3375dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3376dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3377dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3378dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void AddNetwork(Network* network) {
3379dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    std::pair<NetworkMap::iterator,bool> result =
3380dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        network_map_.insert(std::make_pair(network->service_path(), network));
3381dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(result.second);  // Should only get called with new network.
3382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(2) << "Adding Network: " << network->service_path()
3383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            << " (" << network->name() << ")";
3384dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ConnectionType type(network->type());
3385dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (type == TYPE_WIFI) {
3386dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (wifi_enabled())
3387dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        wifi_networks_.push_back(static_cast<WifiNetwork*>(network));
3388dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (type == TYPE_CELLULAR) {
3389dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (cellular_enabled())
3390dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        cellular_networks_.push_back(static_cast<CellularNetwork*>(network));
3391dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (type == TYPE_VPN) {
3392dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      virtual_networks_.push_back(static_cast<VirtualNetwork*>(network));
3393dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3394dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Do not set the active network here. Wait until we parse the network.
3395dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3396dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3397dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // This only gets called when NetworkServiceUpdate receives a NULL update
3398dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // for an existing network, e.g. an error occurred while fetching a network.
3399dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void DeleteNetwork(const std::string& service_path) {
3400dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkMap::iterator found = network_map_.find(service_path);
3401dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (found == network_map_.end()) {
3402dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // This occurs when we receive an update request followed by a disconnect
3403dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // which triggers another update. See UpdateNetworkServiceList.
3404dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return;
3405dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3406dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Network* network = found->second;
3407dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    network_map_.erase(found);
3408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!network->unique_id().empty())
3409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      network_unique_id_map_.erase(network->unique_id());
3410dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ConnectionType type(network->type());
3411dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (type == TYPE_ETHERNET) {
3412dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (network == ethernet_) {
3413dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // This should never happen.
3414dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        LOG(ERROR) << "Deleting active ethernet network: " << service_path;
3415dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        ethernet_ = NULL;
3416dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3417dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (type == TYPE_WIFI) {
3418dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      WifiNetworkVector::iterator iter = std::find(
3419dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          wifi_networks_.begin(), wifi_networks_.end(), network);
3420dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (iter != wifi_networks_.end())
3421dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        wifi_networks_.erase(iter);
3422dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (network == active_wifi_) {
3423dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // This should never happen.
3424dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        LOG(ERROR) << "Deleting active wifi network: " << service_path;
3425dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_wifi_ = NULL;
3426dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3427dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (type == TYPE_CELLULAR) {
3428dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      CellularNetworkVector::iterator iter = std::find(
3429dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          cellular_networks_.begin(), cellular_networks_.end(), network);
3430dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (iter != cellular_networks_.end())
3431dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        cellular_networks_.erase(iter);
3432dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (network == active_cellular_) {
3433dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // This should never happen.
3434dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        LOG(ERROR) << "Deleting active cellular network: " << service_path;
3435dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_cellular_ = NULL;
3436dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3437dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // Find and delete any existing data plans associated with |service_path|.
3438dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      CellularDataPlanMap::iterator found =  data_plan_map_.find(service_path);
3439dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (found != data_plan_map_.end()) {
3440dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        CellularDataPlanVector* data_plans = found->second;
3441dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        delete data_plans;
3442dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        data_plan_map_.erase(found);
3443dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3444dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (type == TYPE_VPN) {
3445dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      VirtualNetworkVector::iterator iter = std::find(
3446dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          virtual_networks_.begin(), virtual_networks_.end(), network);
3447dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (iter != virtual_networks_.end())
3448dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        virtual_networks_.erase(iter);
3449dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (network == active_virtual_) {
3450dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // This should never happen.
3451dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        LOG(ERROR) << "Deleting active virtual network: " << service_path;
3452dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_virtual_ = NULL;
3453dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3454dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3455dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    delete network;
3456dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3457dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void AddRememberedWifiNetwork(WifiNetwork* wifi) {
3459dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    std::pair<NetworkMap::iterator,bool> result =
3460dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        remembered_network_map_.insert(
3461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            std::make_pair(wifi->service_path(), wifi));
3462dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(result.second);  // Should only get called with new network.
3463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    remembered_wifi_networks_.push_back(wifi);
3464dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3465201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
3466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void DeleteRememberedWifiNetwork(const std::string& service_path) {
3467dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkMap::iterator found = remembered_network_map_.find(service_path);
3468dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (found == remembered_network_map_.end()) {
3469dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      LOG(WARNING) << "Attempt to delete non-existant remembered network: "
3470dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                   << service_path;
3471dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return;
3472dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3473dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Network* remembered_network = found->second;
3474dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    remembered_network_map_.erase(found);
3475dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    WifiNetworkVector::iterator iter = std::find(
3476dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        remembered_wifi_networks_.begin(), remembered_wifi_networks_.end(),
3477dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        remembered_network);
3478dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (iter != remembered_wifi_networks_.end())
3479dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      remembered_wifi_networks_.erase(iter);
3480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* network = FindNetworkFromRemembered(remembered_network);
3481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (network && network->type() == TYPE_WIFI) {
3482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Clear the stored credentials for any visible forgotten networks.
3483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      WifiNetwork* wifi = static_cast<WifiNetwork*>(network);
3484ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      wifi->EraseCredentials();
3485ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
3486ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Network is not in visible list.
3487ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      VLOG(2) << "Remembered Network not found: "
3488ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              << remembered_network->unique_id();
3489ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3490dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    delete remembered_network;
3491dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3492dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3493dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Update all network lists, and request associated service updates.
3494dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateNetworkServiceList(const ListValue* services) {
3495dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // TODO(stevenjb): Wait for wifi_scanning_ to be false.
3496dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Copy the list of existing networks to "old" and clear the map and lists.
3497dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkMap old_network_map = network_map_;
3498dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ClearNetworks(false /*don't delete*/);
3499dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Clear the list of update requests.
3500ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    int network_priority_order = 0;
3501dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    network_update_requests_.clear();
3502dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // wifi_scanning_ will remain false unless we request a network update.
3503201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    wifi_scanning_ = false;
3504dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // |services| represents a complete list of visible networks.
3505dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (ListValue::const_iterator iter = services->begin();
3506dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != services->end(); ++iter) {
3507dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string service_path;
3508dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      (*iter)->GetAsString(&service_path);
3509dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!service_path.empty()) {
3510dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // If we find the network in "old", add it immediately to the map
3511dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // and lists. Otherwise it will get added when NetworkServiceUpdate
3512dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // calls ParseNetwork.
3513dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        NetworkMap::iterator found = old_network_map.find(service_path);
3514dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        if (found != old_network_map.end()) {
3515dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          AddNetwork(found->second);
3516dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          old_network_map.erase(found);
3517dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        }
3518dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Always request network updates.
3519dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // TODO(stevenjb): Investigate why we are missing updates then
3520dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // rely on watched network updates and only request updates here for
3521dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // new networks.
3522dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Use update_request map to store network priority.
3523ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_update_requests_[service_path] = network_priority_order++;
352421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        wifi_scanning_ = true;
3525dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        RequestNetworkServiceInfo(service_path.c_str(),
3526dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                  &NetworkServiceUpdate,
3527dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                  this);
3528dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3529dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3530dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Delete any old networks that no longer exist.
3531dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (NetworkMap::iterator iter = old_network_map.begin();
3532dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != old_network_map.end(); ++iter) {
3533dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      delete iter->second;
353421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    }
3535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
3536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3537dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Request updates for watched networks. Does not affect network lists.
3538dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Existing networks will be updated. There should not be any new networks
3539dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // in this list, but if there are they will be added appropriately.
3540dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateWatchedNetworkServiceList(const ListValue* services) {
3541dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (ListValue::const_iterator iter = services->begin();
3542dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != services->end(); ++iter) {
3543dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string service_path;
3544dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      (*iter)->GetAsString(&service_path);
3545dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!service_path.empty()) {
3546dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        VLOG(1) << "Watched Service: " << service_path;
3547dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        RequestNetworkServiceInfo(
3548dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            service_path.c_str(), &NetworkServiceUpdate, this);
3549dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3550dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
35513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
35523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3553dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Request the active profile which lists the remembered networks.
3554dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void RequestRememberedNetworksUpdate() {
3555ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!active_profile_path_.empty()) {
3556ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      RequestNetworkProfile(
3557ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          active_profile_path_.c_str(), &ProfileUpdate, this);
3558ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3559dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3560dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3561dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Update the list of remembered (profile) networks, and request associated
3562dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // service updates.
3563dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateRememberedServiceList(const char* profile_path,
3564dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   const ListValue* profile_entries) {
3565dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Copy the list of existing networks to "old" and clear the map and list.
3566dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkMap old_network_map = remembered_network_map_;
3567dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ClearRememberedNetworks(false /*don't delete*/);
3568dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // |profile_entries| represents a complete list of remembered networks.
3569dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (ListValue::const_iterator iter = profile_entries->begin();
3570dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != profile_entries->end(); ++iter) {
3571dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string service_path;
3572dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      (*iter)->GetAsString(&service_path);
3573dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!service_path.empty()) {
3574dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // If we find the network in "old", add it immediately to the map
3575dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // and list. Otherwise it will get added when
3576dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // RememberedNetworkServiceUpdate calls ParseRememberedNetwork.
3577dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        NetworkMap::iterator found = old_network_map.find(service_path);
3578dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        if (found != old_network_map.end()) {
3579ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          Network* network = found->second;
3580ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          if (network->type() == TYPE_WIFI) {
3581ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            WifiNetwork* wifi = static_cast<WifiNetwork*>(network);
3582ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            AddRememberedWifiNetwork(wifi);
3583ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            old_network_map.erase(found);
3584ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          }
3585dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        }
3586dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Always request updates for remembered networks.
3587dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        RequestNetworkProfileEntry(profile_path,
3588dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   service_path.c_str(),
3589dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   &RememberedNetworkServiceUpdate,
3590dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   this);
3591dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3592dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3593dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Delete any old networks that no longer exist.
3594dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (NetworkMap::iterator iter = old_network_map.begin();
3595dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != old_network_map.end(); ++iter) {
3596dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      delete iter->second;
3597dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3598dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
35993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3600dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Network* CreateNewNetwork(ConnectionType type,
3601dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                            const std::string& service_path) {
3602ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    switch (type) {
3603dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case TYPE_ETHERNET: {
3604dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        EthernetNetwork* ethernet = new EthernetNetwork(service_path);
3605dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return ethernet;
3606dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3607dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case TYPE_WIFI: {
3608dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        WifiNetwork* wifi = new WifiNetwork(service_path);
3609dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return wifi;
3610dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3611dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case TYPE_CELLULAR: {
3612dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        CellularNetwork* cellular = new CellularNetwork(service_path);
3613dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return cellular;
3614dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3615dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case TYPE_VPN: {
3616dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        VirtualNetwork* vpn = new VirtualNetwork(service_path);
3617dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return vpn;
3618dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3619dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      default: {
3620dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        LOG(WARNING) << "Unknown service type: " << type;
3621dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return new Network(service_path, type);
3622dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3623dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3624dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
36253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3626dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Network* ParseNetwork(const std::string& service_path,
3627dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                        const DictionaryValue* info) {
3628ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* network = FindNetworkByPath(service_path);
3629ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!network) {
3630dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      ConnectionType type = ParseTypeFromDictionary(info);
3631dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      network = CreateNewNetwork(type, service_path);
3632dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      AddNetwork(network);
3633dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
36343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3635ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Erase entry from network_unique_id_map_ in case unique id changes.
3636ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!network->unique_id().empty())
3637ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      network_unique_id_map_.erase(network->unique_id());
3638ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3639dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    network->ParseInfo(info);  // virtual.
36403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3641ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!network->unique_id().empty())
3642ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      network_unique_id_map_[network->unique_id()] = network;
3643ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3644dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    UpdateActiveNetwork(network);
36453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3646dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Find and erase entry in update_requests, and set network priority.
3647dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    PriorityMap::iterator found2 = network_update_requests_.find(service_path);
3648dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (found2 != network_update_requests_.end()) {
3649ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      network->priority_order_ = found2->second;
3650dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      network_update_requests_.erase(found2);
3651dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (network_update_requests_.empty()) {
3652dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Clear wifi_scanning_ when we have no pending requests.
3653dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        wifi_scanning_ = false;
3654dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3655dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else {
3656ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // TODO(stevenjb): Enable warning once UpdateNetworkServiceList is fixed.
3657ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // LOG(WARNING) << "ParseNetwork called with no update request entry: "
3658ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      //              << service_path;
3659dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3660201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
3661ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "ParseNetwork: " << network->name();
3662ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotifyNetworkManagerChanged(false);  // Not forced.
3663dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return network;
3664dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3665201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
3666ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns NULL if |service_path| refers to a network that is not a
3667ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // remembered type.
3668dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Network* ParseRememberedNetwork(const std::string& service_path,
3669dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                  const DictionaryValue* info) {
3670dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Network* network;
3671dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkMap::iterator found = remembered_network_map_.find(service_path);
3672dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (found != remembered_network_map_.end()) {
3673dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      network = found->second;
3674dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else {
3675dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      ConnectionType type = ParseTypeFromDictionary(info);
3676ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (type == TYPE_WIFI) {
3677ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network = CreateNewNetwork(type, service_path);
3678ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        WifiNetwork* wifi = static_cast<WifiNetwork*>(network);
3679ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        AddRememberedWifiNetwork(wifi);
3680ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      } else {
3681ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        VLOG(1) << "Ignoring remembered network: " << service_path
3682ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                << " Type: " << ConnectionTypeToString(type);
3683ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return NULL;
3684ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
3685dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3686dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    network->ParseInfo(info);  // virtual.
3687ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "ParseRememberedNetwork: " << network->name();
3688ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotifyNetworkManagerChanged(false);  // Not forced.
3689dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return network;
3690dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3691201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
3692dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void ClearNetworks(bool delete_networks) {
3693dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (delete_networks)
3694dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      STLDeleteValues(&network_map_);
3695dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    network_map_.clear();
3696ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    network_unique_id_map_.clear();
3697dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ethernet_ = NULL;
3698dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    active_wifi_ = NULL;
3699dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    active_cellular_ = NULL;
3700dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    active_virtual_ = NULL;
3701dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi_networks_.clear();
3702dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cellular_networks_.clear();
3703dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    virtual_networks_.clear();
3704dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
37053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3706dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void ClearRememberedNetworks(bool delete_networks) {
3707dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (delete_networks)
3708dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      STLDeleteValues(&remembered_network_map_);
3709dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    remembered_network_map_.clear();
37103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    remembered_wifi_networks_.clear();
3711dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
37123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3713dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
3714dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // NetworkDevice list management functions.
3715dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3716ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns pointer to device or NULL if device is not found by path.
3717ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Use FindNetworkDeviceByPath when you're not intending to change device.
3718ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NetworkDevice* GetNetworkDeviceByPath(const std::string& path) {
3719ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDeviceMap::iterator iter = device_map_.find(path);
3720ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (iter != device_map_.end())
3721ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return iter->second;
3722ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    LOG(WARNING) << "Device path not found: " << path;
3723ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
3724ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
3725ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3726dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Update device list, and request associated device updates.
3727dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // |devices| represents a complete list of devices.
3728dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateNetworkDeviceList(const ListValue* devices) {
3729dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkDeviceMap old_device_map = device_map_;
3730dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    device_map_.clear();
3731dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    VLOG(2) << "Updating Device List.";
3732dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (ListValue::const_iterator iter = devices->begin();
3733dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != devices->end(); ++iter) {
3734dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string device_path;
3735dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      (*iter)->GetAsString(&device_path);
3736dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!device_path.empty()) {
3737dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        NetworkDeviceMap::iterator found = old_device_map.find(device_path);
3738dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        if (found != old_device_map.end()) {
3739ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          VLOG(2) << " Adding existing device: " << device_path;
3740dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          device_map_[device_path] = found->second;
3741dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          old_device_map.erase(found);
3742dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        }
3743dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        RequestNetworkDeviceInfo(
3744dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            device_path.c_str(), &NetworkDeviceUpdate, this);
3745dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3746dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3747dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Delete any old devices that no longer exist.
3748dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (NetworkDeviceMap::iterator iter = old_device_map.begin();
3749dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != old_device_map.end(); ++iter) {
3750ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DeleteDeviceFromDeviceObserversMap(iter->first);
3751ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Delete device.
3752dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      delete iter->second;
3753dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
37543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
37553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3756ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void DeleteDeviceFromDeviceObserversMap(const std::string& device_path) {
3757ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Delete all device observers associated with this device.
3758ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDeviceObserverMap::iterator map_iter =
3759ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_device_observers_.find(device_path);
3760ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (map_iter != network_device_observers_.end()) {
3761ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      delete map_iter->second;
3762ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      network_device_observers_.erase(map_iter);
3763ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3764ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
3765ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3766dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void DeleteDevice(const std::string& device_path) {
3767dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkDeviceMap::iterator found = device_map_.find(device_path);
3768dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (found == device_map_.end()) {
3769dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      LOG(WARNING) << "Attempt to delete non-existant device: "
3770dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                   << device_path;
3771dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return;
3772dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3773dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    VLOG(2) << " Deleting device: " << device_path;
3774dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkDevice* device = found->second;
3775dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    device_map_.erase(found);
3776ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DeleteDeviceFromDeviceObserversMap(device_path);
3777dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    delete device;
3778dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3779dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3780dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void ParseNetworkDevice(const std::string& device_path,
3781dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                          const DictionaryValue* info) {
3782dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkDeviceMap::iterator found = device_map_.find(device_path);
3783dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkDevice* device;
3784dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (found != device_map_.end()) {
3785dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      device = found->second;
3786dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else {
3787dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      device = new NetworkDevice(device_path);
3788dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      VLOG(2) << " Adding device: " << device_path;
3789dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      device_map_[device_path] = device;
3790ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (network_device_observers_.find(device_path) ==
3791ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          network_device_observers_.end()) {
3792ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_device_observers_[device_path] =
3793ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            new NetworkDeviceObserverList(this, device_path);
3794ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
37953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
3796dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    device->ParseInfo(info);
3797dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    VLOG(1) << "ParseNetworkDevice:" << device->name();
3798ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotifyNetworkManagerChanged(false);  // Not forced.
3799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
3800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3801dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
3802dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
38033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void EnableNetworkDeviceType(ConnectionType device, bool enable) {
3804731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!EnsureCrosLoaded())
38053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
3806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // If network device is already enabled/disabled, then don't do anything.
38083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (enable && (enabled_devices_ & (1 << device))) {
38093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      LOG(WARNING) << "Trying to enable a device that's already enabled: "
38103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                   << device;
38113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
3812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
38133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!enable && !(enabled_devices_ & (1 << device))) {
38143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      LOG(WARNING) << "Trying to disable a device that's already disabled: "
38153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                   << device;
38163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
3817c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
38183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3819dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    RequestNetworkDeviceEnable(ConnectionTypeToString(device), enable);
3820c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
3821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3822dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
3823dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Notifications.
3824dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3825dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // We call this any time something in NetworkLibrary changes.
3826ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(stevenjb): We should consider breaking this into multiple
3827dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // notifications, e.g. connection state, devices, services, etc.
3828ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void NotifyNetworkManagerChanged(bool force_update) {
3829dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3830ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Cancel any pending signals.
3831ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (notify_task_) {
3832dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      notify_task_->Cancel();
3833ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      notify_task_ = NULL;
3834ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3835ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (force_update) {
3836ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Signal observers now.
3837ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SignalNetworkManagerObservers();
3838ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
3839ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Schedule a deleayed signal to limit the frequency of notifications.
3840ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      notify_task_ = NewRunnableMethod(
3841ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          this, &NetworkLibraryImpl::SignalNetworkManagerObservers);
3842ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      BrowserThread::PostDelayedTask(BrowserThread::UI, FROM_HERE, notify_task_,
3843ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     kNetworkNotifyDelayMs);
3844ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3845dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3846dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3847dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SignalNetworkManagerObservers() {
3848dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    notify_task_ = NULL;
3849513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    FOR_EACH_OBSERVER(NetworkManagerObserver,
3850513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                      network_manager_observers_,
3851513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                      OnNetworkManagerChanged(this));
3852513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
3853513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3854513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void NotifyNetworkChanged(Network* network) {
3855ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(2) << "Network changed: " << network->name();
3856513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DCHECK(network);
3857513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NetworkObserverMap::const_iterator iter = network_observers_.find(
3858513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        network->service_path());
3859513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (iter != network_observers_.end()) {
3860513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      FOR_EACH_OBSERVER(NetworkObserver,
3861513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                        *(iter->second),
3862513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                        OnNetworkChanged(this, network));
3863513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    } else {
3864513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      NOTREACHED() <<
3865513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          "There weren't supposed to be any property change observers of " <<
3866513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch           network->service_path();
3867513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
38683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3869c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3870ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void NotifyNetworkDeviceChanged(NetworkDevice* device) {
3871ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(device);
3872ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDeviceObserverMap::const_iterator iter =
3873ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_device_observers_.find(device->device_path());
3874ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (iter != network_device_observers_.end()) {
3875ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NetworkDeviceObserverList* device_observer_list = iter->second;
3876ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FOR_EACH_OBSERVER(NetworkDeviceObserver,
3877ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        *device_observer_list,
3878ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        OnNetworkDeviceChanged(this, device));
3879ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
3880ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() <<
3881ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          "There weren't supposed to be any property change observers of " <<
3882ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen           device->device_path();
3883ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3884ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
3885ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3886731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void NotifyCellularDataPlanChanged() {
3887513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    FOR_EACH_OBSERVER(CellularDataPlanObserver,
3888513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                      data_plan_observers_,
3889513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                      OnCellularDataPlanChanged(this));
3890731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
3891731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
3892ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void NotifyPinOperationCompleted(PinOperationError error) {
3893ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    FOR_EACH_OBSERVER(PinOperationObserver,
3894ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      pin_operation_observers_,
3895ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      OnPinOperationCompleted(this, error));
3896ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    sim_operation_ = SIM_OPERATION_NONE;
3897ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
3898ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3899ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void NotifyUserConnectionInitiated(const Network* network) {
3900dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    FOR_EACH_OBSERVER(UserActionObserver,
3901dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                      user_action_observers_,
3902dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                      OnConnectionInitiated(this, network));
39033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3904c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3905dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
3906ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Device updates.
3907ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3908ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void FlipSimPinRequiredStateIfNeeded() {
3909ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (sim_operation_ != SIM_OPERATION_CHANGE_REQUIRE_PIN)
3910ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
3911ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3912ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
3913ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (cellular) {
3914ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NetworkDevice* device = GetNetworkDeviceByPath(cellular->device_path());
3915ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (device->sim_pin_required() == SIM_PIN_NOT_REQUIRED)
3916ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        device->sim_pin_required_ = SIM_PIN_REQUIRED;
3917ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      else if (device->sim_pin_required() == SIM_PIN_REQUIRED)
3918ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        device->sim_pin_required_ = SIM_PIN_NOT_REQUIRED;
3919ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3920ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
3921ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3922ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void UpdateNetworkDeviceStatus(const char* path,
3923ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 const char* key,
3924ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 const Value* value) {
3925ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3926ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (key == NULL || value == NULL)
3927ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
3928ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDevice* device = GetNetworkDeviceByPath(path);
3929ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (device) {
3930ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      VLOG(1) << "UpdateNetworkDeviceStatus: " << device->name() << "." << key;
3931ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      int index = property_index_parser().Get(std::string(key));
3932ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!device->ParseValue(index, value)) {
3933ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        LOG(WARNING) << "UpdateNetworkDeviceStatus: Error parsing: "
3934ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     << path << "." << key;
3935ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      } else if (strcmp(key, kCellularAllowRoamingProperty) == 0) {
3936ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        bool settings_value =
3937ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            UserCrosSettingsProvider::cached_data_roaming_enabled();
3938ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        if (device->data_roaming_allowed() != settings_value) {
3939ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          // Switch back to signed settings value.
3940ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          SetCellularDataRoamingAllowed(settings_value);
3941ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          return;
3942ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        }
3943ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
3944ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Notify only observers on device property change.
3945ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NotifyNetworkDeviceChanged(device);
3946ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // If a device's power state changes, new properties may become
3947ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // defined.
3948ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (strcmp(key, kPoweredProperty) == 0) {
3949ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        RequestNetworkDeviceInfo(path, &NetworkDeviceUpdate, this);
3950ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
3951ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3952ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
3953ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3954ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ////////////////////////////////////////////////////////////////////////////
3955dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Service updates.
3956dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3957513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void UpdateNetworkStatus(const char* path,
3958513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                           const char* key,
3959513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                           const Value* value) {
3960dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3961513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (key == NULL || value == NULL)
3962513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return;
3963ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* network = FindNetworkByPath(path);
3964ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (network) {
3965ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      VLOG(2) << "UpdateNetworkStatus: " << network->name() << "." << key;
3966dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // Note: ParseValue is virtual.
3967dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      int index = property_index_parser().Get(std::string(key));
3968dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!network->ParseValue(index, value)) {
3969dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        LOG(WARNING) << "UpdateNetworkStatus: Error parsing: "
3970dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                     << path << "." << key;
3971dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3972dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      NotifyNetworkChanged(network);
3973ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Anything observing the manager needs to know about any service change.
3974ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NotifyNetworkManagerChanged(false);  // Not forced.
3975513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
3976dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3977dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3978dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
3979dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Data Plans.
3980513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3981dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const CellularDataPlan* GetSignificantDataPlanFromVector(
3982dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const CellularDataPlanVector* plans) const {
3983dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const CellularDataPlan* significant = NULL;
3984dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (CellularDataPlanVector::const_iterator iter = plans->begin();
3985dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != plans->end(); ++iter) {
3986dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // Set significant to the first plan or to first non metered base plan.
3987dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (significant == NULL ||
3988dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          significant->plan_type == CELLULAR_DATA_PLAN_METERED_BASE)
3989dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        significant = *iter;
3990dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3991dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return significant;
3992dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3993dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3994dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CellularNetwork::DataLeft GetDataLeft(
3995dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      CellularDataPlanVector* data_plans) {
3996dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const CellularDataPlan* plan = GetSignificantDataPlanFromVector(data_plans);
3997dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!plan)
3998dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return CellularNetwork::DATA_UNKNOWN;
3999dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (plan->plan_type == CELLULAR_DATA_PLAN_UNLIMITED) {
4000dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      base::TimeDelta remaining = plan->remaining_time();
4001dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (remaining <= base::TimeDelta::FromSeconds(0))
4002dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return CellularNetwork::DATA_NONE;
4003dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (remaining <= base::TimeDelta::FromSeconds(kCellularDataVeryLowSecs))
4004dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return CellularNetwork::DATA_VERY_LOW;
4005dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (remaining <= base::TimeDelta::FromSeconds(kCellularDataLowSecs))
4006dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return CellularNetwork::DATA_LOW;
4007dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return CellularNetwork::DATA_NORMAL;
4008dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (plan->plan_type == CELLULAR_DATA_PLAN_METERED_PAID ||
4009dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen               plan->plan_type == CELLULAR_DATA_PLAN_METERED_BASE) {
4010dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      int64 remaining = plan->remaining_data();
4011dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (remaining <= 0)
4012dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return CellularNetwork::DATA_NONE;
4013dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (remaining <= kCellularDataVeryLowBytes)
4014dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return CellularNetwork::DATA_VERY_LOW;
4015dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // For base plans, we do not care about low data.
4016dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (remaining <= kCellularDataLowBytes &&
4017dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          plan->plan_type != CELLULAR_DATA_PLAN_METERED_BASE)
4018dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return CellularNetwork::DATA_LOW;
4019dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return CellularNetwork::DATA_NORMAL;
4020dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
4021dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return CellularNetwork::DATA_UNKNOWN;
4022dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
4023dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4024dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateCellularDataPlan(const std::string& service_path,
4025dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                              const CellularDataPlanList* data_plan_list) {
4026ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "Updating cellular data plans for: " << service_path;
4027dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CellularDataPlanVector* data_plans = NULL;
4028dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Find and delete any existing data plans associated with |service_path|.
4029dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CellularDataPlanMap::iterator found = data_plan_map_.find(service_path);
4030dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (found != data_plan_map_.end()) {
4031dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      data_plans = found->second;
4032dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      data_plans->reset();  // This will delete existing data plans.
4033513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    } else {
4034dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      data_plans = new CellularDataPlanVector;
4035dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      data_plan_map_[service_path] = data_plans;
4036dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
4037dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (size_t i = 0; i < data_plan_list->plans_size; i++) {
4038dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const CellularDataPlanInfo* info(data_plan_list->GetCellularDataPlan(i));
4039ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      CellularDataPlan* plan = new CellularDataPlan(*info);
4040ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      data_plans->push_back(plan);
4041ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      VLOG(2) << " Plan: " << plan->GetPlanDesciption()
4042ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              << " : " << plan->GetDataRemainingDesciption();
4043dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
4044dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Now, update any matching cellular network's cached data
4045ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CellularNetwork* cellular = FindCellularNetworkByPath(service_path);
4046dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (cellular) {
4047dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      CellularNetwork::DataLeft data_left;
4048dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // If the network needs a new plan, then there's no data.
4049dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (cellular->needs_new_plan())
4050dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        data_left = CellularNetwork::DATA_NONE;
4051513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      else
4052dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        data_left = GetDataLeft(data_plans);
4053ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      VLOG(2) << " Data left: " << data_left
4054ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              << " Need plan: " << cellular->needs_new_plan();
4055dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      cellular->set_data_left(data_left);
4056513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
4057dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NotifyCellularDataPlanChanged();
4058513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4059513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4060dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
4061dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4062dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void Init() {
4063dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // First, get the currently available networks. This data is cached
4064dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // on the connman side, so the call should be quick.
4065dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (EnsureCrosLoaded()) {
4066dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      VLOG(1) << "Requesting initial network manager info from libcros.";
4067dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      RequestNetworkManagerInfo(&NetworkManagerUpdate, this);
4068dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
4069731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
4070731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
4071dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void InitTestData() {
4072dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    is_locked_ = false;
4073dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4074dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Devices
4075dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    int devices =
4076dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        (1 << TYPE_ETHERNET) | (1 << TYPE_WIFI) | (1 << TYPE_CELLULAR);
4077dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    available_devices_ = devices;
4078dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    enabled_devices_ = devices;
4079dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    connected_devices_ = devices;
4080dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4081ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDevice* cellular = new NetworkDevice("cellular");
4082ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_ptr<Value> cellular_type(Value::CreateStringValue(kTypeCellular));
4083ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular->ParseValue(PROPERTY_INDEX_TYPE, cellular_type.get());
4084ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular->IMSI_ = "123456789012345";
4085ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    device_map_["cellular"] = cellular;
4086ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4087dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Networks
4088dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ClearNetworks(true /*delete networks*/);
4089dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4090dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ethernet_ = new EthernetNetwork("eth1");
4091dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ethernet_->set_connected(true);
4092dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AddNetwork(ethernet_);
4093dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4094dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    WifiNetwork* wifi1 = new WifiNetwork("fw1");
4095dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi1->set_name("Fake Wifi Connected");
4096dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi1->set_strength(90);
4097dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi1->set_connected(true);
4098ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi1->set_active(true);
4099dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi1->set_encryption(SECURITY_NONE);
4100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AddNetwork(wifi1);
4101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    WifiNetwork* wifi2 = new WifiNetwork("fw2");
4103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi2->set_name("Fake Wifi");
4104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi2->set_strength(70);
4105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi2->set_connected(false);
4106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi2->set_encryption(SECURITY_NONE);
4107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AddNetwork(wifi2);
4108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    WifiNetwork* wifi3 = new WifiNetwork("fw3");
4110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi3->set_name("Fake Wifi Encrypted");
4111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi3->set_strength(60);
4112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi3->set_connected(false);
4113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi3->set_encryption(SECURITY_WEP);
4114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi3->set_passphrase_required(true);
4115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AddNetwork(wifi3);
4116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    WifiNetwork* wifi4 = new WifiNetwork("fw4");
4118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi4->set_name("Fake Wifi 802.1x");
4119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi4->set_strength(50);
4120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi4->set_connected(false);
4121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi4->set_connectable(false);
4122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi4->set_encryption(SECURITY_8021X);
4123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi4->set_identity("nobody@google.com");
4124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi4->set_cert_path("SETTINGS:key_id=3,cert_id=3,pin=111111");
4125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AddNetwork(wifi4);
4126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    WifiNetwork* wifi5 = new WifiNetwork("fw5");
4128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi5->set_name("Fake Wifi UTF-8 SSID ");
4129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi5->SetSsid("Fake Wifi UTF-8 SSID \u3042\u3044\u3046");
4130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi5->set_strength(25);
4131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi5->set_connected(false);
4132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddNetwork(wifi5);
4133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    WifiNetwork* wifi6 = new WifiNetwork("fw6");
4135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi6->set_name("Fake Wifi latin-1 SSID ");
4136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi6->SetSsid("Fake Wifi latin-1 SSID \xc0\xcb\xcc\xd6\xfb");
4137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi6->set_strength(20);
4138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi6->set_connected(false);
4139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddNetwork(wifi6);
4140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    active_wifi_ = wifi1;
4142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CellularNetwork* cellular1 = new CellularNetwork("fc1");
4144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cellular1->set_name("Fake Cellular");
4145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cellular1->set_strength(70);
4146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular1->set_connected(true);
4147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular1->set_active(true);
4148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cellular1->set_activation_state(ACTIVATION_STATE_ACTIVATED);
4149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cellular1->set_payment_url(std::string("http://www.google.com"));
4150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cellular1->set_usage_url(std::string("http://www.google.com"));
4151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cellular1->set_network_technology(NETWORK_TECHNOLOGY_EVDO);
4152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular1->set_roaming_state(ROAMING_STATE_ROAMING);
4153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CellularDataPlan* base_plan = new CellularDataPlan();
4155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    base_plan->plan_name = "Base plan";
4156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    base_plan->plan_type = CELLULAR_DATA_PLAN_METERED_BASE;
4157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    base_plan->plan_data_bytes = 100ll * 1024 * 1024;
4158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    base_plan->data_bytes_used = 75ll * 1024 * 1024;
4159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CellularDataPlanVector* data_plans = new CellularDataPlanVector();
4160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    data_plan_map_[cellular1->service_path()] = data_plans;
4161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    data_plans->push_back(base_plan);
4162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CellularDataPlan* paid_plan = new CellularDataPlan();
4164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    paid_plan->plan_name = "Paid plan";
4165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    paid_plan->plan_type = CELLULAR_DATA_PLAN_METERED_PAID;
4166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    paid_plan->plan_data_bytes = 5ll * 1024 * 1024 * 1024;
4167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    paid_plan->data_bytes_used = 3ll * 1024 * 1024 * 1024;
4168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    data_plans->push_back(paid_plan);
4169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AddNetwork(cellular1);
4171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    active_cellular_ = cellular1;
4172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CellularNetwork* cellular2 = new CellularNetwork("fc2");
4174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular2->set_name("Fake Cellular 2");
4175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular2->set_strength(70);
4176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular2->set_connected(true);
4177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular2->set_activation_state(ACTIVATION_STATE_ACTIVATED);
4178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular2->set_network_technology(NETWORK_TECHNOLOGY_UMTS);
4179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddNetwork(cellular2);
4180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4181dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Remembered Networks
4182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ClearRememberedNetworks(true /*delete networks*/);
4183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    WifiNetwork* remembered_wifi2 = new WifiNetwork("fw2");
4184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    remembered_wifi2->set_name("Fake Wifi 2");
4185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    remembered_wifi2->set_strength(70);
4186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    remembered_wifi2->set_connected(true);
4187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    remembered_wifi2->set_encryption(SECURITY_WEP);
4188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddRememberedWifiNetwork(remembered_wifi2);
4189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // VPNs.
4191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VirtualNetwork* vpn1 = new VirtualNetwork("fv1");
4192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn1->set_name("Fake VPN Provider 1");
4193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn1->set_server_hostname("vpn1server.fake.com");
4194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn1->set_provider_type(VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_PSK);
4195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn1->set_username("VPN User 1");
4196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn1->set_connected(false);
4197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddNetwork(vpn1);
4198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VirtualNetwork* vpn2 = new VirtualNetwork("fv2");
4200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn2->set_name("Fake VPN Provider 2");
4201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn2->set_server_hostname("vpn2server.fake.com");
4202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn2->set_provider_type(VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_USER_CERT);
4203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn2->set_username("VPN User 2");
4204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn2->set_connected(true);
4205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddNetwork(vpn2);
4206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VirtualNetwork* vpn3 = new VirtualNetwork("fv3");
4208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn3->set_name("Fake VPN Provider 3");
4209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn3->set_server_hostname("vpn3server.fake.com");
4210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn3->set_provider_type(VirtualNetwork::PROVIDER_TYPE_OPEN_VPN);
4211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn3->set_connected(false);
4212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddNetwork(vpn3);
4213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    active_virtual_ = vpn2;
4215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi_scanning_ = false;
4217dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    offline_mode_ = false;
4218513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4219513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4220513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Network manager observer list
4221513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ObserverList<NetworkManagerObserver> network_manager_observers_;
4222513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4223513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Cellular data plan observer list
4224513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ObserverList<CellularDataPlanObserver> data_plan_observers_;
4225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // PIN operation observer list.
4227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ObserverList<PinOperationObserver> pin_operation_observers_;
4228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4229dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // User action observer list
4230dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ObserverList<UserActionObserver> user_action_observers_;
4231dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4232513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Network observer map
4233513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  NetworkObserverMap network_observers_;
4234513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Network device observer map.
4236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NetworkDeviceObserverMap network_device_observers_;
4237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4238513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // For monitoring network manager status changes.
4239513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  PropertyChangeMonitor network_manager_monitor_;
4240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4241731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // For monitoring data plan changes to the connected cellular network.
4242731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DataPlanUpdateMonitor data_plan_monitor_;
4243731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
424472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Network login observer.
424572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<NetworkLoginObserver> network_login_observer_;
424672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4247dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // A service path based map of all Networks.
4248dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NetworkMap network_map_;
4249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // A unique_id_ based map of Networks.
4251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NetworkMap network_unique_id_map_;
4252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // A service path based map of all remembered Networks.
4254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NetworkMap remembered_network_map_;
4255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // A list of services that we are awaiting updates for.
4257dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PriorityMap network_update_requests_;
4258dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4259dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // A device path based map of all NetworkDevices.
4260dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NetworkDeviceMap device_map_;
4261dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4262dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // A network service path based map of all CellularDataPlanVectors.
4263dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CellularDataPlanMap data_plan_map_;
4264dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
42653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The ethernet network.
4266513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EthernetNetwork* ethernet_;
42673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The list of available wifi networks.
42693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  WifiNetworkVector wifi_networks_;
42703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The current connected (or connecting) wifi network.
4272dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  WifiNetwork* active_wifi_;
42733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The remembered wifi networks.
42753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  WifiNetworkVector remembered_wifi_networks_;
42763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The list of available cellular networks.
42783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CellularNetworkVector cellular_networks_;
42793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The current connected (or connecting) cellular network.
4281dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CellularNetwork* active_cellular_;
4282dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // The list of available virtual networks.
4284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  VirtualNetworkVector virtual_networks_;
4285dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // The current connected (or connecting) virtual network.
4287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  VirtualNetwork* active_virtual_;
4288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // The path of the active profile (for retrieving remembered services).
4290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string active_profile_path_;
42913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The current available network devices. Bitwise flag of ConnectionTypes.
42933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int available_devices_;
42943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The current enabled network devices. Bitwise flag of ConnectionTypes.
42963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int enabled_devices_;
42973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The current connected network devices. Bitwise flag of ConnectionTypes.
42993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int connected_devices_;
43003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4301201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // True if we are currently scanning for wifi networks.
4302201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool wifi_scanning_;
4303201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
4304201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Currently not implemented. TODO: implement or eliminate.
43053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool offline_mode_;
43063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
430772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // True if access network library is locked.
430872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool is_locked_;
430972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Type of pending SIM operation, SIM_OPERATION_NONE otherwise.
4311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SimOperationType sim_operation_;
4312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Delayed task to notify a network change.
4314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CancelableTask* notify_task_;
4315513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
431672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Cellular plan payment time.
431772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::Time cellular_plan_payment_time_;
431872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4319dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Temporary connection data for async connect calls.
4320dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  struct ConnectData {
4321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string service_name;
4322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string passphrase;
4323dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    std::string identity;
4324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string cert_path;
4325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string psk_key;
4326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string server_hostname;
4327dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
4328dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ConnectData connect_data_;
4329dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
43303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DISALLOW_COPY_AND_ASSIGN(NetworkLibraryImpl);
43313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
43323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
43333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass NetworkLibraryStubImpl : public NetworkLibrary {
43343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
4335513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  NetworkLibraryStubImpl()
4336513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      : ip_address_("1.1.1.1"),
4337dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        ethernet_(new EthernetNetwork("eth0")),
4338dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_wifi_(NULL),
4339dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_cellular_(NULL) {
4340513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4341513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ~NetworkLibraryStubImpl() { if (ethernet_) delete ethernet_; }
4342513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) {}
4343513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveNetworkManagerObserver(NetworkManagerObserver* observer) {}
4344513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddNetworkObserver(const std::string& service_path,
4345513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                  NetworkObserver* observer) {}
4346513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveNetworkObserver(const std::string& service_path,
4347513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     NetworkObserver* observer) {}
4348513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) {}
4349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void AddNetworkDeviceObserver(const std::string& device_path,
4350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        NetworkDeviceObserver* observer) {}
4351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RemoveNetworkDeviceObserver(const std::string& device_path,
4352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                           NetworkDeviceObserver* observer) {}
435372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Lock() {}
435472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Unlock() {}
4355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool IsLocked() { return false; }
4356513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddCellularDataPlanObserver(
4357513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      CellularDataPlanObserver* observer) {}
4358513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveCellularDataPlanObserver(
4359513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      CellularDataPlanObserver* observer) {}
4360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void AddPinOperationObserver(PinOperationObserver* observer) {}
4361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RemovePinOperationObserver(PinOperationObserver* observer) {}
4362dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void AddUserActionObserver(UserActionObserver* observer) {}
4363dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void RemoveUserActionObserver(UserActionObserver* observer) {}
4364dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
436521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual const EthernetNetwork* ethernet_network() const {
43663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return ethernet_;
43673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
43683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool ethernet_connecting() const { return false; }
43693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool ethernet_connected() const { return true; }
4370dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
437121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual const WifiNetwork* wifi_network() const {
4372dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_wifi_;
4373731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
43743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool wifi_connecting() const { return false; }
43753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool wifi_connected() const { return false; }
4376dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
437721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual const CellularNetwork* cellular_network() const {
4378dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_cellular_;
4379731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
43803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool cellular_connecting() const { return false; }
43813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool cellular_connected() const { return false; }
43823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4383dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const VirtualNetwork* virtual_network() const {
4384dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_virtual_;
4385dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
4386dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool virtual_network_connecting() const { return false; }
4387dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool virtual_network_connected() const { return false; }
4388dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
43893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool Connected() const { return true; }
43903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool Connecting() const { return false; }
43913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const std::string& IPAddress() const { return ip_address_; }
43923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual const WifiNetworkVector& wifi_networks() const {
43933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return wifi_networks_;
43943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
43953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual const WifiNetworkVector& remembered_wifi_networks() const {
43963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return wifi_networks_;
43973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
43983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual const CellularNetworkVector& cellular_networks() const {
43993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return cellular_networks_;
44003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4401dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const VirtualNetworkVector& virtual_networks() const {
4402dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return virtual_networks_;
4403dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
4404513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool has_cellular_networks() const {
4405513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return cellular_networks_.begin() != cellular_networks_.end();
44063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
44073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  /////////////////////////////////////////////////////////////////////////////
44083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4409dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const NetworkDevice* FindNetworkDeviceByPath(
4410dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const { return NULL; }
4411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const NetworkDevice* FindCellularDevice() const {
4412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
4413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const NetworkDevice* FindEthernetDevice() const {
4415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
4416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const NetworkDevice* FindWifiDevice() const {
4418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
4419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual Network* FindNetworkByPath(
4421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& path) const { return NULL; }
4422513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual WifiNetwork* FindWifiNetworkByPath(
4423dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const { return NULL; }
4424513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual CellularNetwork* FindCellularNetworkByPath(
4425dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const { return NULL; }
4426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual VirtualNetwork* FindVirtualNetworkByPath(
4427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& path) const { return NULL; }
4428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual Network* FindNetworkFromRemembered(
4429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const Network* remembered) const { return NULL; }
4430dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const CellularDataPlanVector* GetDataPlans(
4431dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const { return NULL; }
4432dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const CellularDataPlan* GetSignificantDataPlan(
4433dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const { return NULL; }
4434dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ChangePin(const std::string& old_pin,
4436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         const std::string& new_pin) {}
4437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ChangeRequirePin(bool require_pin, const std::string& pin) {}
4438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void EnterPin(const std::string& pin) {}
4439ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void UnblockPin(const std::string& puk, const std::string& new_pin) {}
4440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RequestCellularScan() {}
4441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RequestCellularRegister(const std::string& network_id) {}
4442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetCellularDataRoamingAllowed(bool new_value) {}
4443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RequestNetworkScan() {}
4445731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual bool GetWifiAccessPoints(WifiAccessPointVector* result) {
4446731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return false;
4447731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
4448731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
4449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToWifiNetwork(WifiNetwork* network) {}
4450ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToWifiNetwork(const std::string& service_path) {}
4451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToWifiNetwork(ConnectionSecurity security,
4452513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                    const std::string& ssid,
4453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    const std::string& passphrase,
4454731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                    const std::string& identity,
4455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    const std::string& certpath) {}
4456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToCellularNetwork(CellularNetwork* network) {}
4457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToVirtualNetwork(VirtualNetwork* network) {}
4458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToVirtualNetworkPSK(
4459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& service_name,
4460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& server,
4461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& psk,
4462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& username,
4463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& user_passphrase) {}
446472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void SignalCellularPlanPayment() {}
446572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool HasRecentCellularPlanPayment() { return false; }
4466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void DisconnectFromNetwork(const Network* network) {}
4467513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void ForgetWifiNetwork(const std::string& service_path) {}
4468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual std::string GetCellularHomeCarrierId() const { return std::string(); }
44693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool ethernet_available() const { return true; }
44703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool wifi_available() const { return false; }
44713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool cellular_available() const { return false; }
44723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool ethernet_enabled() const { return true; }
44733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool wifi_enabled() const { return false; }
44743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool cellular_enabled() const { return false; }
4475201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual bool wifi_scanning() const { return false; }
4476513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual const Network* active_network() const { return NULL; }
4477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const Network* connected_network() const { return NULL; }
44783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool offline_mode() const { return false; }
4479731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void EnableEthernetNetworkDevice(bool enable) {}
4480731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void EnableWifiNetworkDevice(bool enable) {}
4481731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void EnableCellularNetworkDevice(bool enable) {}
4482731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void EnableOfflineMode(bool enable) {}
4483731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual NetworkIPConfigVector GetIPConfigs(const std::string& device_path,
4484ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             std::string* hardware_address,
4485ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             HardwareAddressFormat) {
4486731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    hardware_address->clear();
44873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return NetworkIPConfigVector();
44883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
44893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
44903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
44913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string ip_address_;
4492513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EthernetNetwork* ethernet_;
4493dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  WifiNetwork* active_wifi_;
4494dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CellularNetwork* active_cellular_;
4495dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  VirtualNetwork* active_virtual_;
44963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  WifiNetworkVector wifi_networks_;
44973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CellularNetworkVector cellular_networks_;
4498dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  VirtualNetworkVector virtual_networks_;
44993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
45003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
45013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
45023345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickNetworkLibrary* NetworkLibrary::GetImpl(bool stub) {
45033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (stub)
45043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return new NetworkLibraryStubImpl();
45053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  else
45063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return new NetworkLibraryImpl();
4507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
4508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
45103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
45113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Allows InvokeLater without adding refcounting. This class is a Singleton and
45123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// won't be deleted until it's last InvokeLater is run.
45133345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickDISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::NetworkLibraryImpl);
4514