| extern crate bt_shim; |
| |
| use bt_topshim::btif::{BtDeviceType, BtSspVariant, BtTransport, Uuid128Bit}; |
| |
| use btstack::bluetooth::{ |
| BluetoothDevice, IBluetooth, IBluetoothCallback, IBluetoothConnectionCallback, |
| }; |
| use btstack::uuid::Profile; |
| use btstack::RPCProxy; |
| |
| use dbus::arg::RefArg; |
| |
| use dbus::nonblock::SyncConnection; |
| use dbus::strings::Path; |
| |
| use dbus_macros::{dbus_method, dbus_propmap, dbus_proxy_obj, generate_dbus_exporter}; |
| |
| use dbus_projection::DisconnectWatcher; |
| use dbus_projection::{dbus_generated, impl_dbus_arg_enum}; |
| |
| use num_traits::cast::{FromPrimitive, ToPrimitive}; |
| |
| use std::sync::Arc; |
| |
| use crate::dbus_arg::{DBusArg, DBusArgError, RefArgToRust}; |
| |
| #[dbus_propmap(BluetoothDevice)] |
| pub struct BluetoothDeviceDBus { |
| address: String, |
| name: String, |
| } |
| |
| #[allow(dead_code)] |
| struct BluetoothCallbackDBus {} |
| |
| #[dbus_proxy_obj(BluetoothCallback, "org.chromium.bluetooth.BluetoothCallback")] |
| impl IBluetoothCallback for BluetoothCallbackDBus { |
| #[dbus_method("OnAddressChanged")] |
| fn on_address_changed(&self, addr: String) { |
| dbus_generated!() |
| } |
| #[dbus_method("OnDeviceFound")] |
| fn on_device_found(&self, remote_device: BluetoothDevice) { |
| dbus_generated!() |
| } |
| #[dbus_method("OnDiscoveringChanged")] |
| fn on_discovering_changed(&self, discovering: bool) { |
| dbus_generated!() |
| } |
| #[dbus_method("OnSspRequest")] |
| fn on_ssp_request( |
| &self, |
| remote_device: BluetoothDevice, |
| cod: u32, |
| variant: BtSspVariant, |
| passkey: u32, |
| ) { |
| dbus_generated!() |
| } |
| #[dbus_method("OnBondStateChanged")] |
| fn on_bond_state_changed(&self, status: u32, address: String, state: u32) { |
| dbus_generated!() |
| } |
| } |
| |
| impl_dbus_arg_enum!(BtDeviceType); |
| impl_dbus_arg_enum!(BtSspVariant); |
| impl_dbus_arg_enum!(BtTransport); |
| impl_dbus_arg_enum!(Profile); |
| |
| #[allow(dead_code)] |
| struct BluetoothConnectionCallbackDBus {} |
| |
| #[dbus_proxy_obj(BluetoothConnectionCallback, "org.chromium.bluetooth.BluetoothConnectionCallback")] |
| impl IBluetoothConnectionCallback for BluetoothConnectionCallbackDBus { |
| #[dbus_method("OnDeviceConnected")] |
| fn on_device_connected(&self, remote_device: BluetoothDevice) { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("OnDeviceDisconnected")] |
| fn on_device_disconnected(&self, remote_device: BluetoothDevice) { |
| dbus_generated!() |
| } |
| } |
| |
| #[allow(dead_code)] |
| struct IBluetoothDBus {} |
| |
| #[generate_dbus_exporter(export_bluetooth_dbus_obj, "org.chromium.bluetooth.Bluetooth")] |
| impl IBluetooth for IBluetoothDBus { |
| #[dbus_method("RegisterCallback")] |
| fn register_callback(&mut self, callback: Box<dyn IBluetoothCallback + Send>) { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("RegisterConnectionCallback")] |
| fn register_connection_callback( |
| &mut self, |
| callback: Box<dyn IBluetoothConnectionCallback + Send>, |
| ) -> u32 { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("UnregisterConnectionCallback")] |
| fn unregister_connection_callback(&mut self, id: u32) -> bool { |
| dbus_generated!() |
| } |
| |
| // Not exposed over D-Bus. The stack is automatically enabled when the daemon starts. |
| fn enable(&mut self) -> bool { |
| dbus_generated!() |
| } |
| |
| // Not exposed over D-Bus. The stack is automatically disabled when the daemon exits. |
| // TODO(b/189495858): Handle shutdown properly when SIGTERM is received. |
| fn disable(&mut self) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("GetAddress")] |
| fn get_address(&self) -> String { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("GetUuids")] |
| fn get_uuids(&self) -> Vec<Uuid128Bit> { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("GetName")] |
| fn get_name(&self) -> String { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("SetName")] |
| fn set_name(&self, name: String) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("GetBluetoothClass")] |
| fn get_bluetooth_class(&self) -> u32 { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("SetBluetoothClass")] |
| fn set_bluetooth_class(&self, cod: u32) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("GetDiscoverable")] |
| fn get_discoverable(&self) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("GetDiscoverableTimeout")] |
| fn get_discoverable_timeout(&self) -> u32 { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("SetDiscoverable")] |
| fn set_discoverable(&self, mode: bool, duration: u32) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("IsMultiAdvertisementSupported")] |
| fn is_multi_advertisement_supported(&self) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("IsLeExtendedAdvertisingSupported")] |
| fn is_le_extended_advertising_supported(&self) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("StartDiscovery")] |
| fn start_discovery(&self) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("CancelDiscovery")] |
| fn cancel_discovery(&self) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("IsDiscovering")] |
| fn is_discovering(&self) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("GetDiscoveryEndMillis")] |
| fn get_discovery_end_millis(&self) -> u64 { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("CreateBond")] |
| fn create_bond(&self, device: BluetoothDevice, transport: BtTransport) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("CancelBondProcess")] |
| fn cancel_bond_process(&self, device: BluetoothDevice) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("RemoveBond")] |
| fn remove_bond(&self, device: BluetoothDevice) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("GetBondedDevices")] |
| fn get_bonded_devices(&self) -> Vec<BluetoothDevice> { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("GetBondState")] |
| fn get_bond_state(&self, device: BluetoothDevice) -> u32 { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("SetPin")] |
| fn set_pin(&self, device: BluetoothDevice, accept: bool, pin_code: Vec<u8>) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("SetPasskey")] |
| fn set_passkey(&self, device: BluetoothDevice, accept: bool, passkey: Vec<u8>) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("SetPairingConfirmation")] |
| fn set_pairing_confirmation(&self, device: BluetoothDevice, accept: bool) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("GetRemoteName")] |
| fn get_remote_name(&self, _device: BluetoothDevice) -> String { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("GetRemoteType")] |
| fn get_remote_type(&self, _device: BluetoothDevice) -> BtDeviceType { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("GetRemoteAlias")] |
| fn get_remote_alias(&self, _device: BluetoothDevice) -> String { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("SetRemoteAlias")] |
| fn set_remote_alias(&mut self, _device: BluetoothDevice, new_alias: String) { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("GetRemoteClass")] |
| fn get_remote_class(&self, _device: BluetoothDevice) -> u32 { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("GetConnectionState")] |
| fn get_connection_state(&self, device: BluetoothDevice) -> u32 { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("GetProfileConnectionState")] |
| fn get_profile_connection_state(&self, profile: Profile) -> u32 { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("GetRemoteUuids")] |
| fn get_remote_uuids(&self, device: BluetoothDevice) -> Vec<Uuid128Bit> { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("FetchRemoteUuids")] |
| fn fetch_remote_uuids(&self, device: BluetoothDevice) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("SdpSearch")] |
| fn sdp_search(&self, device: BluetoothDevice, uuid: Uuid128Bit) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("ConnectAllEnabledProfiles")] |
| fn connect_all_enabled_profiles(&self, device: BluetoothDevice) -> bool { |
| dbus_generated!() |
| } |
| |
| #[dbus_method("DisconnectAllEnabledProfiles")] |
| fn disconnect_all_enabled_profiles(&self, device: BluetoothDevice) -> bool { |
| dbus_generated!() |
| } |
| } |