diff options
-rw-r--r-- | system/gd/rust/linux/client/src/dbus_iface.rs | 38 | ||||
-rw-r--r-- | system/gd/rust/linux/dbus_projection/dbus_macros/src/lib.rs | 46 |
2 files changed, 51 insertions, 33 deletions
diff --git a/system/gd/rust/linux/client/src/dbus_iface.rs b/system/gd/rust/linux/client/src/dbus_iface.rs index dfd79eb924..4d1ed89a3c 100644 --- a/system/gd/rust/linux/client/src/dbus_iface.rs +++ b/system/gd/rust/linux/client/src/dbus_iface.rs @@ -238,27 +238,17 @@ trait DBusExportable {} #[generate_dbus_interface_client] impl IBluetooth for BluetoothDBus { + #[dbus_method("RegisterCallback")] fn register_callback(&mut self, callback: Box<dyn IBluetoothCallback + Send>) { - let callback = { - let path = dbus::Path::new(callback.get_object_id()).unwrap(); - callback.export_for_rpc(); - path - }; - - self.client_proxy.method_noreturn("RegisterCallback", (callback,)) + dbus_generated!() } + #[dbus_method("RegisterConnectionCallback")] fn register_connection_callback( &mut self, callback: Box<dyn IBluetoothConnectionCallback + Send>, ) -> u32 { - let callback = { - let path = dbus::Path::new(callback.get_object_id()).unwrap(); - callback.export_for_rpc(); - path - }; - - self.client_proxy.method("RegisterConnectionCallback", (callback,)) + dbus_generated!() } #[dbus_method("UnregisterConnectionCallback")] @@ -467,16 +457,9 @@ impl IBluetoothManager for BluetoothManagerDBus { dbus_generated!() } - // `generate_dbus_interface_client` doesn't support callback types yet. - // TODO(b/200732080): Support autogenerate code for callback types. + #[dbus_method("RegisterCallback")] fn register_callback(&mut self, callback: Box<dyn IBluetoothManagerCallback + Send>) { - let callback = { - let path = dbus::Path::new(callback.get_object_id()).unwrap(); - callback.export_for_rpc(); - path - }; - - self.client_proxy.method_noreturn("RegisterCallback", (callback,)) + dbus_generated!() } #[dbus_method("GetFlossEnabled")] @@ -559,19 +542,14 @@ impl IBluetoothGatt for BluetoothGattDBus { // TODO(b/200066804): implement } + #[dbus_method("RegisterClient")] fn register_client( &mut self, app_uuid: String, callback: Box<dyn IBluetoothGattCallback + Send>, eatt_support: bool, ) { - let callback = { - let path = dbus::Path::new(callback.get_object_id()).unwrap(); - callback.export_for_rpc(); - path - }; - - self.client_proxy.method_noreturn("RegisterClient", (app_uuid, callback, eatt_support)) + dbus_generated!() } #[dbus_method("UnregisterClient")] diff --git a/system/gd/rust/linux/dbus_projection/dbus_macros/src/lib.rs b/system/gd/rust/linux/dbus_projection/dbus_macros/src/lib.rs index b690af2475..33a8499036 100644 --- a/system/gd/rust/linux/dbus_projection/dbus_macros/src/lib.rs +++ b/system/gd/rust/linux/dbus_projection/dbus_macros/src/lib.rs @@ -257,6 +257,8 @@ pub fn generate_dbus_interface_client(_attr: TokenStream, item: TokenStream) -> let mut input_list = quote! {}; + let mut object_conversions = quote! {}; + // Iterate on every parameter of a method to build a tuple, e.g. // `(param1, param2, param3)` for input in &method.sig.inputs { @@ -265,10 +267,40 @@ pub fn generate_dbus_interface_client(_attr: TokenStream, item: TokenStream) -> if let Pat::Ident(pat_ident) = &*typed.pat { let ident = pat_ident.ident.clone(); - input_list = quote! { - #input_list - <#arg_type as DBusArg>::to_dbus(#ident).unwrap(), + let is_box = if let Type::Path(type_path) = &**arg_type { + if type_path.path.segments[0].ident.to_string().eq("Box") { + true + } else { + false + } + } else { + false }; + + if is_box { + // A Box<dyn> parameter means this is an object that should be exported + // on D-Bus. + object_conversions = quote! { + #object_conversions + let #ident = { + let path = dbus::Path::new(#ident.get_object_id()).unwrap(); + #ident.export_for_rpc(); + path + }; + }; + + input_list = quote! { + #input_list + #ident, + }; + } else { + // Convert every parameter to its corresponding type recognized by + // the D-Bus library. + input_list = quote! { + #input_list + <#arg_type as DBusArg>::to_dbus(#ident).unwrap(), + }; + } } } } @@ -301,6 +333,14 @@ pub fn generate_dbus_interface_client(_attr: TokenStream, item: TokenStream) -> } }; + // Assemble the method body. May have object conversions if there is a param that is + // a proxy object (`Box<dyn>` type). + let body = quote! { + #object_conversions + + #body + }; + // The method definition is its signature and the body. let generated_method = quote! { #sig { |