Loading system/bta/dm/bta_dm_disc.cc +23 −21 Original line number Diff line number Diff line Loading @@ -485,7 +485,10 @@ 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.service_search_cbacks.legacy != nullptr) { bta_dm_search_cb.service_search_cbacks.on_name_read != nullptr) { // Both device and service search callbacks end up sending event to java. // It's enough to send callback to just one of them. if (bta_dm_search_cb.p_device_search_cback != nullptr) { tBTA_DM_SEARCH search_data = { .disc_res = // tBTA_DM_DISC_RES { Loading @@ -495,7 +498,8 @@ static void bta_dm_remote_name_cmpl(const tBTA_DM_MSG* p_data) { .device_type = {}, .num_uuids = 0UL, .p_uuid_list = nullptr, .result = (remote_name_msg.hci_status == HCI_SUCCESS) ? BTA_SUCCESS .result = (remote_name_msg.hci_status == HCI_SUCCESS) ? BTA_SUCCESS : BTA_FAILURE, .hci_status = remote_name_msg.hci_status, }, Loading @@ -503,14 +507,12 @@ static void bta_dm_remote_name_cmpl(const tBTA_DM_MSG* p_data) { if (remote_name_msg.hci_status == HCI_SUCCESS) { bd_name_copy(search_data.disc_res.bd_name, remote_name_msg.bd_name); } // Both device and service search callbacks end up sending event to java. // It's enough to send callback to just one of them. 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.service_search_cbacks.legacy != nullptr) { bta_dm_search_cb.service_search_cbacks.legacy(BTA_DM_NAME_READ_EVT, &search_data); } else if (bta_dm_search_cb.service_search_cbacks.on_name_read != nullptr) { bta_dm_search_cb.service_search_cbacks.on_name_read( remote_name_msg.bd_addr, remote_name_msg.hci_status, remote_name_msg.bd_name); } } else { log::warn("Received remote name complete without callback"); Loading system/bta/include/bta_api.h +4 −0 Original line number Diff line number Diff line Loading @@ -312,10 +312,14 @@ typedef void(tBTA_DM_DID_RES_CBACK)(RawAddress bd_addr, uint8_t vendor_id_src, uint16_t vendor_id, uint16_t product_id, uint16_t version); typedef void(tBTA_DM_NAME_READ_CBACK)(RawAddress bd_addr, tHCI_ERROR_CODE hci_status, const BD_NAME bd_name); struct service_discovery_callbacks { /* legacy callback I'll tear apart and get rid of */ tBTA_DM_SEARCH_CBACK* legacy; tBTA_DM_DID_RES_CBACK* on_did_received; tBTA_DM_NAME_READ_CBACK* on_name_read; }; /* Execute call back */ Loading system/bta/test/bta_disc_test.cc +6 −3 Original line number Diff line number Diff line Loading @@ -238,21 +238,24 @@ TEST_F(BtaInitializedTest, bta_dm_disc_stop_device_discovery) { TEST_F(BtaInitializedTest, bta_dm_disc_start_service_discovery__BT_TRANSPORT_AUTO) { bta_dm_disc_start_service_discovery( {[](tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) {}, nullptr}, {[](tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) {}, nullptr, nullptr}, kRawAddress, BT_TRANSPORT_AUTO); } TEST_F(BtaInitializedTest, bta_dm_disc_start_service_discovery__BT_TRANSPORT_BR_EDR) { bta_dm_disc_start_service_discovery( {[](tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) {}, nullptr}, {[](tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) {}, nullptr, nullptr}, kRawAddress, BT_TRANSPORT_BR_EDR); } TEST_F(BtaInitializedTest, bta_dm_disc_start_service_discovery__BT_TRANSPORT_LE) { bta_dm_disc_start_service_discovery( {[](tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) {}, nullptr}, {[](tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) {}, nullptr, nullptr}, kRawAddress, BT_TRANSPORT_LE); } Loading system/btif/src/btif_dm.cc +44 −38 Original line number Diff line number Diff line Loading @@ -2081,46 +2081,45 @@ static void btif_dm_search_services_evt(tBTA_DM_SEARCH_EVT event, BT_STATUS_SUCCESS, bd_addr, num_properties, prop); } break; case BTA_DM_NAME_READ_EVT: { default: { ASSERTC(0, "unhandled search services event", event); } break; } } void btif_on_name_read(RawAddress bd_addr, tHCI_ERROR_CODE hci_status, const BD_NAME bd_name) { if (IS_FLAG_ENABLED(rnr_present_during_service_discovery)) { const tBTA_DM_DISC_RES& disc_res = p_data->disc_res; if (disc_res.hci_status != HCI_SUCCESS) { if (hci_status != HCI_SUCCESS) { log::warn("Received RNR event with bad status addr:{} hci_status:{}", ADDRESS_TO_LOGGABLE_CSTR(disc_res.bd_addr), hci_error_code_text(disc_res.hci_status)); break; ADDRESS_TO_LOGGABLE_CSTR(bd_addr), hci_error_code_text(hci_status)); return; } if (disc_res.bd_name[0] == '\0') { if (bd_name[0] == '\0') { log::warn("Received RNR event without valid name addr:{}", ADDRESS_TO_LOGGABLE_CSTR(disc_res.bd_addr)); break; ADDRESS_TO_LOGGABLE_CSTR(bd_addr)); return; } bt_property_t properties[] = {{ .type = BT_PROPERTY_BDNAME, .len = (int)strnlen((char*)disc_res.bd_name, BD_NAME_LEN), .val = (void*)disc_res.bd_name, .len = (int)strnlen((char*)bd_name, BD_NAME_LEN), .val = (void*)bd_name, }}; const bt_status_t status = btif_storage_set_remote_device_property( &disc_res.bd_addr, properties); const bt_status_t status = btif_storage_set_remote_device_property(&bd_addr, properties); ASSERT_LOG(status == BT_STATUS_SUCCESS, "Failed to save remote device property status:%s", bt_status_text(status).c_str()); const size_t num_props = sizeof(properties) / sizeof(bt_property_t); GetInterfaceToProfiles()->events->invoke_remote_device_properties_cb( status, disc_res.bd_addr, (int)num_props, properties); log::info( "Callback for read name event addr:{} name:{}", ADDRESS_TO_LOGGABLE_CSTR(disc_res.bd_addr), PRIVATE_NAME(reinterpret_cast<char const*>(disc_res.bd_name))); status, bd_addr, (int)num_props, properties); log::info("Callback for read name event addr:{} name:{}", ADDRESS_TO_LOGGABLE_CSTR(bd_addr), PRIVATE_NAME(reinterpret_cast<char const*>(bd_name))); } else { log::info("Skipping name read event - called on bad callback."); } } break; default: { ASSERTC(0, "unhandled search services event", event); } break; } } void btif_on_did_received(RawAddress bd_addr, uint8_t vendor_id_src, Loading Loading @@ -3143,8 +3142,11 @@ void btif_dm_get_remote_services(RawAddress remote_addr, const int transport) { base::StringPrintf("transport:%s", bt_transport_text(transport).c_str())); BTA_DmDiscover(remote_addr, service_discovery_callbacks{btif_dm_search_services_evt, btif_on_did_received}, service_discovery_callbacks{ btif_dm_search_services_evt, btif_on_did_received, btif_on_name_read, }, transport); } Loading Loading @@ -4281,6 +4283,10 @@ void btif_dm_search_services_evt(tBTA_DM_SEARCH_EVT event, ::btif_dm_search_services_evt(event, p_data); } void btif_on_name_read(RawAddress bd_addr, tHCI_ERROR_CODE hci_status, const BD_NAME bd_name) { ::btif_on_name_read(bd_addr, hci_status, bd_name); } } // namespace testing } // namespace legacy } // namespace bluetooth system/btif/test/btif_dm_test.cc +6 −19 Original line number Diff line number Diff line Loading @@ -54,8 +54,8 @@ void bta_energy_info_cb(tBTM_BLE_TX_TIME_MS tx_time, tBTM_BLE_ENERGY_USED energy_used, tBTM_CONTRL_STATE ctrl_state, tBTA_STATUS status); void btif_dm_search_services_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data); void btif_on_name_read(RawAddress bd_addr, tHCI_ERROR_CODE hci_status, const BD_NAME bd_name); } // namespace testing } // namespace legacy Loading Loading @@ -174,24 +174,11 @@ TEST_F_WITH_FLAGS(BtifDmWithStackTest, }; }; tBTA_DM_SEARCH data = { .disc_res = { // tBTA_DM_DISC_RES .bd_addr = kRawAddress, .bd_name = {}, .services = 0, .device_type = BT_DEVICE_TYPE_UNKNOWN, .num_uuids = 0, .p_uuid_list = nullptr, .result = BTA_SUCCESS, .hci_status = HCI_SUCCESS, }, }; bd_name_from_char_pointer(data.disc_res.bd_name, kBdName); BD_NAME bd_name; bd_name_from_char_pointer(bd_name, kBdName); bluetooth::legacy::testing::btif_dm_search_services_evt(BTA_DM_NAME_READ_EVT, &data); bluetooth::legacy::testing::btif_on_name_read(kRawAddress, HCI_SUCCESS, bd_name); ASSERT_EQ(BT_STATUS_SUCCESS, invoke_remote_device_properties_cb.status); ASSERT_EQ(kRawAddress, invoke_remote_device_properties_cb.bd_addr); Loading Loading
system/bta/dm/bta_dm_disc.cc +23 −21 Original line number Diff line number Diff line Loading @@ -485,7 +485,10 @@ 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.service_search_cbacks.legacy != nullptr) { bta_dm_search_cb.service_search_cbacks.on_name_read != nullptr) { // Both device and service search callbacks end up sending event to java. // It's enough to send callback to just one of them. if (bta_dm_search_cb.p_device_search_cback != nullptr) { tBTA_DM_SEARCH search_data = { .disc_res = // tBTA_DM_DISC_RES { Loading @@ -495,7 +498,8 @@ static void bta_dm_remote_name_cmpl(const tBTA_DM_MSG* p_data) { .device_type = {}, .num_uuids = 0UL, .p_uuid_list = nullptr, .result = (remote_name_msg.hci_status == HCI_SUCCESS) ? BTA_SUCCESS .result = (remote_name_msg.hci_status == HCI_SUCCESS) ? BTA_SUCCESS : BTA_FAILURE, .hci_status = remote_name_msg.hci_status, }, Loading @@ -503,14 +507,12 @@ static void bta_dm_remote_name_cmpl(const tBTA_DM_MSG* p_data) { if (remote_name_msg.hci_status == HCI_SUCCESS) { bd_name_copy(search_data.disc_res.bd_name, remote_name_msg.bd_name); } // Both device and service search callbacks end up sending event to java. // It's enough to send callback to just one of them. 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.service_search_cbacks.legacy != nullptr) { bta_dm_search_cb.service_search_cbacks.legacy(BTA_DM_NAME_READ_EVT, &search_data); } else if (bta_dm_search_cb.service_search_cbacks.on_name_read != nullptr) { bta_dm_search_cb.service_search_cbacks.on_name_read( remote_name_msg.bd_addr, remote_name_msg.hci_status, remote_name_msg.bd_name); } } else { log::warn("Received remote name complete without callback"); Loading
system/bta/include/bta_api.h +4 −0 Original line number Diff line number Diff line Loading @@ -312,10 +312,14 @@ typedef void(tBTA_DM_DID_RES_CBACK)(RawAddress bd_addr, uint8_t vendor_id_src, uint16_t vendor_id, uint16_t product_id, uint16_t version); typedef void(tBTA_DM_NAME_READ_CBACK)(RawAddress bd_addr, tHCI_ERROR_CODE hci_status, const BD_NAME bd_name); struct service_discovery_callbacks { /* legacy callback I'll tear apart and get rid of */ tBTA_DM_SEARCH_CBACK* legacy; tBTA_DM_DID_RES_CBACK* on_did_received; tBTA_DM_NAME_READ_CBACK* on_name_read; }; /* Execute call back */ Loading
system/bta/test/bta_disc_test.cc +6 −3 Original line number Diff line number Diff line Loading @@ -238,21 +238,24 @@ TEST_F(BtaInitializedTest, bta_dm_disc_stop_device_discovery) { TEST_F(BtaInitializedTest, bta_dm_disc_start_service_discovery__BT_TRANSPORT_AUTO) { bta_dm_disc_start_service_discovery( {[](tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) {}, nullptr}, {[](tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) {}, nullptr, nullptr}, kRawAddress, BT_TRANSPORT_AUTO); } TEST_F(BtaInitializedTest, bta_dm_disc_start_service_discovery__BT_TRANSPORT_BR_EDR) { bta_dm_disc_start_service_discovery( {[](tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) {}, nullptr}, {[](tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) {}, nullptr, nullptr}, kRawAddress, BT_TRANSPORT_BR_EDR); } TEST_F(BtaInitializedTest, bta_dm_disc_start_service_discovery__BT_TRANSPORT_LE) { bta_dm_disc_start_service_discovery( {[](tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) {}, nullptr}, {[](tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) {}, nullptr, nullptr}, kRawAddress, BT_TRANSPORT_LE); } Loading
system/btif/src/btif_dm.cc +44 −38 Original line number Diff line number Diff line Loading @@ -2081,46 +2081,45 @@ static void btif_dm_search_services_evt(tBTA_DM_SEARCH_EVT event, BT_STATUS_SUCCESS, bd_addr, num_properties, prop); } break; case BTA_DM_NAME_READ_EVT: { default: { ASSERTC(0, "unhandled search services event", event); } break; } } void btif_on_name_read(RawAddress bd_addr, tHCI_ERROR_CODE hci_status, const BD_NAME bd_name) { if (IS_FLAG_ENABLED(rnr_present_during_service_discovery)) { const tBTA_DM_DISC_RES& disc_res = p_data->disc_res; if (disc_res.hci_status != HCI_SUCCESS) { if (hci_status != HCI_SUCCESS) { log::warn("Received RNR event with bad status addr:{} hci_status:{}", ADDRESS_TO_LOGGABLE_CSTR(disc_res.bd_addr), hci_error_code_text(disc_res.hci_status)); break; ADDRESS_TO_LOGGABLE_CSTR(bd_addr), hci_error_code_text(hci_status)); return; } if (disc_res.bd_name[0] == '\0') { if (bd_name[0] == '\0') { log::warn("Received RNR event without valid name addr:{}", ADDRESS_TO_LOGGABLE_CSTR(disc_res.bd_addr)); break; ADDRESS_TO_LOGGABLE_CSTR(bd_addr)); return; } bt_property_t properties[] = {{ .type = BT_PROPERTY_BDNAME, .len = (int)strnlen((char*)disc_res.bd_name, BD_NAME_LEN), .val = (void*)disc_res.bd_name, .len = (int)strnlen((char*)bd_name, BD_NAME_LEN), .val = (void*)bd_name, }}; const bt_status_t status = btif_storage_set_remote_device_property( &disc_res.bd_addr, properties); const bt_status_t status = btif_storage_set_remote_device_property(&bd_addr, properties); ASSERT_LOG(status == BT_STATUS_SUCCESS, "Failed to save remote device property status:%s", bt_status_text(status).c_str()); const size_t num_props = sizeof(properties) / sizeof(bt_property_t); GetInterfaceToProfiles()->events->invoke_remote_device_properties_cb( status, disc_res.bd_addr, (int)num_props, properties); log::info( "Callback for read name event addr:{} name:{}", ADDRESS_TO_LOGGABLE_CSTR(disc_res.bd_addr), PRIVATE_NAME(reinterpret_cast<char const*>(disc_res.bd_name))); status, bd_addr, (int)num_props, properties); log::info("Callback for read name event addr:{} name:{}", ADDRESS_TO_LOGGABLE_CSTR(bd_addr), PRIVATE_NAME(reinterpret_cast<char const*>(bd_name))); } else { log::info("Skipping name read event - called on bad callback."); } } break; default: { ASSERTC(0, "unhandled search services event", event); } break; } } void btif_on_did_received(RawAddress bd_addr, uint8_t vendor_id_src, Loading Loading @@ -3143,8 +3142,11 @@ void btif_dm_get_remote_services(RawAddress remote_addr, const int transport) { base::StringPrintf("transport:%s", bt_transport_text(transport).c_str())); BTA_DmDiscover(remote_addr, service_discovery_callbacks{btif_dm_search_services_evt, btif_on_did_received}, service_discovery_callbacks{ btif_dm_search_services_evt, btif_on_did_received, btif_on_name_read, }, transport); } Loading Loading @@ -4281,6 +4283,10 @@ void btif_dm_search_services_evt(tBTA_DM_SEARCH_EVT event, ::btif_dm_search_services_evt(event, p_data); } void btif_on_name_read(RawAddress bd_addr, tHCI_ERROR_CODE hci_status, const BD_NAME bd_name) { ::btif_on_name_read(bd_addr, hci_status, bd_name); } } // namespace testing } // namespace legacy } // namespace bluetooth
system/btif/test/btif_dm_test.cc +6 −19 Original line number Diff line number Diff line Loading @@ -54,8 +54,8 @@ void bta_energy_info_cb(tBTM_BLE_TX_TIME_MS tx_time, tBTM_BLE_ENERGY_USED energy_used, tBTM_CONTRL_STATE ctrl_state, tBTA_STATUS status); void btif_dm_search_services_evt(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data); void btif_on_name_read(RawAddress bd_addr, tHCI_ERROR_CODE hci_status, const BD_NAME bd_name); } // namespace testing } // namespace legacy Loading Loading @@ -174,24 +174,11 @@ TEST_F_WITH_FLAGS(BtifDmWithStackTest, }; }; tBTA_DM_SEARCH data = { .disc_res = { // tBTA_DM_DISC_RES .bd_addr = kRawAddress, .bd_name = {}, .services = 0, .device_type = BT_DEVICE_TYPE_UNKNOWN, .num_uuids = 0, .p_uuid_list = nullptr, .result = BTA_SUCCESS, .hci_status = HCI_SUCCESS, }, }; bd_name_from_char_pointer(data.disc_res.bd_name, kBdName); BD_NAME bd_name; bd_name_from_char_pointer(bd_name, kBdName); bluetooth::legacy::testing::btif_dm_search_services_evt(BTA_DM_NAME_READ_EVT, &data); bluetooth::legacy::testing::btif_on_name_read(kRawAddress, HCI_SUCCESS, bd_name); ASSERT_EQ(BT_STATUS_SUCCESS, invoke_remote_device_properties_cb.status); ASSERT_EQ(kRawAddress, invoke_remote_device_properties_cb.bd_addr); Loading