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 #ifndef CHROMEOS_DBUS_SHILL_CLIENT_HELPER_H_
      6 #define CHROMEOS_DBUS_SHILL_CLIENT_HELPER_H_
      7 
      8 #include <string>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/callback.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "base/memory/weak_ptr.h"
     14 #include "base/observer_list.h"
     15 #include "base/values.h"
     16 #include "chromeos/dbus/dbus_method_call_status.h"
     17 #include "chromeos/dbus/shill_property_changed_observer.h"
     18 
     19 namespace base {
     20 
     21 class Value;
     22 class DictionaryValue;
     23 
     24 }  // namespace base
     25 
     26 namespace dbus {
     27 
     28 class Bus;
     29 class ErrorResponse;
     30 class MessageWriter;
     31 class MethodCall;
     32 class ObjectPath;
     33 class ObjectProxy;
     34 class Response;
     35 class Signal;
     36 
     37 }  // namespace dbus
     38 
     39 namespace chromeos {
     40 
     41 // A class to help implement Shill clients.
     42 class ShillClientHelper {
     43  public:
     44   class RefHolder;
     45 
     46   // A callback to handle PropertyChanged signals.
     47   typedef base::Callback<void(const std::string& name,
     48                               const base::Value& value)> PropertyChangedHandler;
     49 
     50   // A callback to handle responses for methods with DictionaryValue results.
     51   typedef base::Callback<void(
     52       DBusMethodCallStatus call_status,
     53       const base::DictionaryValue& result)> DictionaryValueCallback;
     54 
     55   // A callback to handle responses for methods with DictionaryValue results.
     56   // This is used by CallDictionaryValueMethodWithErrorCallback.
     57   typedef base::Callback<void(const base::DictionaryValue& result)>
     58       DictionaryValueCallbackWithoutStatus;
     59 
     60   // A callback to handle responses of methods returning a ListValue.
     61   typedef base::Callback<void(const base::ListValue& result)> ListValueCallback;
     62 
     63   // A callback to handle errors for method call.
     64   typedef base::Callback<void(const std::string& error_name,
     65                               const std::string& error_message)> ErrorCallback;
     66 
     67   // A callback that handles responses for methods with string results.
     68   typedef base::Callback<void(const std::string& result)> StringCallback;
     69 
     70   // A callback that handles responses for methods with boolean results.
     71   typedef base::Callback<void(bool result)> BooleanCallback;
     72 
     73   // Callback used to notify owner when this can be safely released.
     74   typedef base::Callback<void(ShillClientHelper* helper)> ReleasedCallback;
     75 
     76   explicit ShillClientHelper(dbus::ObjectProxy* proxy);
     77 
     78   virtual ~ShillClientHelper();
     79 
     80   // Sets |released_callback_|. This is optional and should only be called at
     81   // most once.
     82   void SetReleasedCallback(ReleasedCallback callback);
     83 
     84   // Adds an |observer| of the PropertyChanged signal.
     85   void AddPropertyChangedObserver(ShillPropertyChangedObserver* observer);
     86 
     87   // Removes an |observer| of the PropertyChanged signal.
     88   void RemovePropertyChangedObserver(ShillPropertyChangedObserver* observer);
     89 
     90   // Starts monitoring PropertyChanged signal. If there aren't observers for the
     91   // PropertyChanged signal, the actual monitoring will be delayed until the
     92   // first observer is added.
     93   void MonitorPropertyChanged(const std::string& interface_name);
     94 
     95   // Calls a method without results.
     96   void CallVoidMethod(dbus::MethodCall* method_call,
     97                       const VoidDBusMethodCallback& callback);
     98 
     99   // Calls a method with an object path result.
    100   void CallObjectPathMethod(dbus::MethodCall* method_call,
    101                             const ObjectPathDBusMethodCallback& callback);
    102 
    103   // Calls a method with an object path result where there is an error callback.
    104   void CallObjectPathMethodWithErrorCallback(
    105       dbus::MethodCall* method_call,
    106       const ObjectPathCallback& callback,
    107       const ErrorCallback& error_callback);
    108 
    109   // Calls a method with a dictionary value result.
    110   void CallDictionaryValueMethod(dbus::MethodCall* method_call,
    111                                  const DictionaryValueCallback& callback);
    112 
    113   // Calls a method without results with error callback.
    114   void CallVoidMethodWithErrorCallback(dbus::MethodCall* method_call,
    115                                        const base::Closure& callback,
    116                                        const ErrorCallback& error_callback);
    117 
    118   // Calls a method with a boolean result with error callback.
    119   void CallBooleanMethodWithErrorCallback(
    120       dbus::MethodCall* method_call,
    121       const BooleanCallback& callback,
    122       const ErrorCallback& error_callback);
    123 
    124   // Calls a method with a string result with error callback.
    125   void CallStringMethodWithErrorCallback(dbus::MethodCall* method_call,
    126                                          const StringCallback& callback,
    127                                          const ErrorCallback& error_callback);
    128 
    129 
    130   // Calls a method with a dictionary value result with error callback.
    131   void CallDictionaryValueMethodWithErrorCallback(
    132       dbus::MethodCall* method_call,
    133       const DictionaryValueCallbackWithoutStatus& callback,
    134       const ErrorCallback& error_callback);
    135 
    136   // Calls a method with a boolean array result with error callback.
    137   void CallListValueMethodWithErrorCallback(
    138       dbus::MethodCall* method_call,
    139       const ListValueCallback& callback,
    140       const ErrorCallback& error_callback);
    141 
    142   const dbus::ObjectProxy* object_proxy() const { return proxy_; }
    143 
    144   // Appends the value (basic types and string-to-string dictionary) to the
    145   // writer as a variant.
    146   static void AppendValueDataAsVariant(dbus::MessageWriter* writer,
    147                                        const base::Value& value);
    148 
    149   // Appends a string-to-variant dictionary to the writer.
    150   static void AppendServicePropertiesDictionary(
    151       dbus::MessageWriter* writer,
    152       const base::DictionaryValue& dictionary);
    153 
    154  protected:
    155   // Reference / Ownership management. If the number of active refs (observers
    156   // + in-progress method calls) becomes 0, |released_callback_| (if set) will
    157   // be called.
    158   void AddRef();
    159   void Release();
    160 
    161  private:
    162   // Starts monitoring PropertyChanged signal.
    163   void MonitorPropertyChangedInternal(const std::string& interface_name);
    164 
    165   // Handles the result of signal connection setup.
    166   void OnSignalConnected(const std::string& interface,
    167                          const std::string& signal,
    168                          bool success);
    169 
    170   // Handles PropertyChanged signal.
    171   void OnPropertyChanged(dbus::Signal* signal);
    172 
    173   dbus::ObjectProxy* proxy_;
    174   ReleasedCallback released_callback_;
    175   int active_refs_;
    176   PropertyChangedHandler property_changed_handler_;
    177   ObserverList<ShillPropertyChangedObserver, true /* check_empty */>
    178       observer_list_;
    179   std::vector<std::string> interfaces_to_be_monitored_;
    180 
    181   // Note: This should remain the last member so it'll be destroyed and
    182   // invalidate its weak pointers before any other members are destroyed.
    183   base::WeakPtrFactory<ShillClientHelper> weak_ptr_factory_;
    184 
    185   DISALLOW_COPY_AND_ASSIGN(ShillClientHelper);
    186 };
    187 
    188 }  // namespace chromeos
    189 
    190 #endif  // CHROMEOS_DBUS_SHILL_CLIENT_HELPER_H_
    191