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(
6823dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      table, arraysize(table), ERROR_NO_ERROR);
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_) {
12043dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    case ERROR_NO_ERROR:
12053dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      // TODO(nkostylev): Introduce new error message "None" instead.
12063dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      return std::string();
1207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ERROR_OUT_OF_RANGE:
1208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_OUT_OF_RANGE);
1209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ERROR_PIN_MISSING:
1210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_PIN_MISSING);
1211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ERROR_DHCP_FAILED:
1212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_DHCP_FAILED);
1213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case ERROR_CONNECT_FAILED:
1214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ERROR_CONNECT_FAILED);
12163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case ERROR_BAD_PASSPHRASE:
1217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ERROR_BAD_PASSPHRASE);
12193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case ERROR_BAD_WEPKEY:
1220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_BAD_WEPKEY);
1221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ERROR_ACTIVATION_FAILED:
1222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ERROR_ACTIVATION_FAILED);
1224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ERROR_NEED_EVDO:
1225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_NEED_EVDO);
1226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ERROR_NEED_HOME_NETWORK:
1227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ERROR_NEED_HOME_NETWORK);
1229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ERROR_OTASP_FAILED:
1230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_OTASP_FAILED);
1231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ERROR_AAA_FAILED:
1232731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_ERROR_AAA_FAILED);
1233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1234731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_UNRECOGNIZED);
1235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid Network::InitIPAddress() {
12384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ip_address_.clear();
12394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // If connected, get ip config.
1240201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (EnsureCrosLoaded() && connected() && !device_path_.empty()) {
12414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    IPConfigStatus* ipconfig_status = ListIPConfigs(device_path_.c_str());
12424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    if (ipconfig_status) {
12434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      for (int i = 0; i < ipconfig_status->size; i++) {
12444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        IPConfig ipconfig = ipconfig_status->ips[i];
12454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        if (strlen(ipconfig.address) > 0) {
12464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          ip_address_ = ipconfig.address;
12474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          break;
12484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        }
12494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      }
12504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      FreeIPConfigStatus(ipconfig_status);
12514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
12524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
12534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
12544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
1256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// VirtualNetwork
1257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool VirtualNetwork::ParseProviderValue(int index, const Value* value) {
1259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (index) {
1260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_HOST:
1261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&server_hostname_);
1262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_NAME:
1263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Note: shadows Network::name_ property.
1264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&name_);
1265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_TYPE: {
1266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::string provider_type_string;
1267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->GetAsString(&provider_type_string)) {
1268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        provider_type_ = ParseProviderType(provider_type_string);
1269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    default:
1274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return false;
1277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool VirtualNetwork::ParseValue(int index, const Value* value) {
1280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (index) {
1281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_PROVIDER: {
1282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DCHECK_EQ(value->GetType(), Value::TYPE_DICTIONARY);
1283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const DictionaryValue* dict = static_cast<const DictionaryValue*>(value);
1284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      for (DictionaryValue::key_iterator iter = dict->begin_keys();
1285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen           iter != dict->end_keys(); ++iter) {
1286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        const std::string& key = *iter;
1287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        Value* v;
1288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        bool res = dict->GetWithoutPathExpansion(key, &v);
1289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        DCHECK(res);
1290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        if (res) {
1291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          int index = property_index_parser().Get(key);
1292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          if (!ParseProviderValue(index, v))
1293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            VLOG(1) << name() << ": Provider unhandled key: " << key
1294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    << " Type: " << v->GetType();
1295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        }
1296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return true;
1298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_L2TPIPSEC_CA_CERT:
1300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&ca_cert_);
1301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_L2TPIPSEC_PSK:
1302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&psk_passphrase_);
1303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_L2TPIPSEC_CERT:
1304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&user_cert_);
1305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_L2TPIPSEC_KEY:
1306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&user_cert_key_);
1307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_L2TPIPSEC_USER:
1308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&username_);
1309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_L2TPIPSEC_PASSWORD:
1310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&user_passphrase_);
1311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    default:
1312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return Network::ParseValue(index, value);
1313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return false;
1316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VirtualNetwork::ParseInfo(const DictionaryValue* info) {
1319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Network::ParseInfo(info);
1320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  VLOG(1) << "VPN: " << name()
1321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          << " Type: " << ProviderTypeToString(provider_type());
1322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (provider_type_ == PROVIDER_TYPE_L2TP_IPSEC_PSK) {
1323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!user_cert_.empty())
1324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      provider_type_ = PROVIDER_TYPE_L2TP_IPSEC_USER_CERT;
1325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool VirtualNetwork::NeedMoreInfoToConnect() const {
1329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (server_hostname_.empty() || username_.empty() || user_passphrase_.empty())
1330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return true;
1331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (provider_type_) {
1332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROVIDER_TYPE_L2TP_IPSEC_PSK:
1333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (psk_passphrase_.empty())
1334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1336ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROVIDER_TYPE_L2TP_IPSEC_USER_CERT:
1337ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROVIDER_TYPE_OPEN_VPN:
1338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (user_cert_.empty())
1339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROVIDER_TYPE_MAX:
1342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return false;
1345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VirtualNetwork::SetCACert(const std::string& ca_cert) {
1348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetStringProperty(kL2TPIPSecCACertProperty, ca_cert, &ca_cert_);
1349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VirtualNetwork::SetPSKPassphrase(const std::string& psk_passphrase) {
1352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetStringProperty(kL2TPIPSecPSKProperty, psk_passphrase,
1353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           &psk_passphrase_);
1354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VirtualNetwork::SetUserCert(const std::string& user_cert) {
1357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetStringProperty(kL2TPIPSecCertProperty, user_cert, &user_cert_);
1358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1359ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VirtualNetwork::SetUserCertKey(const std::string& key) {
1361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetStringProperty(kL2TPIPSecKeyProperty, key, &user_cert_key_);
1362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1363ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VirtualNetwork::SetUsername(const std::string& username) {
1365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetStringProperty(kL2TPIPSecUserProperty, username, &username_);
1366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VirtualNetwork::SetUserPassphrase(const std::string& user_passphrase) {
1369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetStringProperty(kL2TPIPSecPasswordProperty, user_passphrase,
1370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    &user_passphrase_);
1371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstd::string VirtualNetwork::GetProviderTypeString() const {
1374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (this->provider_type_) {
1375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROVIDER_TYPE_L2TP_IPSEC_PSK:
1376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringUTF8(
1377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_L2TP_IPSEC_PSK);
1378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROVIDER_TYPE_L2TP_IPSEC_USER_CERT:
1380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringUTF8(
1381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_L2TP_IPSEC_USER_CERT);
1382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROVIDER_TYPE_OPEN_VPN:
1384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringUTF8(
1385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_OPEN_VPN);
1386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    default:
1388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringUTF8(
1389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          IDS_CHROMEOS_NETWORK_ERROR_UNKNOWN);
1390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen////////////////////////////////////////////////////////////////////////////////
1395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WirelessNetwork
1396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1397dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool WirelessNetwork::ParseValue(int index, const Value* value) {
1398dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  switch (index) {
1399dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_SIGNAL_STRENGTH:
1400dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsInteger(&strength_);
1401dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    default:
1402dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return Network::ParseValue(index, value);
1403dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1404dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
1405dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return false;
1406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch////////////////////////////////////////////////////////////////////////////////
14094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// CellularDataPlan
14104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
14114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochstring16 CellularDataPlan::GetPlanDesciption() const {
14124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  switch (plan_type) {
14134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case chromeos::CELLULAR_DATA_PLAN_UNLIMITED: {
14144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      return l10n_util::GetStringFUTF16(
14154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PURCHASE_UNLIMITED_DATA,
141621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          base::TimeFormatFriendlyDate(plan_start_time));
14174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      break;
14184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
14194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case chromeos::CELLULAR_DATA_PLAN_METERED_PAID: {
14204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      return l10n_util::GetStringFUTF16(
14214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_PURCHASE_DATA,
14224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                FormatBytes(plan_data_bytes,
14234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                            GetByteDisplayUnits(plan_data_bytes),
14244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                            true),
142521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                base::TimeFormatFriendlyDate(plan_start_time));
14264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
14274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case chromeos::CELLULAR_DATA_PLAN_METERED_BASE: {
14284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      return l10n_util::GetStringFUTF16(
14294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_RECEIVED_FREE_DATA,
14304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                FormatBytes(plan_data_bytes,
14314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                            GetByteDisplayUnits(plan_data_bytes),
14324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                            true),
143321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                base::TimeFormatFriendlyDate(plan_start_time));
14344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    default:
14354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      break;
14364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
14374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
14384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  return string16();
14394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
14404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
14414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochstring16 CellularDataPlan::GetRemainingWarning() const {
14424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (plan_type == chromeos::CELLULAR_DATA_PLAN_UNLIMITED) {
14434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Time based plan. Show nearing expiration and data expiration.
1444201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (remaining_time().InSeconds() <= chromeos::kCellularDataVeryLowSecs) {
1445201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return GetPlanExpiration();
14464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
14474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  } else if (plan_type == chromeos::CELLULAR_DATA_PLAN_METERED_PAID ||
14484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch             plan_type == chromeos::CELLULAR_DATA_PLAN_METERED_BASE) {
14494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Metered plan. Show low data and out of data.
1450201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (remaining_data() <= chromeos::kCellularDataVeryLowBytes) {
1451dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      int64 remaining_mbytes = remaining_data() / (1024 * 1024);
14524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      return l10n_util::GetStringFUTF16(
14534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          IDS_NETWORK_DATA_REMAINING_MESSAGE,
1454dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          UTF8ToUTF16(base::Int64ToString(remaining_mbytes)));
14554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
14564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
14574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  return string16();
14584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
14594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
14604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochstring16 CellularDataPlan::GetDataRemainingDesciption() const {
1461201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int64 remaining_bytes = remaining_data();
14624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  switch (plan_type) {
14634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case chromeos::CELLULAR_DATA_PLAN_UNLIMITED: {
14644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      return l10n_util::GetStringUTF16(
14654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_UNLIMITED);
14664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
14674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case chromeos::CELLULAR_DATA_PLAN_METERED_PAID: {
1468201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return FormatBytes(remaining_bytes,
1469201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          GetByteDisplayUnits(remaining_bytes),
14704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          true);
14714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
14724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case chromeos::CELLULAR_DATA_PLAN_METERED_BASE: {
1473201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return FormatBytes(remaining_bytes,
1474201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          GetByteDisplayUnits(remaining_bytes),
14754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          true);
14764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
14774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    default:
14784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      break;
14794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
14804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  return string16();
14814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
14824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
14834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochstring16 CellularDataPlan::GetUsageInfo() const {
14844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (plan_type == chromeos::CELLULAR_DATA_PLAN_UNLIMITED) {
14854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Time based plan. Show nearing expiration and data expiration.
1486201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return GetPlanExpiration();
14874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  } else if (plan_type == chromeos::CELLULAR_DATA_PLAN_METERED_PAID ||
14884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch             plan_type == chromeos::CELLULAR_DATA_PLAN_METERED_BASE) {
14894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Metered plan. Show low data and out of data.
1490dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    int64 remaining_bytes = remaining_data();
1491dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (remaining_bytes == 0) {
1492dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return l10n_util::GetStringUTF16(
1493dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          IDS_NETWORK_DATA_NONE_AVAILABLE_MESSAGE);
1494dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (remaining_bytes < 1024 * 1024) {
1495dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return l10n_util::GetStringUTF16(
1496dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          IDS_NETWORK_DATA_LESS_THAN_ONE_MB_AVAILABLE_MESSAGE);
1497dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else {
1498dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      int64 remaining_mb = remaining_bytes / (1024 * 1024);
1499dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return l10n_util::GetStringFUTF16(
1500dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          IDS_NETWORK_DATA_MB_AVAILABLE_MESSAGE,
1501dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          UTF8ToUTF16(base::Int64ToString(remaining_mb)));
1502dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
15034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
15044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  return string16();
15054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
15064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
150772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstd::string CellularDataPlan::GetUniqueIdentifier() const {
150872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // A cellular plan is uniquely described by the union of name, type,
150972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // start time, end time, and max bytes.
151072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // So we just return a union of all these variables.
151172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return plan_name + "|" +
151272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      base::Int64ToString(plan_type) + "|" +
151372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      base::Int64ToString(plan_start_time.ToInternalValue()) + "|" +
151472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      base::Int64ToString(plan_end_time.ToInternalValue()) + "|" +
151572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      base::Int64ToString(plan_data_bytes);
151672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
151772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1518201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbase::TimeDelta CellularDataPlan::remaining_time() const {
1519201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  base::TimeDelta time = plan_end_time - base::Time::Now();
1520201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return time.InMicroseconds() < 0 ? base::TimeDelta() : time;
1521201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
1522201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
15234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochint64 CellularDataPlan::remaining_minutes() const {
1524201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return remaining_time().InMinutes();
1525201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
1526201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1527201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochint64 CellularDataPlan::remaining_data() const {
1528201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int64 data = plan_data_bytes - data_bytes_used;
1529201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return data < 0 ? 0 : data;
15304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
15314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
15324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochstring16 CellularDataPlan::GetPlanExpiration() const {
1533201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return TimeFormat::TimeRemaining(remaining_time());
15344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
1535731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
1537ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// CellularNetwork::Apn
1538ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1539ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CellularNetwork::Apn::Set(const DictionaryValue& dict) {
1540ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!dict.GetStringWithoutPathExpansion(kApnProperty, &apn))
1541ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    apn.clear();
1542ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!dict.GetStringWithoutPathExpansion(kNetworkIdProperty, &network_id))
1543ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    network_id.clear();
1544ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!dict.GetStringWithoutPathExpansion(kUsernameProperty, &username))
1545ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    username.clear();
1546ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!dict.GetStringWithoutPathExpansion(kPasswordProperty, &password))
1547ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    password.clear();
1548ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1549ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1550ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen////////////////////////////////////////////////////////////////////////////////
1551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CellularNetwork
1552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1553dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenCellularNetwork::~CellularNetwork() {
1554513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
1555513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1556dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool CellularNetwork::ParseValue(int index, const Value* value) {
1557dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  switch (index) {
1558dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_ACTIVATION_STATE: {
1559dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string activation_state_string;
1560dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (value->GetAsString(&activation_state_string)) {
1561ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        ActivationState prev_state = activation_state_;
1562dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        activation_state_ = ParseActivationState(activation_state_string);
1563ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        if (activation_state_ != prev_state)
1564ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          RefreshDataPlansIfNeeded();
1565ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1566ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1567ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1568ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1569ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_CELLULAR_APN: {
1570ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->IsType(Value::TYPE_DICTIONARY)) {
1571ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        apn_.Set(*static_cast<const DictionaryValue*>(value));
1572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1574ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1575ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1576ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_CELLULAR_LAST_GOOD_APN: {
1577ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->IsType(Value::TYPE_DICTIONARY)) {
1578ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        last_good_apn_.Set(*static_cast<const DictionaryValue*>(value));
1579dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return true;
1580dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
1581dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1582dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
1583dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_NETWORK_TECHNOLOGY: {
1584dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string network_technology_string;
1585dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (value->GetAsString(&network_technology_string)) {
1586dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        network_technology_ = ParseNetworkTechnology(network_technology_string);
1587dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return true;
1588dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
1589dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1590dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
1591dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_ROAMING_STATE: {
1592dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string roaming_state_string;
1593dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (value->GetAsString(&roaming_state_string)) {
1594dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        roaming_state_ = ParseRoamingState(roaming_state_string);
1595dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return true;
1596dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
1597dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1598dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
1599dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_OPERATOR_NAME:
1600dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&operator_name_);
1601dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_OPERATOR_CODE:
1602dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&operator_code_);
1603ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_SERVING_OPERATOR: {
1604ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->IsType(Value::TYPE_DICTIONARY)) {
1605ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        const DictionaryValue *dict =
1606ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            static_cast<const DictionaryValue*>(value);
1607ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        operator_code_.clear();
1608ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        operator_country_.clear();
1609ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        operator_name_.clear();
1610ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        dict->GetStringWithoutPathExpansion(kOperatorNameKey,
1611ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            &operator_name_);
1612ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        dict->GetStringWithoutPathExpansion(kOperatorCodeKey,
1613ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            &operator_code_);
1614ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        dict->GetStringWithoutPathExpansion(kOperatorCountryKey,
1615ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            &operator_country_);
1616ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1617ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1618ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1619ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1620dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_PAYMENT_URL:
1621dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&payment_url_);
1622dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_USAGE_URL:
1623dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&usage_url_);
1624ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_STATE: {
1625ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Save previous state before calling WirelessNetwork::ParseValue.
1626ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ConnectionState prev_state = state_;
1627ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (WirelessNetwork::ParseValue(index, value)) {
1628ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        if (state_ != prev_state)
1629ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          RefreshDataPlansIfNeeded();
1630ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1631ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1632ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1633ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1634ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_CONNECTIVITY_STATE: {
1635ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Save previous state before calling WirelessNetwork::ParseValue.
1636ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ConnectivityState prev_state = connectivity_state_;
1637ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (WirelessNetwork::ParseValue(index, value)) {
1638ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        if (connectivity_state_ != prev_state)
1639ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          RefreshDataPlansIfNeeded();
1640ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1641ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1642ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1643ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1644dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    default:
1645dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return WirelessNetwork::ParseValue(index, value);
1646dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
1647dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return false;
1648513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
1649513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
16503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool CellularNetwork::StartActivation() const {
1651731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!EnsureCrosLoaded())
1652731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return false;
1653dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return ActivateCellularModem(service_path().c_str(), NULL);
1654731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
1655731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1656ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CellularNetwork::RefreshDataPlansIfNeeded() const {
1657ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!EnsureCrosLoaded())
1658ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
1659ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (connected() && activated())
1660ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    RequestCellularDataPlanUpdate(service_path().c_str());
1661ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1662ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1663ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CellularNetwork::SetApn(const Apn& apn) {
1664ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!EnsureCrosLoaded())
1665ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
1666ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1667ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!apn.apn.empty()) {
1668ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DictionaryValue value;
1669ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    value.SetString(kApnProperty, apn.apn);
1670ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    value.SetString(kNetworkIdProperty, apn.network_id);
1671ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    value.SetString(kUsernameProperty, apn.username);
1672ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    value.SetString(kPasswordProperty, apn.password);
1673ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SetValueProperty(kCellularApnProperty, &value);
1674ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
1675ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ClearProperty(kCellularApnProperty);
1676ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1677ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1678ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1679ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool CellularNetwork::SupportsDataPlan() const {
1680ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(nkostylev): Are there cases when only one of this is defined?
1681ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return !usage_url().empty() || !payment_url().empty();
1682ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1683ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1684731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstd::string CellularNetwork::GetNetworkTechnologyString() const {
1685731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // No need to localize these cellular technology abbreviations.
1686731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  switch (network_technology_) {
1687731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_1XRTT:
1688731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "1xRTT";
1689731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1690731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_EVDO:
1691731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "EVDO";
1692731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1693731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_GPRS:
1694731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "GPRS";
1695731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1696731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_EDGE:
1697731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "EDGE";
1698731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1699731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_UMTS:
1700731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "UMTS";
1701731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1702731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_HSPA:
1703731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "HSPA";
1704731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1705731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_HSPA_PLUS:
1706731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "HSPA Plus";
1707731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1708731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_LTE:
1709731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "LTE";
1710731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1711731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NETWORK_TECHNOLOGY_LTE_ADVANCED:
1712731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return "LTE Advanced";
1713731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1714731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    default:
1715731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1716731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_CELLULAR_TECHNOLOGY_UNKNOWN);
1717731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1718731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
1719731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
1720731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1721201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochstd::string CellularNetwork::GetConnectivityStateString() const {
1722201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // These strings do not appear in the UI, so no need to localize them
1723201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  switch (connectivity_state_) {
1724201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case CONN_STATE_UNRESTRICTED:
1725201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return "unrestricted";
1726201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      break;
1727201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case CONN_STATE_RESTRICTED:
1728201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return "restricted";
1729201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      break;
1730201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case CONN_STATE_NONE:
1731201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return "none";
1732201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      break;
1733201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case CONN_STATE_UNKNOWN:
1734201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    default:
1735201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return "unknown";
1736201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
1737201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
1738201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1739513209b27ff55e2841eac0e4120199c23acce758Ben Murdochstd::string CellularNetwork::ActivationStateToString(
1740513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ActivationState activation_state) {
1741513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  switch (activation_state) {
1742731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ACTIVATION_STATE_ACTIVATED:
1743731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1744731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ACTIVATION_STATE_ACTIVATED);
1745731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1746731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ACTIVATION_STATE_ACTIVATING:
1747731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1748731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ACTIVATION_STATE_ACTIVATING);
1749731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1750731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ACTIVATION_STATE_NOT_ACTIVATED:
1751731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1752731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ACTIVATION_STATE_NOT_ACTIVATED);
1753731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1754731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ACTIVATION_STATE_PARTIALLY_ACTIVATED:
1755731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1756731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ACTIVATION_STATE_PARTIALLY_ACTIVATED);
1757731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1758731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    default:
1759731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1760731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ACTIVATION_STATE_UNKNOWN);
1761731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1762731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
1763731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
1764731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1765513209b27ff55e2841eac0e4120199c23acce758Ben Murdochstd::string CellularNetwork::GetActivationStateString() const {
1766513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return ActivationStateToString(this->activation_state_);
1767513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
1768513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1769731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstd::string CellularNetwork::GetRoamingStateString() const {
1770731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  switch (this->roaming_state_) {
1771731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ROAMING_STATE_HOME:
1772731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1773731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ROAMING_STATE_HOME);
1774731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1775731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case ROAMING_STATE_ROAMING:
1776731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1777731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ROAMING_STATE_ROAMING);
1778731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1779731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    default:
1780731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return l10n_util::GetStringUTF8(
1781731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick          IDS_CHROMEOS_NETWORK_ROAMING_STATE_UNKNOWN);
1782731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
1783dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
1784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
1787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WifiNetwork
1788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1789ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Called from ParseNetwork after calling ParseInfo.
1790ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::CalculateUniqueId() {
1791ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ConnectionSecurity encryption = encryption_;
1792ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Flimflam treats wpa and rsn as psk internally, so convert those types
1793ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // to psk for unique naming.
1794ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (encryption == SECURITY_WPA || encryption == SECURITY_RSN)
1795ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    encryption = SECURITY_PSK;
1796ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string security = std::string(SecurityToString(encryption));
1797ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  unique_id_ = security + "|" + name_;
1798ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1799ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1800ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool WifiNetwork::SetSsid(const std::string& ssid) {
1801ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Detects encoding and convert to UTF-8.
1802ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string ssid_utf8;
1803ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!IsStringUTF8(ssid)) {
1804ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string encoding;
1805ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (base::DetectEncoding(ssid, &encoding)) {
1806ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!base::ConvertToUtf8AndNormalize(ssid, encoding, &ssid_utf8)) {
1807ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        ssid_utf8.clear();
1808ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1809ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1810ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1811ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1812ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (ssid_utf8.empty())
1813ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SetName(ssid);
1814ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  else
1815ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SetName(ssid_utf8);
1816ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1817ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
1818ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1819ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1820ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool WifiNetwork::SetHexSsid(const std::string& ssid_hex) {
1821ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Converts ascii hex dump (eg. "49656c6c6f") to string (eg. "Hello").
1822ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<uint8> ssid_raw;
1823ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!base::HexStringToBytes(ssid_hex, &ssid_raw)) {
1824ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    LOG(ERROR) << "Iligal hex char is found in WiFi.HexSSID.";
1825ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ssid_raw.clear();
1826ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
1827ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1828ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1829ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return SetSsid(std::string(ssid_raw.begin(), ssid_raw.end()));
1830ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1831ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1832dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool WifiNetwork::ParseValue(int index, const Value* value) {
1833dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  switch (index) {
1834ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_WIFI_HEX_SSID: {
1835ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::string ssid_hex;
1836ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!value->GetAsString(&ssid_hex))
1837ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return false;
1838ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1839ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetHexSsid(ssid_hex);
1840ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return true;
1841ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1842ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_NAME: {
1843ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Does not change network name when it was already set by WiFi.HexSSID.
1844ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!name().empty())
1845ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1846ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      else
1847ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return WirelessNetwork::ParseValue(index, value);
1848ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1849dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_SECURITY: {
1850dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string security_string;
1851dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (value->GetAsString(&security_string)) {
1852dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        encryption_ = ParseSecurity(security_string);
1853dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return true;
1854dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
1855dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
1856dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
1857ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_PASSPHRASE: {
1858ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::string passphrase;
1859ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->GetAsString(&passphrase)) {
1860ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // Only store the passphrase if we are the owner.
1861ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // TODO(stevenjb): Remove this when chromium-os:12948 is resolved.
1862ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        if (chromeos::UserManager::Get()->current_user_is_owner())
1863ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          passphrase_ = passphrase;
1864ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1865ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1866ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1867ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1868dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_PASSPHRASE_REQUIRED:
1869dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsBoolean(&passphrase_required_);
1870ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_SAVE_CREDENTIALS:
1871ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsBoolean(&save_credentials_);
1872dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_IDENTITY:
1873dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&identity_);
1874dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PROPERTY_INDEX_CERT_PATH:
1875dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return value->GetAsString(&cert_path_);
1876ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_IDENTITY:
1877ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&eap_identity_);
1878ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_METHOD: {
1879ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::string method;
1880ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->GetAsString(&method)) {
1881ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        eap_method_ = ParseEAPMethod(method);
1882ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1883ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1884ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1885ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1886ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_PHASE_2_AUTH: {
1887ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::string auth;
1888ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (value->GetAsString(&auth)) {
1889ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        eap_phase_2_auth_ = ParseEAPPhase2Auth(auth);
1890ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return true;
1891ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
1892ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1893ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1894ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_ANONYMOUS_IDENTITY:
1895ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&eap_anonymous_identity_);
1896ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_CERT_ID:
1897ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&eap_client_cert_pkcs11_id_);
1898ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_CA_CERT_NSS:
1899ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&eap_server_ca_cert_nss_nickname_);
1900ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_USE_SYSTEM_CAS:
1901ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsBoolean(&eap_use_system_cas_);
1902ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_PASSWORD:
1903ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return value->GetAsString(&eap_passphrase_);
1904ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_CLIENT_CERT:
1905ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_CLIENT_CERT_NSS:
1906ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_PRIVATE_KEY:
1907ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_PRIVATE_KEY_PASSWORD:
1908ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_KEY_ID:
1909ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_CA_CERT:
1910ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_CA_CERT_ID:
1911ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_PIN:
1912ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case PROPERTY_INDEX_EAP_KEY_MGMT:
1913ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // These properties are currently not used in the UI.
1914ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return true;
1915dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    default:
1916dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return WirelessNetwork::ParseValue(index, value);
1917dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
1918dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return false;
1919731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
1920731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1921ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::ParseInfo(const DictionaryValue* info) {
1922ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Network::ParseInfo(info);
1923ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CalculateUniqueId();
1924ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1925ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1926ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string& WifiNetwork::GetPassphrase() const {
1927ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!user_passphrase_.empty())
1928ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return user_passphrase_;
1929ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return passphrase_;
1930ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1931ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1932dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid WifiNetwork::SetPassphrase(const std::string& passphrase) {
1933ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Set the user_passphrase_ only; passphrase_ stores the flimflam value.
1934ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // If the user sets an empty passphrase, restore it to the passphrase
1935ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // remembered by flimflam.
1936ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!passphrase.empty()) {
1937ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    user_passphrase_ = passphrase;
1938ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    passphrase_ = passphrase;
1939ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
1940ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    user_passphrase_ = passphrase_;
1941ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1942ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Send the change to flimflam. If the format is valid, it will propagate to
1943ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // passphrase_ with a service update.
1944ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetOrClearStringProperty(kPassphraseProperty, passphrase, NULL);
1945ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1946ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1947ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetSaveCredentials(bool save_credentials) {
1948ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetBooleanProperty(kSaveCredentialsProperty, save_credentials,
1949ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     &save_credentials_);
1950ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1951ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1952ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// See src/third_party/flimflam/doc/service-api.txt for properties that
1953ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// flimflam will forget when SaveCredentials is false.
1954ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::EraseCredentials() {
1955ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WipeString(&passphrase_);
1956ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WipeString(&user_passphrase_);
1957ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WipeString(&eap_client_cert_pkcs11_id_);
1958ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WipeString(&eap_identity_);
1959ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WipeString(&eap_anonymous_identity_);
1960ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WipeString(&eap_passphrase_);
1961513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
1962513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1963dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid WifiNetwork::SetIdentity(const std::string& identity) {
1964ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetStringProperty(kIdentityProperty, identity, &identity_);
1965731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
1966731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1967dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid WifiNetwork::SetCertPath(const std::string& cert_path) {
1968ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetStringProperty(kCertPathProperty, cert_path, &cert_path_);
1969ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1970ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1971ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetEAPMethod(EAPMethod method) {
1972ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  eap_method_ = method;
1973ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (method) {
1974ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_METHOD_PEAP:
1975ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapMethodProperty, kEapMethodPEAP, NULL);
1976ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1977ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_METHOD_TLS:
1978ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapMethodProperty, kEapMethodTLS, NULL);
1979ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1980ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_METHOD_TTLS:
1981ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapMethodProperty, kEapMethodTTLS, NULL);
1982ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1983ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_METHOD_LEAP:
1984ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapMethodProperty, kEapMethodLEAP, NULL);
1985ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1986ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    default:
1987ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ClearProperty(kEapMethodProperty);
1988ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1989ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1990ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1991ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1992ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetEAPPhase2Auth(EAPPhase2Auth auth) {
1993ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  eap_phase_2_auth_ = auth;
1994ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool is_peap = (eap_method_ == EAP_METHOD_PEAP);
1995ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (auth) {
1996ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_PHASE_2_AUTH_AUTO:
1997ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ClearProperty(kEapPhase2AuthProperty);
1998ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
1999ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_PHASE_2_AUTH_MD5:
2000ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapPhase2AuthProperty,
2001ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        is_peap ? kEapPhase2AuthPEAPMD5
2002ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                : kEapPhase2AuthTTLSMD5,
2003ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        NULL);
2004ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
2005ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_PHASE_2_AUTH_MSCHAPV2:
2006ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapPhase2AuthProperty,
2007ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        is_peap ? kEapPhase2AuthPEAPMSCHAPV2
2008ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                : kEapPhase2AuthTTLSMSCHAPV2,
2009ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        NULL);
2010ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
2011ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_PHASE_2_AUTH_MSCHAP:
2012ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapPhase2AuthProperty, kEapPhase2AuthTTLSMSCHAP, NULL);
2013ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
2014ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_PHASE_2_AUTH_PAP:
2015ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapPhase2AuthProperty, kEapPhase2AuthTTLSPAP, NULL);
2016ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
2017ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case EAP_PHASE_2_AUTH_CHAP:
2018ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStringProperty(kEapPhase2AuthProperty, kEapPhase2AuthTTLSCHAP, NULL);
2019ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
2020ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2021ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
2022ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2023ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetEAPServerCaCertNssNickname(
2024ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const std::string& nss_nickname) {
2025ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  VLOG(1) << "SetEAPServerCaCertNssNickname " << nss_nickname;
2026ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetOrClearStringProperty(kEapCaCertNssProperty, nss_nickname,
2027ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           &eap_server_ca_cert_nss_nickname_);
2028ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
2029ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2030ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetEAPClientCertPkcs11Id(const std::string& pkcs11_id) {
2031ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  VLOG(1) << "SetEAPClientCertPkcs11Id " << pkcs11_id;
2032ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetOrClearStringProperty(kEapCertIDProperty, pkcs11_id,
2033ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           &eap_client_cert_pkcs11_id_);
2034ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
2035ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2036ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetEAPUseSystemCAs(bool use_system_cas) {
2037ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetBooleanProperty(kEapUseSystemCAsProperty, use_system_cas,
2038ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     &eap_use_system_cas_);
2039ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
2040ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2041ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetEAPIdentity(const std::string& identity) {
2042ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetOrClearStringProperty(kEapIdentityProperty, identity, &eap_identity_);
2043ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
2044ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2045ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetEAPAnonymousIdentity(const std::string& identity) {
2046ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetOrClearStringProperty(kEapAnonymousIdentityProperty, identity,
2047ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           &eap_anonymous_identity_);
2048ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
2049ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2050ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WifiNetwork::SetEAPPassphrase(const std::string& passphrase) {
2051ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetOrClearStringProperty(kEapPasswordProperty, passphrase, &eap_passphrase_);
2052c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2053c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2054ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstd::string WifiNetwork::GetEncryptionString() const {
2055c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (encryption_) {
2056c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SECURITY_UNKNOWN:
2057c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
2058c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SECURITY_NONE:
2059c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "";
2060c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SECURITY_WEP:
2061c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "WEP";
2062c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SECURITY_WPA:
2063c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "WPA";
2064c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SECURITY_RSN:
2065c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "RSN";
2066c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SECURITY_8021X:
2067c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "8021X";
2068ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case SECURITY_PSK:
2069ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return "PSK";
2070c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2071731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return "Unknown";
2072731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
2073731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
207421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool WifiNetwork::IsPassphraseRequired() const {
207521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // TODO(stevenjb): Remove error_ tests when fixed in flimflam
207621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // (http://crosbug.com/10135).
207721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (error_ == ERROR_BAD_PASSPHRASE || error_ == ERROR_BAD_WEPKEY)
207821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return true;
2079ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // For 802.1x networks, configuration is required if connectable is false.
2080ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (encryption_ == SECURITY_8021X)
2081ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return !connectable_;
208221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return passphrase_required_;
208321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
208421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
2085731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Parse 'path' to determine if the certificate is stored in a pkcs#11 device.
2086731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// flimflam recognizes the string "SETTINGS:" to specify authentication
2087731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// parameters. 'key_id=' indicates that the certificate is stored in a pkcs#11
2088731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// device. See src/third_party/flimflam/files/doc/service-api.txt.
2089731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool WifiNetwork::IsCertificateLoaded() const {
2090731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static const std::string settings_string("SETTINGS:");
2091731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static const std::string pkcs11_key("key_id");
2092731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (cert_path_.find(settings_string) == 0) {
2093731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    std::string::size_type idx = cert_path_.find(pkcs11_key);
2094731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (idx != std::string::npos)
2095731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      idx = cert_path_.find_first_not_of(kWhitespaceASCII,
2096731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                         idx + pkcs11_key.length());
2097731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (idx != std::string::npos && cert_path_[idx] == '=')
2098731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return true;
2099731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
2100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return false;
2101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
2102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////////
2104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NetworkLibrary
2105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass NetworkLibraryImpl : public NetworkLibrary  {
21073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
21083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  NetworkLibraryImpl()
2109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      : network_manager_monitor_(NULL),
2110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        data_plan_monitor_(NULL),
2111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        ethernet_(NULL),
2112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_wifi_(NULL),
2113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_cellular_(NULL),
2114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_virtual_(NULL),
21153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        available_devices_(0),
21163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        enabled_devices_(0),
21173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        connected_devices_(0),
2118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        wifi_scanning_(false),
2119513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        offline_mode_(false),
212072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        is_locked_(false),
2121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        sim_operation_(SIM_OPERATION_NONE),
2122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        notify_task_(NULL) {
2123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (EnsureCrosLoaded()) {
21243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      Init();
2125513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      network_manager_monitor_ =
2126513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          MonitorNetworkManager(&NetworkManagerStatusChangedHandler,
2127513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                this);
2128513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      data_plan_monitor_ = MonitorCellularDataPlan(&DataPlanUpdateHandler,
2129513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                                   this);
213072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      network_login_observer_.reset(new NetworkLoginObserver(this));
21313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    } else {
21323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      InitTestData();
21333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
21343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~NetworkLibraryImpl() {
2137513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    network_manager_observers_.Clear();
2138513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (network_manager_monitor_)
2139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      DisconnectPropertyChangeMonitor(network_manager_monitor_);
2140513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    data_plan_observers_.Clear();
2141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    pin_operation_observers_.Clear();
2142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    user_action_observers_.Clear();
2143513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (data_plan_monitor_)
2144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      DisconnectDataPlanUpdateMonitor(data_plan_monitor_);
2145513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    STLDeleteValues(&network_observers_);
2146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    STLDeleteValues(&network_device_observers_);
2147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ClearNetworks(true /*delete networks*/);
2148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ClearRememberedNetworks(true /*delete networks*/);
2149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    STLDeleteValues(&data_plan_map_);
2150513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2151513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
2152513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) {
2153513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!network_manager_observers_.HasObserver(observer))
2154513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      network_manager_observers_.AddObserver(observer);
2155513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2156513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
2157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveNetworkManagerObserver(NetworkManagerObserver* observer) {
2158513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    network_manager_observers_.RemoveObserver(observer);
2159513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2160513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
2161513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddNetworkObserver(const std::string& service_path,
2162513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                  NetworkObserver* observer) {
2163513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DCHECK(observer);
2164513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!EnsureCrosLoaded())
2165513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return;
2166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // First, add the observer to the callback map.
2167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NetworkObserverMap::iterator iter = network_observers_.find(service_path);
2168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NetworkObserverList* oblist;
2169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (iter != network_observers_.end()) {
2170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      oblist = iter->second;
2171513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    } else {
2172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      oblist = new NetworkObserverList(this, service_path);
2173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      network_observers_[service_path] = oblist;
2174513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
2175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!oblist->HasObserver(observer))
2176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      oblist->AddObserver(observer);
2177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
2179513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveNetworkObserver(const std::string& service_path,
2180513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     NetworkObserver* observer) {
2181513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DCHECK(observer);
2182513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DCHECK(service_path.size());
2183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NetworkObserverMap::iterator map_iter =
2184513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        network_observers_.find(service_path);
2185513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (map_iter != network_observers_.end()) {
2186513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      map_iter->second->RemoveObserver(observer);
2187513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      if (!map_iter->second->size()) {
2188513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        delete map_iter->second;
2189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_observers_.erase(map_iter);
2190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
2191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
2192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void AddNetworkDeviceObserver(const std::string& device_path,
2195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        NetworkDeviceObserver* observer) {
2196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(observer);
2197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!EnsureCrosLoaded())
2198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // First, add the observer to the callback map.
2200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDeviceObserverMap::iterator iter =
2201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_device_observers_.find(device_path);
2202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDeviceObserverList* oblist;
2203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (iter != network_device_observers_.end()) {
2204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      oblist = iter->second;
2205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!oblist->HasObserver(observer))
2206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        oblist->AddObserver(observer);
2207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
2208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(WARNING) << "No NetworkDeviceObserverList found for "
2209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   << device_path;
2210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RemoveNetworkDeviceObserver(const std::string& device_path,
2214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                           NetworkDeviceObserver* observer) {
2215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(observer);
2216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(device_path.size());
2217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDeviceObserverMap::iterator map_iter =
2218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_device_observers_.find(device_path);
2219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (map_iter != network_device_observers_.end()) {
2220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      map_iter->second->RemoveObserver(observer);
2221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2224513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) {
2225513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DCHECK(observer);
2226513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NetworkObserverMap::iterator map_iter = network_observers_.begin();
2227513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    while (map_iter != network_observers_.end()) {
2228513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      map_iter->second->RemoveObserver(observer);
2229513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      if (!map_iter->second->size()) {
2230513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        delete map_iter->second;
2231513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        network_observers_.erase(map_iter++);
2232513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      } else {
2233513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        ++map_iter;
2234513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
2235513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
22363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
223872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Lock() {
223972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (is_locked_)
224072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return;
224172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    is_locked_ = true;
2242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotifyNetworkManagerChanged(true);  // Forced update.
224372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
224472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
224572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Unlock() {
224672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DCHECK(is_locked_);
224772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (!is_locked_)
224872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return;
224972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    is_locked_ = false;
2250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotifyNetworkManagerChanged(true);  // Forced update.
225172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
225272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
225372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool IsLocked() {
225472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return is_locked_;
225572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
225672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2257513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddCellularDataPlanObserver(CellularDataPlanObserver* observer) {
2258513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!data_plan_observers_.HasObserver(observer))
2259513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      data_plan_observers_.AddObserver(observer);
22603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2262513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveCellularDataPlanObserver(
2263513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      CellularDataPlanObserver* observer) {
2264513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    data_plan_observers_.RemoveObserver(observer);
2265513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void AddPinOperationObserver(PinOperationObserver* observer) {
2268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!pin_operation_observers_.HasObserver(observer))
2269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      pin_operation_observers_.AddObserver(observer);
2270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RemovePinOperationObserver(PinOperationObserver* observer) {
2273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    pin_operation_observers_.RemoveObserver(observer);
2274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2276dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void AddUserActionObserver(UserActionObserver* observer) {
2277dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!user_action_observers_.HasObserver(observer))
2278dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      user_action_observers_.AddObserver(observer);
2279dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2281dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void RemoveUserActionObserver(UserActionObserver* observer) {
2282dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    user_action_observers_.RemoveObserver(observer);
2283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
228521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual const EthernetNetwork* ethernet_network() const { return ethernet_; }
2286513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool ethernet_connecting() const {
2287513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return ethernet_ ? ethernet_->connecting() : false;
2288513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2289513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool ethernet_connected() const {
2290513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return ethernet_ ? ethernet_->connected() : false;
2291513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2293dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const WifiNetwork* wifi_network() const { return active_wifi_; }
2294513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool wifi_connecting() const {
2295dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_wifi_ ? active_wifi_->connecting() : false;
2296513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2297513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool wifi_connected() const {
2298dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_wifi_ ? active_wifi_->connected() : false;
2299513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2300513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
2301dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const CellularNetwork* cellular_network() const {
2302dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_cellular_;
2303dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2304513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool cellular_connecting() const {
2305dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_cellular_ ? active_cellular_->connecting() : false;
2306513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2307513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool cellular_connected() const {
2308dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_cellular_ ? active_cellular_->connected() : false;
2309dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2310dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const VirtualNetwork* virtual_network() const {
2311dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_virtual_;
2312dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool virtual_network_connecting() const {
2314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_virtual_ ? active_virtual_->connecting() : false;
2315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2316dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool virtual_network_connected() const {
2317dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_virtual_ ? active_virtual_->connected() : false;
2318513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool Connected() const {
23213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return ethernet_connected() || wifi_connected() || cellular_connected();
23223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool Connecting() const {
23253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return ethernet_connecting() || wifi_connecting() || cellular_connecting();
23263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const std::string& IPAddress() const {
2329513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Returns IP address for the active network.
2330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // TODO(stevenjb): Fix this for VPNs. See chromium-os:13972.
2331dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const Network* result = active_network();
2332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!result)
2333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      result = connected_network();  // happens if we are connected to a VPN.
2334dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!result)
2335dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      result = ethernet_;  // Use non active ethernet addr if no active network.
2336dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (result)
2337dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return result->ip_address();
2338513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    static std::string null_address("0.0.0.0");
2339513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return null_address;
23403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual const WifiNetworkVector& wifi_networks() const {
23433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return wifi_networks_;
23443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual const WifiNetworkVector& remembered_wifi_networks() const {
23473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return remembered_wifi_networks_;
2348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual const CellularNetworkVector& cellular_networks() const {
23513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return cellular_networks_;
2352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2354dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const VirtualNetworkVector& virtual_networks() const {
2355dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return virtual_networks_;
2356dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2357dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
23583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  /////////////////////////////////////////////////////////////////////////////
23593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2360dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const NetworkDevice* FindNetworkDeviceByPath(
2361dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const {
2362dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkDeviceMap::const_iterator iter = device_map_.find(path);
2363dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (iter != device_map_.end())
2364dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return iter->second;
2365dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    LOG(WARNING) << "Device path not found: " << path;
2366dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return NULL;
2367dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2368dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const NetworkDevice* FindCellularDevice() const {
2370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    for (NetworkDeviceMap::const_iterator iter = device_map_.begin();
2371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         iter != device_map_.end(); ++iter) {
2372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (iter->second->type() == TYPE_CELLULAR)
2373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return iter->second;
2374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const NetworkDevice* FindEthernetDevice() const {
2379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    for (NetworkDeviceMap::const_iterator iter = device_map_.begin();
2380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         iter != device_map_.end(); ++iter) {
2381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (iter->second->type() == TYPE_ETHERNET)
2382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return iter->second;
2383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const NetworkDevice* FindWifiDevice() const {
2388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    for (NetworkDeviceMap::const_iterator iter = device_map_.begin();
2389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         iter != device_map_.end(); ++iter) {
2390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (iter->second->type() == TYPE_WIFI)
2391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return iter->second;
2392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual Network* FindNetworkByPath(const std::string& path) const {
2397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkMap::const_iterator iter = network_map_.find(path);
2398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (iter != network_map_.end())
2399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return iter->second;
2400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  WirelessNetwork* FindWirelessNetworkByPath(const std::string& path) const {
2404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* network = FindNetworkByPath(path);
2405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (network &&
2406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        (network->type() == TYPE_WIFI || network->type() == TYPE_CELLULAR))
2407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return static_cast<WirelessNetwork*>(network);
2408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual WifiNetwork* FindWifiNetworkByPath(const std::string& path) const {
2412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* network = FindNetworkByPath(path);
2413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (network && network->type() == TYPE_WIFI)
2414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return static_cast<WifiNetwork*>(network);
2415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual CellularNetwork* FindCellularNetworkByPath(
2419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& path) const {
2420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* network = FindNetworkByPath(path);
2421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (network && network->type() == TYPE_CELLULAR)
2422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return static_cast<CellularNetwork*>(network);
2423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2424ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual VirtualNetwork* FindVirtualNetworkByPath(
2427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& path) const {
2428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* network = FindNetworkByPath(path);
2429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (network && network->type() == TYPE_VPN)
2430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return static_cast<VirtualNetwork*>(network);
2431ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual Network* FindNetworkFromRemembered(
2435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const Network* remembered) const {
2436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkMap::const_iterator found =
2437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_unique_id_map_.find(remembered->unique_id());
2438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (found != network_unique_id_map_.end())
2439ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return found->second;
2440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const CellularDataPlanVector* GetDataPlans(
2444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& path) const {
2445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CellularDataPlanMap::const_iterator iter = data_plan_map_.find(path);
2446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (iter == data_plan_map_.end())
2447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return NULL;
2448ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // If we need a new plan, then ignore any data plans we have.
2449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CellularNetwork* cellular = FindCellularNetworkByPath(path);
2450ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (cellular && cellular->needs_new_plan())
2451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return NULL;
2452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return iter->second;
2453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2454ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const CellularDataPlan* GetSignificantDataPlan(
2456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& path) const {
2457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const CellularDataPlanVector* plans = GetDataPlans(path);
2458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (plans)
2459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return GetSignificantDataPlanFromVector(plans);
2460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
2461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  /////////////////////////////////////////////////////////////////////////////
2464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ChangePin(const std::string& old_pin,
2466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         const std::string& new_pin) {
2467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
2468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!cellular) {
2469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() << "Calling ChangePin method w/o cellular device.";
2470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    sim_operation_ = SIM_OPERATION_CHANGE_PIN;
2473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    chromeos::RequestChangePin(cellular->device_path().c_str(),
2474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               old_pin.c_str(), new_pin.c_str(),
2475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               PinOperationCallback, this);
2476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ChangeRequirePin(bool require_pin,
2479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                const std::string& pin) {
2480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "ChangeRequirePin require_pin: " << require_pin
2481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            << " pin: " << pin;
2482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
2483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!cellular) {
2484ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() << "Calling ChangeRequirePin method w/o cellular device.";
2485ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2486ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2487ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    sim_operation_ = SIM_OPERATION_CHANGE_REQUIRE_PIN;
2488ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    chromeos::RequestRequirePin(cellular->device_path().c_str(),
2489ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                pin.c_str(), require_pin,
2490ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                PinOperationCallback, this);
2491ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2492ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2493ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void EnterPin(const std::string& pin) {
2494ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
2495ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!cellular) {
2496ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() << "Calling EnterPin method w/o cellular device.";
2497ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2498ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2499ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    sim_operation_ = SIM_OPERATION_ENTER_PIN;
2500ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    chromeos::RequestEnterPin(cellular->device_path().c_str(),
2501ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              pin.c_str(),
2502ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              PinOperationCallback, this);
2503ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2504ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2505ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void UnblockPin(const std::string& puk,
2506ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          const std::string& new_pin) {
2507ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
2508ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!cellular) {
2509ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() << "Calling UnblockPin method w/o cellular device.";
2510ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2511ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2512ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    sim_operation_ = SIM_OPERATION_UNBLOCK_PIN;
2513ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    chromeos::RequestUnblockPin(cellular->device_path().c_str(),
2514ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                puk.c_str(), new_pin.c_str(),
2515ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                PinOperationCallback, this);
2516ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2517ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2518ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static void PinOperationCallback(void* object,
2519ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   const char* path,
2520ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   NetworkMethodErrorType error,
2521ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   const char* error_message) {
2522ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
2523ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(networklib);
2524ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PinOperationError pin_error;
2525ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "PinOperationCallback, error: " << error
2526ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            << " error_msg: " << error_message;
2527ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (error == chromeos::NETWORK_METHOD_ERROR_NONE) {
2528ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      pin_error = PIN_ERROR_NONE;
2529ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      VLOG(1) << "Pin operation completed successfuly";
2530ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // TODO(nkostylev): Might be cleaned up and exposed in flimflam API.
2531ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // http://crosbug.com/14253
2532ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Since this option state is not exposed we have to update it manually.
2533ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      networklib->FlipSimPinRequiredStateIfNeeded();
2534ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
2535ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (error_message &&
2536ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            (strcmp(error_message, kErrorIncorrectPinMsg) == 0 ||
2537ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen             strcmp(error_message, kErrorPinRequiredMsg) == 0)) {
2538ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        pin_error = PIN_ERROR_INCORRECT_CODE;
2539ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      } else if (error_message &&
2540ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                 strcmp(error_message, kErrorPinBlockedMsg) == 0) {
2541ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        pin_error = PIN_ERROR_BLOCKED;
2542ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      } else {
2543ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        pin_error = PIN_ERROR_UNKNOWN;
2544ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        NOTREACHED() << "Unknown PIN error: " << error_message;
2545ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
2546ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2547ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    networklib->NotifyPinOperationCompleted(pin_error);
2548ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2549ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2550ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RequestCellularScan() {
2551ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
2552ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!cellular) {
2553ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() << "Calling RequestCellularScan method w/o cellular device.";
2554ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2555ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2556ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    chromeos::ProposeScan(cellular->device_path().c_str());
25573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2559ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RequestCellularRegister(const std::string& network_id) {
2560ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
2561ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!cellular) {
2562ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() << "Calling CellularRegister method w/o cellular device.";
2563ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2564ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2565ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    chromeos::RequestCellularRegister(cellular->device_path().c_str(),
2566ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      network_id.c_str(),
2567ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      CellularRegisterCallback,
2568ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      this);
2569dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2570dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2571ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static void CellularRegisterCallback(void* object,
2572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       const char* path,
2573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       NetworkMethodErrorType error,
2574ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       const char* error_message) {
2575ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
2576ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(networklib);
2577ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // TODO(dpolukhin): Notify observers about network registration status
2578ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // but not UI doesn't assume such notification so just ignore result.
2579dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2580dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2581ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetCellularDataRoamingAllowed(bool new_value) {
2582ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
2583ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!cellular) {
2584ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() << "Calling SetCellularDataRoamingAllowed method "
2585ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      "w/o cellular device.";
2586ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2587ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2588ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_ptr<Value> value(Value::CreateBooleanValue(new_value));
2589ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    chromeos::SetNetworkDeviceProperty(cellular->device_path().c_str(),
2590ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       kCellularAllowRoamingProperty,
2591ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       value.get());
25923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2594ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  /////////////////////////////////////////////////////////////////////////////
2595ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2596ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RequestNetworkScan() {
2597ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (EnsureCrosLoaded()) {
2598ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (wifi_enabled()) {
2599ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        wifi_scanning_ = true;  // Cleared when updates are received.
2600ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        chromeos::RequestNetworkScan(kTypeWifi);
2601ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        RequestRememberedNetworksUpdate();
2602ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
2603ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (cellular_network())
2604ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        cellular_network()->RefreshDataPlansIfNeeded();
2605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
26063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2608731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual bool GetWifiAccessPoints(WifiAccessPointVector* result) {
2609731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!EnsureCrosLoaded())
26103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return false;
2611dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
26123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DeviceNetworkList* network_list = GetDeviceNetworkList();
26133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (network_list == NULL)
2614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return false;
26153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    result->clear();
26163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    result->reserve(network_list->network_size);
26173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const base::Time now = base::Time::Now();
26183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    for (size_t i = 0; i < network_list->network_size; ++i) {
26193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      DCHECK(network_list->networks[i].address);
26203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      DCHECK(network_list->networks[i].name);
26213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      WifiAccessPoint ap;
2622731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ap.mac_address = SafeString(network_list->networks[i].address);
2623731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ap.name = SafeString(network_list->networks[i].name);
26243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      ap.timestamp = now -
26253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          base::TimeDelta::FromSeconds(network_list->networks[i].age_seconds);
26263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      ap.signal_strength = network_list->networks[i].strength;
26273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      ap.channel = network_list->networks[i].channel;
26283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      result->push_back(ap);
2629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
26303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    FreeDeviceNetworkList(network_list);
26313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return true;
26323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2634ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static void NetworkConnectCallback(void *object,
2635ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     const char *path,
2636ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     NetworkMethodErrorType error,
2637ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     const char* error_message) {
2638ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
2639ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(networklib);
2640ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2641ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* network = networklib->FindNetworkByPath(path);
2642ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!network) {
2643ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(ERROR) << "No network for path: " << path;
2644ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2645dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
2646ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2647ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (error != NETWORK_METHOD_ERROR_NONE) {
2648ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(WARNING) << "Error from ServiceConnect callback for: "
2649ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   << network->name()
2650ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   << " Error: " << error << " Message: " << error_message;
2651ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (error_message &&
2652ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          strcmp(error_message, kErrorPassphraseRequiredMsg) == 0) {
2653ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // This will trigger the connection failed notification.
2654ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // TODO(stevenjb): Remove if chromium-os:13203 gets fixed.
2655ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network->set_state(STATE_FAILURE);
2656ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network->set_error(ERROR_BAD_PASSPHRASE);
2657ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        networklib->NotifyNetworkManagerChanged(true);  // Forced update.
2658ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
2659ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2660ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2661ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2662ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "Connected to service: " << network->name();
2663ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2664ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Update local cache and notify listeners.
2665ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (network->type() == TYPE_WIFI) {
2666ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      WifiNetwork* wifi = static_cast<WifiNetwork *>(network);
2667ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // If the user asked not to save credentials, flimflam will have
2668ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // forgotten them.  Wipe our cache as well.
2669ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!wifi->save_credentials()) {
2670ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        wifi->EraseCredentials();
2671ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
2672ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      networklib->active_wifi_ = wifi;
2673ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else if (network->type() == TYPE_CELLULAR) {
2674ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      networklib->active_cellular_ = static_cast<CellularNetwork *>(network);
2675ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else if (network->type() == TYPE_VPN) {
2676ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      networklib->active_virtual_ = static_cast<VirtualNetwork *>(network);
2677ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
2678ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(ERROR) << "Network of unexpected type: " << network->type();
2679ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2680ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2681ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // If we succeed, this network will be remembered; request an update.
2682ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // TODO(stevenjb): flimflam should do this automatically.
2683ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    networklib->RequestRememberedNetworksUpdate();
2684ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Notify observers.
2685ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    networklib->NotifyNetworkManagerChanged(true);  // Forced update.
2686ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    networklib->NotifyUserConnectionInitiated(network);
2687dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2688dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2689ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2690ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void CallConnectToNetwork(Network* network) {
2691dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(network);
2692dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!EnsureCrosLoaded() || !network)
2693ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2694ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // In order to be certain to trigger any notifications, set the connecting
2695ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // state locally and notify observers. Otherwise there might be a state
2696ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // change without a forced notify.
2697ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    network->set_connecting(true);
2698ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotifyNetworkManagerChanged(true);  // Forced update.
2699ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    RequestNetworkServiceConnect(network->service_path().c_str(),
2700ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 NetworkConnectCallback, this);
2701ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2702ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2703ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToWifiNetwork(WifiNetwork* wifi) {
2704ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // This will happen if a network resets or gets out of range.
2705ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (wifi->user_passphrase_ != wifi->passphrase_ ||
2706ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        wifi->passphrase_required())
2707ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      wifi->SetPassphrase(wifi->user_passphrase_);
2708ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CallConnectToNetwork(wifi);
2709dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2710dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2711dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Use this to connect to a wifi network by service path.
2712ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToWifiNetwork(const std::string& service_path) {
2713ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    WifiNetwork* wifi = FindWifiNetworkByPath(service_path);
2714dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!wifi) {
2715dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      LOG(WARNING) << "Attempt to connect to non existing network: "
2716dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                   << service_path;
2717ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2718dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
2719ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ConnectToWifiNetwork(wifi);
27203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2722dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Use this to connect to an unlisted wifi network.
2723dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // This needs to request information about the named service.
2724dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // The connection attempt will occur in the callback.
2725ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToWifiNetwork(ConnectionSecurity security,
2726513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                    const std::string& ssid,
2727ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    const std::string& passphrase,
2728731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                    const std::string& identity,
2729ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    const std::string& certpath) {
2730513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!EnsureCrosLoaded())
2731ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2732ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Store the connection data to be used by the callback.
2733ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.service_name = ssid;
2734ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.passphrase = passphrase;
2735ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.identity = identity;
2736ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.cert_path = certpath;
2737ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Asynchronously request service properties and call
2738ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // WifiServiceUpdateAndConnect.
2739dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    RequestHiddenWifiNetwork(ssid.c_str(),
2740dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             SecurityToString(security),
2741dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             WifiServiceUpdateAndConnect,
2742dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             this);
2743dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2744dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2745dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Callback
2746dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void WifiServiceUpdateAndConnect(void* object,
2747dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                          const char* service_path,
2748dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                          const Value* info) {
2749dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
2750dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(networklib);
2751dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (service_path && info) {
2752dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      DCHECK_EQ(info->GetType(), Value::TYPE_DICTIONARY);
2753dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const DictionaryValue* dict = static_cast<const DictionaryValue*>(info);
2754dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      Network* network =
2755dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          networklib->ParseNetwork(std::string(service_path), dict);
2756ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DCHECK(network->type() == TYPE_WIFI);
2757ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      networklib->ConnectToWifiNetworkUsingConnectData(
2758ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          static_cast<WifiNetwork*>(network));
2759dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
2760dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
2761dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2762ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void ConnectToWifiNetworkUsingConnectData(WifiNetwork* wifi) {
2763dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ConnectData& data = connect_data_;
2764ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (wifi->name() != data.service_name) {
2765ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(WARNING) << "Wifi network name does not match ConnectData: "
2766ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   << wifi->name() << " != " << data.service_name;
2767dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return;
2768dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
2769ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi->set_added(true);
2770ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi->SetIdentity(data.identity);
2771ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi->SetPassphrase(data.passphrase);
2772ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!data.cert_path.empty())
2773ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      wifi->SetCertPath(data.cert_path);
2774ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2775ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ConnectToWifiNetwork(wifi);
2776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2778ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToCellularNetwork(CellularNetwork* cellular) {
2779ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CallConnectToNetwork(cellular);
2780731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
2781731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
278272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Records information that cellular play payment had happened.
278372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void SignalCellularPlanPayment() {
278472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DCHECK(!HasRecentCellularPlanPayment());
278572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    cellular_plan_payment_time_ = base::Time::Now();
278672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
278772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
278872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Returns true if cellular plan payment had been recorded recently.
278972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool HasRecentCellularPlanPayment() {
279072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return (base::Time::Now() -
2791dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            cellular_plan_payment_time_).InHours() < kRecentPlanPaymentHours;
279272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
279372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2794ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToVirtualNetwork(VirtualNetwork* vpn) {
2795ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CallConnectToNetwork(vpn);
2796ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2797ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2798ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToVirtualNetworkPSK(
2799ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& service_name,
2800ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& server,
2801ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& psk,
2802ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& username,
2803ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& user_passphrase) {
2804ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!EnsureCrosLoaded())
2805ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2806ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Store the connection data to be used by the callback.
2807ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.service_name = service_name;
2808ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.psk_key = psk;
2809ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.server_hostname = server;
2810ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.identity = username;
2811ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    connect_data_.passphrase = user_passphrase;
2812ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    RequestVirtualNetwork(service_name.c_str(),
2813ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          server.c_str(),
2814ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          kProviderL2tpIpsec,
2815ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          VPNServiceUpdateAndConnect,
2816ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          this);
2817ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2818ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2819ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Callback
2820ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static void VPNServiceUpdateAndConnect(void* object,
2821ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                         const char* service_path,
2822ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                         const Value* info) {
2823ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
2824ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(networklib);
2825ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (service_path && info) {
2826ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      VLOG(1) << "Connecting to new VPN Service: " << service_path;
2827ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DCHECK_EQ(info->GetType(), Value::TYPE_DICTIONARY);
2828ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const DictionaryValue* dict = static_cast<const DictionaryValue*>(info);
2829ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Network* network =
2830ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          networklib->ParseNetwork(std::string(service_path), dict);
2831ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DCHECK(network->type() == TYPE_VPN);
2832ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      networklib->ConnectToVirtualNetworkUsingConnectData(
2833ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          static_cast<VirtualNetwork*>(network));
2834ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
2835ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(WARNING) << "Unable to create VPN Service: " << service_path;
2836ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2837ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2838ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2839ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void ConnectToVirtualNetworkUsingConnectData(VirtualNetwork* vpn) {
2840ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ConnectData& data = connect_data_;
2841ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (vpn->name() != data.service_name) {
2842ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(WARNING) << "Virtual network name does not match ConnectData: "
2843ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                   << vpn->name() << " != " << data.service_name;
2844ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
2845ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
2846ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2847ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->set_added(true);
2848ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->set_server_hostname(data.server_hostname);
2849ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->SetCACert("");
2850ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->SetUserCert("");
2851ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->SetUserCertKey("");
2852ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->SetPSKPassphrase(data.psk_key);
2853ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->SetUsername(data.identity);
2854ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->SetUserPassphrase(data.passphrase);
2855ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2856ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CallConnectToNetwork(vpn);
2857ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2858ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2859ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void DisconnectFromNetwork(const Network* network) {
2860513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DCHECK(network);
2861513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!EnsureCrosLoaded() || !network)
2862513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return;
2863ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "Disconnect from network: " << network->service_path();
2864ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (chromeos::DisconnectFromNetwork(network->service_path().c_str())) {
2865513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // Update local cache and notify listeners.
2866ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Network* found_network = FindNetworkByPath(network->service_path());
2867ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (found_network) {
2868ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        found_network->set_connected(false);
2869ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        if (found_network == active_wifi_)
2870dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          active_wifi_ = NULL;
2871ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        else if (found_network == active_cellular_)
2872dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          active_cellular_ = NULL;
2873ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        else if (found_network == active_virtual_)
2874ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          active_virtual_ = NULL;
28753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      }
2876ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NotifyNetworkManagerChanged(true);  // Forced update.
28773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
28783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2879c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2880513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void ForgetWifiNetwork(const std::string& service_path) {
2881513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!EnsureCrosLoaded())
2882513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return;
2883ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DeleteRememberedService(service_path.c_str());
2884ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DeleteRememberedWifiNetwork(service_path);
2885ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotifyNetworkManagerChanged(true);  // Forced update.
2886ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2887ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2888ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual std::string GetCellularHomeCarrierId() const {
2889ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string carrier_id;
2890ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
2891ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (cellular) {
2892ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return cellular->home_provider_id();
2893ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
28943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
2895ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return carrier_id;
2896c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool ethernet_available() const {
28993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return available_devices_ & (1 << TYPE_ETHERNET);
29003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
29013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool wifi_available() const {
29023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return available_devices_ & (1 << TYPE_WIFI);
29033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
29043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool cellular_available() const {
29053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return available_devices_ & (1 << TYPE_CELLULAR);
2906c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2907c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool ethernet_enabled() const {
29093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return enabled_devices_ & (1 << TYPE_ETHERNET);
29103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
29113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool wifi_enabled() const {
29123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return enabled_devices_ & (1 << TYPE_WIFI);
29133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
29143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool cellular_enabled() const {
29153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return enabled_devices_ & (1 << TYPE_CELLULAR);
2916c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2917c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2918201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual bool wifi_scanning() const {
2919201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return wifi_scanning_;
2920201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
2921201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
29223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool offline_mode() const { return offline_mode_; }
2923c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2924dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Note: This does not include any virtual networks.
2925513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual const Network* active_network() const {
2926dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Use flimflam's ordering of the services to determine what the active
2927dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // network is (i.e. don't assume priority of network types).
2928dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Network* result = NULL;
2929513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (ethernet_ && ethernet_->is_active())
2930dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      result = ethernet_;
2931ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if ((active_wifi_ && active_wifi_->is_active()) &&
2932ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        (!result ||
2933ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         active_wifi_->priority_order_ < result->priority_order_))
2934ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      result = active_wifi_;
2935ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if ((active_cellular_ && active_cellular_->is_active()) &&
2936ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        (!result ||
2937ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         active_cellular_->priority_order_ < result->priority_order_))
2938ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      result = active_cellular_;
2939ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return result;
2940ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
2941ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
2942ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const Network* connected_network() const {
2943ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Use flimflam's ordering of the services to determine what the connected
2944ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // network is (i.e. don't assume priority of network types).
2945ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* result = NULL;
2946ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (ethernet_ && ethernet_->connected())
2947ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      result = ethernet_;
2948ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if ((active_wifi_ && active_wifi_->connected()) &&
2949ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        (!result ||
2950ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         active_wifi_->priority_order_ < result->priority_order_))
2951dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      result = active_wifi_;
2952ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if ((active_cellular_ && active_cellular_->connected()) &&
2953ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        (!result ||
2954ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         active_cellular_->priority_order_ < result->priority_order_))
2955dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      result = active_cellular_;
2956dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return result;
2957513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2958513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
2959731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void EnableEthernetNetworkDevice(bool enable) {
296072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (is_locked_)
296172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return;
29623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EnableNetworkDeviceType(TYPE_ETHERNET, enable);
2963c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2964c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2965731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void EnableWifiNetworkDevice(bool enable) {
296672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (is_locked_)
296772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return;
29683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EnableNetworkDeviceType(TYPE_WIFI, enable);
2969c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2970c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2971731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void EnableCellularNetworkDevice(bool enable) {
297272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (is_locked_)
297372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return;
29743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EnableNetworkDeviceType(TYPE_CELLULAR, enable);
29753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2976c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2977731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void EnableOfflineMode(bool enable) {
2978731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!EnsureCrosLoaded())
29793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
2980c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // If network device is already enabled/disabled, then don't do anything.
29823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (enable && offline_mode_) {
2983513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      VLOG(1) << "Trying to enable offline mode when it's already enabled.";
29843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
29853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
29863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!enable && !offline_mode_) {
2987513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      VLOG(1) << "Trying to disable offline mode when it's already disabled.";
29883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
29893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
2990c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (SetOfflineMode(enable)) {
29923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      offline_mode_ = enable;
29933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
2994c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2996731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual NetworkIPConfigVector GetIPConfigs(const std::string& device_path,
2997ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             std::string* hardware_address,
2998ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             HardwareAddressFormat format) {
2999ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(hardware_address);
3000731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    hardware_address->clear();
30013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    NetworkIPConfigVector ipconfig_vector;
3002731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (EnsureCrosLoaded() && !device_path.empty()) {
30033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      IPConfigStatus* ipconfig_status = ListIPConfigs(device_path.c_str());
30043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (ipconfig_status) {
30053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        for (int i = 0; i < ipconfig_status->size; i++) {
30063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          IPConfig ipconfig = ipconfig_status->ips[i];
30073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          ipconfig_vector.push_back(
30083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              NetworkIPConfig(device_path, ipconfig.type, ipconfig.address,
30093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              ipconfig.netmask, ipconfig.gateway,
30103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              ipconfig.name_servers));
30113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        }
3012731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        *hardware_address = ipconfig_status->hardware_address;
30133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        FreeIPConfigStatus(ipconfig_status);
30143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        // Sort the list of ip configs by type.
30153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        std::sort(ipconfig_vector.begin(), ipconfig_vector.end());
3016c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
3017c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
3018c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3019ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    for (size_t i = 0; i < hardware_address->size(); ++i)
3020ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      (*hardware_address)[i] = toupper((*hardware_address)[i]);
3021ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (format == FORMAT_COLON_SEPARATED_HEX) {
3022ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (hardware_address->size() % 2 == 0) {
3023ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        std::string output;
3024ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        for (size_t i = 0; i < hardware_address->size(); ++i) {
3025ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          if ((i != 0) && (i % 2 == 0))
3026ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            output.push_back(':');
3027ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          output.push_back((*hardware_address)[i]);
3028ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        }
3029ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        *hardware_address = output;
30304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      }
3031ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
3032ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DCHECK(format == FORMAT_RAW_HEX);
30333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
3034ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return ipconfig_vector;
3035c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
3036c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
3038513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3039dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  typedef std::map<std::string, Network*> NetworkMap;
3040dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  typedef std::map<std::string, int> PriorityMap;
3041dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  typedef std::map<std::string, NetworkDevice*> NetworkDeviceMap;
3042dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  typedef std::map<std::string, CellularDataPlanVector*> CellularDataPlanMap;
3043dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3044513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  class NetworkObserverList : public ObserverList<NetworkObserver> {
3045513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch   public:
3046513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NetworkObserverList(NetworkLibraryImpl* library,
3047513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                        const std::string& service_path) {
3048513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      network_monitor_ = MonitorNetworkService(&NetworkStatusChangedHandler,
3049513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                               service_path.c_str(),
3050513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                               library);
3051513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
3052513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3053513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    virtual ~NetworkObserverList() {
3054513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      if (network_monitor_)
3055513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        DisconnectPropertyChangeMonitor(network_monitor_);
3056513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
3057513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3058513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch   private:
3059513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    static void NetworkStatusChangedHandler(void* object,
3060513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            const char* path,
3061513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            const char* key,
3062513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            const Value* value) {
3063513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3064513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      DCHECK(networklib);
3065513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      networklib->UpdateNetworkStatus(path, key, value);
3066513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
3067513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    PropertyChangeMonitor network_monitor_;
3068ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DISALLOW_COPY_AND_ASSIGN(NetworkObserverList);
3069513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  };
3070513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3071513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  typedef std::map<std::string, NetworkObserverList*> NetworkObserverMap;
3072513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3073ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  class NetworkDeviceObserverList : public ObserverList<NetworkDeviceObserver> {
3074ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   public:
3075ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDeviceObserverList(NetworkLibraryImpl* library,
3076ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              const std::string& device_path) {
3077ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      device_monitor_ = MonitorNetworkDevice(
3078ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          &NetworkDevicePropertyChangedHandler,
3079ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          device_path.c_str(),
3080ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          library);
3081ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3082ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3083ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    virtual ~NetworkDeviceObserverList() {
3084ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (device_monitor_)
3085ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        DisconnectPropertyChangeMonitor(device_monitor_);
3086ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3087ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3088ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   private:
3089ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    static void NetworkDevicePropertyChangedHandler(void* object,
3090ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                    const char* path,
3091ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                    const char* key,
3092ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                    const Value* value) {
3093ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3094ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DCHECK(networklib);
3095ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      networklib->UpdateNetworkDeviceStatus(path, key, value);
3096ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3097ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    PropertyChangeMonitor device_monitor_;
3098ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DISALLOW_COPY_AND_ASSIGN(NetworkDeviceObserverList);
3099ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
3100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef std::map<std::string, NetworkDeviceObserverList*>
3102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NetworkDeviceObserverMap;
3103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
3105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Callbacks.
3106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static void NetworkManagerStatusChangedHandler(void* object,
3108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                                 const char* path,
3109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                                 const char* key,
3110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                                 const Value* value) {
3111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DCHECK(networklib);
3113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    networklib->NetworkManagerStatusChanged(key, value);
31143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // This processes all Manager update messages.
3117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void NetworkManagerStatusChanged(const char* key, const Value* value) {
3118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    base::TimeTicks start = base::TimeTicks::Now();
3120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    VLOG(1) << "NetworkManagerStatusChanged: KEY=" << key;
3121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!key)
3122513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return;
3123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    int index = property_index_parser().Get(std::string(key));
3124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    switch (index) {
3125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_STATE:
3126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Currently we ignore the network manager state.
3127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_AVAILABLE_TECHNOLOGIES: {
3129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(value->GetType(), Value::TYPE_LIST);
3130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const ListValue* vlist = static_cast<const ListValue*>(value);
3131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        UpdateAvailableTechnologies(vlist);
3132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      }
3134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_ENABLED_TECHNOLOGIES: {
3135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(value->GetType(), Value::TYPE_LIST);
3136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const ListValue* vlist = static_cast<const ListValue*>(value);
3137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        UpdateEnabledTechnologies(vlist);
3138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_CONNECTED_TECHNOLOGIES: {
3141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(value->GetType(), Value::TYPE_LIST);
3142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const ListValue* vlist = static_cast<const ListValue*>(value);
3143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        UpdateConnectedTechnologies(vlist);
3144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_DEFAULT_TECHNOLOGY:
3147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Currently we ignore DefaultTechnology.
3148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_OFFLINE_MODE: {
3150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(value->GetType(), Value::TYPE_BOOLEAN);
3151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        value->GetAsBoolean(&offline_mode_);
3152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        NotifyNetworkManagerChanged(false);  // Not forced.
3153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_ACTIVE_PROFILE: {
3156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(value->GetType(), Value::TYPE_STRING);
3157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        value->GetAsString(&active_profile_path_);
3158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        RequestRememberedNetworksUpdate();
3159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_PROFILES:
3162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Currently we ignore Profiles (list of all profiles).
3163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_SERVICES: {
3165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(value->GetType(), Value::TYPE_LIST);
3166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const ListValue* vlist = static_cast<const ListValue*>(value);
3167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        UpdateNetworkServiceList(vlist);
3168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_SERVICE_WATCH_LIST: {
3171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(value->GetType(), Value::TYPE_LIST);
3172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const ListValue* vlist = static_cast<const ListValue*>(value);
3173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        UpdateWatchedNetworkServiceList(vlist);
3174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_DEVICE:
3177dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case PROPERTY_INDEX_DEVICES: {
3178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(value->GetType(), Value::TYPE_LIST);
3179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const ListValue* vlist = static_cast<const ListValue*>(value);
3180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        UpdateNetworkDeviceList(vlist);
3181dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      default:
3184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        LOG(WARNING) << "Unhandled key: " << key;
3185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        break;
3186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
3187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    base::TimeDelta delta = base::TimeTicks::Now() - start;
3188dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    VLOG(1) << "  time: " << delta.InMilliseconds() << " ms.";
3189dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    HISTOGRAM_TIMES("CROS_NETWORK_UPDATE", delta);
3190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
3191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
3192dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void NetworkManagerUpdate(void* object,
3193dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   const char* manager_path,
3194dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   const Value* info) {
3195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3196dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(networklib);
3197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!info) {
3198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(ERROR) << "Error retrieving manager properties: " << manager_path;
3199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
3200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "Received NetworkManagerUpdate.";
3202dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK_EQ(info->GetType(), Value::TYPE_DICTIONARY);
3203dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const DictionaryValue* dict = static_cast<const DictionaryValue*>(info);
3204dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    networklib->ParseNetworkManager(dict);
3205dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3206dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3207dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void ParseNetworkManager(const DictionaryValue* dict) {
3208dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (DictionaryValue::key_iterator iter = dict->begin_keys();
3209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != dict->end_keys(); ++iter) {
3210dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& key = *iter;
3211dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      Value* value;
3212dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      bool res = dict->GetWithoutPathExpansion(key, &value);
3213dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      CHECK(res);
3214dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      NetworkManagerStatusChanged(key.c_str(), value);
3215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3217dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3218dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void ProfileUpdate(void* object,
3219dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                            const char* profile_path,
3220dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                            const Value* info) {
3221dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3222dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(networklib);
3223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!info) {
3224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(ERROR) << "Error retrieving profile: " << profile_path;
3225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
3226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "Received ProfileUpdate for: " << profile_path;
3228dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK_EQ(info->GetType(), Value::TYPE_DICTIONARY);
3229dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const DictionaryValue* dict = static_cast<const DictionaryValue*>(info);
3230dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ListValue* entries(NULL);
3231dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    dict->GetList(kEntriesProperty, &entries);
3232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(entries);
3233dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    networklib->UpdateRememberedServiceList(profile_path, entries);
3234dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3235dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3236dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void NetworkServiceUpdate(void* object,
3237dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   const char* service_path,
3238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   const Value* info) {
3239dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3240dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(networklib);
3241dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (service_path) {
3242dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!info) {
3243dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Network no longer exists.
3244dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        networklib->DeleteNetwork(std::string(service_path));
3245dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      } else {
3246dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(info->GetType(), Value::TYPE_DICTIONARY);
3247dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const DictionaryValue* dict = static_cast<const DictionaryValue*>(info);
3248dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        networklib->ParseNetwork(std::string(service_path), dict);
3249201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      }
3250201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
3251dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3252201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
3253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void RememberedNetworkServiceUpdate(void* object,
3254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                             const char* service_path,
3255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                             const Value* info) {
3256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3257dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(networklib);
3258dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (service_path) {
3259dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!info) {
3260dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Remembered network no longer exists.
3261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        networklib->DeleteRememberedWifiNetwork(std::string(service_path));
3262dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      } else {
3263dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(info->GetType(), Value::TYPE_DICTIONARY);
3264dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const DictionaryValue* dict = static_cast<const DictionaryValue*>(info);
3265dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        networklib->ParseRememberedNetwork(std::string(service_path), dict);
3266513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
32673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
3268dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3269513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3270dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void NetworkDeviceUpdate(void* object,
3271dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                  const char* device_path,
3272dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                  const Value* info) {
3273dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3274dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(networklib);
3275dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (device_path) {
3276dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!info) {
3277dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // device no longer exists.
3278dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        networklib->DeleteDevice(std::string(device_path));
3279dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      } else {
3280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        DCHECK_EQ(info->GetType(), Value::TYPE_DICTIONARY);
3281dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        const DictionaryValue* dict = static_cast<const DictionaryValue*>(info);
3282dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        networklib->ParseNetworkDevice(std::string(device_path), dict);
3283201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      }
3284201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
3285dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3286201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
3287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void DataPlanUpdateHandler(void* object,
3288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                    const char* modem_service_path,
3289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                    const CellularDataPlanList* dataplan) {
3290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
3291dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(networklib);
3292dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (modem_service_path && dataplan) {
3293dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      networklib->UpdateCellularDataPlan(std::string(modem_service_path),
3294dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                         dataplan);
3295dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3296dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3297dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3298dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
3299dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Network technology functions.
3300dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3301dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateTechnologies(const ListValue* technologies, int* bitfieldp) {
3302dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(bitfieldp);
3303dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!technologies)
3304dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return;
3305dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    int bitfield = 0;
3306dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (ListValue::const_iterator iter = technologies->begin();
3307dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != technologies->end(); ++iter) {
3308dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string technology;
3309dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      (*iter)->GetAsString(&technology);
3310dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!technology.empty()) {
3311dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        ConnectionType type = ParseType(technology);
3312dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        bitfield |= 1 << type;
3313201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      }
3314201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
3315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    *bitfieldp = bitfield;
3316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotifyNetworkManagerChanged(false);  // Not forced.
3317dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3318201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
3319dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateAvailableTechnologies(const ListValue* technologies) {
3320dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    UpdateTechnologies(technologies, &available_devices_);
3321dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3322dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3323dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateEnabledTechnologies(const ListValue* technologies) {
3324dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    UpdateTechnologies(technologies, &enabled_devices_);
3325dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!ethernet_enabled())
3326dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      ethernet_ = NULL;
3327dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!wifi_enabled()) {
3328dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      active_wifi_ = NULL;
3329dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      wifi_networks_.clear();
3330dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3331dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!cellular_enabled()) {
3332dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      active_cellular_ = NULL;
3333dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      cellular_networks_.clear();
3334dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3335dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3336dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3337dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateConnectedTechnologies(const ListValue* technologies) {
3338dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    UpdateTechnologies(technologies, &connected_devices_);
3339dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3340dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3341dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
3342dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Network list management functions.
3343dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3344dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Note: sometimes flimflam still returns networks when the device type is
3345dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // disabled. Always check the appropriate enabled() state before adding
3346dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // networks to a list or setting an active network so that we do not show them
3347dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // in the UI.
3348dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3349dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // This relies on services being requested from flimflam in priority order,
3350dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // and the updates getting processed and received in order.
3351dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateActiveNetwork(Network* network) {
3352dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ConnectionType type(network->type());
3353dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (type == TYPE_ETHERNET) {
3354dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (ethernet_enabled()) {
3355dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Set ethernet_ to the first connected ethernet service, or the first
3356dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // disconnected ethernet service if none are connected.
3357dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        if (ethernet_ == NULL || !ethernet_->connected())
3358dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          ethernet_ = static_cast<EthernetNetwork*>(network);
3359dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3360dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (type == TYPE_WIFI) {
3361dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (wifi_enabled()) {
3362dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Set active_wifi_ to the first connected or connecting wifi service.
3363dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        if (active_wifi_ == NULL && network->connecting_or_connected())
3364dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          active_wifi_ = static_cast<WifiNetwork*>(network);
33653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      }
3366dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (type == TYPE_CELLULAR) {
3367dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (cellular_enabled()) {
3368dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Set active_cellular_ to first connected/connecting celluar service.
3369dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        if (active_cellular_ == NULL && network->connecting_or_connected())
3370dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          active_cellular_ = static_cast<CellularNetwork*>(network);
3371dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3372dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (type == TYPE_VPN) {
3373dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // Set active_virtual_ to the first connected or connecting vpn service.
3374dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (active_virtual_ == NULL && network->connecting_or_connected())
3375dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_virtual_ = static_cast<VirtualNetwork*>(network);
3376dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3377dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3378dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3379dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void AddNetwork(Network* network) {
3380dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    std::pair<NetworkMap::iterator,bool> result =
3381dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        network_map_.insert(std::make_pair(network->service_path(), network));
3382dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(result.second);  // Should only get called with new network.
3383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(2) << "Adding Network: " << network->service_path()
3384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            << " (" << network->name() << ")";
3385dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ConnectionType type(network->type());
3386dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (type == TYPE_WIFI) {
3387dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (wifi_enabled())
3388dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        wifi_networks_.push_back(static_cast<WifiNetwork*>(network));
3389dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (type == TYPE_CELLULAR) {
3390dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (cellular_enabled())
3391dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        cellular_networks_.push_back(static_cast<CellularNetwork*>(network));
3392dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (type == TYPE_VPN) {
3393dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      virtual_networks_.push_back(static_cast<VirtualNetwork*>(network));
3394dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3395dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Do not set the active network here. Wait until we parse the network.
3396dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3397dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3398dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // This only gets called when NetworkServiceUpdate receives a NULL update
3399dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // for an existing network, e.g. an error occurred while fetching a network.
3400dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void DeleteNetwork(const std::string& service_path) {
3401dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkMap::iterator found = network_map_.find(service_path);
3402dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (found == network_map_.end()) {
3403dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // This occurs when we receive an update request followed by a disconnect
3404dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // which triggers another update. See UpdateNetworkServiceList.
3405dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return;
3406dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3407dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Network* network = found->second;
3408dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    network_map_.erase(found);
3409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!network->unique_id().empty())
3410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      network_unique_id_map_.erase(network->unique_id());
3411dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ConnectionType type(network->type());
3412dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (type == TYPE_ETHERNET) {
3413dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (network == ethernet_) {
3414dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // This should never happen.
3415dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        LOG(ERROR) << "Deleting active ethernet network: " << service_path;
3416dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        ethernet_ = NULL;
3417dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3418dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (type == TYPE_WIFI) {
3419dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      WifiNetworkVector::iterator iter = std::find(
3420dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          wifi_networks_.begin(), wifi_networks_.end(), network);
3421dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (iter != wifi_networks_.end())
3422dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        wifi_networks_.erase(iter);
3423dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (network == active_wifi_) {
3424dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // This should never happen.
3425dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        LOG(ERROR) << "Deleting active wifi network: " << service_path;
3426dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_wifi_ = NULL;
3427dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3428dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (type == TYPE_CELLULAR) {
3429dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      CellularNetworkVector::iterator iter = std::find(
3430dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          cellular_networks_.begin(), cellular_networks_.end(), network);
3431dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (iter != cellular_networks_.end())
3432dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        cellular_networks_.erase(iter);
3433dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (network == active_cellular_) {
3434dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // This should never happen.
3435dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        LOG(ERROR) << "Deleting active cellular network: " << service_path;
3436dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_cellular_ = NULL;
3437dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3438dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // Find and delete any existing data plans associated with |service_path|.
3439dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      CellularDataPlanMap::iterator found =  data_plan_map_.find(service_path);
3440dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (found != data_plan_map_.end()) {
3441dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        CellularDataPlanVector* data_plans = found->second;
3442dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        delete data_plans;
3443dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        data_plan_map_.erase(found);
3444dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3445dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (type == TYPE_VPN) {
3446dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      VirtualNetworkVector::iterator iter = std::find(
3447dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          virtual_networks_.begin(), virtual_networks_.end(), network);
3448dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (iter != virtual_networks_.end())
3449dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        virtual_networks_.erase(iter);
3450dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (network == active_virtual_) {
3451dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // This should never happen.
3452dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        LOG(ERROR) << "Deleting active virtual network: " << service_path;
3453dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_virtual_ = NULL;
3454dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3455dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3456dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    delete network;
3457dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3458dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void AddRememberedWifiNetwork(WifiNetwork* wifi) {
3460dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    std::pair<NetworkMap::iterator,bool> result =
3461dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        remembered_network_map_.insert(
3462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            std::make_pair(wifi->service_path(), wifi));
3463dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    DCHECK(result.second);  // Should only get called with new network.
3464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    remembered_wifi_networks_.push_back(wifi);
3465dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3466201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
3467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void DeleteRememberedWifiNetwork(const std::string& service_path) {
3468dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkMap::iterator found = remembered_network_map_.find(service_path);
3469dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (found == remembered_network_map_.end()) {
3470dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      LOG(WARNING) << "Attempt to delete non-existant remembered network: "
3471dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                   << service_path;
3472dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return;
3473dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3474dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Network* remembered_network = found->second;
3475dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    remembered_network_map_.erase(found);
3476dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    WifiNetworkVector::iterator iter = std::find(
3477dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        remembered_wifi_networks_.begin(), remembered_wifi_networks_.end(),
3478dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        remembered_network);
3479dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (iter != remembered_wifi_networks_.end())
3480dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      remembered_wifi_networks_.erase(iter);
3481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* network = FindNetworkFromRemembered(remembered_network);
3482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (network && network->type() == TYPE_WIFI) {
3483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Clear the stored credentials for any visible forgotten networks.
3484ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      WifiNetwork* wifi = static_cast<WifiNetwork*>(network);
3485ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      wifi->EraseCredentials();
3486ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
3487ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Network is not in visible list.
3488ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      VLOG(2) << "Remembered Network not found: "
3489ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              << remembered_network->unique_id();
3490ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3491dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    delete remembered_network;
3492dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3493dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3494dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Update all network lists, and request associated service updates.
3495dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateNetworkServiceList(const ListValue* services) {
3496dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // TODO(stevenjb): Wait for wifi_scanning_ to be false.
3497dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Copy the list of existing networks to "old" and clear the map and lists.
3498dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkMap old_network_map = network_map_;
3499dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ClearNetworks(false /*don't delete*/);
3500dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Clear the list of update requests.
3501ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    int network_priority_order = 0;
3502dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    network_update_requests_.clear();
3503dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // wifi_scanning_ will remain false unless we request a network update.
3504201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    wifi_scanning_ = false;
3505dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // |services| represents a complete list of visible networks.
3506dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (ListValue::const_iterator iter = services->begin();
3507dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != services->end(); ++iter) {
3508dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string service_path;
3509dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      (*iter)->GetAsString(&service_path);
3510dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!service_path.empty()) {
3511dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // If we find the network in "old", add it immediately to the map
3512dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // and lists. Otherwise it will get added when NetworkServiceUpdate
3513dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // calls ParseNetwork.
3514dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        NetworkMap::iterator found = old_network_map.find(service_path);
3515dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        if (found != old_network_map.end()) {
3516dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          AddNetwork(found->second);
3517dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          old_network_map.erase(found);
3518dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        }
3519dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Always request network updates.
3520dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // TODO(stevenjb): Investigate why we are missing updates then
3521dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // rely on watched network updates and only request updates here for
3522dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // new networks.
3523dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Use update_request map to store network priority.
3524ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_update_requests_[service_path] = network_priority_order++;
352521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        wifi_scanning_ = true;
3526dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        RequestNetworkServiceInfo(service_path.c_str(),
3527dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                  &NetworkServiceUpdate,
3528dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                  this);
3529dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3530dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3531dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Delete any old networks that no longer exist.
3532dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (NetworkMap::iterator iter = old_network_map.begin();
3533dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != old_network_map.end(); ++iter) {
3534dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      delete iter->second;
353521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    }
3536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
3537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3538dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Request updates for watched networks. Does not affect network lists.
3539dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Existing networks will be updated. There should not be any new networks
3540dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // in this list, but if there are they will be added appropriately.
3541dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateWatchedNetworkServiceList(const ListValue* services) {
3542dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (ListValue::const_iterator iter = services->begin();
3543dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != services->end(); ++iter) {
3544dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string service_path;
3545dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      (*iter)->GetAsString(&service_path);
3546dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!service_path.empty()) {
3547dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        VLOG(1) << "Watched Service: " << service_path;
3548dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        RequestNetworkServiceInfo(
3549dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            service_path.c_str(), &NetworkServiceUpdate, this);
3550dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3551dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
35523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
35533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3554dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Request the active profile which lists the remembered networks.
3555dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void RequestRememberedNetworksUpdate() {
3556ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!active_profile_path_.empty()) {
3557ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      RequestNetworkProfile(
3558ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          active_profile_path_.c_str(), &ProfileUpdate, this);
3559ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3560dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3561dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3562dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Update the list of remembered (profile) networks, and request associated
3563dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // service updates.
3564dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateRememberedServiceList(const char* profile_path,
3565dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   const ListValue* profile_entries) {
3566dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Copy the list of existing networks to "old" and clear the map and list.
3567dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkMap old_network_map = remembered_network_map_;
3568dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ClearRememberedNetworks(false /*don't delete*/);
3569dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // |profile_entries| represents a complete list of remembered networks.
3570dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (ListValue::const_iterator iter = profile_entries->begin();
3571dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != profile_entries->end(); ++iter) {
3572dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string service_path;
3573dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      (*iter)->GetAsString(&service_path);
3574dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!service_path.empty()) {
3575dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // If we find the network in "old", add it immediately to the map
3576dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // and list. Otherwise it will get added when
3577dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // RememberedNetworkServiceUpdate calls ParseRememberedNetwork.
3578dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        NetworkMap::iterator found = old_network_map.find(service_path);
3579dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        if (found != old_network_map.end()) {
3580ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          Network* network = found->second;
3581ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          if (network->type() == TYPE_WIFI) {
3582ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            WifiNetwork* wifi = static_cast<WifiNetwork*>(network);
3583ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            AddRememberedWifiNetwork(wifi);
3584ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            old_network_map.erase(found);
3585ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          }
3586dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        }
3587dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Always request updates for remembered networks.
3588dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        RequestNetworkProfileEntry(profile_path,
3589dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   service_path.c_str(),
3590dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   &RememberedNetworkServiceUpdate,
3591dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                   this);
3592dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3593dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3594dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Delete any old networks that no longer exist.
3595dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (NetworkMap::iterator iter = old_network_map.begin();
3596dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != old_network_map.end(); ++iter) {
3597dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      delete iter->second;
3598dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3599dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
36003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3601dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Network* CreateNewNetwork(ConnectionType type,
3602dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                            const std::string& service_path) {
3603ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    switch (type) {
3604dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case TYPE_ETHERNET: {
3605dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        EthernetNetwork* ethernet = new EthernetNetwork(service_path);
3606dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return ethernet;
3607dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3608dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case TYPE_WIFI: {
3609dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        WifiNetwork* wifi = new WifiNetwork(service_path);
3610dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return wifi;
3611dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3612dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case TYPE_CELLULAR: {
3613dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        CellularNetwork* cellular = new CellularNetwork(service_path);
3614dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return cellular;
3615dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3616dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      case TYPE_VPN: {
3617dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        VirtualNetwork* vpn = new VirtualNetwork(service_path);
3618dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return vpn;
3619dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3620dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      default: {
3621dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        LOG(WARNING) << "Unknown service type: " << type;
3622dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return new Network(service_path, type);
3623dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3624dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3625dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
36263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3627dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Network* ParseNetwork(const std::string& service_path,
3628dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                        const DictionaryValue* info) {
3629ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* network = FindNetworkByPath(service_path);
3630ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!network) {
3631dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      ConnectionType type = ParseTypeFromDictionary(info);
3632dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      network = CreateNewNetwork(type, service_path);
3633dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      AddNetwork(network);
3634dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
36353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3636ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Erase entry from network_unique_id_map_ in case unique id changes.
3637ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!network->unique_id().empty())
3638ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      network_unique_id_map_.erase(network->unique_id());
3639ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3640dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    network->ParseInfo(info);  // virtual.
36413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3642ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!network->unique_id().empty())
3643ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      network_unique_id_map_[network->unique_id()] = network;
3644ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3645dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    UpdateActiveNetwork(network);
36463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3647dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Find and erase entry in update_requests, and set network priority.
3648dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    PriorityMap::iterator found2 = network_update_requests_.find(service_path);
3649dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (found2 != network_update_requests_.end()) {
3650ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      network->priority_order_ = found2->second;
3651dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      network_update_requests_.erase(found2);
3652dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (network_update_requests_.empty()) {
3653dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Clear wifi_scanning_ when we have no pending requests.
3654dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        wifi_scanning_ = false;
3655dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3656dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else {
3657ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // TODO(stevenjb): Enable warning once UpdateNetworkServiceList is fixed.
3658ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // LOG(WARNING) << "ParseNetwork called with no update request entry: "
3659ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      //              << service_path;
3660dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3661201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
3662ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "ParseNetwork: " << network->name();
3663ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotifyNetworkManagerChanged(false);  // Not forced.
3664dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return network;
3665dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3666201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
3667ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns NULL if |service_path| refers to a network that is not a
3668ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // remembered type.
3669dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Network* ParseRememberedNetwork(const std::string& service_path,
3670dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                  const DictionaryValue* info) {
3671dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Network* network;
3672dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkMap::iterator found = remembered_network_map_.find(service_path);
3673dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (found != remembered_network_map_.end()) {
3674dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      network = found->second;
3675dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else {
3676dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      ConnectionType type = ParseTypeFromDictionary(info);
3677ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (type == TYPE_WIFI) {
3678ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network = CreateNewNetwork(type, service_path);
3679ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        WifiNetwork* wifi = static_cast<WifiNetwork*>(network);
3680ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        AddRememberedWifiNetwork(wifi);
3681ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      } else {
3682ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        VLOG(1) << "Ignoring remembered network: " << service_path
3683ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                << " Type: " << ConnectionTypeToString(type);
3684ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        return NULL;
3685ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
3686dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3687dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    network->ParseInfo(info);  // virtual.
3688ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "ParseRememberedNetwork: " << network->name();
3689ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotifyNetworkManagerChanged(false);  // Not forced.
3690dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return network;
3691dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3692201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
3693dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void ClearNetworks(bool delete_networks) {
3694dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (delete_networks)
3695dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      STLDeleteValues(&network_map_);
3696dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    network_map_.clear();
3697ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    network_unique_id_map_.clear();
3698dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ethernet_ = NULL;
3699dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    active_wifi_ = NULL;
3700dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    active_cellular_ = NULL;
3701dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    active_virtual_ = NULL;
3702dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi_networks_.clear();
3703dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cellular_networks_.clear();
3704dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    virtual_networks_.clear();
3705dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
37063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3707dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void ClearRememberedNetworks(bool delete_networks) {
3708dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (delete_networks)
3709dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      STLDeleteValues(&remembered_network_map_);
3710dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    remembered_network_map_.clear();
37113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    remembered_wifi_networks_.clear();
3712dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
37133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3714dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
3715dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // NetworkDevice list management functions.
3716dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3717ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns pointer to device or NULL if device is not found by path.
3718ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Use FindNetworkDeviceByPath when you're not intending to change device.
3719ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NetworkDevice* GetNetworkDeviceByPath(const std::string& path) {
3720ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDeviceMap::iterator iter = device_map_.find(path);
3721ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (iter != device_map_.end())
3722ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return iter->second;
3723ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    LOG(WARNING) << "Device path not found: " << path;
3724ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
3725ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
3726ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3727dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Update device list, and request associated device updates.
3728dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // |devices| represents a complete list of devices.
3729dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateNetworkDeviceList(const ListValue* devices) {
3730dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkDeviceMap old_device_map = device_map_;
3731dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    device_map_.clear();
3732dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    VLOG(2) << "Updating Device List.";
3733dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (ListValue::const_iterator iter = devices->begin();
3734dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != devices->end(); ++iter) {
3735dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      std::string device_path;
3736dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      (*iter)->GetAsString(&device_path);
3737dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!device_path.empty()) {
3738dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        NetworkDeviceMap::iterator found = old_device_map.find(device_path);
3739dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        if (found != old_device_map.end()) {
3740ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          VLOG(2) << " Adding existing device: " << device_path;
3741dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          device_map_[device_path] = found->second;
3742dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          old_device_map.erase(found);
3743dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        }
3744dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        RequestNetworkDeviceInfo(
3745dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            device_path.c_str(), &NetworkDeviceUpdate, this);
3746dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3747dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3748dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Delete any old devices that no longer exist.
3749dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (NetworkDeviceMap::iterator iter = old_device_map.begin();
3750dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != old_device_map.end(); ++iter) {
3751ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      DeleteDeviceFromDeviceObserversMap(iter->first);
3752ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Delete device.
3753dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      delete iter->second;
3754dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
37553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
37563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3757ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void DeleteDeviceFromDeviceObserversMap(const std::string& device_path) {
3758ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Delete all device observers associated with this device.
3759ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDeviceObserverMap::iterator map_iter =
3760ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_device_observers_.find(device_path);
3761ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (map_iter != network_device_observers_.end()) {
3762ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      delete map_iter->second;
3763ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      network_device_observers_.erase(map_iter);
3764ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3765ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
3766ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3767dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void DeleteDevice(const std::string& device_path) {
3768dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkDeviceMap::iterator found = device_map_.find(device_path);
3769dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (found == device_map_.end()) {
3770dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      LOG(WARNING) << "Attempt to delete non-existant device: "
3771dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                   << device_path;
3772dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return;
3773dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3774dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    VLOG(2) << " Deleting device: " << device_path;
3775dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkDevice* device = found->second;
3776dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    device_map_.erase(found);
3777ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DeleteDeviceFromDeviceObserversMap(device_path);
3778dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    delete device;
3779dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3780dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3781dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void ParseNetworkDevice(const std::string& device_path,
3782dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                          const DictionaryValue* info) {
3783dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkDeviceMap::iterator found = device_map_.find(device_path);
3784dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NetworkDevice* device;
3785dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (found != device_map_.end()) {
3786dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      device = found->second;
3787dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else {
3788dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      device = new NetworkDevice(device_path);
3789dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      VLOG(2) << " Adding device: " << device_path;
3790dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      device_map_[device_path] = device;
3791ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (network_device_observers_.find(device_path) ==
3792ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          network_device_observers_.end()) {
3793ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_device_observers_[device_path] =
3794ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            new NetworkDeviceObserverList(this, device_path);
3795ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
37963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
3797dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    device->ParseInfo(info);
3798dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    VLOG(1) << "ParseNetworkDevice:" << device->name();
3799ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NotifyNetworkManagerChanged(false);  // Not forced.
3800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
3801c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3802dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
3803dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
38043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void EnableNetworkDeviceType(ConnectionType device, bool enable) {
3805731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!EnsureCrosLoaded())
38063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
3807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // If network device is already enabled/disabled, then don't do anything.
38093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (enable && (enabled_devices_ & (1 << device))) {
38103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      LOG(WARNING) << "Trying to enable a device that's already enabled: "
38113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                   << device;
38123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
3813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
38143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!enable && !(enabled_devices_ & (1 << device))) {
38153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      LOG(WARNING) << "Trying to disable a device that's already disabled: "
38163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                   << device;
38173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
3818c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
38193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3820dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    RequestNetworkDeviceEnable(ConnectionTypeToString(device), enable);
3821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
3822c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3823dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
3824dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Notifications.
3825dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3826dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // We call this any time something in NetworkLibrary changes.
3827ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(stevenjb): We should consider breaking this into multiple
3828dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // notifications, e.g. connection state, devices, services, etc.
3829ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void NotifyNetworkManagerChanged(bool force_update) {
3830dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3831ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Cancel any pending signals.
3832ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (notify_task_) {
3833dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      notify_task_->Cancel();
3834ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      notify_task_ = NULL;
3835ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3836ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (force_update) {
3837ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Signal observers now.
3838ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SignalNetworkManagerObservers();
3839ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
3840ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Schedule a deleayed signal to limit the frequency of notifications.
3841ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      notify_task_ = NewRunnableMethod(
3842ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          this, &NetworkLibraryImpl::SignalNetworkManagerObservers);
3843ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      BrowserThread::PostDelayedTask(BrowserThread::UI, FROM_HERE, notify_task_,
3844ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     kNetworkNotifyDelayMs);
3845ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3846dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3847dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3848dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SignalNetworkManagerObservers() {
3849dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    notify_task_ = NULL;
3850513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    FOR_EACH_OBSERVER(NetworkManagerObserver,
3851513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                      network_manager_observers_,
3852513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                      OnNetworkManagerChanged(this));
3853513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
3854513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3855513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void NotifyNetworkChanged(Network* network) {
3856ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(2) << "Network changed: " << network->name();
3857513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    DCHECK(network);
3858513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NetworkObserverMap::const_iterator iter = network_observers_.find(
3859513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        network->service_path());
3860513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (iter != network_observers_.end()) {
3861513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      FOR_EACH_OBSERVER(NetworkObserver,
3862513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                        *(iter->second),
3863513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                        OnNetworkChanged(this, network));
3864513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    } else {
3865513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      NOTREACHED() <<
3866513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          "There weren't supposed to be any property change observers of " <<
3867513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch           network->service_path();
3868513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
38693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3870c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3871ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void NotifyNetworkDeviceChanged(NetworkDevice* device) {
3872ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DCHECK(device);
3873ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDeviceObserverMap::const_iterator iter =
3874ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        network_device_observers_.find(device->device_path());
3875ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (iter != network_device_observers_.end()) {
3876ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NetworkDeviceObserverList* device_observer_list = iter->second;
3877ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FOR_EACH_OBSERVER(NetworkDeviceObserver,
3878ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        *device_observer_list,
3879ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        OnNetworkDeviceChanged(this, device));
3880ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
3881ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED() <<
3882ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          "There weren't supposed to be any property change observers of " <<
3883ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen           device->device_path();
3884ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3885ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
3886ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3887731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void NotifyCellularDataPlanChanged() {
3888513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    FOR_EACH_OBSERVER(CellularDataPlanObserver,
3889513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                      data_plan_observers_,
3890513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                      OnCellularDataPlanChanged(this));
3891731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
3892731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
3893ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void NotifyPinOperationCompleted(PinOperationError error) {
3894ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    FOR_EACH_OBSERVER(PinOperationObserver,
3895ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      pin_operation_observers_,
3896ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      OnPinOperationCompleted(this, error));
3897ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    sim_operation_ = SIM_OPERATION_NONE;
3898ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
3899ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3900ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void NotifyUserConnectionInitiated(const Network* network) {
3901dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    FOR_EACH_OBSERVER(UserActionObserver,
3902dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                      user_action_observers_,
3903dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                      OnConnectionInitiated(this, network));
39043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3905c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3906dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
3907ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Device updates.
3908ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3909ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void FlipSimPinRequiredStateIfNeeded() {
3910ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (sim_operation_ != SIM_OPERATION_CHANGE_REQUIRE_PIN)
3911ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
3912ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3913ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const NetworkDevice* cellular = FindCellularDevice();
3914ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (cellular) {
3915ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NetworkDevice* device = GetNetworkDeviceByPath(cellular->device_path());
3916ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (device->sim_pin_required() == SIM_PIN_NOT_REQUIRED)
3917ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        device->sim_pin_required_ = SIM_PIN_REQUIRED;
3918ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      else if (device->sim_pin_required() == SIM_PIN_REQUIRED)
3919ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        device->sim_pin_required_ = SIM_PIN_NOT_REQUIRED;
3920ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3921ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
3922ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3923ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void UpdateNetworkDeviceStatus(const char* path,
3924ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 const char* key,
3925ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 const Value* value) {
3926ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3927ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (key == NULL || value == NULL)
3928ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return;
3929ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDevice* device = GetNetworkDeviceByPath(path);
3930ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (device) {
3931ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      VLOG(1) << "UpdateNetworkDeviceStatus: " << device->name() << "." << key;
3932ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      int index = property_index_parser().Get(std::string(key));
3933ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (!device->ParseValue(index, value)) {
3934ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        LOG(WARNING) << "UpdateNetworkDeviceStatus: Error parsing: "
3935ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     << path << "." << key;
3936ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      } else if (strcmp(key, kCellularAllowRoamingProperty) == 0) {
3937ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        bool settings_value =
3938ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            UserCrosSettingsProvider::cached_data_roaming_enabled();
3939ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        if (device->data_roaming_allowed() != settings_value) {
3940ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          // Switch back to signed settings value.
3941ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          SetCellularDataRoamingAllowed(settings_value);
3942ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          return;
3943ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        }
3944ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
3945ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Notify only observers on device property change.
3946ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NotifyNetworkDeviceChanged(device);
3947ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // If a device's power state changes, new properties may become
3948ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // defined.
3949ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (strcmp(key, kPoweredProperty) == 0) {
3950ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        RequestNetworkDeviceInfo(path, &NetworkDeviceUpdate, this);
3951ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
3952ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
3953ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
3954ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
3955ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ////////////////////////////////////////////////////////////////////////////
3956dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Service updates.
3957dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3958513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void UpdateNetworkStatus(const char* path,
3959513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                           const char* key,
3960513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                           const Value* value) {
3961dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3962513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (key == NULL || value == NULL)
3963513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return;
3964ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    Network* network = FindNetworkByPath(path);
3965ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (network) {
3966ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      VLOG(2) << "UpdateNetworkStatus: " << network->name() << "." << key;
3967dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // Note: ParseValue is virtual.
3968dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      int index = property_index_parser().Get(std::string(key));
3969dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (!network->ParseValue(index, value)) {
3970dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        LOG(WARNING) << "UpdateNetworkStatus: Error parsing: "
3971dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                     << path << "." << key;
3972dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
3973dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      NotifyNetworkChanged(network);
3974ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // Anything observing the manager needs to know about any service change.
3975ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NotifyNetworkManagerChanged(false);  // Not forced.
3976513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
3977dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3978dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3979dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
3980dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Data Plans.
3981513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
3982dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const CellularDataPlan* GetSignificantDataPlanFromVector(
3983dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const CellularDataPlanVector* plans) const {
3984dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const CellularDataPlan* significant = NULL;
3985dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (CellularDataPlanVector::const_iterator iter = plans->begin();
3986dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         iter != plans->end(); ++iter) {
3987dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // Set significant to the first plan or to first non metered base plan.
3988dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (significant == NULL ||
3989dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          significant->plan_type == CELLULAR_DATA_PLAN_METERED_BASE)
3990dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        significant = *iter;
3991dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
3992dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return significant;
3993dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
3994dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3995dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CellularNetwork::DataLeft GetDataLeft(
3996dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      CellularDataPlanVector* data_plans) {
3997dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const CellularDataPlan* plan = GetSignificantDataPlanFromVector(data_plans);
3998dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!plan)
3999dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return CellularNetwork::DATA_UNKNOWN;
4000dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (plan->plan_type == CELLULAR_DATA_PLAN_UNLIMITED) {
4001dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      base::TimeDelta remaining = plan->remaining_time();
4002dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (remaining <= base::TimeDelta::FromSeconds(0))
4003dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return CellularNetwork::DATA_NONE;
4004dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (remaining <= base::TimeDelta::FromSeconds(kCellularDataVeryLowSecs))
4005dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return CellularNetwork::DATA_VERY_LOW;
4006dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (remaining <= base::TimeDelta::FromSeconds(kCellularDataLowSecs))
4007dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return CellularNetwork::DATA_LOW;
4008dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return CellularNetwork::DATA_NORMAL;
4009dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else if (plan->plan_type == CELLULAR_DATA_PLAN_METERED_PAID ||
4010dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen               plan->plan_type == CELLULAR_DATA_PLAN_METERED_BASE) {
4011dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      int64 remaining = plan->remaining_data();
4012dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (remaining <= 0)
4013dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return CellularNetwork::DATA_NONE;
4014dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (remaining <= kCellularDataVeryLowBytes)
4015dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return CellularNetwork::DATA_VERY_LOW;
4016dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // For base plans, we do not care about low data.
4017dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (remaining <= kCellularDataLowBytes &&
4018dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          plan->plan_type != CELLULAR_DATA_PLAN_METERED_BASE)
4019dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        return CellularNetwork::DATA_LOW;
4020dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return CellularNetwork::DATA_NORMAL;
4021dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
4022dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return CellularNetwork::DATA_UNKNOWN;
4023dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
4024dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4025dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void UpdateCellularDataPlan(const std::string& service_path,
4026dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                              const CellularDataPlanList* data_plan_list) {
4027ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VLOG(1) << "Updating cellular data plans for: " << service_path;
4028dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CellularDataPlanVector* data_plans = NULL;
4029dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Find and delete any existing data plans associated with |service_path|.
4030dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CellularDataPlanMap::iterator found = data_plan_map_.find(service_path);
4031dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (found != data_plan_map_.end()) {
4032dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      data_plans = found->second;
4033dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      data_plans->reset();  // This will delete existing data plans.
4034513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    } else {
4035dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      data_plans = new CellularDataPlanVector;
4036dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      data_plan_map_[service_path] = data_plans;
4037dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
4038dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (size_t i = 0; i < data_plan_list->plans_size; i++) {
4039dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const CellularDataPlanInfo* info(data_plan_list->GetCellularDataPlan(i));
4040ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      CellularDataPlan* plan = new CellularDataPlan(*info);
4041ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      data_plans->push_back(plan);
4042ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      VLOG(2) << " Plan: " << plan->GetPlanDesciption()
4043ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              << " : " << plan->GetDataRemainingDesciption();
4044dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
4045dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Now, update any matching cellular network's cached data
4046ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CellularNetwork* cellular = FindCellularNetworkByPath(service_path);
4047dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (cellular) {
4048dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      CellularNetwork::DataLeft data_left;
4049dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // If the network needs a new plan, then there's no data.
4050dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (cellular->needs_new_plan())
4051dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        data_left = CellularNetwork::DATA_NONE;
4052513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      else
4053dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        data_left = GetDataLeft(data_plans);
4054ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      VLOG(2) << " Data left: " << data_left
4055ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              << " Need plan: " << cellular->needs_new_plan();
4056dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      cellular->set_data_left(data_left);
4057513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
4058dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    NotifyCellularDataPlanChanged();
4059513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4060513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4061dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ////////////////////////////////////////////////////////////////////////////
4062dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4063dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void Init() {
4064dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // First, get the currently available networks. This data is cached
4065dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // on the connman side, so the call should be quick.
4066dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (EnsureCrosLoaded()) {
4067dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      VLOG(1) << "Requesting initial network manager info from libcros.";
4068dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      RequestNetworkManagerInfo(&NetworkManagerUpdate, this);
4069dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
4070731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
4071731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
4072dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void InitTestData() {
4073dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    is_locked_ = false;
4074dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4075dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Devices
4076dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    int devices =
4077dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        (1 << TYPE_ETHERNET) | (1 << TYPE_WIFI) | (1 << TYPE_CELLULAR);
4078dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    available_devices_ = devices;
4079dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    enabled_devices_ = devices;
4080dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    connected_devices_ = devices;
4081dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4082ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkDevice* cellular = new NetworkDevice("cellular");
4083ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    scoped_ptr<Value> cellular_type(Value::CreateStringValue(kTypeCellular));
4084ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular->ParseValue(PROPERTY_INDEX_TYPE, cellular_type.get());
4085ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular->IMSI_ = "123456789012345";
4086ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    device_map_["cellular"] = cellular;
4087ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4088dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Networks
4089dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ClearNetworks(true /*delete networks*/);
4090dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4091dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ethernet_ = new EthernetNetwork("eth1");
4092dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ethernet_->set_connected(true);
4093dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AddNetwork(ethernet_);
4094dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4095dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    WifiNetwork* wifi1 = new WifiNetwork("fw1");
4096dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi1->set_name("Fake Wifi Connected");
4097dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi1->set_strength(90);
4098dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi1->set_connected(true);
4099ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi1->set_active(true);
4100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi1->set_encryption(SECURITY_NONE);
4101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AddNetwork(wifi1);
4102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    WifiNetwork* wifi2 = new WifiNetwork("fw2");
4104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi2->set_name("Fake Wifi");
4105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi2->set_strength(70);
4106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi2->set_connected(false);
4107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi2->set_encryption(SECURITY_NONE);
4108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AddNetwork(wifi2);
4109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    WifiNetwork* wifi3 = new WifiNetwork("fw3");
4111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi3->set_name("Fake Wifi Encrypted");
4112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi3->set_strength(60);
4113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi3->set_connected(false);
4114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi3->set_encryption(SECURITY_WEP);
4115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi3->set_passphrase_required(true);
4116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AddNetwork(wifi3);
4117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    WifiNetwork* wifi4 = new WifiNetwork("fw4");
4119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi4->set_name("Fake Wifi 802.1x");
4120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi4->set_strength(50);
4121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi4->set_connected(false);
4122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi4->set_connectable(false);
4123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi4->set_encryption(SECURITY_8021X);
4124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi4->set_identity("nobody@google.com");
4125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi4->set_cert_path("SETTINGS:key_id=3,cert_id=3,pin=111111");
4126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AddNetwork(wifi4);
4127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    WifiNetwork* wifi5 = new WifiNetwork("fw5");
4129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi5->set_name("Fake Wifi UTF-8 SSID ");
4130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi5->SetSsid("Fake Wifi UTF-8 SSID \u3042\u3044\u3046");
4131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi5->set_strength(25);
4132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi5->set_connected(false);
4133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddNetwork(wifi5);
4134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    WifiNetwork* wifi6 = new WifiNetwork("fw6");
4136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi6->set_name("Fake Wifi latin-1 SSID ");
4137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi6->SetSsid("Fake Wifi latin-1 SSID \xc0\xcb\xcc\xd6\xfb");
4138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi6->set_strength(20);
4139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    wifi6->set_connected(false);
4140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddNetwork(wifi6);
4141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    active_wifi_ = wifi1;
4143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CellularNetwork* cellular1 = new CellularNetwork("fc1");
4145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cellular1->set_name("Fake Cellular");
4146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cellular1->set_strength(70);
4147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular1->set_connected(true);
4148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular1->set_active(true);
4149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cellular1->set_activation_state(ACTIVATION_STATE_ACTIVATED);
4150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cellular1->set_payment_url(std::string("http://www.google.com"));
4151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cellular1->set_usage_url(std::string("http://www.google.com"));
4152dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    cellular1->set_network_technology(NETWORK_TECHNOLOGY_EVDO);
4153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular1->set_roaming_state(ROAMING_STATE_ROAMING);
4154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CellularDataPlan* base_plan = new CellularDataPlan();
4156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    base_plan->plan_name = "Base plan";
4157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    base_plan->plan_type = CELLULAR_DATA_PLAN_METERED_BASE;
4158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    base_plan->plan_data_bytes = 100ll * 1024 * 1024;
4159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    base_plan->data_bytes_used = 75ll * 1024 * 1024;
4160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CellularDataPlanVector* data_plans = new CellularDataPlanVector();
4161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    data_plan_map_[cellular1->service_path()] = data_plans;
4162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    data_plans->push_back(base_plan);
4163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CellularDataPlan* paid_plan = new CellularDataPlan();
4165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    paid_plan->plan_name = "Paid plan";
4166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    paid_plan->plan_type = CELLULAR_DATA_PLAN_METERED_PAID;
4167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    paid_plan->plan_data_bytes = 5ll * 1024 * 1024 * 1024;
4168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    paid_plan->data_bytes_used = 3ll * 1024 * 1024 * 1024;
4169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    data_plans->push_back(paid_plan);
4170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AddNetwork(cellular1);
4172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    active_cellular_ = cellular1;
4173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    CellularNetwork* cellular2 = new CellularNetwork("fc2");
4175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular2->set_name("Fake Cellular 2");
4176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular2->set_strength(70);
4177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular2->set_connected(true);
4178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular2->set_activation_state(ACTIVATION_STATE_ACTIVATED);
4179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cellular2->set_network_technology(NETWORK_TECHNOLOGY_UMTS);
4180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddNetwork(cellular2);
4181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Remembered Networks
4183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ClearRememberedNetworks(true /*delete networks*/);
4184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    WifiNetwork* remembered_wifi2 = new WifiNetwork("fw2");
4185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    remembered_wifi2->set_name("Fake Wifi 2");
4186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    remembered_wifi2->set_strength(70);
4187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    remembered_wifi2->set_connected(true);
4188dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    remembered_wifi2->set_encryption(SECURITY_WEP);
4189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddRememberedWifiNetwork(remembered_wifi2);
4190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // VPNs.
4192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VirtualNetwork* vpn1 = new VirtualNetwork("fv1");
4193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn1->set_name("Fake VPN Provider 1");
4194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn1->set_server_hostname("vpn1server.fake.com");
4195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn1->set_provider_type(VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_PSK);
4196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn1->set_username("VPN User 1");
4197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn1->set_connected(false);
4198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddNetwork(vpn1);
4199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VirtualNetwork* vpn2 = new VirtualNetwork("fv2");
4201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn2->set_name("Fake VPN Provider 2");
4202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn2->set_server_hostname("vpn2server.fake.com");
4203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn2->set_provider_type(VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_USER_CERT);
4204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn2->set_username("VPN User 2");
4205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn2->set_connected(true);
4206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddNetwork(vpn2);
4207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VirtualNetwork* vpn3 = new VirtualNetwork("fv3");
4209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn3->set_name("Fake VPN Provider 3");
4210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn3->set_server_hostname("vpn3server.fake.com");
4211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn3->set_provider_type(VirtualNetwork::PROVIDER_TYPE_OPEN_VPN);
4212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn3->set_connected(false);
4213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddNetwork(vpn3);
4214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    active_virtual_ = vpn2;
4216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4217dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    wifi_scanning_ = false;
4218dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    offline_mode_ = false;
4219513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4220513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4221513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Network manager observer list
4222513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ObserverList<NetworkManagerObserver> network_manager_observers_;
4223513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4224513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Cellular data plan observer list
4225513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ObserverList<CellularDataPlanObserver> data_plan_observers_;
4226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // PIN operation observer list.
4228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ObserverList<PinOperationObserver> pin_operation_observers_;
4229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4230dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // User action observer list
4231dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ObserverList<UserActionObserver> user_action_observers_;
4232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4233513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Network observer map
4234513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  NetworkObserverMap network_observers_;
4235513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
4236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Network device observer map.
4237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NetworkDeviceObserverMap network_device_observers_;
4238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4239513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // For monitoring network manager status changes.
4240513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  PropertyChangeMonitor network_manager_monitor_;
4241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4242731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // For monitoring data plan changes to the connected cellular network.
4243731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DataPlanUpdateMonitor data_plan_monitor_;
4244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
424572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Network login observer.
424672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<NetworkLoginObserver> network_login_observer_;
424772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4248dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // A service path based map of all Networks.
4249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NetworkMap network_map_;
4250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // A unique_id_ based map of Networks.
4252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NetworkMap network_unique_id_map_;
4253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // A service path based map of all remembered Networks.
4255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NetworkMap remembered_network_map_;
4256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4257dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // A list of services that we are awaiting updates for.
4258dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PriorityMap network_update_requests_;
4259dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4260dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // A device path based map of all NetworkDevices.
4261dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NetworkDeviceMap device_map_;
4262dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4263dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // A network service path based map of all CellularDataPlanVectors.
4264dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CellularDataPlanMap data_plan_map_;
4265dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
42663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The ethernet network.
4267513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EthernetNetwork* ethernet_;
42683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The list of available wifi networks.
42703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  WifiNetworkVector wifi_networks_;
42713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The current connected (or connecting) wifi network.
4273dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  WifiNetwork* active_wifi_;
42743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The remembered wifi networks.
42763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  WifiNetworkVector remembered_wifi_networks_;
42773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The list of available cellular networks.
42793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CellularNetworkVector cellular_networks_;
42803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The current connected (or connecting) cellular network.
4282dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CellularNetwork* active_cellular_;
4283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // The list of available virtual networks.
4285dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  VirtualNetworkVector virtual_networks_;
4286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // The current connected (or connecting) virtual network.
4288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  VirtualNetwork* active_virtual_;
4289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // The path of the active profile (for retrieving remembered services).
4291dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string active_profile_path_;
42923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The current available network devices. Bitwise flag of ConnectionTypes.
42943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int available_devices_;
42953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The current enabled network devices. Bitwise flag of ConnectionTypes.
42973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int enabled_devices_;
42983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The current connected network devices. Bitwise flag of ConnectionTypes.
43003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int connected_devices_;
43013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4302201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // True if we are currently scanning for wifi networks.
4303201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool wifi_scanning_;
4304201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
4305201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Currently not implemented. TODO: implement or eliminate.
43063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool offline_mode_;
43073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
430872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // True if access network library is locked.
430972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool is_locked_;
431072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Type of pending SIM operation, SIM_OPERATION_NONE otherwise.
4312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SimOperationType sim_operation_;
4313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Delayed task to notify a network change.
4315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CancelableTask* notify_task_;
4316513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
431772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Cellular plan payment time.
431872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::Time cellular_plan_payment_time_;
431972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4320dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Temporary connection data for async connect calls.
4321dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  struct ConnectData {
4322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string service_name;
4323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string passphrase;
4324dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    std::string identity;
4325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string cert_path;
4326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string psk_key;
4327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string server_hostname;
4328dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  };
4329dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ConnectData connect_data_;
4330dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
43313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DISALLOW_COPY_AND_ASSIGN(NetworkLibraryImpl);
43323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
43333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
43343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass NetworkLibraryStubImpl : public NetworkLibrary {
43353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
4336513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  NetworkLibraryStubImpl()
4337513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      : ip_address_("1.1.1.1"),
4338dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        ethernet_(new EthernetNetwork("eth0")),
4339dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_wifi_(NULL),
4340dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        active_cellular_(NULL) {
4341513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
4342513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ~NetworkLibraryStubImpl() { if (ethernet_) delete ethernet_; }
4343513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) {}
4344513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveNetworkManagerObserver(NetworkManagerObserver* observer) {}
4345513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddNetworkObserver(const std::string& service_path,
4346513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                  NetworkObserver* observer) {}
4347513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveNetworkObserver(const std::string& service_path,
4348513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     NetworkObserver* observer) {}
4349513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) {}
4350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void AddNetworkDeviceObserver(const std::string& device_path,
4351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                        NetworkDeviceObserver* observer) {}
4352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RemoveNetworkDeviceObserver(const std::string& device_path,
4353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                           NetworkDeviceObserver* observer) {}
435472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Lock() {}
435572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Unlock() {}
4356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool IsLocked() { return false; }
4357513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void AddCellularDataPlanObserver(
4358513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      CellularDataPlanObserver* observer) {}
4359513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void RemoveCellularDataPlanObserver(
4360513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      CellularDataPlanObserver* observer) {}
4361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void AddPinOperationObserver(PinOperationObserver* observer) {}
4362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RemovePinOperationObserver(PinOperationObserver* observer) {}
4363dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void AddUserActionObserver(UserActionObserver* observer) {}
4364dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void RemoveUserActionObserver(UserActionObserver* observer) {}
4365dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
436621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual const EthernetNetwork* ethernet_network() const {
43673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return ethernet_;
43683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
43693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool ethernet_connecting() const { return false; }
43703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool ethernet_connected() const { return true; }
4371dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
437221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual const WifiNetwork* wifi_network() const {
4373dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_wifi_;
4374731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
43753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool wifi_connecting() const { return false; }
43763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool wifi_connected() const { return false; }
4377dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
437821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual const CellularNetwork* cellular_network() const {
4379dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_cellular_;
4380731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
43813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool cellular_connecting() const { return false; }
43823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool cellular_connected() const { return false; }
43833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4384dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const VirtualNetwork* virtual_network() const {
4385dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return active_virtual_;
4386dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
4387dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool virtual_network_connecting() const { return false; }
4388dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool virtual_network_connected() const { return false; }
4389dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
43903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool Connected() const { return true; }
43913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool Connecting() const { return false; }
43923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const std::string& IPAddress() const { return ip_address_; }
43933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual const WifiNetworkVector& wifi_networks() const {
43943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return wifi_networks_;
43953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
43963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual const WifiNetworkVector& remembered_wifi_networks() const {
43973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return wifi_networks_;
43983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
43993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual const CellularNetworkVector& cellular_networks() const {
44003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return cellular_networks_;
44013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4402dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const VirtualNetworkVector& virtual_networks() const {
4403dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return virtual_networks_;
4404dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
4405513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool has_cellular_networks() const {
4406513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return cellular_networks_.begin() != cellular_networks_.end();
44073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
44083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  /////////////////////////////////////////////////////////////////////////////
44093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4410dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const NetworkDevice* FindNetworkDeviceByPath(
4411dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const { return NULL; }
4412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const NetworkDevice* FindCellularDevice() const {
4413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
4414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const NetworkDevice* FindEthernetDevice() const {
4416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
4417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const NetworkDevice* FindWifiDevice() const {
4419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return NULL;
4420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
4421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual Network* FindNetworkByPath(
4422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& path) const { return NULL; }
4423513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual WifiNetwork* FindWifiNetworkByPath(
4424dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const { return NULL; }
4425513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual CellularNetwork* FindCellularNetworkByPath(
4426dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const { return NULL; }
4427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual VirtualNetwork* FindVirtualNetworkByPath(
4428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& path) const { return NULL; }
4429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual Network* FindNetworkFromRemembered(
4430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const Network* remembered) const { return NULL; }
4431dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const CellularDataPlanVector* GetDataPlans(
4432dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const { return NULL; }
4433dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const CellularDataPlan* GetSignificantDataPlan(
4434dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      const std::string& path) const { return NULL; }
4435dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
4436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ChangePin(const std::string& old_pin,
4437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         const std::string& new_pin) {}
4438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ChangeRequirePin(bool require_pin, const std::string& pin) {}
4439ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void EnterPin(const std::string& pin) {}
4440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void UnblockPin(const std::string& puk, const std::string& new_pin) {}
4441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RequestCellularScan() {}
4442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RequestCellularRegister(const std::string& network_id) {}
4443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetCellularDataRoamingAllowed(bool new_value) {}
4444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
4445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void RequestNetworkScan() {}
4446731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual bool GetWifiAccessPoints(WifiAccessPointVector* result) {
4447731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return false;
4448731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
4449731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
4450ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToWifiNetwork(WifiNetwork* network) {}
4451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToWifiNetwork(const std::string& service_path) {}
4452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToWifiNetwork(ConnectionSecurity security,
4453513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                    const std::string& ssid,
4454ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    const std::string& passphrase,
4455731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                    const std::string& identity,
4456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    const std::string& certpath) {}
4457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToCellularNetwork(CellularNetwork* network) {}
4458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToVirtualNetwork(VirtualNetwork* network) {}
4459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ConnectToVirtualNetworkPSK(
4460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& service_name,
4461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& server,
4462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& psk,
4463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& username,
4464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& user_passphrase) {}
446572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void SignalCellularPlanPayment() {}
446672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool HasRecentCellularPlanPayment() { return false; }
4467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void DisconnectFromNetwork(const Network* network) {}
4468513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void ForgetWifiNetwork(const std::string& service_path) {}
4469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual std::string GetCellularHomeCarrierId() const { return std::string(); }
44703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool ethernet_available() const { return true; }
44713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool wifi_available() const { return false; }
44723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool cellular_available() const { return false; }
44733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool ethernet_enabled() const { return true; }
44743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool wifi_enabled() const { return false; }
44753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool cellular_enabled() const { return false; }
4476201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual bool wifi_scanning() const { return false; }
4477513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual const Network* active_network() const { return NULL; }
4478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const Network* connected_network() const { return NULL; }
44793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool offline_mode() const { return false; }
4480731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void EnableEthernetNetworkDevice(bool enable) {}
4481731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void EnableWifiNetworkDevice(bool enable) {}
4482731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void EnableCellularNetworkDevice(bool enable) {}
4483731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void EnableOfflineMode(bool enable) {}
4484731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual NetworkIPConfigVector GetIPConfigs(const std::string& device_path,
4485ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             std::string* hardware_address,
4486ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             HardwareAddressFormat) {
4487731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    hardware_address->clear();
44883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return NetworkIPConfigVector();
44893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
44903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
44913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
44923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string ip_address_;
4493513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EthernetNetwork* ethernet_;
4494dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  WifiNetwork* active_wifi_;
4495dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  CellularNetwork* active_cellular_;
4496dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  VirtualNetwork* active_virtual_;
44973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  WifiNetworkVector wifi_networks_;
44983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CellularNetworkVector cellular_networks_;
4499dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  VirtualNetworkVector virtual_networks_;
45003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
45013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
45023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
45033345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickNetworkLibrary* NetworkLibrary::GetImpl(bool stub) {
45043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (stub)
45053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return new NetworkLibraryStubImpl();
45063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  else
45073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return new NetworkLibraryImpl();
4508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
4509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
45113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
45123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Allows InvokeLater without adding refcounting. This class is a Singleton and
45133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// won't be deleted until it's last InvokeLater is run.
45143345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickDISABLE_RUNNABLE_METHOD_REFCOUNT(chromeos::NetworkLibraryImpl);
4515