12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_configuration_handler.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/format_macros.h" 12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/json/json_writer.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/stl_util.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/stringprintf.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/shill_manager_client.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chromeos/dbus/shill_profile_client.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/shill_service_client.h" 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chromeos/network/network_event_log.h" 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/network/network_state.h" 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/network/network_state_handler.h" 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chromeos/network/shill_property_util.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "dbus/object_path.h" 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Strip surrounding "" from keys (if present). 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::string StripQuotations(const std::string& in_str) { 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size_t len = in_str.length(); 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (len >= 2 && in_str[0] == '"' && in_str[len-1] == '"') 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return in_str.substr(1, len-2); 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return in_str; 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void InvokeErrorCallback(const std::string& service_path, 431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const network_handler::ErrorCallback& error_callback, 441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::string& error_name) { 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string error_msg = "Config Error: " + error_name; 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NET_LOG_ERROR(error_msg, service_path); 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) network_handler::RunErrorCallback( 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) error_callback, service_path, error_name, error_msg); 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void GetPropertiesCallback( 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const network_handler::DictionaryResultCallback& callback, 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const network_handler::ErrorCallback& error_callback, 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& service_path, 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DBusMethodCallStatus call_status, 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::DictionaryValue& properties) { 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (call_status != DBUS_METHOD_CALL_SUCCESS) { 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Because network services are added and removed frequently, we will see 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // failures regularly, so don't log these. 601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) network_handler::RunErrorCallback(error_callback, 611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) service_path, 621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) network_handler::kDBusFailedError, 631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) network_handler::kDBusFailedErrorMessage); 64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (callback.is_null()) 67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Get the correct name from WifiHex if necessary. 70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<base::DictionaryValue> properties_copy(properties.DeepCopy()); 71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string name = 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch shill_property_util::GetNameFromProperties(service_path, properties); 73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!name.empty()) 74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch properties_copy->SetStringWithoutPathExpansion(shill::kNameProperty, name); 75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch callback.Run(service_path, *properties_copy.get()); 76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid SetNetworkProfileErrorCallback( 79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& service_path, 80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& profile_path, 81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const network_handler::ErrorCallback& error_callback, 82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& dbus_error_name, 83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& dbus_error_message) { 84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch network_handler::ShillErrorCallbackFunction( 85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "Config.SetNetworkProfile Failed: " + profile_path, 86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch service_path, error_callback, 87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dbus_error_name, dbus_error_message); 88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid LogConfigProperties(const std::string& desc, 91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& path, 92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::DictionaryValue& properties) { 93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (base::DictionaryValue::Iterator iter(properties); 94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch !iter.IsAtEnd(); iter.Advance()) { 95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string v = "******"; 96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!shill_property_util::IsPassphraseKey(iter.key())) 97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::JSONWriter::Write(&iter.value(), &v); 98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NET_LOG_DEBUG(desc, path + "." + iter.key() + "=" + v); 99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Helper class to request from Shill the profile entries associated with a 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Service and delete the service from each profile. Triggers either 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// |callback| on success or |error_callback| on failure, and calls 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// |handler|->ProfileEntryDeleterCompleted() on completion to delete itself. 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass NetworkConfigurationHandler::ProfileEntryDeleter 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : public base::SupportsWeakPtr<ProfileEntryDeleter> { 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileEntryDeleter(NetworkConfigurationHandler* handler, 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& service_path, 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Closure& callback, 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const network_handler::ErrorCallback& error_callback) 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : owner_(handler), 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch service_path_(service_path), 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callback_(callback), 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch error_callback_(error_callback) { 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void Run() { 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DBusThreadManager::Get()->GetShillServiceClient()-> 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetLoadableProfileEntries( 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dbus::ObjectPath(service_path_), 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&ProfileEntryDeleter::GetProfileEntriesToDeleteCallback, 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AsWeakPtr())); 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void GetProfileEntriesToDeleteCallback( 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DBusMethodCallStatus call_status, 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::DictionaryValue& profile_entries) { 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (call_status != DBUS_METHOD_CALL_SUCCESS) { 1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InvokeErrorCallback( 1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) service_path_, error_callback_, "GetLoadableProfileEntriesFailed"); 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch owner_->ProfileEntryDeleterCompleted(service_path_); // Deletes this. 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (base::DictionaryValue::Iterator iter(profile_entries); 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch !iter.IsAtEnd(); iter.Advance()) { 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string profile_path = StripQuotations(iter.key()); 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string entry_path; 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch iter.value().GetAsString(&entry_path); 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (profile_path.empty() || entry_path.empty()) { 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NET_LOG_ERROR("Failed to parse Profile Entry", base::StringPrintf( 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "%s: %s", profile_path.c_str(), entry_path.c_str())); 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch continue; 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (profile_delete_entries_.count(profile_path) != 0) { 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NET_LOG_ERROR("Multiple Profile Entries", base::StringPrintf( 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "%s: %s", profile_path.c_str(), entry_path.c_str())); 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch continue; 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NET_LOG_DEBUG("Delete Profile Entry", base::StringPrintf( 156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "%s: %s", profile_path.c_str(), entry_path.c_str())); 157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile_delete_entries_[profile_path] = entry_path; 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DBusThreadManager::Get()->GetShillProfileClient()->DeleteEntry( 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch dbus::ObjectPath(profile_path), 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch entry_path, 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&ProfileEntryDeleter::ProfileEntryDeletedCallback, 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AsWeakPtr(), profile_path, entry_path), 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&ProfileEntryDeleter::ShillErrorCallback, 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AsWeakPtr(), profile_path, entry_path)); 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void ProfileEntryDeletedCallback(const std::string& profile_path, 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& entry) { 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NET_LOG_DEBUG("Profile Entry Deleted", base::StringPrintf( 171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "%s: %s", profile_path.c_str(), entry.c_str())); 172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile_delete_entries_.erase(profile_path); 173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!profile_delete_entries_.empty()) 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Run the callback if this is the last pending deletion. 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!callback_.is_null()) 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callback_.Run(); 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch owner_->ProfileEntryDeleterCompleted(service_path_); // Deletes this. 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void ShillErrorCallback(const std::string& profile_path, 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& entry, 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& dbus_error_name, 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& dbus_error_message) { 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Any Shill Error triggers a failure / error. 186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch network_handler::ShillErrorCallbackFunction( 1877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "GetLoadableProfileEntries Failed", profile_path, error_callback_, 1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dbus_error_name, dbus_error_message); 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Delete this even if there are pending deletions; any callbacks will 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // safely become no-ops (by invalidating the WeakPtrs). 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch owner_->ProfileEntryDeleterCompleted(service_path_); // Deletes this. 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NetworkConfigurationHandler* owner_; // Unowned 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string service_path_; 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Closure callback_; 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch network_handler::ErrorCallback error_callback_; 198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Map of pending profile entry deletions, indexed by profile path. 200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::map<std::string, std::string> profile_delete_entries_; 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DISALLOW_COPY_AND_ASSIGN(ProfileEntryDeleter); 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// NetworkConfigurationHandler 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkConfigurationHandler::GetProperties( 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& service_path, 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const network_handler::DictionaryResultCallback& callback, 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const network_handler::ErrorCallback& error_callback) const { 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NET_LOG_USER("GetProperties", service_path); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillServiceClient()->GetProperties( 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath(service_path), 214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&GetPropertiesCallback, 2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch callback, error_callback, service_path)); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkConfigurationHandler::SetProperties( 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& service_path, 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue& properties, 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const network_handler::ErrorCallback& error_callback) { 223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (properties.empty()) { 224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!callback.is_null()) 225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback.Run(); 226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NET_LOG_USER("SetProperties", service_path); 229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LogConfigProperties("SetProperty", service_path, properties); 230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DBusThreadManager::Get()->GetShillServiceClient()->SetProperties( 2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dbus::ObjectPath(service_path), 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties, 2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&NetworkConfigurationHandler::SetPropertiesSuccessCallback, 2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AsWeakPtr(), service_path, callback), 2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&NetworkConfigurationHandler::SetPropertiesErrorCallback, 2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AsWeakPtr(), service_path, error_callback)); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkConfigurationHandler::ClearProperties( 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& service_path, 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& names, 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const network_handler::ErrorCallback& error_callback) { 245ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (names.empty()) { 246ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!callback.is_null()) 247ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback.Run(); 248ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return; 249ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NET_LOG_USER("ClearProperties", service_path); 251ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (std::vector<std::string>::const_iterator iter = names.begin(); 252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch iter != names.end(); ++iter) { 253ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NET_LOG_DEBUG("ClearProperty", service_path + "." + *iter); 254ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillServiceClient()->ClearProperties( 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath(service_path), 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) names, 258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&NetworkConfigurationHandler::ClearPropertiesSuccessCallback, 2590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch AsWeakPtr(), service_path, names, callback), 260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&NetworkConfigurationHandler::ClearPropertiesErrorCallback, 261a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) AsWeakPtr(), service_path, error_callback)); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkConfigurationHandler::CreateConfiguration( 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue& properties, 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const network_handler::StringResultCallback& callback, 26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const network_handler::ErrorCallback& error_callback) { 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ShillManagerClient* manager = 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DBusThreadManager::Get()->GetShillManagerClient(); 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string type; 27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) properties.GetStringWithoutPathExpansion(shill::kTypeProperty, &type); 272effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(!type.empty()); 2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (NetworkTypePattern::Ethernet().MatchesType(type)) { 2741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InvokeErrorCallback( 275effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch shill_property_util::GetNetworkIdFromProperties(properties), 2761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) error_callback, 277effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "ConfigureServiceForProfile: Invalid type: " + type); 2781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return; 2791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 281effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NET_LOG_USER("CreateConfiguration: " + type, 282effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch shill_property_util::GetNetworkIdFromProperties(properties)); 283ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LogConfigProperties("Configure", type, properties); 284ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 285c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch std::string profile; 28668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) properties.GetStringWithoutPathExpansion(shill::kProfileProperty, 287c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch &profile); 288c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch DCHECK(!profile.empty()); 289c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch manager->ConfigureServiceForProfile( 290c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch dbus::ObjectPath(profile), 291c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch properties, 292c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch base::Bind(&NetworkConfigurationHandler::RunCreateNetworkCallback, 293c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch AsWeakPtr(), 294c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch callback), 295c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch base::Bind(&network_handler::ShillErrorCallbackFunction, 296c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch "Config.CreateConfiguration Failed", 297c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch "", 298c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch error_callback)); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkConfigurationHandler::RemoveConfiguration( 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& service_path, 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const network_handler::ErrorCallback& error_callback) { 305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Service.Remove is not reliable. Instead, request the profile entries 306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // for the service and remove each entry. 307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (ContainsKey(profile_entry_deleters_, service_path)) { 3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InvokeErrorCallback( 3091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) service_path, error_callback, "RemoveConfigurationInProgress"); 310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 313eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NET_LOG_USER("Remove Configuration", service_path); 314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ProfileEntryDeleter* deleter = 315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new ProfileEntryDeleter(this, service_path, callback, error_callback); 316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile_entry_deleters_[service_path] = deleter; 317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch deleter->Run(); 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid NetworkConfigurationHandler::SetNetworkProfile( 321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& service_path, 322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& profile_path, 323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::Closure& callback, 324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const network_handler::ErrorCallback& error_callback) { 325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NET_LOG_USER("SetNetworkProfile", service_path + ": " + profile_path); 326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::StringValue profile_path_value(profile_path); 327ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DBusThreadManager::Get()->GetShillServiceClient()->SetProperty( 328ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch dbus::ObjectPath(service_path), 32968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) shill::kProfileProperty, 330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch profile_path_value, 331ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback, 332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(&SetNetworkProfileErrorCallback, 333ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch service_path, profile_path, error_callback)); 334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 335ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// NetworkConfigurationHandler Private methods 337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)NetworkConfigurationHandler::NetworkConfigurationHandler() 33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : network_state_handler_(NULL) { 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkConfigurationHandler::~NetworkConfigurationHandler() { 343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch STLDeleteContainerPairSecondPointers( 344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile_entry_deleters_.begin(), profile_entry_deleters_.end()); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void NetworkConfigurationHandler::Init( 34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkStateHandler* network_state_handler) { 34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_state_handler_ = network_state_handler; 35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void NetworkConfigurationHandler::RunCreateNetworkCallback( 35390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const network_handler::StringResultCallback& callback, 35490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const dbus::ObjectPath& service_path) { 3557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!callback.is_null()) 3567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch callback.Run(service_path.value()); 35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This may also get called when CreateConfiguration is used to update an 35890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // existing configuration, so request a service update just in case. 35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(pneubeck): Separate 'Create' and 'Update' calls and only trigger 36090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // this on an update. 36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) network_state_handler_->RequestUpdateForNetwork(service_path.value()); 36290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid NetworkConfigurationHandler::ProfileEntryDeleterCompleted( 365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& service_path) { 366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::map<std::string, ProfileEntryDeleter*>::iterator iter = 367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile_entry_deleters_.find(service_path); 368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(iter != profile_entry_deleters_.end()); 369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch delete iter->second; 370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch profile_entry_deleters_.erase(iter); 371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid NetworkConfigurationHandler::SetPropertiesSuccessCallback( 3747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& service_path, 3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Closure& callback) { 3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!callback.is_null()) 3777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch callback.Run(); 3787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch network_state_handler_->RequestUpdateForNetwork(service_path); 3797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid NetworkConfigurationHandler::SetPropertiesErrorCallback( 3827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& service_path, 3837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const network_handler::ErrorCallback& error_callback, 3847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& dbus_error_name, 3857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& dbus_error_message) { 3867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch network_handler::ShillErrorCallbackFunction( 3877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "Config.SetProperties Failed", 3887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch service_path, error_callback, 3897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dbus_error_name, dbus_error_message); 3907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Some properties may have changed so request an update regardless. 3917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch network_state_handler_->RequestUpdateForNetwork(service_path); 3927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 394a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void NetworkConfigurationHandler::ClearPropertiesSuccessCallback( 395a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& service_path, 396a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::vector<std::string>& names, 397a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::Closure& callback, 398a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::ListValue& result) { 399a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string kClearPropertiesFailedError("Error.ClearPropertiesFailed"); 400a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(names.size() == result.GetSize()) 401a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) << "Incorrect result size from ClearProperties."; 402a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 403a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (size_t i = 0; i < result.GetSize(); ++i) { 404a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool success = false; 405a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) result.GetBoolean(i, &success); 406a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!success) { 4070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // If a property was cleared that has never been set, the clear will fail. 4080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // We do not track which properties have been set, so just log the error. 409a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) NET_LOG_ERROR("ClearProperties Failed: " + names[i], service_path); 410a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 411a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 412a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!callback.is_null()) 414a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) callback.Run(); 415a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) network_state_handler_->RequestUpdateForNetwork(service_path); 416a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 417a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 418a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void NetworkConfigurationHandler::ClearPropertiesErrorCallback( 419a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& service_path, 420a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const network_handler::ErrorCallback& error_callback, 421a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& dbus_error_name, 422a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& dbus_error_message) { 423a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) network_handler::ShillErrorCallbackFunction( 424a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) "Config.ClearProperties Failed", 425a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) service_path, error_callback, 426a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dbus_error_name, dbus_error_message); 427a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Some properties may have changed so request an update regardless. 428a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) network_state_handler_->RequestUpdateForNetwork(service_path); 429a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 430a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// static 43290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)NetworkConfigurationHandler* NetworkConfigurationHandler::InitializeForTest( 43390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkStateHandler* network_state_handler) { 43490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NetworkConfigurationHandler* handler = new NetworkConfigurationHandler(); 43590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) handler->Init(network_state_handler); 43690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return handler; 43790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 43890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chromeos 440