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; 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ScopedDBusError; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Signal; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ObjectProxy is used to communicate with remote objects, mainly for 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// calling methods of these objects. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ObjectProxy is a ref counted object, to ensure that |this| of the 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// object is alive when callbacks referencing |this| are called; the 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bus always holds at least one of those references so object proxies 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// always last as long as the bus that created them. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CHROME_DBUS_EXPORT ObjectProxy 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCountedThreadSafe<ObjectProxy> { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Client code should use Bus::GetObjectProxy() or 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bus::GetObjectProxyWithOptions() instead of this constructor. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectProxy(Bus* bus, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& service_name, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ObjectPath& object_path, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int options); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Options to be OR-ed together when calling Bus::GetObjectProxyWithOptions(). 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the IGNORE_SERVICE_UNKNOWN_ERRORS option to silence logging of 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // org.freedesktop.DBus.Error.ServiceUnknown errors and 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // org.freedesktop.DBus.Error.ObjectUnknown errors. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Options { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DEFAULT_OPTIONS = 0, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IGNORE_SERVICE_UNKNOWN_ERRORS = 1 << 0 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Special timeout constants. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The constants correspond to DBUS_TIMEOUT_USE_DEFAULT and 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DBUS_TIMEOUT_INFINITE. Here we use literal numbers instead of these 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // macros as these aren't defined with D-Bus earlier than 1.4.12. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TIMEOUT_USE_DEFAULT = -1, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TIMEOUT_INFINITE = 0x7fffffff, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when an error response is returned or no response is returned. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used for CallMethodWithErrorCallback(). 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void(ErrorResponse*)> ErrorCallback; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the response is returned. Used for CallMethod(). 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void(Response*)> ResponseCallback; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when a signal is received. Signal* is the incoming signal. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void (Signal*)> SignalCallback; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Called when NameOwnerChanged signal is received. 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typedef base::Callback<void( 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& old_owner, 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& new_owner)> NameOwnerChangedCallback; 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Called when the service becomes available. 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) typedef base::Callback<void( 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool service_is_available)> WaitForServiceToBeAvailableCallback; 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the object proxy is connected to the signal. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parameters: 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - the interface name. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - the signal name. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // - whether it was successful or not. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void (const std::string&, const std::string&, bool)> 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnConnectedCallback; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls the method of the remote object and blocks until the response 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // is returned. Returns NULL on error with the error details specified 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // in the |error| object. 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // BLOCKING CALL. 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual scoped_ptr<Response> CallMethodAndBlockWithErrorDetails( 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MethodCall* method_call, 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int timeout_ms, 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedDBusError* error); 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Calls the method of the remote object and blocks until the response 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is returned. Returns NULL on error. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BLOCKING CALL. 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<Response> CallMethodAndBlock(MethodCall* method_call, 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int timeout_ms); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests to call the method of the remote object. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |callback| will be called in the origin thread, once the method call 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is complete. As it's called in the origin thread, |callback| can 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // safely reference objects in the origin thread (i.e. UI thread in most 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cases). If the caller is not interested in the response from the 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // method (i.e. calling a method that does not return a value), 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EmptyResponseCallback() can be passed to the |callback| parameter. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the method call is successful, a pointer to Response object will 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be passed to the callback. If unsuccessful, NULL will be passed to 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the callback. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called in the origin thread. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CallMethod(MethodCall* method_call, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int timeout_ms, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCallback callback); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests to call the method of the remote object. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |callback| and |error_callback| will be called in the origin thread, once 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the method call is complete. As it's called in the origin thread, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |callback| can safely reference objects in the origin thread (i.e. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UI thread in most cases). If the caller is not interested in the response 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the method (i.e. calling a method that does not return a value), 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EmptyResponseCallback() can be passed to the |callback| parameter. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the method call is successful, a pointer to Response object will 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be passed to the callback. If unsuccessful, the error callback will be 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called and a pointer to ErrorResponse object will be passed to the error 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback if available, otherwise NULL will be passed. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called in the origin thread. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CallMethodWithErrorCallback(MethodCall* method_call, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int timeout_ms, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCallback callback, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorCallback error_callback); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests to connect to the signal from the remote object, replacing 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // any previous |signal_callback| connected to that signal. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |signal_callback| will be called in the origin thread, when the 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // signal is received from the remote object. As it's called in the 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // origin thread, |signal_callback| can safely reference objects in the 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // origin thread (i.e. UI thread in most cases). 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |on_connected_callback| is called when the object proxy is connected 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the signal, or failed to be connected, in the origin thread. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called in the origin thread. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ConnectToSignal(const std::string& interface_name, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& signal_name, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalCallback signal_callback, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnConnectedCallback on_connected_callback); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets a callback for "NameOwnerChanged" signal. The callback is called on 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the origin thread when D-Bus system sends "NameOwnerChanged" for the name 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // represented by |service_name_|. 1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void SetNameOwnerChangedCallback(NameOwnerChangedCallback callback); 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Runs the callback as soon as the service becomes available. 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void WaitForServiceToBeAvailable( 1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WaitForServiceToBeAvailableCallback callback); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Detaches from the remote object. The Bus object will take care of 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // detaching so you don't have to do this manually. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BLOCKING CALL. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Detach(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const ObjectPath& object_path() const { return object_path_; } 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns an empty callback that does nothing. Can be used for 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CallMethod(). 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ResponseCallback EmptyResponseCallback(); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is protected, so we can define sub classes. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ObjectProxy(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<ObjectProxy>; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Struct of data we'll be passing from StartAsyncMethodCall() to 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnPendingCallIsCompleteThunk(). 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct OnPendingCallIsCompleteData { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnPendingCallIsCompleteData(ObjectProxy* in_object_proxy, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCallback in_response_callback, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorCallback error_callback, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks start_time); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~OnPendingCallIsCompleteData(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectProxy* object_proxy; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCallback response_callback; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorCallback error_callback; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks start_time; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts the async method call. This is a helper function to implement 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CallMethod(). 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartAsyncMethodCall(int timeout_ms, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMessage* request_message, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCallback response_callback, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorCallback error_callback, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks start_time); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the pending call is complete. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnPendingCallIsComplete(DBusPendingCall* pending_call, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCallback response_callback, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorCallback error_callback, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks start_time); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Runs the response callback with the given response object. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunResponseCallback(ResponseCallback response_callback, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorCallback error_callback, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks start_time, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMessage* response_message); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Redirects the function call to OnPendingCallIsComplete(). 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void OnPendingCallIsCompleteThunk(DBusPendingCall* pending_call, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* user_data); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Connects to NameOwnerChanged signal. 2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool ConnectToNameOwnerChangedSignal(); 2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper function for ConnectToSignal(). 23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool ConnectToSignalInternal(const std::string& interface_name, 23868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::string& signal_name, 23968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) SignalCallback signal_callback); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Helper function for WaitForServiceToBeAvailable(). 2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void WaitForServiceToBeAvailableInternal(); 2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles the incoming request messages and dispatches to the signal 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callbacks. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusHandlerResult HandleMessage(DBusConnection* connection, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMessage* raw_message); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Runs the method. Helper function for HandleMessage(). 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunMethod(base::TimeTicks start_time, 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<SignalCallback> signal_callbacks, 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Signal* signal); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Redirects the function call to HandleMessage(). 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static DBusHandlerResult HandleMessageThunk(DBusConnection* connection, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMessage* raw_message, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* user_data); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper method for logging response errors appropriately. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LogMethodCallFailure(const base::StringPiece& interface_name, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::StringPiece& method_name, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::StringPiece& error_name, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::StringPiece& error_message) const; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used as ErrorCallback by CallMethod(). 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCallMethodError(const std::string& interface_name, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& method_name, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCallback response_callback, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorResponse* error_response); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds the match rule to the bus and associate the callback with the signal. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool AddMatchRuleWithCallback(const std::string& match_rule, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& absolute_signal_name, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalCallback signal_callback); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds the match rule to the bus so that HandleMessage can see the signal. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool AddMatchRuleWithoutCallback(const std::string& match_rule, 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& absolute_signal_name); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calls D-Bus's GetNameOwner method synchronously to update 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |service_name_owner_| with the current owner of |service_name_|. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BLOCKING CALL. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateNameOwnerAndBlock(); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles NameOwnerChanged signal from D-Bus's special message bus. 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusHandlerResult HandleNameOwnerChanged(scoped_ptr<dbus::Signal> signal); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Runs |name_owner_changed_callback_|. 2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void RunNameOwnerChangedCallback(const std::string& old_owner, 2914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& new_owner); 2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Runs |wait_for_service_to_be_available_callbacks_|. 2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void RunWaitForServiceToBeAvailableCallbacks(bool service_is_available); 2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Bus> bus_; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string service_name_; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectPath object_path_; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the message filter was added. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool filter_added_; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The method table where keys are absolute signal names (i.e. interface 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // name + signal name), and values are lists of the corresponding callbacks. 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef std::map<std::string, std::vector<SignalCallback> > MethodTable; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MethodTable method_table_; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The callback called when NameOwnerChanged signal is received. 3094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NameOwnerChangedCallback name_owner_changed_callback_; 3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Called when the service becomes available. 3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::vector<WaitForServiceToBeAvailableCallback> 3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wait_for_service_to_be_available_callbacks_; 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> match_rules_; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool ignore_service_unknown_errors_; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Known name owner of the well-known bus name represented by |service_name_|. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string service_name_owner_; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ObjectProxy); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace dbus 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // DBUS_OBJECT_PROXY_H_ 328