shill_profile_client.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chromeos/dbus/shill_profile_client.h"
6
7#include "base/bind.h"
8#include "base/message_loop/message_loop.h"
9#include "base/stl_util.h"
10#include "base/values.h"
11#include "chromeos/dbus/dbus_thread_manager.h"
12#include "chromeos/dbus/shill_property_changed_observer.h"
13#include "dbus/bus.h"
14#include "dbus/message.h"
15#include "dbus/object_path.h"
16#include "dbus/values_util.h"
17#include "third_party/cros_system_api/dbus/service_constants.h"
18
19namespace chromeos {
20
21namespace {
22
23const char kSharedProfilePath[] = "/profile/default";
24
25class ShillProfileClientImpl : public ShillProfileClient {
26 public:
27  ShillProfileClientImpl();
28
29  virtual void AddPropertyChangedObserver(
30      const dbus::ObjectPath& profile_path,
31      ShillPropertyChangedObserver* observer) OVERRIDE {
32    GetHelper(profile_path)->AddPropertyChangedObserver(observer);
33  }
34
35  virtual void RemovePropertyChangedObserver(
36      const dbus::ObjectPath& profile_path,
37      ShillPropertyChangedObserver* observer) OVERRIDE {
38    GetHelper(profile_path)->RemovePropertyChangedObserver(observer);
39  }
40
41  virtual void GetProperties(
42      const dbus::ObjectPath& profile_path,
43      const DictionaryValueCallbackWithoutStatus& callback,
44      const ErrorCallback& error_callback) OVERRIDE;
45  virtual void GetEntry(const dbus::ObjectPath& profile_path,
46                        const std::string& entry_path,
47                        const DictionaryValueCallbackWithoutStatus& callback,
48                        const ErrorCallback& error_callback) OVERRIDE;
49  virtual void DeleteEntry(const dbus::ObjectPath& profile_path,
50                           const std::string& entry_path,
51                           const base::Closure& callback,
52                           const ErrorCallback& error_callback) OVERRIDE;
53
54  virtual TestInterface* GetTestInterface() OVERRIDE {
55    return NULL;
56  }
57
58 protected:
59  virtual void Init(dbus::Bus* bus) OVERRIDE {
60    bus_ = bus;
61  }
62
63 private:
64  typedef std::map<std::string, ShillClientHelper*> HelperMap;
65
66  // Returns the corresponding ShillClientHelper for the profile.
67  ShillClientHelper* GetHelper(const dbus::ObjectPath& profile_path);
68
69  dbus::Bus* bus_;
70  HelperMap helpers_;
71  STLValueDeleter<HelperMap> helpers_deleter_;
72
73  DISALLOW_COPY_AND_ASSIGN(ShillProfileClientImpl);
74};
75
76ShillProfileClientImpl::ShillProfileClientImpl()
77    : bus_(NULL),
78      helpers_deleter_(&helpers_) {
79}
80
81ShillClientHelper* ShillProfileClientImpl::GetHelper(
82    const dbus::ObjectPath& profile_path) {
83  HelperMap::iterator it = helpers_.find(profile_path.value());
84  if (it != helpers_.end())
85    return it->second;
86
87  // There is no helper for the profile, create it.
88  dbus::ObjectProxy* object_proxy =
89      bus_->GetObjectProxy(shill::kFlimflamServiceName, profile_path);
90  ShillClientHelper* helper = new ShillClientHelper(object_proxy);
91  helper->MonitorPropertyChanged(shill::kFlimflamProfileInterface);
92  helpers_.insert(HelperMap::value_type(profile_path.value(), helper));
93  return helper;
94}
95
96void ShillProfileClientImpl::GetProperties(
97    const dbus::ObjectPath& profile_path,
98    const DictionaryValueCallbackWithoutStatus& callback,
99    const ErrorCallback& error_callback) {
100  dbus::MethodCall method_call(shill::kFlimflamProfileInterface,
101                               shill::kGetPropertiesFunction);
102  GetHelper(profile_path)->CallDictionaryValueMethodWithErrorCallback(
103      &method_call, callback, error_callback);
104}
105
106void ShillProfileClientImpl::GetEntry(
107    const dbus::ObjectPath& profile_path,
108    const std::string& entry_path,
109    const DictionaryValueCallbackWithoutStatus& callback,
110    const ErrorCallback& error_callback) {
111  dbus::MethodCall method_call(shill::kFlimflamProfileInterface,
112                               shill::kGetEntryFunction);
113  dbus::MessageWriter writer(&method_call);
114  writer.AppendString(entry_path);
115  GetHelper(profile_path)->CallDictionaryValueMethodWithErrorCallback(
116      &method_call, callback, error_callback);
117}
118
119void ShillProfileClientImpl::DeleteEntry(
120    const dbus::ObjectPath& profile_path,
121    const std::string& entry_path,
122    const base::Closure& callback,
123    const ErrorCallback& error_callback) {
124  dbus::MethodCall method_call(shill::kFlimflamProfileInterface,
125                               shill::kDeleteEntryFunction);
126  dbus::MessageWriter writer(&method_call);
127  writer.AppendString(entry_path);
128  GetHelper(profile_path)->CallVoidMethodWithErrorCallback(
129      &method_call, callback, error_callback);
130}
131
132}  // namespace
133
134ShillProfileClient::ShillProfileClient() {}
135
136ShillProfileClient::~ShillProfileClient() {}
137
138// static
139ShillProfileClient* ShillProfileClient::Create() {
140  return new ShillProfileClientImpl();
141}
142
143// static
144std::string ShillProfileClient::GetSharedProfilePath() {
145  return std::string(kSharedProfilePath);
146}
147
148}  // namespace chromeos
149