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
23class ShillProfileClientImpl : public ShillProfileClient {
24 public:
25  ShillProfileClientImpl();
26
27  virtual void AddPropertyChangedObserver(
28      const dbus::ObjectPath& profile_path,
29      ShillPropertyChangedObserver* observer) OVERRIDE {
30    GetHelper(profile_path)->AddPropertyChangedObserver(observer);
31  }
32
33  virtual void RemovePropertyChangedObserver(
34      const dbus::ObjectPath& profile_path,
35      ShillPropertyChangedObserver* observer) OVERRIDE {
36    GetHelper(profile_path)->RemovePropertyChangedObserver(observer);
37  }
38
39  virtual void GetProperties(
40      const dbus::ObjectPath& profile_path,
41      const DictionaryValueCallbackWithoutStatus& callback,
42      const ErrorCallback& error_callback) OVERRIDE;
43  virtual void GetEntry(const dbus::ObjectPath& profile_path,
44                        const std::string& entry_path,
45                        const DictionaryValueCallbackWithoutStatus& callback,
46                        const ErrorCallback& error_callback) OVERRIDE;
47  virtual void DeleteEntry(const dbus::ObjectPath& profile_path,
48                           const std::string& entry_path,
49                           const base::Closure& callback,
50                           const ErrorCallback& error_callback) OVERRIDE;
51
52  virtual TestInterface* GetTestInterface() OVERRIDE {
53    return NULL;
54  }
55
56 protected:
57  virtual void Init(dbus::Bus* bus) OVERRIDE {
58    bus_ = bus;
59  }
60
61 private:
62  typedef std::map<std::string, ShillClientHelper*> HelperMap;
63
64  // Returns the corresponding ShillClientHelper for the profile.
65  ShillClientHelper* GetHelper(const dbus::ObjectPath& profile_path);
66
67  dbus::Bus* bus_;
68  HelperMap helpers_;
69  STLValueDeleter<HelperMap> helpers_deleter_;
70
71  DISALLOW_COPY_AND_ASSIGN(ShillProfileClientImpl);
72};
73
74ShillProfileClientImpl::ShillProfileClientImpl()
75    : bus_(NULL),
76      helpers_deleter_(&helpers_) {
77}
78
79ShillClientHelper* ShillProfileClientImpl::GetHelper(
80    const dbus::ObjectPath& profile_path) {
81  HelperMap::iterator it = helpers_.find(profile_path.value());
82  if (it != helpers_.end())
83    return it->second;
84
85  // There is no helper for the profile, create it.
86  dbus::ObjectProxy* object_proxy =
87      bus_->GetObjectProxy(shill::kFlimflamServiceName, profile_path);
88  ShillClientHelper* helper = new ShillClientHelper(object_proxy);
89  helper->MonitorPropertyChanged(shill::kFlimflamProfileInterface);
90  helpers_.insert(HelperMap::value_type(profile_path.value(), helper));
91  return helper;
92}
93
94void ShillProfileClientImpl::GetProperties(
95    const dbus::ObjectPath& profile_path,
96    const DictionaryValueCallbackWithoutStatus& callback,
97    const ErrorCallback& error_callback) {
98  dbus::MethodCall method_call(shill::kFlimflamProfileInterface,
99                               shill::kGetPropertiesFunction);
100  GetHelper(profile_path)->CallDictionaryValueMethodWithErrorCallback(
101      &method_call, callback, error_callback);
102}
103
104void ShillProfileClientImpl::GetEntry(
105    const dbus::ObjectPath& profile_path,
106    const std::string& entry_path,
107    const DictionaryValueCallbackWithoutStatus& callback,
108    const ErrorCallback& error_callback) {
109  dbus::MethodCall method_call(shill::kFlimflamProfileInterface,
110                               shill::kGetEntryFunction);
111  dbus::MessageWriter writer(&method_call);
112  writer.AppendString(entry_path);
113  GetHelper(profile_path)->CallDictionaryValueMethodWithErrorCallback(
114      &method_call, callback, error_callback);
115}
116
117void ShillProfileClientImpl::DeleteEntry(
118    const dbus::ObjectPath& profile_path,
119    const std::string& entry_path,
120    const base::Closure& callback,
121    const ErrorCallback& error_callback) {
122  dbus::MethodCall method_call(shill::kFlimflamProfileInterface,
123                               shill::kDeleteEntryFunction);
124  dbus::MessageWriter writer(&method_call);
125  writer.AppendString(entry_path);
126  GetHelper(profile_path)->CallVoidMethodWithErrorCallback(
127      &method_call, callback, error_callback);
128}
129
130}  // namespace
131
132ShillProfileClient::ShillProfileClient() {}
133
134ShillProfileClient::~ShillProfileClient() {}
135
136// static
137ShillProfileClient* ShillProfileClient::Create() {
138  return new ShillProfileClientImpl();
139}
140
141}  // namespace chromeos
142