1*635a8641SAndroid Build Coastguard WorkerFrom a4d8dee3905d784f40d8f480eaacae2655e68b47 Mon Sep 17 00:00:00 2001 2*635a8641SAndroid Build Coastguard WorkerFrom: Sonny Sasaka <[email protected]> 3*635a8641SAndroid Build Coastguard WorkerDate: Wed, 11 Jul 2018 20:55:58 -0700 4*635a8641SAndroid Build Coastguard WorkerSubject: [PATCH] dbus: Add TryRegisterFallback 5*635a8641SAndroid Build Coastguard Worker 6*635a8641SAndroid Build Coastguard WorkerThe TryRegisterFallback works just like TryRegisterObjectPath, 7*635a8641SAndroid Build Coastguard Workerwith addition that the registered callbacks also apply to the specified 8*635a8641SAndroid Build Coastguard Workerobject path and its sub paths. This is useful to implement a "catch-all" 9*635a8641SAndroid Build Coastguard Workerhandler. 10*635a8641SAndroid Build Coastguard Worker 11*635a8641SAndroid Build Coastguard WorkerCurrently this is needed by Bluetooth dispatcher which needs to catch 12*635a8641SAndroid Build Coastguard Workerall method calls to all objects and forward them to another D-Bus 13*635a8641SAndroid Build Coastguard Workerservice. 14*635a8641SAndroid Build Coastguard Worker 15*635a8641SAndroid Build Coastguard WorkerBug:862849 16*635a8641SAndroid Build Coastguard Worker--- 17*635a8641SAndroid Build Coastguard Worker dbus/bus.cc | 27 +++++++++++++++++++++------ 18*635a8641SAndroid Build Coastguard Worker dbus/bus.h | 32 ++++++++++++++++++++++++++++++++ 19*635a8641SAndroid Build Coastguard Worker dbus/mock_bus.h | 5 +++++ 20*635a8641SAndroid Build Coastguard Worker 3 files changed, 58 insertions(+), 6 deletions(-) 21*635a8641SAndroid Build Coastguard Worker 22*635a8641SAndroid Build Coastguard Workerdiff --git a/dbus/bus.cc b/dbus/bus.cc 23*635a8641SAndroid Build Coastguard Workerindex e62058e0dc34..29043609e760 100644 24*635a8641SAndroid Build Coastguard Worker--- a/dbus/bus.cc 25*635a8641SAndroid Build Coastguard Worker+++ b/dbus/bus.cc 26*635a8641SAndroid Build Coastguard Worker@@ -722,6 +722,25 @@ bool Bus::TryRegisterObjectPath(const ObjectPath& object_path, 27*635a8641SAndroid Build Coastguard Worker const DBusObjectPathVTable* vtable, 28*635a8641SAndroid Build Coastguard Worker void* user_data, 29*635a8641SAndroid Build Coastguard Worker DBusError* error) { 30*635a8641SAndroid Build Coastguard Worker+ return TryRegisterObjectPathInternal( 31*635a8641SAndroid Build Coastguard Worker+ object_path, vtable, user_data, error, 32*635a8641SAndroid Build Coastguard Worker+ dbus_connection_try_register_object_path); 33*635a8641SAndroid Build Coastguard Worker+} 34*635a8641SAndroid Build Coastguard Worker+ 35*635a8641SAndroid Build Coastguard Worker+bool Bus::TryRegisterFallback(const ObjectPath& object_path, 36*635a8641SAndroid Build Coastguard Worker+ const DBusObjectPathVTable* vtable, 37*635a8641SAndroid Build Coastguard Worker+ void* user_data, 38*635a8641SAndroid Build Coastguard Worker+ DBusError* error) { 39*635a8641SAndroid Build Coastguard Worker+ return TryRegisterObjectPathInternal(object_path, vtable, user_data, error, 40*635a8641SAndroid Build Coastguard Worker+ dbus_connection_try_register_fallback); 41*635a8641SAndroid Build Coastguard Worker+} 42*635a8641SAndroid Build Coastguard Worker+ 43*635a8641SAndroid Build Coastguard Worker+bool Bus::TryRegisterObjectPathInternal( 44*635a8641SAndroid Build Coastguard Worker+ const ObjectPath& object_path, 45*635a8641SAndroid Build Coastguard Worker+ const DBusObjectPathVTable* vtable, 46*635a8641SAndroid Build Coastguard Worker+ void* user_data, 47*635a8641SAndroid Build Coastguard Worker+ DBusError* error, 48*635a8641SAndroid Build Coastguard Worker+ TryRegisterObjectPathFunction* register_function) { 49*635a8641SAndroid Build Coastguard Worker DCHECK(connection_); 50*635a8641SAndroid Build Coastguard Worker AssertOnDBusThread(); 51*635a8641SAndroid Build Coastguard Worker 52*635a8641SAndroid Build Coastguard Worker@@ -731,12 +750,8 @@ bool Bus::TryRegisterObjectPath(const ObjectPath& object_path, 53*635a8641SAndroid Build Coastguard Worker return false; 54*635a8641SAndroid Build Coastguard Worker } 55*635a8641SAndroid Build Coastguard Worker 56*635a8641SAndroid Build Coastguard Worker- const bool success = dbus_connection_try_register_object_path( 57*635a8641SAndroid Build Coastguard Worker- connection_, 58*635a8641SAndroid Build Coastguard Worker- object_path.value().c_str(), 59*635a8641SAndroid Build Coastguard Worker- vtable, 60*635a8641SAndroid Build Coastguard Worker- user_data, 61*635a8641SAndroid Build Coastguard Worker- error); 62*635a8641SAndroid Build Coastguard Worker+ const bool success = register_function( 63*635a8641SAndroid Build Coastguard Worker+ connection_, object_path.value().c_str(), vtable, user_data, error); 64*635a8641SAndroid Build Coastguard Worker if (success) 65*635a8641SAndroid Build Coastguard Worker registered_object_paths_.insert(object_path); 66*635a8641SAndroid Build Coastguard Worker return success; 67*635a8641SAndroid Build Coastguard Workerdiff --git a/dbus/bus.h b/dbus/bus.h 68*635a8641SAndroid Build Coastguard Workerindex c2c2685afdc4..704a4c3a0b54 100644 69*635a8641SAndroid Build Coastguard Worker--- a/dbus/bus.h 70*635a8641SAndroid Build Coastguard Worker+++ b/dbus/bus.h 71*635a8641SAndroid Build Coastguard Worker@@ -520,6 +520,24 @@ class CHROME_DBUS_EXPORT Bus : public base::RefCountedThreadSafe<Bus> { 72*635a8641SAndroid Build Coastguard Worker void* user_data, 73*635a8641SAndroid Build Coastguard Worker DBusError* error); 74*635a8641SAndroid Build Coastguard Worker 75*635a8641SAndroid Build Coastguard Worker+ // Tries to register the object path and its sub paths. 76*635a8641SAndroid Build Coastguard Worker+ // Returns true on success. 77*635a8641SAndroid Build Coastguard Worker+ // Returns false if the object path is already registered. 78*635a8641SAndroid Build Coastguard Worker+ // 79*635a8641SAndroid Build Coastguard Worker+ // |message_function| in |vtable| will be called every time when a new 80*635a8641SAndroid Build Coastguard Worker+ // message sent to the object path (or hierarchically below) arrives. 81*635a8641SAndroid Build Coastguard Worker+ // 82*635a8641SAndroid Build Coastguard Worker+ // The same object path must not be added more than once. 83*635a8641SAndroid Build Coastguard Worker+ // 84*635a8641SAndroid Build Coastguard Worker+ // See also documentation of |dbus_connection_try_register_fallback| at 85*635a8641SAndroid Build Coastguard Worker+ // http://dbus.freedesktop.org/doc/api/html/group__DBusConnection.html 86*635a8641SAndroid Build Coastguard Worker+ // 87*635a8641SAndroid Build Coastguard Worker+ // BLOCKING CALL. 88*635a8641SAndroid Build Coastguard Worker+ virtual bool TryRegisterFallback(const ObjectPath& object_path, 89*635a8641SAndroid Build Coastguard Worker+ const DBusObjectPathVTable* vtable, 90*635a8641SAndroid Build Coastguard Worker+ void* user_data, 91*635a8641SAndroid Build Coastguard Worker+ DBusError* error); 92*635a8641SAndroid Build Coastguard Worker+ 93*635a8641SAndroid Build Coastguard Worker // Unregister the object path. 94*635a8641SAndroid Build Coastguard Worker // 95*635a8641SAndroid Build Coastguard Worker // BLOCKING CALL. 96*635a8641SAndroid Build Coastguard Worker@@ -590,8 +608,22 @@ class CHROME_DBUS_EXPORT Bus : public base::RefCountedThreadSafe<Bus> { 97*635a8641SAndroid Build Coastguard Worker virtual ~Bus(); 98*635a8641SAndroid Build Coastguard Worker 99*635a8641SAndroid Build Coastguard Worker private: 100*635a8641SAndroid Build Coastguard Worker+ using TryRegisterObjectPathFunction = 101*635a8641SAndroid Build Coastguard Worker+ dbus_bool_t(DBusConnection* connection, 102*635a8641SAndroid Build Coastguard Worker+ const char* object_path, 103*635a8641SAndroid Build Coastguard Worker+ const DBusObjectPathVTable* vtable, 104*635a8641SAndroid Build Coastguard Worker+ void* user_data, 105*635a8641SAndroid Build Coastguard Worker+ DBusError* error); 106*635a8641SAndroid Build Coastguard Worker+ 107*635a8641SAndroid Build Coastguard Worker friend class base::RefCountedThreadSafe<Bus>; 108*635a8641SAndroid Build Coastguard Worker 109*635a8641SAndroid Build Coastguard Worker+ bool TryRegisterObjectPathInternal( 110*635a8641SAndroid Build Coastguard Worker+ const ObjectPath& object_path, 111*635a8641SAndroid Build Coastguard Worker+ const DBusObjectPathVTable* vtable, 112*635a8641SAndroid Build Coastguard Worker+ void* user_data, 113*635a8641SAndroid Build Coastguard Worker+ DBusError* error, 114*635a8641SAndroid Build Coastguard Worker+ TryRegisterObjectPathFunction* register_function); 115*635a8641SAndroid Build Coastguard Worker+ 116*635a8641SAndroid Build Coastguard Worker // Helper function used for RemoveObjectProxy(). 117*635a8641SAndroid Build Coastguard Worker void RemoveObjectProxyInternal(scoped_refptr<dbus::ObjectProxy> object_proxy, 118*635a8641SAndroid Build Coastguard Worker const base::Closure& callback); 119*635a8641SAndroid Build Coastguard Workerdiff --git a/dbus/mock_bus.h b/dbus/mock_bus.h 120*635a8641SAndroid Build Coastguard Workerindex 216bc64bd068..6b3495db6014 100644 121*635a8641SAndroid Build Coastguard Worker--- a/dbus/mock_bus.h 122*635a8641SAndroid Build Coastguard Worker+++ b/dbus/mock_bus.h 123*635a8641SAndroid Build Coastguard Worker@@ -62,6 +62,11 @@ class MockBus : public Bus { 124*635a8641SAndroid Build Coastguard Worker const DBusObjectPathVTable* vtable, 125*635a8641SAndroid Build Coastguard Worker void* user_data, 126*635a8641SAndroid Build Coastguard Worker DBusError* error)); 127*635a8641SAndroid Build Coastguard Worker+ MOCK_METHOD4(TryRegisterFallback, 128*635a8641SAndroid Build Coastguard Worker+ bool(const ObjectPath& object_path, 129*635a8641SAndroid Build Coastguard Worker+ const DBusObjectPathVTable* vtable, 130*635a8641SAndroid Build Coastguard Worker+ void* user_data, 131*635a8641SAndroid Build Coastguard Worker+ DBusError* error)); 132*635a8641SAndroid Build Coastguard Worker MOCK_METHOD1(UnregisterObjectPath, void(const ObjectPath& object_path)); 133*635a8641SAndroid Build Coastguard Worker MOCK_METHOD0(GetDBusTaskRunner, base::TaskRunner*()); 134*635a8641SAndroid Build Coastguard Worker MOCK_METHOD0(GetOriginTaskRunner, base::TaskRunner*()); 135*635a8641SAndroid Build Coastguard Worker-- 136*635a8641SAndroid Build Coastguard Worker2.18.0.203.gfac676dfb9-goog 137*635a8641SAndroid Build Coastguard Worker 138