- add sources.
[platform/framework/web/crosswalk.git] / src / chromeos / dbus / shill_client_helper.h
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_