| Index: chrome/browser/chromeos/cros/network_library_impl_cros.cc
|
| diff --git a/chrome/browser/chromeos/cros/network_library_impl_cros.cc b/chrome/browser/chromeos/cros/network_library_impl_cros.cc
|
| deleted file mode 100644
|
| index f3510c9cf24f8e00c032bfd0c5dfa6032d389030..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/chromeos/cros/network_library_impl_cros.cc
|
| +++ /dev/null
|
| @@ -1,1302 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/chromeos/cros/network_library_impl_cros.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/command_line.h"
|
| -#include "base/json/json_writer.h" // for debug output only.
|
| -#include "base/metrics/histogram.h"
|
| -#include "base/stl_util.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/chromeos/cros/native_network_constants.h"
|
| -#include "chrome/browser/chromeos/cros/native_network_parser.h"
|
| -#include "chrome/browser/chromeos/settings/cros_settings.h"
|
| -#include "chrome/common/chrome_switches.h"
|
| -#include "chromeos/network/cros_network_functions.h"
|
| -#include "chromeos/network/network_state_handler.h"
|
| -#include "chromeos/network/network_util.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "third_party/cros_system_api/dbus/service_constants.h"
|
| -
|
| -using content::BrowserThread;
|
| -
|
| -namespace chromeos {
|
| -
|
| -// Structure used to pass IP parameter info to a DoSetIPParameters callback,
|
| -// since Bind only takes up to six parameters.
|
| -struct NetworkLibraryImplCros::IPParameterInfo {
|
| - std::string address;
|
| - std::string netmask;
|
| - std::string gateway;
|
| - std::string name_servers;
|
| - int dhcp_usage_mask;
|
| -};
|
| -
|
| -////////////////////////////////////////////////////////////////////////////
|
| -
|
| -NetworkLibraryImplCros::NetworkLibraryImplCros()
|
| - : NetworkLibraryImplBase(),
|
| - weak_ptr_factory_(this) {
|
| -}
|
| -
|
| -NetworkLibraryImplCros::~NetworkLibraryImplCros() {
|
| - STLDeleteValues(&monitored_networks_);
|
| - STLDeleteValues(&monitored_devices_);
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::Init() {
|
| - // First, get the currently available networks. This data is cached
|
| - // on the connman side, so the call should be quick.
|
| - VLOG(1) << "Requesting initial network manager info from libcros.";
|
| - CrosRequestNetworkManagerProperties(
|
| - base::Bind(&NetworkLibraryImplCros::NetworkManagerUpdate,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - network_manager_watcher_.reset(CrosMonitorNetworkManagerProperties(
|
| - base::Bind(&NetworkLibraryImplCros::NetworkManagerStatusChangedHandler,
|
| - weak_ptr_factory_.GetWeakPtr())));
|
| - // Always have at least one device obsever so that device updates are
|
| - // always received.
|
| - network_device_observer_.reset(new NetworkLibraryDeviceObserver());
|
| -}
|
| -
|
| -bool NetworkLibraryImplCros::IsCros() const {
|
| - return true;
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -// NetworkLibraryImplBase implementation.
|
| -
|
| -void NetworkLibraryImplCros::MonitorNetworkStart(
|
| - const std::string& service_path) {
|
| - if (monitored_networks_.find(service_path) == monitored_networks_.end()) {
|
| - CrosNetworkWatcher* watcher = CrosMonitorNetworkServiceProperties(
|
| - base::Bind(&NetworkLibraryImplCros::UpdateNetworkStatus,
|
| - weak_ptr_factory_.GetWeakPtr()),
|
| - service_path);
|
| - monitored_networks_[service_path] = watcher;
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::MonitorNetworkStop(
|
| - const std::string& service_path) {
|
| - NetworkWatcherMap::iterator iter = monitored_networks_.find(service_path);
|
| - if (iter != monitored_networks_.end()) {
|
| - delete iter->second;
|
| - monitored_networks_.erase(iter);
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::MonitorNetworkDeviceStart(
|
| - const std::string& device_path) {
|
| - if (monitored_devices_.find(device_path) == monitored_devices_.end()) {
|
| - CrosNetworkWatcher* watcher = CrosMonitorNetworkDeviceProperties(
|
| - base::Bind(&NetworkLibraryImplCros::UpdateNetworkDeviceStatus,
|
| - weak_ptr_factory_.GetWeakPtr()),
|
| - device_path);
|
| - monitored_devices_[device_path] = watcher;
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::MonitorNetworkDeviceStop(
|
| - const std::string& device_path) {
|
| - NetworkWatcherMap::iterator iter = monitored_devices_.find(device_path);
|
| - if (iter != monitored_devices_.end()) {
|
| - delete iter->second;
|
| - monitored_devices_.erase(iter);
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::UpdateNetworkStatus(
|
| - const std::string& path, const std::string& key, const Value& value) {
|
| - CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - Network* network = FindNetworkByPath(path);
|
| - if (network) {
|
| - VLOG(2) << "UpdateNetworkStatus: " << network->name() << "." << key;
|
| - bool prev_connected = network->connected();
|
| - if (!network->UpdateStatus(key, value, NULL)) {
|
| - LOG(WARNING) << "UpdateNetworkStatus: Error updating: "
|
| - << path << "." << key;
|
| - }
|
| - if (key == flimflam::kProfileProperty)
|
| - SetProfileTypeFromPath(network);
|
| - // If we just connected, this may have been added to remembered list.
|
| - if (!prev_connected && network->connected())
|
| - RequestRememberedNetworksUpdate();
|
| - NotifyNetworkChanged(network);
|
| - // Anything observing the manager needs to know about any service change.
|
| - NotifyNetworkManagerChanged(false); // Not forced.
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::UpdateNetworkDeviceStatus(
|
| - const std::string& path, const std::string& key, const Value& value) {
|
| - CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - NetworkDevice* device = FindNetworkDeviceByPath(path);
|
| - if (device) {
|
| - VLOG(2) << "UpdateNetworkDeviceStatus: " << device->name() << "." << key;
|
| - PropertyIndex index = PROPERTY_INDEX_UNKNOWN;
|
| - if (device->UpdateStatus(key, value, &index)) {
|
| - if (device->type() == TYPE_CELLULAR) {
|
| - if (!UpdateCellularDeviceStatus(device, index))
|
| - return; // Update aborted, skip notify.
|
| - }
|
| - } else {
|
| - VLOG(1) << "UpdateNetworkDeviceStatus: Failed to update: "
|
| - << path << "." << key;
|
| - }
|
| - if (device->type() == TYPE_WIFI && device->scanning() != wifi_scanning_) {
|
| - wifi_scanning_ = device->scanning();
|
| - NotifyNetworkManagerChanged(false); // Not forced.
|
| - }
|
| - // Notify only observers on device property change.
|
| - NotifyNetworkDeviceChanged(device, index);
|
| - // If a device's power state changes, new properties may become defined.
|
| - if (index == PROPERTY_INDEX_POWERED) {
|
| - CrosRequestNetworkDeviceProperties(
|
| - path,
|
| - base::Bind(&NetworkLibraryImplCros::NetworkDeviceUpdate,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - }
|
| - }
|
| -}
|
| -
|
| -bool NetworkLibraryImplCros::UpdateCellularDeviceStatus(NetworkDevice* device,
|
| - PropertyIndex index) {
|
| - if (index == PROPERTY_INDEX_CELLULAR_ALLOW_ROAMING) {
|
| - if (IsCellularAlwaysInRoaming()) {
|
| - if (!device->data_roaming_allowed())
|
| - SetCellularDataRoamingAllowed(true);
|
| - } else {
|
| - bool settings_value;
|
| - if ((CrosSettings::Get()->GetBoolean(
|
| - kSignedDataRoamingEnabled, &settings_value)) &&
|
| - (device->data_roaming_allowed() != settings_value)) {
|
| - // Switch back to signed settings value.
|
| - SetCellularDataRoamingAllowed(settings_value);
|
| - return false;
|
| - }
|
| - }
|
| - } else if (index == PROPERTY_INDEX_SIM_LOCK) {
|
| - // We only ever request a sim unlock when we wish to enable the device.
|
| - if (!device->is_sim_locked() && !cellular_enabled())
|
| - EnableCellularNetworkDevice(true);
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -/////////////////////////////////////////////////////////////////////////////
|
| -// NetworkLibraryImplBase connect implementation.
|
| -
|
| -void NetworkLibraryImplCros::CallConfigureService(const std::string& identifier,
|
| - const DictionaryValue* info) {
|
| - CrosConfigureService(*info);
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::NetworkConnectCallback(
|
| - const std::string& service_path,
|
| - NetworkMethodErrorType error,
|
| - const std::string& error_message) {
|
| - NetworkConnectStatus status;
|
| - if (error == NETWORK_METHOD_ERROR_NONE) {
|
| - status = CONNECT_SUCCESS;
|
| - } else {
|
| - LOG(WARNING) << "Error from ServiceConnect callback for: "
|
| - << service_path
|
| - << " Error: " << error << " Message: " << error_message;
|
| - if (error_message == flimflam::kErrorPassphraseRequiredMsg) {
|
| - status = CONNECT_BAD_PASSPHRASE;
|
| - } else {
|
| - status = CONNECT_FAILED;
|
| - }
|
| - }
|
| - Network* network = FindNetworkByPath(service_path);
|
| - if (!network) {
|
| - LOG(ERROR) << "No network for path: " << service_path;
|
| - return;
|
| - }
|
| - NetworkConnectCompleted(network, status);
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::CallConnectToNetwork(Network* network) {
|
| - DCHECK(network);
|
| - CrosRequestNetworkServiceConnect(
|
| - network->service_path(),
|
| - base::Bind(&NetworkLibraryImplCros::NetworkConnectCallback,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::WifiServiceUpdateAndConnect(
|
| - const std::string& service_path,
|
| - const base::DictionaryValue* properties) {
|
| - if (properties) {
|
| - Network* network = ParseNetwork(service_path, *properties);
|
| - CHECK_EQ(network->type(), TYPE_WIFI);
|
| - ConnectToWifiNetworkUsingConnectData(static_cast<WifiNetwork*>(network));
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::CallRequestWifiNetworkAndConnect(
|
| - const std::string& ssid, ConnectionSecurity security) {
|
| - // Asynchronously request service properties and call
|
| - // WifiServiceUpdateAndConnect.
|
| - CrosRequestHiddenWifiNetworkProperties(
|
| - ssid,
|
| - SecurityToString(security),
|
| - base::Bind(&NetworkLibraryImplCros::WifiServiceUpdateAndConnect,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::VPNServiceUpdateAndConnect(
|
| - const std::string& service_path,
|
| - const base::DictionaryValue* properties) {
|
| - if (properties) {
|
| - VLOG(1) << "Connecting to new VPN Service: " << service_path;
|
| - Network* network = ParseNetwork(service_path, *properties);
|
| - CHECK_EQ(network->type(), TYPE_VPN);
|
| - ConnectToVirtualNetworkUsingConnectData(
|
| - static_cast<VirtualNetwork*>(network));
|
| - } else {
|
| - LOG(WARNING) << "Unable to create VPN Service: " << service_path;
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::CallRequestVirtualNetworkAndConnect(
|
| - const std::string& service_name,
|
| - const std::string& server_hostname,
|
| - ProviderType provider_type) {
|
| - CrosRequestVirtualNetworkProperties(
|
| - service_name,
|
| - server_hostname,
|
| - ProviderTypeToString(provider_type),
|
| - base::Bind(&NetworkLibraryImplCros::VPNServiceUpdateAndConnect,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::CallDeleteRememberedNetwork(
|
| - const std::string& profile_path,
|
| - const std::string& service_path) {
|
| - CrosDeleteServiceFromProfile(profile_path, service_path);
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -// NetworkLibrary implementation.
|
| -
|
| -void NetworkLibraryImplCros::ChangePin(const std::string& old_pin,
|
| - const std::string& new_pin) {
|
| - const NetworkDevice* cellular = FindCellularDevice();
|
| - if (!cellular) {
|
| - NOTREACHED() << "Calling ChangePin method w/o cellular device.";
|
| - return;
|
| - }
|
| - sim_operation_ = SIM_OPERATION_CHANGE_PIN;
|
| - CrosRequestChangePin(
|
| - cellular->device_path(), old_pin, new_pin,
|
| - base::Bind(&NetworkLibraryImplCros::PinOperationCallback,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::ChangeRequirePin(bool require_pin,
|
| - const std::string& pin) {
|
| - VLOG(1) << "ChangeRequirePin require_pin: " << require_pin
|
| - << " pin: " << pin;
|
| - const NetworkDevice* cellular = FindCellularDevice();
|
| - if (!cellular) {
|
| - NOTREACHED() << "Calling ChangeRequirePin method w/o cellular device.";
|
| - return;
|
| - }
|
| - sim_operation_ = SIM_OPERATION_CHANGE_REQUIRE_PIN;
|
| - CrosRequestRequirePin(
|
| - cellular->device_path(), pin, require_pin,
|
| - base::Bind(&NetworkLibraryImplCros::PinOperationCallback,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::EnterPin(const std::string& pin) {
|
| - const NetworkDevice* cellular = FindCellularDevice();
|
| - if (!cellular) {
|
| - NOTREACHED() << "Calling EnterPin method w/o cellular device.";
|
| - return;
|
| - }
|
| - sim_operation_ = SIM_OPERATION_ENTER_PIN;
|
| - CrosRequestEnterPin(cellular->device_path(), pin,
|
| - base::Bind(&NetworkLibraryImplCros::PinOperationCallback,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::UnblockPin(const std::string& puk,
|
| - const std::string& new_pin) {
|
| - const NetworkDevice* cellular = FindCellularDevice();
|
| - if (!cellular) {
|
| - NOTREACHED() << "Calling UnblockPin method w/o cellular device.";
|
| - return;
|
| - }
|
| - sim_operation_ = SIM_OPERATION_UNBLOCK_PIN;
|
| - CrosRequestUnblockPin(
|
| - cellular->device_path(), puk, new_pin,
|
| - base::Bind(&NetworkLibraryImplCros::PinOperationCallback,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::PinOperationCallback(
|
| - const std::string& path,
|
| - NetworkMethodErrorType error,
|
| - const std::string& error_message) {
|
| - PinOperationError pin_error;
|
| - VLOG(1) << "PinOperationCallback, error: " << error
|
| - << " error_msg: " << error_message;
|
| - if (error == chromeos::NETWORK_METHOD_ERROR_NONE) {
|
| - pin_error = PIN_ERROR_NONE;
|
| - VLOG(1) << "Pin operation completed successfuly";
|
| - } else {
|
| - if (error_message == flimflam::kErrorIncorrectPinMsg ||
|
| - error_message == flimflam::kErrorPinRequiredMsg) {
|
| - pin_error = PIN_ERROR_INCORRECT_CODE;
|
| - } else if (error_message == flimflam::kErrorPinBlockedMsg) {
|
| - pin_error = PIN_ERROR_BLOCKED;
|
| - } else {
|
| - pin_error = PIN_ERROR_UNKNOWN;
|
| - NOTREACHED() << "Unknown PIN error: " << error_message;
|
| - }
|
| - }
|
| - NotifyPinOperationCompleted(pin_error);
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::RequestCellularScan() {
|
| - const NetworkDevice* cellular = FindCellularDevice();
|
| - if (!cellular) {
|
| - NOTREACHED() << "Calling RequestCellularScan method w/o cellular device.";
|
| - return;
|
| - }
|
| - CrosProposeScan(cellular->device_path());
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::RequestCellularRegister(
|
| - const std::string& network_id) {
|
| - const NetworkDevice* cellular = FindCellularDevice();
|
| - if (!cellular) {
|
| - NOTREACHED() << "Calling CellularRegister method w/o cellular device.";
|
| - return;
|
| - }
|
| - CrosRequestCellularRegister(
|
| - cellular->device_path(), network_id,
|
| - base::Bind(&NetworkLibraryImplCros::CellularRegisterCallback,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::CellularRegisterCallback(
|
| - const std::string& path,
|
| - NetworkMethodErrorType error,
|
| - const std::string& error_message) {
|
| - // TODO(dpolukhin): Notify observers about network registration status
|
| - // but not UI doesn't assume such notification so just ignore result.
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::SetCellularDataRoamingAllowed(bool new_value) {
|
| - const NetworkDevice* cellular = FindCellularDevice();
|
| - if (!cellular) {
|
| - NOTREACHED() << "Calling SetCellularDataRoamingAllowed method "
|
| - "w/o cellular device.";
|
| - return;
|
| - }
|
| - base::FundamentalValue value(new_value);
|
| - CrosSetNetworkDeviceProperty(cellular->device_path(),
|
| - flimflam::kCellularAllowRoamingProperty,
|
| - value);
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::SetCarrier(
|
| - const std::string& carrier,
|
| - const NetworkOperationCallback& completed) {
|
| - const NetworkDevice* cellular = FindCellularDevice();
|
| - if (!cellular) {
|
| - NOTREACHED() << "Calling SetCarrier method w/o cellular device.";
|
| - return;
|
| - }
|
| - CrosSetCarrier(cellular->device_path(), carrier, completed);
|
| -}
|
| -
|
| -bool NetworkLibraryImplCros::IsCellularAlwaysInRoaming() {
|
| - const NetworkDevice* cellular = FindCellularDevice();
|
| - if (!cellular) {
|
| - NOTREACHED() << "Calling IsCellularAlwaysInRoaming method "
|
| - "w/o cellular device.";
|
| - return false;
|
| - }
|
| - return cellular->provider_requires_roaming();
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::RequestNetworkScan() {
|
| - if (wifi_enabled())
|
| - CrosRequestNetworkScan(flimflam::kTypeWifi);
|
| -
|
| - if (wimax_enabled())
|
| - CrosRequestNetworkScan(flimflam::kTypeWimax);
|
| -
|
| - // Make sure all Manager info is up to date. This will also update
|
| - // remembered networks and visible services.
|
| - CrosRequestNetworkManagerProperties(
|
| - base::Bind(&NetworkLibraryImplCros::NetworkManagerUpdate,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::RefreshIPConfig(Network* network) {
|
| - DCHECK(network);
|
| - CrosRequestNetworkDeviceProperties(
|
| - network->device_path(),
|
| - base::Bind(&NetworkLibraryImplCros::RefreshIPConfigCallback,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::RefreshIPConfigCallback(
|
| - const std::string& device_path,
|
| - const base::DictionaryValue* properties) {
|
| - const ListValue* ips = NULL;
|
| - if (!properties->GetListWithoutPathExpansion(
|
| - flimflam::kIPConfigsProperty, &ips))
|
| - return;
|
| -
|
| - for (size_t i = 0; i < ips->GetSize(); i++) {
|
| - std::string ipconfig_path;
|
| - if (!ips->GetString(i, &ipconfig_path))
|
| - continue;
|
| - CrosRequestIPConfigRefresh(ipconfig_path);
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::DisconnectFromNetwork(const Network* network) {
|
| - DCHECK(network);
|
| - // Asynchronous disconnect request. Network state will be updated through
|
| - // the network manager once disconnect completes.
|
| - CrosRequestNetworkServiceDisconnect(network->service_path());
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::CallEnableNetworkDeviceType(
|
| - ConnectionType device, bool enable) {
|
| - busy_devices_ |= 1 << device;
|
| - CrosRequestNetworkDeviceEnable(ConnectionTypeToString(device), enable);
|
| - if (device == TYPE_WIFI && enable)
|
| - RequestNetworkScan();
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::CallRemoveNetwork(const Network* network) {
|
| - const std::string& service_path = network->service_path();
|
| - if (network->connected())
|
| - CrosRequestNetworkServiceDisconnect(service_path);
|
| - CrosRequestRemoveNetworkService(service_path);
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::GetIPConfigsCallback(
|
| - const NetworkGetIPConfigsCallback& callback,
|
| - HardwareAddressFormat format,
|
| - const NetworkIPConfigVector& ipconfig_vector,
|
| - const std::string& hardware_address) {
|
| - std::string hardware_address_tmp = hardware_address;
|
| - for (size_t i = 0; i < hardware_address_tmp.size(); ++i)
|
| - hardware_address_tmp[i] = toupper(hardware_address_tmp[i]);
|
| - if (format == FORMAT_COLON_SEPARATED_HEX) {
|
| - if (hardware_address_tmp.size() % 2 == 0) {
|
| - std::string output;
|
| - for (size_t i = 0; i < hardware_address_tmp.size(); ++i) {
|
| - if ((i != 0) && (i % 2 == 0))
|
| - output.push_back(':');
|
| - output.push_back(hardware_address_tmp[i]);
|
| - }
|
| - hardware_address_tmp.swap(output);
|
| - }
|
| - } else {
|
| - DCHECK_EQ(format, FORMAT_RAW_HEX);
|
| - }
|
| - callback.Run(ipconfig_vector, hardware_address_tmp);
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::GetIPConfigs(
|
| - const std::string& device_path,
|
| - HardwareAddressFormat format,
|
| - const NetworkGetIPConfigsCallback& callback) {
|
| - CrosListIPConfigs(device_path,
|
| - base::Bind(&NetworkLibraryImplCros::GetIPConfigsCallback,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - callback,
|
| - format));
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::SetIPParameters(const std::string& service_path,
|
| - const std::string& address,
|
| - const std::string& netmask,
|
| - const std::string& gateway,
|
| - const std::string& name_servers,
|
| - int dhcp_usage_mask) {
|
| - if (service_path.empty())
|
| - return;
|
| -
|
| - VLOG(1) << "Setting IP parameters: "
|
| - << "address: " << address
|
| - << (dhcp_usage_mask & USE_DHCP_ADDRESS ?
|
| - " (ignored)" : " (in use)")
|
| - << "netmask: " << netmask
|
| - << (dhcp_usage_mask & USE_DHCP_NETMASK ?
|
| - " (ignored)" : " (in use)")
|
| - << "gateway: " << gateway
|
| - << (dhcp_usage_mask & USE_DHCP_GATEWAY ?
|
| - " (ignored)" : " (in use)")
|
| - << "name_servers: " << name_servers
|
| - << (dhcp_usage_mask & USE_DHCP_NAME_SERVERS ?
|
| - " (ignored)" : " (in use)");
|
| -
|
| - // Have to pass these in a structure, since Bind only takes up to six
|
| - // parameters.
|
| - IPParameterInfo info;
|
| - info.address = address;
|
| - info.netmask = netmask;
|
| - info.gateway = gateway;
|
| - info.name_servers = name_servers;
|
| - info.dhcp_usage_mask = dhcp_usage_mask;
|
| - chromeos::NetworkPropertiesCallback callback =
|
| - base::Bind(&NetworkLibraryImplCros::SetIPParametersCallback,
|
| - weak_ptr_factory_.GetWeakPtr(), info);
|
| -
|
| - CrosRequestNetworkServiceProperties(service_path, callback);
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::RequestNetworkServiceProperties(
|
| - const std::string& service_path,
|
| - const NetworkServicePropertiesCallback& callback) {
|
| - chromeos::CrosRequestNetworkServiceProperties(service_path, callback);
|
| -}
|
| -
|
| -/////////////////////////////////////////////////////////////////////////////
|
| -// Network Manager functions.
|
| -
|
| -void NetworkLibraryImplCros::NetworkManagerStatusChangedHandler(
|
| - const std::string& path,
|
| - const std::string& key,
|
| - const Value& value) {
|
| - if (!NetworkManagerStatusChanged(key, &value)) {
|
| - LOG(ERROR) << "Invalid key-value pair, key: " << key << " type: "
|
| - << value.GetType();
|
| - }
|
| -}
|
| -
|
| -// This processes all Manager update messages.
|
| -bool NetworkLibraryImplCros::NetworkManagerStatusChanged(
|
| - const std::string& key, const Value* value) {
|
| - CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - base::TimeTicks start = base::TimeTicks::Now();
|
| - VLOG(1) << "NetworkManagerStatusChanged: KEY=" << key;
|
| - int index = NativeNetworkParser::property_mapper()->Get(key);
|
| - switch (index) {
|
| - case PROPERTY_INDEX_STATE:
|
| - // Currently we ignore the network manager state.
|
| - break;
|
| - case PROPERTY_INDEX_AVAILABLE_TECHNOLOGIES: {
|
| - const ListValue* vlist = NULL;
|
| - if (!value->GetAsList(&vlist))
|
| - return false;
|
| - UpdateAvailableTechnologies(vlist);
|
| - break;
|
| - }
|
| - case PROPERTY_INDEX_UNINITIALIZED_TECHNOLOGIES: {
|
| - const ListValue* vlist = NULL;
|
| - if (!value->GetAsList(&vlist))
|
| - return false;
|
| - UpdateTechnologies(vlist, &uninitialized_devices_);
|
| - break;
|
| - }
|
| - case PROPERTY_INDEX_ENABLED_TECHNOLOGIES: {
|
| - const ListValue* vlist = NULL;
|
| - if (!value->GetAsList(&vlist))
|
| - return false;
|
| - UpdateEnabledTechnologies(vlist);
|
| - break;
|
| - }
|
| - case PROPERTY_INDEX_DEFAULT_TECHNOLOGY:
|
| - // Currently we ignore DefaultTechnology.
|
| - break;
|
| - case PROPERTY_INDEX_ACTIVE_PROFILE: {
|
| - std::string prev = active_profile_path_;
|
| - DCHECK_EQ(value->GetType(), Value::TYPE_STRING);
|
| - value->GetAsString(&active_profile_path_);
|
| - VLOG(1) << "Active Profile: " << active_profile_path_;
|
| - if (active_profile_path_ != prev &&
|
| - active_profile_path_ != kSharedProfilePath)
|
| - SwitchToPreferredNetwork();
|
| - break;
|
| - }
|
| - case PROPERTY_INDEX_PROFILES: {
|
| - const ListValue* vlist = NULL;
|
| - if (!value->GetAsList(&vlist))
|
| - return false;
|
| - UpdateRememberedNetworks(vlist);
|
| - break;
|
| - }
|
| - case PROPERTY_INDEX_SERVICES: {
|
| - const ListValue* vlist = NULL;
|
| - if (!value->GetAsList(&vlist))
|
| - return false;
|
| - UpdateNetworkServiceList(vlist);
|
| - break;
|
| - }
|
| - case PROPERTY_INDEX_SERVICE_WATCH_LIST: {
|
| - const ListValue* vlist = NULL;
|
| - if (!value->GetAsList(&vlist))
|
| - return false;
|
| - UpdateWatchedNetworkServiceList(vlist);
|
| - break;
|
| - }
|
| - case PROPERTY_INDEX_DEVICE:
|
| - case PROPERTY_INDEX_DEVICES: {
|
| - const ListValue* vlist = NULL;
|
| - if (!value->GetAsList(&vlist))
|
| - return false;
|
| - UpdateNetworkDeviceList(vlist);
|
| - break;
|
| - }
|
| - case PROPERTY_INDEX_CHECK_PORTAL_LIST: {
|
| - DCHECK_EQ(value->GetType(), Value::TYPE_STRING);
|
| - value->GetAsString(&check_portal_list_);
|
| - break;
|
| - }
|
| - case PROPERTY_INDEX_PORTAL_URL:
|
| - case PROPERTY_INDEX_ARP_GATEWAY:
|
| - // Currently we ignore PortalURL and ArpGateway.
|
| - break;
|
| - default:
|
| - VLOG(2) << "Manager: Unhandled key: " << key;
|
| - break;
|
| - }
|
| - base::TimeDelta delta = base::TimeTicks::Now() - start;
|
| - VLOG(2) << "NetworkManagerStatusChanged: time: "
|
| - << delta.InMilliseconds() << " ms.";
|
| - HISTOGRAM_TIMES("CROS_NETWORK_UPDATE", delta);
|
| - return true;
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::NetworkManagerUpdate(
|
| - const std::string& manager_path,
|
| - const base::DictionaryValue* properties) {
|
| - if (!properties) {
|
| - LOG(ERROR) << "Error retrieving manager properties: " << manager_path;
|
| - return;
|
| - }
|
| - VLOG(1) << "Received NetworkManagerUpdate.";
|
| -
|
| - for (DictionaryValue::Iterator iter(*properties); !iter.IsAtEnd();
|
| - iter.Advance()) {
|
| - if (!NetworkManagerStatusChanged(iter.key(), &iter.value())) {
|
| - LOG(ERROR) << "Invalid key-value pair, key: " << iter.key() << " type: "
|
| - << iter.value().GetType();
|
| - }
|
| - }
|
| - // If there is no Profiles entry, request remembered networks here.
|
| - if (!properties->HasKey(flimflam::kProfilesProperty))
|
| - RequestRememberedNetworksUpdate();
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////
|
| -
|
| -void NetworkLibraryImplCros::UpdateTechnologies(
|
| - const ListValue* technologies, int* bitfieldp) {
|
| - DCHECK(bitfieldp);
|
| - if (!technologies)
|
| - return;
|
| - int bitfield = 0;
|
| - for (ListValue::const_iterator iter = technologies->begin();
|
| - iter != technologies->end(); ++iter) {
|
| - std::string technology;
|
| - (*iter)->GetAsString(&technology);
|
| - if (!technology.empty()) {
|
| - ConnectionType type =
|
| - NativeNetworkParser::ParseConnectionType(technology);
|
| - bitfield |= 1 << type;
|
| - }
|
| - }
|
| - *bitfieldp = bitfield;
|
| - NotifyNetworkManagerChanged(false); // Not forced.
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::UpdateAvailableTechnologies(
|
| - const ListValue* technologies) {
|
| - UpdateTechnologies(technologies, &available_devices_);
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::UpdateEnabledTechnologies(
|
| - const ListValue* technologies) {
|
| - int old_enabled_devices = enabled_devices_;
|
| - UpdateTechnologies(technologies, &enabled_devices_);
|
| - busy_devices_ &= ~(old_enabled_devices ^ enabled_devices_);
|
| - if (!ethernet_enabled())
|
| - ethernet_ = NULL;
|
| - if (!wifi_enabled()) {
|
| - active_wifi_ = NULL;
|
| - wifi_networks_.clear();
|
| - }
|
| - if (!cellular_enabled()) {
|
| - active_cellular_ = NULL;
|
| - cellular_networks_.clear();
|
| - }
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////
|
| -
|
| -// Update all network lists, and request associated service updates.
|
| -void NetworkLibraryImplCros::UpdateNetworkServiceList(
|
| - const ListValue* services) {
|
| - // Copy the list of existing networks to "old" and clear the map and lists.
|
| - NetworkMap old_network_map = network_map_;
|
| - ClearNetworks();
|
| - // Clear the list of update requests.
|
| - int network_priority_order = 0;
|
| - network_update_requests_.clear();
|
| - // |services| represents a complete list of visible networks.
|
| - for (ListValue::const_iterator iter = services->begin();
|
| - iter != services->end(); ++iter) {
|
| - std::string service_path;
|
| - (*iter)->GetAsString(&service_path);
|
| - if (!service_path.empty()) {
|
| - // If we find the network in "old", add it immediately to the map
|
| - // and lists. Otherwise it will get added when NetworkServiceUpdate
|
| - // calls ParseNetwork.
|
| - NetworkMap::iterator found = old_network_map.find(service_path);
|
| - if (found != old_network_map.end()) {
|
| - AddNetwork(found->second);
|
| - old_network_map.erase(found);
|
| - }
|
| - // Always request network updates.
|
| - // TODO(stevenjb): Investigate why we are missing updates then
|
| - // rely on watched network updates and only request updates here for
|
| - // new networks.
|
| - // Use update_request map to store network priority.
|
| - network_update_requests_[service_path] = network_priority_order++;
|
| - VLOG(2) << "UpdateNetworkServiceList, Service: " << service_path;
|
| - CrosRequestNetworkServiceProperties(
|
| - service_path,
|
| - base::Bind(&NetworkLibraryImplCros::NetworkServiceUpdate,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - }
|
| - }
|
| -
|
| - // Iterate through list of remaining networks that are no longer in the
|
| - // list and delete them or update their status and re-add them to the list.
|
| - for (NetworkMap::iterator iter = old_network_map.begin();
|
| - iter != old_network_map.end(); ++iter) {
|
| - Network* network = iter->second;
|
| - VLOG(2) << "Delete Network: " << network->name()
|
| - << " State = " << network->GetStateString()
|
| - << " connecting = " << network->connecting()
|
| - << " connection_started = " << network->connection_started();
|
| - WifiNetwork* wifi = NULL;
|
| - if (network->type() == TYPE_WIFI)
|
| - wifi = static_cast<WifiNetwork*>(network);
|
| - if (network->failed() && network->notify_failure()) {
|
| - // We have not notified observers of a connection failure yet.
|
| - AddNetwork(network);
|
| - } else if (network->connecting() && network->connection_started() &&
|
| - !(wifi && wifi->hidden_ssid())) {
|
| - // Network was in connecting state; set state to failed, but not if it
|
| - // had a hidden SSID (since that won't appear in the scanning list).
|
| - VLOG(2) << "Removed network was connecting: " << network->name();
|
| - network->SetState(STATE_FAILURE);
|
| - AddNetwork(network);
|
| - } else {
|
| - VLOG(2) << "Deleting removed network: " << network->name()
|
| - << " State = " << network->GetStateString();
|
| - DeleteNetwork(network);
|
| - }
|
| - }
|
| - // If the last network has disappeared, nothing else will
|
| - // have notified observers, so do it now.
|
| - if (services->empty())
|
| - NotifyNetworkManagerChanged(true); // Forced update
|
| -}
|
| -
|
| -// Request updates for watched networks. Does not affect network lists.
|
| -// Existing networks will be updated. There should not be any new networks
|
| -// in this list, but if there are they will be added appropriately.
|
| -void NetworkLibraryImplCros::UpdateWatchedNetworkServiceList(
|
| - const ListValue* services) {
|
| - for (ListValue::const_iterator iter = services->begin();
|
| - iter != services->end(); ++iter) {
|
| - std::string service_path;
|
| - (*iter)->GetAsString(&service_path);
|
| - if (!service_path.empty()) {
|
| - VLOG(1) << "Watched Service: " << service_path;
|
| - CrosRequestNetworkServiceProperties(
|
| - service_path,
|
| - base::Bind(&NetworkLibraryImplCros::NetworkServiceUpdate,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - }
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::NetworkServiceUpdate(
|
| - const std::string& service_path,
|
| - const base::DictionaryValue* properties) {
|
| - if (!properties)
|
| - return; // Network no longer in visible list, ignore.
|
| - VLOG(2) << "NetworkServiceUpdate: " << service_path;
|
| - ParseNetwork(service_path, *properties);
|
| -}
|
| -
|
| -// Called from NetworkServiceUpdate and WifiServiceUpdateAndConnect.
|
| -Network* NetworkLibraryImplCros::ParseNetwork(
|
| - const std::string& service_path, const DictionaryValue& info) {
|
| - Network* network = FindNetworkByPath(service_path);
|
| - if (!network) {
|
| - NativeNetworkParser parser;
|
| - network = parser.CreateNetworkFromInfo(service_path, info);
|
| - AddNetwork(network);
|
| - } else {
|
| - // Erase entry from network_unique_id_map_ in case unique id changes.
|
| - if (!network->unique_id().empty())
|
| - network_unique_id_map_.erase(network->unique_id());
|
| - if (network->network_parser()) {
|
| - ConnectionState old_state = network->state();
|
| - network->network_parser()->UpdateNetworkFromInfo(info, network);
|
| - if (old_state != network->state()) {
|
| - VLOG(1) << "ParseNetwork: " << network->name()
|
| - << " State: " << old_state << " -> " << network->state();
|
| - }
|
| - }
|
| - }
|
| -
|
| - if (!network->unique_id().empty())
|
| - network_unique_id_map_[network->unique_id()] = network;
|
| -
|
| - SetProfileTypeFromPath(network);
|
| -
|
| - UpdateActiveNetwork(network);
|
| -
|
| - // Copy remembered credentials if required.
|
| - Network* remembered = FindRememberedFromNetwork(network);
|
| - if (remembered)
|
| - network->CopyCredentialsFromRemembered(remembered);
|
| -
|
| - // Find and erase entry in update_requests, and set network priority.
|
| - PriorityMap::iterator found2 = network_update_requests_.find(service_path);
|
| - if (found2 != network_update_requests_.end()) {
|
| - network->priority_order_ = found2->second;
|
| - network_update_requests_.erase(found2);
|
| - } else {
|
| - // TODO(stevenjb): Enable warning once UpdateNetworkServiceList is fixed.
|
| - // LOG(WARNING) << "ParseNetwork called with no update request entry: "
|
| - // << service_path;
|
| - }
|
| -
|
| - VLOG(2) << "ParseNetwork: " << network->name()
|
| - << " path: " << network->service_path()
|
| - << " profile: " << network->profile_path_;
|
| - NotifyNetworkManagerChanged(false); // Not forced.
|
| - return network;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////
|
| -
|
| -void NetworkLibraryImplCros::UpdateRememberedNetworks(
|
| - const ListValue* profiles) {
|
| - VLOG(1) << "UpdateRememberedNetworks";
|
| - // Update the list of profiles.
|
| - NetworkProfileList old_profile_list;
|
| - old_profile_list.swap(profile_list_);
|
| -
|
| - for (ListValue::const_iterator iter = profiles->begin();
|
| - iter != profiles->end(); ++iter) {
|
| - std::string profile_path;
|
| - (*iter)->GetAsString(&profile_path);
|
| - if (profile_path.empty()) {
|
| - LOG(WARNING) << "Bad or empty profile path.";
|
| - continue;
|
| - }
|
| - NetworkProfileType profile_type;
|
| - if (profile_path == kSharedProfilePath)
|
| - profile_type = PROFILE_SHARED;
|
| - else
|
| - profile_type = PROFILE_USER;
|
| - AddProfile(profile_path, profile_type);
|
| - }
|
| - bool lists_equal = old_profile_list.size() == profile_list_.size() &&
|
| - std::equal(profile_list_.begin(), profile_list_.end(),
|
| - old_profile_list.begin(), AreProfilePathsEqual);
|
| -
|
| - RequestRememberedNetworksUpdate();
|
| - if (!lists_equal)
|
| - NotifyNetworkProfileObservers();
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::RequestRememberedNetworksUpdate() {
|
| - VLOG(1) << "RequestRememberedNetworksUpdate";
|
| - // Delete all remembered networks. We delete them because
|
| - // RequestNetworkProfileProperties is asynchronous and may invoke
|
| - // UpdateRememberedServiceList multiple times (once per profile).
|
| - // We can do this safely because we do not save any local state for
|
| - // remembered networks. This list updates infrequently.
|
| - DeleteRememberedNetworks();
|
| - // Request remembered networks from each profile. Later entries will
|
| - // override earlier entries, so default/local entries will override
|
| - // user entries (as desired).
|
| - for (NetworkProfileList::iterator iter = profile_list_.begin();
|
| - iter != profile_list_.end(); ++iter) {
|
| - NetworkProfile& profile = *iter;
|
| - VLOG(1) << " Requesting Profile: " << profile.path;
|
| - CrosRequestNetworkProfileProperties(
|
| - profile.path,
|
| - base::Bind(&NetworkLibraryImplCros::UpdateProfile,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::UpdateProfile(
|
| - const std::string& profile_path,
|
| - const base::DictionaryValue* properties) {
|
| - if (!properties) {
|
| - LOG(ERROR) << "Error retrieving profile: " << profile_path;
|
| - return;
|
| - }
|
| - VLOG(1) << "UpdateProfile for path: " << profile_path;
|
| - const ListValue* profile_entries(NULL);
|
| - properties->GetList(flimflam::kEntriesProperty, &profile_entries);
|
| - if (!profile_entries) {
|
| - LOG(ERROR) << "'Entries' property is missing.";
|
| - return;
|
| - }
|
| -
|
| - NetworkProfileList::iterator iter1;
|
| - for (iter1 = profile_list_.begin(); iter1 != profile_list_.end(); ++iter1) {
|
| - if (iter1->path == profile_path)
|
| - break;
|
| - }
|
| - if (iter1 == profile_list_.end()) {
|
| - // This can happen if shill gets restarted while Chrome is running.
|
| - LOG(WARNING) << "Profile not in list: " << profile_path;
|
| - return;
|
| - }
|
| - NetworkProfile& profile = *iter1;
|
| - // |profile_entries| is a list of remembered networks from |profile_path|.
|
| - profile.services.clear();
|
| - for (ListValue::const_iterator iter2 = profile_entries->begin();
|
| - iter2 != profile_entries->end(); ++iter2) {
|
| - std::string service_path;
|
| - (*iter2)->GetAsString(&service_path);
|
| - if (service_path.empty()) {
|
| - LOG(WARNING) << "Empty service path in profile.";
|
| - continue;
|
| - }
|
| - VLOG(2) << " Remembered service: " << service_path;
|
| - // Add service to profile list.
|
| - profile.services.insert(service_path);
|
| - // Request update for remembered network.
|
| - // Shill does not set the Profile property for remembered networks, but only
|
| - // for the active networks, so we provide |profile_path| to the callback.
|
| - CrosRequestNetworkProfileEntryProperties(
|
| - profile_path,
|
| - service_path,
|
| - base::Bind(&NetworkLibraryImplCros::RememberedNetworkServiceUpdate,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - profile_path));
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::RememberedNetworkServiceUpdate(
|
| - const std::string& profile_path,
|
| - const std::string& service_path,
|
| - const base::DictionaryValue* properties) {
|
| - VLOG(2) << "RememberedNetworkServiceUpdate: profile: " << profile_path
|
| - << " service: " << service_path
|
| - << (properties == NULL ? " got removed" : " got updated");
|
| - if (properties) {
|
| - ParseRememberedNetwork(profile_path, service_path, *properties);
|
| - } else {
|
| - // Remove this service from the respective Profile::services list.
|
| - for (NetworkProfileList::iterator iter = profile_list_.begin();
|
| - iter != profile_list_.end(); ++iter) {
|
| - NetworkProfile& profile = *iter;
|
| - if (profile.path != profile_path)
|
| - continue;
|
| -
|
| - if (profile.services.erase(service_path) != 0) {
|
| - VLOG(1) << "Removed service path: " << service_path
|
| - << " from Profile::services of: " << profile_path;
|
| - }
|
| - break;
|
| - }
|
| - }
|
| -}
|
| -
|
| -// Returns NULL if |service_path| refers to a network that is not a
|
| -// remembered type. Called from RememberedNetworkServiceUpdate.
|
| -Network* NetworkLibraryImplCros::ParseRememberedNetwork(
|
| - const std::string& profile_path,
|
| - const std::string& service_path,
|
| - const DictionaryValue& info) {
|
| - Network* remembered;
|
| - NetworkMap::iterator found = remembered_network_map_.find(service_path);
|
| - if (found != remembered_network_map_.end()) {
|
| - remembered = found->second;
|
| - if (remembered->network_parser())
|
| - remembered->network_parser()->UpdateNetworkFromInfo(info, remembered);
|
| - } else {
|
| - NativeNetworkParser parser;
|
| - remembered = parser.CreateNetworkFromInfo(service_path, info);
|
| - if (remembered->type() == TYPE_WIFI || remembered->type() == TYPE_VPN) {
|
| - if (!ValidateAndAddRememberedNetwork(remembered))
|
| - return NULL;
|
| - } else {
|
| - LOG(WARNING) << "Ignoring remembered network: " << service_path
|
| - << " Type: " << ConnectionTypeToString(remembered->type());
|
| - delete remembered;
|
| - return NULL;
|
| - }
|
| - }
|
| -
|
| - remembered->set_profile_path(profile_path);
|
| - SetProfileTypeFromPath(remembered);
|
| -
|
| - VLOG(2) << "ParseRememberedNetwork: " << remembered->name()
|
| - << " path: " << remembered->service_path()
|
| - << " profile: " << remembered->profile_path_;
|
| - NotifyNetworkManagerChanged(false); // Not forced.
|
| -
|
| - if (remembered->type() == TYPE_VPN) {
|
| - // VPNs are only stored in profiles. If we don't have a network for it,
|
| - // request one.
|
| - if (!FindNetworkByUniqueId(remembered->unique_id())) {
|
| - VirtualNetwork* vpn = static_cast<VirtualNetwork*>(remembered);
|
| - std::string provider_type = ProviderTypeToString(vpn->provider_type());
|
| - VLOG(2) << "Requesting VPN: " << vpn->name()
|
| - << " Server: " << vpn->server_hostname()
|
| - << " Type: " << provider_type;
|
| - CrosRequestVirtualNetworkProperties(
|
| - vpn->name(),
|
| - vpn->server_hostname(),
|
| - provider_type,
|
| - base::Bind(&NetworkLibraryImplCros::NetworkServiceUpdate,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - }
|
| - }
|
| -
|
| - return remembered;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////
|
| -// NetworkDevice list management functions.
|
| -
|
| -// Update device list, and request associated device updates.
|
| -// |devices| represents a complete list of devices.
|
| -void NetworkLibraryImplCros::UpdateNetworkDeviceList(const ListValue* devices) {
|
| - NetworkDeviceMap old_device_map = device_map_;
|
| - device_map_.clear();
|
| - VLOG(2) << "Updating Device List.";
|
| - for (ListValue::const_iterator iter = devices->begin();
|
| - iter != devices->end(); ++iter) {
|
| - std::string device_path;
|
| - (*iter)->GetAsString(&device_path);
|
| - if (!device_path.empty()) {
|
| - NetworkDeviceMap::iterator found = old_device_map.find(device_path);
|
| - if (found != old_device_map.end()) {
|
| - VLOG(2) << " Adding existing device: " << device_path;
|
| - CHECK(found->second) << "Attempted to add NULL device pointer";
|
| - device_map_[device_path] = found->second;
|
| - old_device_map.erase(found);
|
| - }
|
| - CrosRequestNetworkDeviceProperties(
|
| - device_path,
|
| - base::Bind(&NetworkLibraryImplCros::NetworkDeviceUpdate,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - }
|
| - }
|
| - // Delete any old devices that no longer exist.
|
| - for (NetworkDeviceMap::iterator iter = old_device_map.begin();
|
| - iter != old_device_map.end(); ++iter) {
|
| - DeleteDeviceFromDeviceObserversMap(iter->first);
|
| - // Delete device.
|
| - delete iter->second;
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::NetworkDeviceUpdate(
|
| - const std::string& device_path,
|
| - const base::DictionaryValue* properties) {
|
| - if (!properties) {
|
| - // device no longer exists.
|
| - DeleteDevice(device_path);
|
| - } else {
|
| - ParseNetworkDevice(device_path, *properties);
|
| - }
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::ParseNetworkDevice(const std::string& device_path,
|
| - const DictionaryValue& info) {
|
| - NetworkDeviceMap::iterator found = device_map_.find(device_path);
|
| - NetworkDevice* device;
|
| - if (found != device_map_.end()) {
|
| - device = found->second;
|
| - device->device_parser()->UpdateDeviceFromInfo(info, device);
|
| - } else {
|
| - NativeNetworkDeviceParser parser;
|
| - device = parser.CreateDeviceFromInfo(device_path, info);
|
| - VLOG(2) << " Adding device: " << device_path;
|
| - if (device) {
|
| - device_map_[device_path] = device;
|
| - }
|
| - CHECK(device) << "Attempted to add NULL device for path: " << device_path;
|
| - }
|
| - VLOG(2) << "ParseNetworkDevice:" << device->name();
|
| -
|
| - // Re-synchronize the roaming setting with the device property if required.
|
| - if (device && device->type() == TYPE_CELLULAR)
|
| - UpdateCellularDeviceStatus(device, PROPERTY_INDEX_CELLULAR_ALLOW_ROAMING);
|
| -
|
| - if (device && device->type() == TYPE_WIFI)
|
| - wifi_scanning_ = device->scanning();
|
| -
|
| - NotifyNetworkManagerChanged(false); // Not forced.
|
| - AddNetworkDeviceObserver(device_path, network_device_observer_.get());
|
| -}
|
| -
|
| -void NetworkLibraryImplCros::SetIPParametersCallback(
|
| - const IPParameterInfo& info,
|
| - const std::string& service_path,
|
| - const base::DictionaryValue* properties) {
|
| - // crbug.com/146616 will fix this once we have better
|
| - // handling of shill errors.
|
| - if (!properties)
|
| - return;
|
| -
|
| - Network* network = FindNetworkByPath(service_path);
|
| - if (!network)
|
| - return;
|
| -
|
| - // Find the properties we're going to set, and minimize the DBus calls below
|
| - // by not clearing if it's already cleared, and not setting if it's already
|
| - // set to the same value. Also, don't reconnect at the end if nothing changed.
|
| - bool something_changed = false;
|
| - std::string current_address;
|
| - int32 current_prefixlen = -1;
|
| - std::string current_gateway;
|
| - std::string current_name_servers;
|
| - bool address_exists = properties->GetStringWithoutPathExpansion(
|
| - shill::kStaticIPAddressProperty,
|
| - ¤t_address);
|
| - VLOG_IF(2, address_exists) << shill::kStaticIPAddressProperty
|
| - << "=" << current_address;
|
| - bool prefixlen_exists = properties->GetIntegerWithoutPathExpansion(
|
| - shill::kStaticIPPrefixlenProperty,
|
| - ¤t_prefixlen);
|
| - VLOG_IF(2, prefixlen_exists) << shill::kStaticIPPrefixlenProperty
|
| - << "=" << current_prefixlen;
|
| - bool gateway_exists = properties->GetStringWithoutPathExpansion(
|
| - shill::kStaticIPGatewayProperty,
|
| - ¤t_gateway);
|
| - VLOG_IF(2, gateway_exists) << shill::kStaticIPGatewayProperty
|
| - << "=" << current_gateway;
|
| - bool name_servers_exist = properties->GetStringWithoutPathExpansion(
|
| - shill::kStaticIPNameServersProperty,
|
| - ¤t_name_servers);
|
| - VLOG_IF(2, name_servers_exist) << shill::kStaticIPNameServersProperty
|
| - << "=" << current_name_servers;
|
| -
|
| - if (info.dhcp_usage_mask & USE_DHCP_ADDRESS) {
|
| - if (address_exists) {
|
| - something_changed = true;
|
| - CrosClearNetworkServiceProperty(service_path,
|
| - shill::kStaticIPAddressProperty);
|
| - VLOG(2) << "Clearing " << shill::kStaticIPAddressProperty;
|
| - }
|
| - } else if (current_address != info.address) {
|
| - base::StringValue value(info.address);
|
| - VLOG(2) << "Setting " << shill::kStaticIPAddressProperty
|
| - << " to " << info.address;
|
| - something_changed = true;
|
| - CrosSetNetworkServiceProperty(service_path,
|
| - shill::kStaticIPAddressProperty,
|
| - value);
|
| - }
|
| -
|
| - if (info.dhcp_usage_mask & USE_DHCP_NETMASK) {
|
| - if (prefixlen_exists) {
|
| - something_changed = true;
|
| - CrosClearNetworkServiceProperty(service_path,
|
| - shill::kStaticIPPrefixlenProperty);
|
| - VLOG(2) << "Clearing " << shill::kStaticIPPrefixlenProperty;
|
| - }
|
| - } else {
|
| - int prefixlen = network_util::NetmaskToPrefixLength(info.netmask);
|
| - if (prefixlen == -1) {
|
| - VLOG(1) << "IPConfig prefix length is invalid for netmask "
|
| - << info.netmask;
|
| - } else if (current_prefixlen != prefixlen) {
|
| - base::FundamentalValue value(prefixlen);
|
| - VLOG(2) << "Setting " << shill::kStaticIPPrefixlenProperty
|
| - << " to " << prefixlen;
|
| - something_changed = true;
|
| - CrosSetNetworkServiceProperty(service_path,
|
| - shill::kStaticIPPrefixlenProperty,
|
| - value);
|
| - }
|
| - }
|
| -
|
| - if (info.dhcp_usage_mask & USE_DHCP_GATEWAY) {
|
| - if (gateway_exists) {
|
| - something_changed = true;
|
| - CrosClearNetworkServiceProperty(service_path,
|
| - shill::kStaticIPGatewayProperty);
|
| - VLOG(2) << "Clearing " << shill::kStaticIPGatewayProperty;
|
| - }
|
| - } else if (current_gateway != info.gateway){
|
| - base::StringValue value(info.gateway);
|
| - VLOG(2) << "Setting " << shill::kStaticIPGatewayProperty
|
| - << " to " << info.gateway;
|
| - something_changed = true;
|
| - CrosSetNetworkServiceProperty(service_path,
|
| - shill::kStaticIPGatewayProperty,
|
| - value);
|
| - }
|
| -
|
| - if (info.dhcp_usage_mask & USE_DHCP_NAME_SERVERS) {
|
| - if (name_servers_exist) {
|
| - something_changed = true;
|
| - CrosClearNetworkServiceProperty(service_path,
|
| - shill::kStaticIPNameServersProperty);
|
| - VLOG(2) << "Clearing " << shill::kStaticIPNameServersProperty;
|
| -
|
| - // Notify that the network changed, so that the DNS cache can be
|
| - // cleared properly.
|
| - NotifyNetworkChanged(network);
|
| - }
|
| - } else if (current_name_servers != info.name_servers){
|
| - base::StringValue value(info.name_servers);
|
| - VLOG(2) << "Setting " << shill::kStaticIPNameServersProperty
|
| - << " to " << info.name_servers;
|
| - something_changed = true;
|
| - CrosSetNetworkServiceProperty(service_path,
|
| - shill::kStaticIPNameServersProperty,
|
| - value);
|
| -
|
| - // Notify that the network changed, so that the DNS cache can be
|
| - // cleared properly.
|
| - NotifyNetworkChanged(network);
|
| - }
|
| -
|
| - if (!something_changed)
|
| - return;
|
| -
|
| - // Ensure NetworkStateHandler properties are up-to-date.
|
| - if (NetworkHandler::IsInitialized()) {
|
| - NetworkHandler::Get()->network_state_handler()->RequestUpdateForNetwork(
|
| - service_path);
|
| - }
|
| -
|
| - // Attempt to refresh its IP parameters, so that the changes to the service
|
| - // properties can take effect.
|
| - if (network->connecting_or_connected())
|
| - RefreshIPConfig(network);
|
| -}
|
| -
|
| -// static
|
| -bool NetworkLibraryImplCros::AreProfilePathsEqual(const NetworkProfile& a,
|
| - const NetworkProfile& b) {
|
| - return a.path == b.path;
|
| -}
|
| -
|
| -} // namespace chromeos
|
|
|