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