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