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