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

Commit cb342d7d authored by Jakub Pawlowski's avatar Jakub Pawlowski
Browse files

BTA: turn service discovery events into callbacks

Instead of single callback, that handles multiple, mostly unrelated
events, we should have callbacks for each event.

This would reduce mental complexity of following this code - instead of
finding event, associated struct, invoker and callback, one would have
to just do single search.

Bug: 330675788
Flag: exempt, no logic changes, hard to isolate architecture refactor
Test: mma -j32
Change-Id: I055358d95278b2e2522b403607d9bbde96bbc695
parent 2d8674ee
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -111,9 +111,10 @@ void BTA_DmSearchCancel(void) { bta_dm_disc_stop_device_discovery(); }
 * Returns          void
 *
 ******************************************************************************/
void BTA_DmDiscover(const RawAddress& bd_addr, tBTA_DM_SEARCH_CBACK* p_cback,
void BTA_DmDiscover(const RawAddress& bd_addr,
                    service_discovery_callbacks cbacks,
                    tBT_TRANSPORT transport) {
  bta_dm_disc_start_service_discovery(p_cback, bd_addr, transport);
  bta_dm_disc_start_service_discovery(cbacks, bd_addr, transport);
}

/*******************************************************************************
+20 −19
Original line number Diff line number Diff line
@@ -341,7 +341,7 @@ static void bta_dm_discover(tBTA_DM_MSG* p_data) {

  bta_dm_gattc_register();

  bta_dm_search_cb.p_service_search_cback = p_data->discover.p_cback;
  bta_dm_search_cb.service_search_cbacks = p_data->discover.cbacks;
  bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
  bta_dm_search_cb.service_index = 0;
  bta_dm_search_cb.services_found = 0;
@@ -485,7 +485,7 @@ static void bta_dm_remote_name_cmpl(const tBTA_DM_MSG* p_data) {

  // Callback with this property
  if (bta_dm_search_cb.p_device_search_cback != nullptr ||
      bta_dm_search_cb.p_service_search_cback != nullptr) {
      bta_dm_search_cb.service_search_cbacks.legacy != nullptr) {
    tBTA_DM_SEARCH search_data = {
        .disc_res =  // tBTA_DM_DISC_RES
        {
@@ -508,8 +508,8 @@ static void bta_dm_remote_name_cmpl(const tBTA_DM_MSG* p_data) {
    if (bta_dm_search_cb.p_device_search_cback != nullptr) {
      bta_dm_search_cb.p_device_search_cback(BTA_DM_NAME_READ_EVT,
                                             &search_data);
    } else if (bta_dm_search_cb.p_service_search_cback != nullptr) {
      bta_dm_search_cb.p_service_search_cback(BTA_DM_NAME_READ_EVT,
    } else if (bta_dm_search_cb.service_search_cbacks.legacy != nullptr) {
      bta_dm_search_cb.service_search_cbacks.legacy(BTA_DM_NAME_READ_EVT,
                                                    &search_data);
    }
  } else {
@@ -668,8 +668,8 @@ static void bta_dm_sdp_result(tBTA_DM_MSG* p_data) {
                                    bta_dm_get_remname());

          result.disc_ble_res.services = &gatt_uuids;
          bta_dm_search_cb.p_service_search_cback(BTA_DM_GATT_OVER_SDP_RES_EVT,
                                                  &result);
          bta_dm_search_cb.service_search_cbacks.legacy(
              BTA_DM_GATT_OVER_SDP_RES_EVT, &result);
        }
      } else {
        /* SDP_DB_FULL means some records with the
@@ -735,7 +735,8 @@ static void bta_dm_sdp_result(tBTA_DM_MSG* p_data) {
      result.did_res.vendor_id = di_record.rec.vendor;
      result.did_res.product_id = di_record.rec.product;
      result.did_res.version = di_record.rec.version;
      bta_dm_search_cb.p_service_search_cback(BTA_DM_DID_RES_EVT, &result);
      bta_dm_search_cb.service_search_cbacks.legacy(BTA_DM_DID_RES_EVT,
                                                    &result);
    }
#endif

@@ -847,7 +848,7 @@ static void bta_dm_read_dis_cmpl(const RawAddress& addr,
    result.did_res.vendor_id = p_dis_value->pnp_id.vendor_id;
    result.did_res.product_id = p_dis_value->pnp_id.product_id;
    result.did_res.version = p_dis_value->pnp_id.product_version;
    bta_dm_search_cb.p_service_search_cback(BTA_DM_DID_RES_EVT, &result);
    bta_dm_search_cb.service_search_cbacks.legacy(BTA_DM_DID_RES_EVT, &result);
  }

  bta_dm_execute_queued_request();
@@ -913,9 +914,9 @@ static void bta_dm_search_cmpl() {

  // send all result back to app
  if (send_gatt_results) {
    if (bta_dm_search_cb.p_service_search_cback) {
    if (bta_dm_search_cb.service_search_cbacks.legacy) {
      log::info("Sending GATT results to upper layer");
      bta_dm_search_cb.p_service_search_cback(BTA_DM_GATT_OVER_LE_RES_EVT,
      bta_dm_search_cb.service_search_cbacks.legacy(BTA_DM_GATT_OVER_LE_RES_EVT,
                                                    &result);
    }
  }
@@ -958,7 +959,7 @@ static void bta_dm_disc_result(tBTA_DM_MSG* p_data) {
  if (!is_gatt_over_ble && (bta_dm_search_cb.services &
                            ((BTA_ALL_SERVICE_MASK | BTA_USER_SERVICE_MASK) &
                             ~BTA_BLE_SERVICE_MASK)))
    bta_dm_search_cb.p_service_search_cback(BTA_DM_DISC_RES_EVT,
    bta_dm_search_cb.service_search_cbacks.legacy(BTA_DM_DISC_RES_EVT,
                                                  &p_data->disc_result.result);

  get_gatt_interface().BTA_GATTC_CancelOpen(0, bta_dm_search_cb.peer_bdaddr,
@@ -985,9 +986,9 @@ static void bta_dm_search_result(tBTA_DM_MSG* p_data) {
  if ((!bta_dm_search_cb.services) ||
      ((bta_dm_search_cb.services) &&
       (p_data->disc_result.result.disc_res.services))) {
    if (bta_dm_search_cb.p_service_search_cback) {
      bta_dm_search_cb.p_service_search_cback(BTA_DM_DISC_RES_EVT,
                                              &p_data->disc_result.result);
    if (bta_dm_search_cb.service_search_cbacks.legacy) {
      bta_dm_search_cb.service_search_cbacks.legacy(
          BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
    } else {
      log::warn("Received search result without valid callback");
    }
@@ -2400,7 +2401,7 @@ void bta_dm_disc_stop_device_discovery() {
  bta_sys_sendmsg(p_msg);
}

void bta_dm_disc_start_service_discovery(tBTA_DM_SEARCH_CBACK* p_cback,
void bta_dm_disc_start_service_discovery(service_discovery_callbacks cbacks,
                                         const RawAddress& bd_addr,
                                         tBT_TRANSPORT transport) {
  tBTA_DM_API_DISCOVER* p_msg =
@@ -2409,7 +2410,7 @@ void bta_dm_disc_start_service_discovery(tBTA_DM_SEARCH_CBACK* p_cback,
  p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
  p_msg->bd_addr = bd_addr;
  p_msg->transport = transport;
  p_msg->p_cback = p_cback;
  p_msg->cbacks = cbacks;

  bta_sys_sendmsg(p_msg);
}
+1 −1
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ void bta_dm_disc_start_device_discovery(tBTA_DM_SEARCH_CBACK*);
void bta_dm_disc_stop_device_discovery();

// Bta service discovery start and stop entry points
void bta_dm_disc_start_service_discovery(tBTA_DM_SEARCH_CBACK*,
void bta_dm_disc_start_service_discovery(service_discovery_callbacks cbacks,
                                         const RawAddress& bd_addr,
                                         tBT_TRANSPORT transport);
void bta_dm_disc_stop_service_discovery(const RawAddress& bd_addr,
+2 −2
Original line number Diff line number Diff line
@@ -74,7 +74,7 @@ typedef struct {
typedef struct {
  BT_HDR_RIGID hdr;
  RawAddress bd_addr;
  tBTA_DM_SEARCH_CBACK* p_cback;
  service_discovery_callbacks cbacks;
  tBT_TRANSPORT transport;
} tBTA_DM_API_DISCOVER;

@@ -155,7 +155,7 @@ inline std::string bta_dm_state_text(const tBTA_DM_STATE& state) {
/* DM search control block */
typedef struct {
  tBTA_DM_SEARCH_CBACK* p_device_search_cback;
  tBTA_DM_SEARCH_CBACK* p_service_search_cback;
  service_discovery_callbacks service_search_cbacks;
  tBTM_INQ_INFO* p_btm_inq_info;
  tBTA_SERVICE_MASK services;
  tBTA_SERVICE_MASK services_to_search;
+6 −2
Original line number Diff line number Diff line
@@ -319,6 +319,10 @@ typedef union {
/* Search callback */
typedef void(tBTA_DM_SEARCH_CBACK)(tBTA_DM_SEARCH_EVT event,
                                   tBTA_DM_SEARCH* p_data);
struct service_discovery_callbacks {
  /* legacy callback I'll tear apart and get rid of */
  tBTA_DM_SEARCH_CBACK* legacy;
};

/* Execute call back */
typedef void(tBTA_DM_EXEC_CBACK)(void* p_param);
@@ -580,8 +584,8 @@ void BTA_DmSearchCancel(void);
 * Returns          void
 *
 ******************************************************************************/
void BTA_DmDiscover(const RawAddress& bd_addr, tBTA_DM_SEARCH_CBACK* p_cback,
                    tBT_TRANSPORT transport);
void BTA_DmDiscover(const RawAddress& bd_addr,
                    service_discovery_callbacks cback, tBT_TRANSPORT transport);

/*******************************************************************************
 *
Loading