1 extern crate bt_shim; 2 3 use bt_topshim::btif::{BtDeviceType, BtSspVariant, BtTransport, Uuid128Bit}; 4 5 use btstack::bluetooth::{ 6 BluetoothDevice, IBluetooth, IBluetoothCallback, IBluetoothConnectionCallback, 7 }; 8 use btstack::uuid::Profile; 9 use btstack::RPCProxy; 10 11 use dbus::arg::RefArg; 12 13 use dbus::nonblock::SyncConnection; 14 use dbus::strings::Path; 15 16 use dbus_macros::{dbus_method, dbus_propmap, dbus_proxy_obj, generate_dbus_exporter}; 17 18 use dbus_projection::DisconnectWatcher; 19 use dbus_projection::{dbus_generated, impl_dbus_arg_enum}; 20 21 use num_traits::cast::{FromPrimitive, ToPrimitive}; 22 23 use std::sync::Arc; 24 25 use crate::dbus_arg::{DBusArg, DBusArgError, RefArgToRust}; 26 27 #[dbus_propmap(BluetoothDevice)] 28 pub struct BluetoothDeviceDBus { 29 address: String, 30 name: String, 31 } 32 33 #[allow(dead_code)] 34 struct BluetoothCallbackDBus {} 35 36 #[dbus_proxy_obj(BluetoothCallback, "org.chromium.bluetooth.BluetoothCallback")] 37 impl IBluetoothCallback for BluetoothCallbackDBus { 38 #[dbus_method("OnAddressChanged")] on_address_changed(&self, addr: String)39 fn on_address_changed(&self, addr: String) { 40 dbus_generated!() 41 } 42 #[dbus_method("OnNameChanged")] on_name_changed(&self, name: String)43 fn on_name_changed(&self, name: String) { 44 dbus_generated!() 45 } 46 #[dbus_method("OnDiscoverableChanged")] on_discoverable_changed(&self, discoverable: bool)47 fn on_discoverable_changed(&self, discoverable: bool) { 48 dbus_generated!() 49 } 50 #[dbus_method("OnDeviceFound")] on_device_found(&self, remote_device: BluetoothDevice)51 fn on_device_found(&self, remote_device: BluetoothDevice) { 52 dbus_generated!() 53 } 54 #[dbus_method("OnDeviceCleared")] on_device_cleared(&self, remote_device: BluetoothDevice)55 fn on_device_cleared(&self, remote_device: BluetoothDevice) { 56 dbus_generated!() 57 } 58 #[dbus_method("OnDiscoveringChanged")] on_discovering_changed(&self, discovering: bool)59 fn on_discovering_changed(&self, discovering: bool) { 60 dbus_generated!() 61 } 62 #[dbus_method("OnSspRequest")] on_ssp_request( &self, remote_device: BluetoothDevice, cod: u32, variant: BtSspVariant, passkey: u32, )63 fn on_ssp_request( 64 &self, 65 remote_device: BluetoothDevice, 66 cod: u32, 67 variant: BtSspVariant, 68 passkey: u32, 69 ) { 70 dbus_generated!() 71 } 72 #[dbus_method("OnBondStateChanged")] on_bond_state_changed(&self, status: u32, address: String, state: u32)73 fn on_bond_state_changed(&self, status: u32, address: String, state: u32) { 74 dbus_generated!() 75 } 76 } 77 78 impl_dbus_arg_enum!(BtDeviceType); 79 impl_dbus_arg_enum!(BtSspVariant); 80 impl_dbus_arg_enum!(BtTransport); 81 impl_dbus_arg_enum!(Profile); 82 83 #[allow(dead_code)] 84 struct BluetoothConnectionCallbackDBus {} 85 86 #[dbus_proxy_obj(BluetoothConnectionCallback, "org.chromium.bluetooth.BluetoothConnectionCallback")] 87 impl IBluetoothConnectionCallback for BluetoothConnectionCallbackDBus { 88 #[dbus_method("OnDeviceConnected")] on_device_connected(&self, remote_device: BluetoothDevice)89 fn on_device_connected(&self, remote_device: BluetoothDevice) { 90 dbus_generated!() 91 } 92 93 #[dbus_method("OnDeviceDisconnected")] on_device_disconnected(&self, remote_device: BluetoothDevice)94 fn on_device_disconnected(&self, remote_device: BluetoothDevice) { 95 dbus_generated!() 96 } 97 } 98 99 #[allow(dead_code)] 100 struct IBluetoothDBus {} 101 102 #[generate_dbus_exporter(export_bluetooth_dbus_obj, "org.chromium.bluetooth.Bluetooth")] 103 impl IBluetooth for IBluetoothDBus { 104 #[dbus_method("RegisterCallback")] register_callback(&mut self, callback: Box<dyn IBluetoothCallback + Send>)105 fn register_callback(&mut self, callback: Box<dyn IBluetoothCallback + Send>) { 106 dbus_generated!() 107 } 108 109 #[dbus_method("RegisterConnectionCallback")] register_connection_callback( &mut self, callback: Box<dyn IBluetoothConnectionCallback + Send>, ) -> u32110 fn register_connection_callback( 111 &mut self, 112 callback: Box<dyn IBluetoothConnectionCallback + Send>, 113 ) -> u32 { 114 dbus_generated!() 115 } 116 117 #[dbus_method("UnregisterConnectionCallback")] unregister_connection_callback(&mut self, id: u32) -> bool118 fn unregister_connection_callback(&mut self, id: u32) -> bool { 119 dbus_generated!() 120 } 121 122 // Not exposed over D-Bus. The stack is automatically enabled when the daemon starts. enable(&mut self) -> bool123 fn enable(&mut self) -> bool { 124 dbus_generated!() 125 } 126 127 // Not exposed over D-Bus. The stack is automatically disabled when the daemon exits. 128 // TODO(b/189495858): Handle shutdown properly when SIGTERM is received. disable(&mut self) -> bool129 fn disable(&mut self) -> bool { 130 dbus_generated!() 131 } 132 133 #[dbus_method("GetAddress")] get_address(&self) -> String134 fn get_address(&self) -> String { 135 dbus_generated!() 136 } 137 138 #[dbus_method("GetUuids")] get_uuids(&self) -> Vec<Uuid128Bit>139 fn get_uuids(&self) -> Vec<Uuid128Bit> { 140 dbus_generated!() 141 } 142 143 #[dbus_method("GetName")] get_name(&self) -> String144 fn get_name(&self) -> String { 145 dbus_generated!() 146 } 147 148 #[dbus_method("SetName")] set_name(&self, name: String) -> bool149 fn set_name(&self, name: String) -> bool { 150 dbus_generated!() 151 } 152 153 #[dbus_method("GetBluetoothClass")] get_bluetooth_class(&self) -> u32154 fn get_bluetooth_class(&self) -> u32 { 155 dbus_generated!() 156 } 157 158 #[dbus_method("SetBluetoothClass")] set_bluetooth_class(&self, cod: u32) -> bool159 fn set_bluetooth_class(&self, cod: u32) -> bool { 160 dbus_generated!() 161 } 162 163 #[dbus_method("GetDiscoverable")] get_discoverable(&self) -> bool164 fn get_discoverable(&self) -> bool { 165 dbus_generated!() 166 } 167 168 #[dbus_method("GetDiscoverableTimeout")] get_discoverable_timeout(&self) -> u32169 fn get_discoverable_timeout(&self) -> u32 { 170 dbus_generated!() 171 } 172 173 #[dbus_method("SetDiscoverable")] set_discoverable(&self, mode: bool, duration: u32) -> bool174 fn set_discoverable(&self, mode: bool, duration: u32) -> bool { 175 dbus_generated!() 176 } 177 178 #[dbus_method("IsMultiAdvertisementSupported")] is_multi_advertisement_supported(&self) -> bool179 fn is_multi_advertisement_supported(&self) -> bool { 180 dbus_generated!() 181 } 182 183 #[dbus_method("IsLeExtendedAdvertisingSupported")] is_le_extended_advertising_supported(&self) -> bool184 fn is_le_extended_advertising_supported(&self) -> bool { 185 dbus_generated!() 186 } 187 188 #[dbus_method("StartDiscovery")] start_discovery(&self) -> bool189 fn start_discovery(&self) -> bool { 190 dbus_generated!() 191 } 192 193 #[dbus_method("CancelDiscovery")] cancel_discovery(&self) -> bool194 fn cancel_discovery(&self) -> bool { 195 dbus_generated!() 196 } 197 198 #[dbus_method("IsDiscovering")] is_discovering(&self) -> bool199 fn is_discovering(&self) -> bool { 200 dbus_generated!() 201 } 202 203 #[dbus_method("GetDiscoveryEndMillis")] get_discovery_end_millis(&self) -> u64204 fn get_discovery_end_millis(&self) -> u64 { 205 dbus_generated!() 206 } 207 208 #[dbus_method("CreateBond")] create_bond(&self, device: BluetoothDevice, transport: BtTransport) -> bool209 fn create_bond(&self, device: BluetoothDevice, transport: BtTransport) -> bool { 210 dbus_generated!() 211 } 212 213 #[dbus_method("CancelBondProcess")] cancel_bond_process(&self, device: BluetoothDevice) -> bool214 fn cancel_bond_process(&self, device: BluetoothDevice) -> bool { 215 dbus_generated!() 216 } 217 218 #[dbus_method("RemoveBond")] remove_bond(&self, device: BluetoothDevice) -> bool219 fn remove_bond(&self, device: BluetoothDevice) -> bool { 220 dbus_generated!() 221 } 222 223 #[dbus_method("GetBondedDevices")] get_bonded_devices(&self) -> Vec<BluetoothDevice>224 fn get_bonded_devices(&self) -> Vec<BluetoothDevice> { 225 dbus_generated!() 226 } 227 228 #[dbus_method("GetBondState")] get_bond_state(&self, device: BluetoothDevice) -> u32229 fn get_bond_state(&self, device: BluetoothDevice) -> u32 { 230 dbus_generated!() 231 } 232 233 #[dbus_method("SetPin")] set_pin(&self, device: BluetoothDevice, accept: bool, pin_code: Vec<u8>) -> bool234 fn set_pin(&self, device: BluetoothDevice, accept: bool, pin_code: Vec<u8>) -> bool { 235 dbus_generated!() 236 } 237 238 #[dbus_method("SetPasskey")] set_passkey(&self, device: BluetoothDevice, accept: bool, passkey: Vec<u8>) -> bool239 fn set_passkey(&self, device: BluetoothDevice, accept: bool, passkey: Vec<u8>) -> bool { 240 dbus_generated!() 241 } 242 243 #[dbus_method("SetPairingConfirmation")] set_pairing_confirmation(&self, device: BluetoothDevice, accept: bool) -> bool244 fn set_pairing_confirmation(&self, device: BluetoothDevice, accept: bool) -> bool { 245 dbus_generated!() 246 } 247 248 #[dbus_method("GetRemoteName")] get_remote_name(&self, _device: BluetoothDevice) -> String249 fn get_remote_name(&self, _device: BluetoothDevice) -> String { 250 dbus_generated!() 251 } 252 253 #[dbus_method("GetRemoteType")] get_remote_type(&self, _device: BluetoothDevice) -> BtDeviceType254 fn get_remote_type(&self, _device: BluetoothDevice) -> BtDeviceType { 255 dbus_generated!() 256 } 257 258 #[dbus_method("GetRemoteAlias")] get_remote_alias(&self, _device: BluetoothDevice) -> String259 fn get_remote_alias(&self, _device: BluetoothDevice) -> String { 260 dbus_generated!() 261 } 262 263 #[dbus_method("SetRemoteAlias")] set_remote_alias(&mut self, _device: BluetoothDevice, new_alias: String)264 fn set_remote_alias(&mut self, _device: BluetoothDevice, new_alias: String) { 265 dbus_generated!() 266 } 267 268 #[dbus_method("GetRemoteClass")] get_remote_class(&self, _device: BluetoothDevice) -> u32269 fn get_remote_class(&self, _device: BluetoothDevice) -> u32 { 270 dbus_generated!() 271 } 272 273 #[dbus_method("GetConnectionState")] get_connection_state(&self, device: BluetoothDevice) -> u32274 fn get_connection_state(&self, device: BluetoothDevice) -> u32 { 275 dbus_generated!() 276 } 277 278 #[dbus_method("GetProfileConnectionState")] get_profile_connection_state(&self, profile: Profile) -> u32279 fn get_profile_connection_state(&self, profile: Profile) -> u32 { 280 dbus_generated!() 281 } 282 283 #[dbus_method("GetRemoteUuids")] get_remote_uuids(&self, device: BluetoothDevice) -> Vec<Uuid128Bit>284 fn get_remote_uuids(&self, device: BluetoothDevice) -> Vec<Uuid128Bit> { 285 dbus_generated!() 286 } 287 288 #[dbus_method("FetchRemoteUuids")] fetch_remote_uuids(&self, device: BluetoothDevice) -> bool289 fn fetch_remote_uuids(&self, device: BluetoothDevice) -> bool { 290 dbus_generated!() 291 } 292 293 #[dbus_method("SdpSearch")] sdp_search(&self, device: BluetoothDevice, uuid: Uuid128Bit) -> bool294 fn sdp_search(&self, device: BluetoothDevice, uuid: Uuid128Bit) -> bool { 295 dbus_generated!() 296 } 297 298 #[dbus_method("ConnectAllEnabledProfiles")] connect_all_enabled_profiles(&mut self, device: BluetoothDevice) -> bool299 fn connect_all_enabled_profiles(&mut self, device: BluetoothDevice) -> bool { 300 dbus_generated!() 301 } 302 303 #[dbus_method("DisconnectAllEnabledProfiles")] disconnect_all_enabled_profiles(&mut self, device: BluetoothDevice) -> bool304 fn disconnect_all_enabled_profiles(&mut self, device: BluetoothDevice) -> bool { 305 dbus_generated!() 306 } 307 } 308