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