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 19 namespace chromeos { 20 21 namespace { 22 23 class 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 74 ShillProfileClientImpl::ShillProfileClientImpl() 75 : bus_(NULL), 76 helpers_deleter_(&helpers_) { 77 } 78 79 ShillClientHelper* 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 94 void 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 104 void 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 117 void 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 132 ShillProfileClient::ShillProfileClient() {} 133 134 ShillProfileClient::~ShillProfileClient() {} 135 136 // static 137 ShillProfileClient* ShillProfileClient::Create() { 138 return new ShillProfileClientImpl(); 139 } 140 141 } // namespace chromeos 142