Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e5d5569 authored by Sonny Sasaka's avatar Sonny Sasaka
Browse files

floss: Implement GATT service discovery methods

This implements the following IBluetoothGatt methods:
* RefreshDevice
* DiscoverServices
* DiscoverServiceByUuid

Bug: 193685325
Tag: #floss
Test: Build floss on Linux and AOSP

Change-Id: I876776abc8adf5e1665e10d7b401da61fc04fcaa
parent f429d48f
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -134,4 +134,13 @@ impl IBluetoothGatt for IBluetoothGattDBus {

    #[dbus_method("ClientReadPhy")]
    fn client_read_phy(&mut self, client_id: i32, addr: String) {}

    #[dbus_method("RefreshDevice")]
    fn refresh_device(&self, client_id: i32, addr: String) {}

    #[dbus_method("DiscoverServices")]
    fn discover_services(&self, client_id: i32, addr: String) {}

    #[dbus_method("DiscoverServiceByUuid")]
    fn discover_service_by_uuid(&self, client_id: i32, addr: String, uuid: String) {}
}
+40 −0
Original line number Diff line number Diff line
@@ -151,6 +151,15 @@ pub trait IBluetoothGatt {

    /// Reads the PHY used by a peer.
    fn client_read_phy(&mut self, client_id: i32, addr: String);

    /// Clears the attribute cache of a device.
    fn refresh_device(&self, client_id: i32, addr: String);

    /// Enumerates all GATT services on a connected device.
    fn discover_services(&self, client_id: i32, addr: String);

    /// Search a GATT service on a connected device based on a UUID.
    fn discover_service_by_uuid(&self, client_id: i32, addr: String, uuid: String);
}

/// Callback for GATT Client API.
@@ -383,6 +392,37 @@ impl IBluetoothGatt for BluetoothGatt {

        self.gatt.as_mut().unwrap().client.read_phy(client_id, &address);
    }

    fn refresh_device(&self, client_id: i32, addr: String) {
        self.gatt
            .as_ref()
            .unwrap()
            .client
            .refresh(client_id, &RawAddress::from_string(addr).unwrap());
    }

    fn discover_services(&self, client_id: i32, addr: String) {
        let conn_id = self.context_map.get_conn_id_from_address(client_id, &addr);
        if conn_id.is_none() {
            return;
        }

        self.gatt.as_ref().unwrap().client.search_service(conn_id.unwrap(), None);
    }

    fn discover_service_by_uuid(&self, client_id: i32, addr: String, uuid: String) {
        let conn_id = self.context_map.get_conn_id_from_address(client_id, &addr);
        if conn_id.is_none() {
            return;
        }

        let uuid = parse_uuid_string(uuid);
        if uuid.is_none() {
            return;
        }

        self.gatt.as_ref().unwrap().client.search_service(conn_id.unwrap(), uuid);
    }
}

#[btif_callbacks_dispatcher(BluetoothGatt, dispatch_gatt_client_callbacks, GattClientCallbacks)]
+7 −2
Original line number Diff line number Diff line
@@ -510,8 +510,13 @@ impl GattClient {
        BtStatus::from(ccall!(self, refresh, client_if, ffi_addr))
    }

    pub fn search_service(&self, conn_id: i32, filter_uuid: &Uuid) -> BtStatus {
        BtStatus::from(ccall!(self, search_service, conn_id, filter_uuid))
    pub fn search_service(&self, conn_id: i32, filter_uuid: Option<Uuid>) -> BtStatus {
        let filter_uuid_ptr = match filter_uuid {
            None => std::ptr::null(),
            Some(uuid) => &uuid,
        };

        BtStatus::from(ccall!(self, search_service, conn_id, filter_uuid_ptr))
    }

    pub fn btif_gattc_discover_service_by_uuid(&self, conn_id: i32, uuid: &Uuid) {