Home | History | Annotate | Download | only in dbus
      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