object_proxy.h revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef DBUS_OBJECT_PROXY_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DBUS_OBJECT_PROXY_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <dbus/dbus.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/dbus_export.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_path.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace dbus { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Bus; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ErrorResponse; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MethodCall; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Response; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Signal; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ObjectProxy is used to communicate with remote objects, mainly for 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// calling methods of these objects. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ObjectProxy is a ref counted object, to ensure that |this| of the 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// object is is alive when callbacks referencing |this| are called; the 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bus always holds at least one of those references so object proxies 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// always last as long as the bus that created them. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CHROME_DBUS_EXPORT ObjectProxy 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCountedThreadSafe<ObjectProxy> { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Client code should use Bus::GetObjectProxy() or 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bus::GetObjectProxyWithOptions() instead of this constructor. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectProxy(Bus* bus, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& service_name, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ObjectPath& object_path, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int options); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Options to be OR-ed together when calling Bus::GetObjectProxyWithOptions(). 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the IGNORE_SERVICE_UNKNOWN_ERRORS option to silence logging of 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // org.freedesktop.DBus.Error.ServiceUnknown errors and 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // org.freedesktop.DBus.Error.ObjectUnknown errors. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Options { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DEFAULT_OPTIONS = 0, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IGNORE_SERVICE_UNKNOWN_ERRORS = 1 << 0 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Special timeout constants. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The constants correspond to DBUS_TIMEOUT_USE_DEFAULT and 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DBUS_TIMEOUT_INFINITE. Here we use literal numbers instead of these 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // macros as these aren't defined with D-Bus earlier than 1.4.12. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TIMEOUT_USE_DEFAULT = -1, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TIMEOUT_INFINITE = 0x7fffffff, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when an error response is returned or no response is returned. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used for CallMethodWithErrorCallback(). 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void(ErrorResponse*)> ErrorCallback; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the response is returned. Used for CallMethod(). 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void(Response*)> ResponseCallback; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when a signal is received. Signal* is the incoming signal. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void (Signal*)> SignalCallback; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Called when NameOwnerChanged signal is received. 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typedef base::Callback<void( 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& old_owner, 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& new_owner)> NameOwnerChangedCallback; 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Called when the service becomes available. 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typedef base::Callback<void( 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool service_is_available)> WaitForServiceToBeAvailableCallback; 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the object proxy is connected to the signal. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parameters: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - the interface name. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - the signal name. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - whether it was successful or not. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void (const std::string&, const std::string&, bool)> 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnConnectedCallback; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls the method of the remote object and blocks until the response 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is returned. Returns NULL on error. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BLOCKING CALL. 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<Response> CallMethodAndBlock(MethodCall* method_call, 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int timeout_ms); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests to call the method of the remote object. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |callback| will be called in the origin thread, once the method call 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is complete. As it's called in the origin thread, |callback| can 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // safely reference objects in the origin thread (i.e. UI thread in most 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cases). If the caller is not interested in the response from the 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // method (i.e. calling a method that does not return a value), 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EmptyResponseCallback() can be passed to the |callback| parameter. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the method call is successful, a pointer to Response object will 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be passed to the callback. If unsuccessful, NULL will be passed to 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the callback. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called in the origin thread. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CallMethod(MethodCall* method_call, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int timeout_ms, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCallback callback); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests to call the method of the remote object. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |callback| and |error_callback| will be called in the origin thread, once 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the method call is complete. As it's called in the origin thread, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |callback| can safely reference objects in the origin thread (i.e. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UI thread in most cases). If the caller is not interested in the response 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the method (i.e. calling a method that does not return a value), 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EmptyResponseCallback() can be passed to the |callback| parameter. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the method call is successful, a pointer to Response object will 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be passed to the callback. If unsuccessful, the error callback will be 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called and a pointer to ErrorResponse object will be passed to the error 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback if available, otherwise NULL will be passed. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called in the origin thread. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CallMethodWithErrorCallback(MethodCall* method_call, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int timeout_ms, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCallback callback, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorCallback error_callback); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests to connect to the signal from the remote object, replacing 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // any previous |signal_callback| connected to that signal. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |signal_callback| will be called in the origin thread, when the 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // signal is received from the remote object. As it's called in the 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // origin thread, |signal_callback| can safely reference objects in the 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // origin thread (i.e. UI thread in most cases). 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |on_connected_callback| is called when the object proxy is connected 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the signal, or failed to be connected, in the origin thread. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called in the origin thread. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ConnectToSignal(const std::string& interface_name, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& signal_name, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalCallback signal_callback, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnConnectedCallback on_connected_callback); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets a callback for "NameOwnerChanged" signal. The callback is called on 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the origin thread when D-Bus system sends "NameOwnerChanged" for the name 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // represented by |service_name_|. 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SetNameOwnerChangedCallback(NameOwnerChangedCallback callback); 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Runs the callback as soon as the service becomes available. 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void WaitForServiceToBeAvailable( 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WaitForServiceToBeAvailableCallback callback); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Detaches from the remote object. The Bus object will take care of 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // detaching so you don't have to do this manually. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BLOCKING CALL. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Detach(); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const ObjectPath& object_path() const { return object_path_; } 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns an empty callback that does nothing. Can be used for 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CallMethod(). 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ResponseCallback EmptyResponseCallback(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is protected, so we can define sub classes. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ObjectProxy(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<ObjectProxy>; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Struct of data we'll be passing from StartAsyncMethodCall() to 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnPendingCallIsCompleteThunk(). 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct OnPendingCallIsCompleteData { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPendingCallIsCompleteData(ObjectProxy* in_object_proxy, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCallback in_response_callback, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorCallback error_callback, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks start_time); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~OnPendingCallIsCompleteData(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectProxy* object_proxy; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCallback response_callback; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorCallback error_callback; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks start_time; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts the async method call. This is a helper function to implement 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CallMethod(). 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartAsyncMethodCall(int timeout_ms, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMessage* request_message, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCallback response_callback, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorCallback error_callback, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks start_time); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the pending call is complete. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnPendingCallIsComplete(DBusPendingCall* pending_call, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCallback response_callback, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorCallback error_callback, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks start_time); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Runs the response callback with the given response object. 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunResponseCallback(ResponseCallback response_callback, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorCallback error_callback, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks start_time, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMessage* response_message); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Redirects the function call to OnPendingCallIsComplete(). 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void OnPendingCallIsCompleteThunk(DBusPendingCall* pending_call, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* user_data); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Connects to NameOwnerChanged signal. 2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool ConnectToNameOwnerChangedSignal(); 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper function for ConnectToSignal(). 22668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool ConnectToSignalInternal(const std::string& interface_name, 22768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::string& signal_name, 22868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) SignalCallback signal_callback); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Helper function for WaitForServiceToBeAvailable(). 2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void WaitForServiceToBeAvailableInternal(); 2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles the incoming request messages and dispatches to the signal 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callbacks. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusHandlerResult HandleMessage(DBusConnection* connection, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMessage* raw_message); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Runs the method. Helper function for HandleMessage(). 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunMethod(base::TimeTicks start_time, 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<SignalCallback> signal_callbacks, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Signal* signal); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Redirects the function call to HandleMessage(). 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static DBusHandlerResult HandleMessageThunk(DBusConnection* connection, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMessage* raw_message, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* user_data); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper method for logging response errors appropriately. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LogMethodCallFailure(const base::StringPiece& interface_name, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::StringPiece& method_name, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::StringPiece& error_name, 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::StringPiece& error_message) const; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used as ErrorCallback by CallMethod(). 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCallMethodError(const std::string& interface_name, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& method_name, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCallback response_callback, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorResponse* error_response); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds the match rule to the bus and associate the callback with the signal. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool AddMatchRuleWithCallback(const std::string& match_rule, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& absolute_signal_name, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalCallback signal_callback); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds the match rule to the bus so that HandleMessage can see the signal. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool AddMatchRuleWithoutCallback(const std::string& match_rule, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& absolute_signal_name); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls D-Bus's GetNameOwner method synchronously to update 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |service_name_owner_| with the current owner of |service_name_|. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BLOCKING CALL. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateNameOwnerAndBlock(); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles NameOwnerChanged signal from D-Bus's special message bus. 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusHandlerResult HandleNameOwnerChanged(scoped_ptr<dbus::Signal> signal); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Runs |name_owner_changed_callback_|. 2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void RunNameOwnerChangedCallback(const std::string& old_owner, 2804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& new_owner); 2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Runs |wait_for_service_to_be_available_callbacks_|. 2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void RunWaitForServiceToBeAvailableCallbacks(bool service_is_available); 2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Bus> bus_; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string service_name_; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectPath object_path_; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the message filter was added. 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool filter_added_; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The method table where keys are absolute signal names (i.e. interface 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // name + signal name), and values are lists of the corresponding callbacks. 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef std::map<std::string, std::vector<SignalCallback> > MethodTable; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MethodTable method_table_; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The callback called when NameOwnerChanged signal is received. 2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NameOwnerChangedCallback name_owner_changed_callback_; 2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Called when the service becomes available. 3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector<WaitForServiceToBeAvailableCallback> 3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wait_for_service_to_be_available_callbacks_; 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> match_rules_; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool ignore_service_unknown_errors_; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Known name owner of the well-known bus name represnted by |service_name_|. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string service_name_owner_; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ObjectProxy); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace dbus 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // DBUS_OBJECT_PROXY_H_ 317