1ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Use of this source code is governed by a BSD-style license that can be
3ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// found in the LICENSE file.
4ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
5ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#ifndef DBUS_OBJECT_PROXY_H_
6ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#define DBUS_OBJECT_PROXY_H_
7ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
8ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include <dbus/dbus.h>
9ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
10ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include <map>
11ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include <set>
12ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include <string>
13ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include <vector>
14ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
15ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "base/callback.h"
16cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include "base/macros.h"
17ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "base/memory/ref_counted.h"
18ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "base/strings/string_piece.h"
19ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "base/time/time.h"
20ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "dbus/dbus_export.h"
21ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "dbus/object_path.h"
22ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
23ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratnamespace dbus {
24ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
25ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass Bus;
26ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass ErrorResponse;
27ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass MethodCall;
28ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass Response;
29ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass ScopedDBusError;
30ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass Signal;
31ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
32ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// ObjectProxy is used to communicate with remote objects, mainly for
33ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// calling methods of these objects.
34ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
35ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// ObjectProxy is a ref counted object, to ensure that |this| of the
36ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// object is alive when callbacks referencing |this| are called; the
37ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// bus always holds at least one of those references so object proxies
38ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// always last as long as the bus that created them.
39ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass CHROME_DBUS_EXPORT ObjectProxy
40ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    : public base::RefCountedThreadSafe<ObjectProxy> {
41ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat public:
42ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Client code should use Bus::GetObjectProxy() or
43ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Bus::GetObjectProxyWithOptions() instead of this constructor.
44ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  ObjectProxy(Bus* bus,
45ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat              const std::string& service_name,
46ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat              const ObjectPath& object_path,
47ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat              int options);
48ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
49ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Options to be OR-ed together when calling Bus::GetObjectProxyWithOptions().
50ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Set the IGNORE_SERVICE_UNKNOWN_ERRORS option to silence logging of
51ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // org.freedesktop.DBus.Error.ServiceUnknown errors and
52ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // org.freedesktop.DBus.Error.ObjectUnknown errors.
53ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  enum Options {
54ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    DEFAULT_OPTIONS = 0,
55ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    IGNORE_SERVICE_UNKNOWN_ERRORS = 1 << 0
56ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  };
57ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
58ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Special timeout constants.
59ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
60ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The constants correspond to DBUS_TIMEOUT_USE_DEFAULT and
61ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // DBUS_TIMEOUT_INFINITE. Here we use literal numbers instead of these
62ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // macros as these aren't defined with D-Bus earlier than 1.4.12.
63ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  enum {
64ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    TIMEOUT_USE_DEFAULT = -1,
65ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    TIMEOUT_INFINITE = 0x7fffffff,
66ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  };
67ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
68ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when an error response is returned or no response is returned.
69ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Used for CallMethodWithErrorCallback().
70ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  typedef base::Callback<void(ErrorResponse*)> ErrorCallback;
71ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
72ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when the response is returned. Used for CallMethod().
73ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  typedef base::Callback<void(Response*)> ResponseCallback;
74ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
75ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when a signal is received. Signal* is the incoming signal.
76ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  typedef base::Callback<void (Signal*)> SignalCallback;
77ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
78ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when NameOwnerChanged signal is received.
79ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  typedef base::Callback<void(
80ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const std::string& old_owner,
81ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const std::string& new_owner)> NameOwnerChangedCallback;
82ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
83ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when the service becomes available.
84ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  typedef base::Callback<void(
85ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      bool service_is_available)> WaitForServiceToBeAvailableCallback;
86ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
87ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when the object proxy is connected to the signal.
88ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Parameters:
89ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // - the interface name.
90ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // - the signal name.
91ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // - whether it was successful or not.
92ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  typedef base::Callback<void (const std::string&, const std::string&, bool)>
93ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      OnConnectedCallback;
94ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
95ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Calls the method of the remote object and blocks until the response
96ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // is returned. Returns NULL on error with the error details specified
97ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // in the |error| object.
98ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
99ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
100ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual scoped_ptr<Response> CallMethodAndBlockWithErrorDetails(
101ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      MethodCall* method_call,
102ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      int timeout_ms,
103ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      ScopedDBusError* error);
104ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
105ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Calls the method of the remote object and blocks until the response
106ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // is returned. Returns NULL on error.
107ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
108ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
109ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual scoped_ptr<Response> CallMethodAndBlock(MethodCall* method_call,
110ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                                  int timeout_ms);
111ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
112ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Requests to call the method of the remote object.
113ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
114ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |callback| will be called in the origin thread, once the method call
115ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // is complete. As it's called in the origin thread, |callback| can
116ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // safely reference objects in the origin thread (i.e. UI thread in most
117ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // cases). If the caller is not interested in the response from the
118ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // method (i.e. calling a method that does not return a value),
119ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // EmptyResponseCallback() can be passed to the |callback| parameter.
120ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
121ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // If the method call is successful, a pointer to Response object will
122ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // be passed to the callback. If unsuccessful, NULL will be passed to
123ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // the callback.
124ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
125ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Must be called in the origin thread.
126ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void CallMethod(MethodCall* method_call,
127ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                          int timeout_ms,
128ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                          ResponseCallback callback);
129ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
130ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Requests to call the method of the remote object.
131ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
132ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |callback| and |error_callback| will be called in the origin thread, once
133ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // the method call is complete. As it's called in the origin thread,
134ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |callback| can safely reference objects in the origin thread (i.e.
135ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // UI thread in most cases). If the caller is not interested in the response
136ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // from the method (i.e. calling a method that does not return a value),
137ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // EmptyResponseCallback() can be passed to the |callback| parameter.
138ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
139ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // If the method call is successful, a pointer to Response object will
140ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // be passed to the callback. If unsuccessful, the error callback will be
141ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // called and a pointer to ErrorResponse object will be passed to the error
142ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // callback if available, otherwise NULL will be passed.
143ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
144ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Must be called in the origin thread.
145ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void CallMethodWithErrorCallback(MethodCall* method_call,
146ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                           int timeout_ms,
147ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                           ResponseCallback callback,
148ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                           ErrorCallback error_callback);
149ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
150cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  // Requests to connect to the signal from the remote object.
151ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
152ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |signal_callback| will be called in the origin thread, when the
153ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // signal is received from the remote object. As it's called in the
154ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // origin thread, |signal_callback| can safely reference objects in the
155ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // origin thread (i.e. UI thread in most cases).
156ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
157ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |on_connected_callback| is called when the object proxy is connected
158ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // to the signal, or failed to be connected, in the origin thread.
159ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
160cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  // If a SignalCallback has already been registered for the given
161cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  // |interface_name| and |signal_name|, |signal_callback| will be
162cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  // added to the list of callbacks for |interface_name| and
163cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  // |signal_name|.
164cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  //
165ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Must be called in the origin thread.
166ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void ConnectToSignal(const std::string& interface_name,
167ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                               const std::string& signal_name,
168ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                               SignalCallback signal_callback,
169ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                               OnConnectedCallback on_connected_callback);
170ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
171ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Sets a callback for "NameOwnerChanged" signal. The callback is called on
172ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // the origin thread when D-Bus system sends "NameOwnerChanged" for the name
173ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // represented by |service_name_|.
174ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void SetNameOwnerChangedCallback(NameOwnerChangedCallback callback);
175ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
176ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Runs the callback as soon as the service becomes available.
177ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void WaitForServiceToBeAvailable(
178ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      WaitForServiceToBeAvailableCallback callback);
179ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
180ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Detaches from the remote object. The Bus object will take care of
181ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // detaching so you don't have to do this manually.
182ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
183ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
184ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void Detach();
185ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
186ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  const ObjectPath& object_path() const { return object_path_; }
187ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
188ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns an empty callback that does nothing. Can be used for
189ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // CallMethod().
190ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static ResponseCallback EmptyResponseCallback();
191ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
192ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat protected:
193ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // This is protected, so we can define sub classes.
194ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual ~ObjectProxy();
195ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
196ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat private:
197ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  friend class base::RefCountedThreadSafe<ObjectProxy>;
198ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
199ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Struct of data we'll be passing from StartAsyncMethodCall() to
200ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // OnPendingCallIsCompleteThunk().
201ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  struct OnPendingCallIsCompleteData {
202ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    OnPendingCallIsCompleteData(ObjectProxy* in_object_proxy,
203ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                ResponseCallback in_response_callback,
204ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                ErrorCallback error_callback,
205ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                base::TimeTicks start_time);
206ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    ~OnPendingCallIsCompleteData();
207ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
208ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    ObjectProxy* object_proxy;
209ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    ResponseCallback response_callback;
210ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    ErrorCallback error_callback;
211ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    base::TimeTicks start_time;
212ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  };
213ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
214ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Starts the async method call. This is a helper function to implement
215ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // CallMethod().
216ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void StartAsyncMethodCall(int timeout_ms,
217ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                            DBusMessage* request_message,
218ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                            ResponseCallback response_callback,
219ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                            ErrorCallback error_callback,
220ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                            base::TimeTicks start_time);
221ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
222ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when the pending call is complete.
223ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void OnPendingCallIsComplete(DBusPendingCall* pending_call,
224ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                               ResponseCallback response_callback,
225ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                               ErrorCallback error_callback,
226ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                               base::TimeTicks start_time);
227ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
228ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Runs the response callback with the given response object.
229ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void RunResponseCallback(ResponseCallback response_callback,
230ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                           ErrorCallback error_callback,
231ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                           base::TimeTicks start_time,
232ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                           DBusMessage* response_message);
233ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
234ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Redirects the function call to OnPendingCallIsComplete().
235ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static void OnPendingCallIsCompleteThunk(DBusPendingCall* pending_call,
236ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                           void* user_data);
237ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
238ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Connects to NameOwnerChanged signal.
239ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool ConnectToNameOwnerChangedSignal();
240ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
241ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper function for ConnectToSignal().
242ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool ConnectToSignalInternal(const std::string& interface_name,
243ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                               const std::string& signal_name,
244ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                               SignalCallback signal_callback);
245ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
246ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper function for WaitForServiceToBeAvailable().
247ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void WaitForServiceToBeAvailableInternal();
248ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
249ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Handles the incoming request messages and dispatches to the signal
250ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // callbacks.
251ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  DBusHandlerResult HandleMessage(DBusConnection* connection,
252ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                  DBusMessage* raw_message);
253ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
254ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Runs the method. Helper function for HandleMessage().
255ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void RunMethod(base::TimeTicks start_time,
256ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                 std::vector<SignalCallback> signal_callbacks,
257ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                 Signal* signal);
258ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
259ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Redirects the function call to HandleMessage().
260ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static DBusHandlerResult HandleMessageThunk(DBusConnection* connection,
261ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                              DBusMessage* raw_message,
262ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                              void* user_data);
263ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
264ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper method for logging response errors appropriately.
265ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void LogMethodCallFailure(const base::StringPiece& interface_name,
266ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                            const base::StringPiece& method_name,
267ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                            const base::StringPiece& error_name,
268ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                            const base::StringPiece& error_message) const;
269ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
270ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Used as ErrorCallback by CallMethod().
271ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void OnCallMethodError(const std::string& interface_name,
272ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                         const std::string& method_name,
273ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                         ResponseCallback response_callback,
274ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                         ErrorResponse* error_response);
275ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
276ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Adds the match rule to the bus and associate the callback with the signal.
277ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool AddMatchRuleWithCallback(const std::string& match_rule,
278ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                const std::string& absolute_signal_name,
279ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                SignalCallback signal_callback);
280ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
281ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Adds the match rule to the bus so that HandleMessage can see the signal.
282ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool AddMatchRuleWithoutCallback(const std::string& match_rule,
283ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                   const std::string& absolute_signal_name);
284ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
285ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Calls D-Bus's GetNameOwner method synchronously to update
286ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |service_name_owner_| with the current owner of |service_name_|.
287ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
288ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
289ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void UpdateNameOwnerAndBlock();
290ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
291ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Handles NameOwnerChanged signal from D-Bus's special message bus.
292ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  DBusHandlerResult HandleNameOwnerChanged(scoped_ptr<dbus::Signal> signal);
293ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
294ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Runs |name_owner_changed_callback_|.
295ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void RunNameOwnerChangedCallback(const std::string& old_owner,
296ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                   const std::string& new_owner);
297ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
298ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Runs |wait_for_service_to_be_available_callbacks_|.
299ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void RunWaitForServiceToBeAvailableCallbacks(bool service_is_available);
300ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
301ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  scoped_refptr<Bus> bus_;
302ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::string service_name_;
303ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  ObjectPath object_path_;
304ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
305ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The method table where keys are absolute signal names (i.e. interface
306ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // name + signal name), and values are lists of the corresponding callbacks.
307ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  typedef std::map<std::string, std::vector<SignalCallback> > MethodTable;
308ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  MethodTable method_table_;
309ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
310ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The callback called when NameOwnerChanged signal is received.
311ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  NameOwnerChangedCallback name_owner_changed_callback_;
312ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
313ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when the service becomes available.
314ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::vector<WaitForServiceToBeAvailableCallback>
315ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      wait_for_service_to_be_available_callbacks_;
316ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
317ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::set<std::string> match_rules_;
318ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
319ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  const bool ignore_service_unknown_errors_;
320ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
321ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Known name owner of the well-known bus name represented by |service_name_|.
322ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::string service_name_owner_;
323ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
324ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::set<DBusPendingCall*> pending_calls_;
325ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
326ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  DISALLOW_COPY_AND_ASSIGN(ObjectProxy);
327ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat};
328ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
329ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat}  // namespace dbus
330ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
331ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#endif  // DBUS_OBJECT_PROXY_H_
332