/******************************************************************************* ** ** Function bta_hf_client_do_disc ** ** Description Do service discovery. ** ** ** Returns void ** *******************************************************************************/ void bta_hf_client_do_disc(void) { tSDP_UUID uuid_list[2]; UINT16 num_uuid = 1; UINT16 attr_list[4]; UINT8 num_attr; BOOLEAN db_inited = FALSE; /* initiator; get proto list and features */ if (bta_hf_client_cb.scb.role == BTA_HF_CLIENT_INT) { attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST; attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST; attr_list[2] = ATTR_ID_BT_PROFILE_DESC_LIST; attr_list[3] = ATTR_ID_SUPPORTED_FEATURES; num_attr = 4; uuid_list[0].uu.uuid16 = UUID_SERVCLASS_AG_HANDSFREE; } /* acceptor; get features */ else { attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST; attr_list[1] = ATTR_ID_BT_PROFILE_DESC_LIST; attr_list[2] = ATTR_ID_SUPPORTED_FEATURES; num_attr = 3; uuid_list[0].uu.uuid16 = UUID_SERVCLASS_AG_HANDSFREE; } /* allocate buffer for sdp database */ bta_hf_client_cb.scb.p_disc_db = (tSDP_DISCOVERY_DB *) osi_malloc(BT_DEFAULT_BUFFER_SIZE); if (bta_hf_client_cb.scb.p_disc_db) { /* set up service discovery database; attr happens to be attr_list len */ uuid_list[0].len = LEN_UUID_16; uuid_list[1].len = LEN_UUID_16; db_inited = SDP_InitDiscoveryDb(bta_hf_client_cb.scb.p_disc_db, BT_DEFAULT_BUFFER_SIZE, num_uuid, uuid_list, num_attr, attr_list); } if (db_inited) { /*Service discovery not initiated */ db_inited = SDP_ServiceSearchAttributeRequest(bta_hf_client_cb.scb.peer_addr, bta_hf_client_cb.scb.p_disc_db, bta_hf_client_sdp_cback); } if (!db_inited) { /*free discover db */ bta_hf_client_free_db(NULL); /* sent failed event */ bta_hf_client_sm_execute(BTA_HF_CLIENT_DISC_FAIL_EVT, NULL); } }
/****************************************************************************** ** ** Function AVRC_FindService ** ** Description This function is called by the application to perform service ** discovery and retrieve AVRCP SDP record information from a ** peer device. Information is returned for the first service ** record found on the server that matches the service UUID. ** The callback function will be executed when service discovery ** is complete. There can only be one outstanding call to ** AVRC_FindService() at a time; the application must wait for ** the callback before it makes another call to the function. ** The application is responsible for allocating memory for the ** discovery database. It is recommended that the size of the ** discovery database be at least 300 bytes. The application ** can deallocate the memory after the callback function has ** executed. ** ** Input Parameters: ** service_uuid: Indicates TG(UUID_SERVCLASS_AV_REM_CTRL_TARGET) ** or CT(UUID_SERVCLASS_AV_REMOTE_CONTROL) ** ** bd_addr: BD address of the peer device. ** ** p_db: SDP discovery database parameters. ** ** p_cback: Pointer to the callback function. ** ** Output Parameters: ** None. ** ** Returns AVRC_SUCCESS if successful. ** AVRC_BAD_PARAMS if discovery database parameters are invalid. ** AVRC_NO_RESOURCES if there are not enough resources to ** perform the service search. ** ******************************************************************************/ UINT16 AVRC_FindService(UINT16 service_uuid, BD_ADDR bd_addr, tAVRC_SDP_DB_PARAMS *p_db, tAVRC_FIND_CBACK *p_cback) { tSDP_UUID uuid_list; BOOLEAN result = TRUE; UINT16 a2d_attr_list[] = {ATTR_ID_SERVICE_CLASS_ID_LIST, /* update AVRC_NUM_ATTR, if changed */ ATTR_ID_PROTOCOL_DESC_LIST, ATTR_ID_BT_PROFILE_DESC_LIST, ATTR_ID_SERVICE_NAME, ATTR_ID_SUPPORTED_FEATURES, ATTR_ID_PROVIDER_NAME }; AVRC_TRACE_API1("AVRC_FindService uuid: %x", service_uuid); if( (service_uuid != UUID_SERVCLASS_AV_REM_CTRL_TARGET && service_uuid != UUID_SERVCLASS_AV_REMOTE_CONTROL) || p_db == NULL || p_db->p_db == NULL || p_cback == NULL) return AVRC_BAD_PARAM; /* check if it is busy */ if( avrc_cb.service_uuid == UUID_SERVCLASS_AV_REM_CTRL_TARGET || avrc_cb.service_uuid == UUID_SERVCLASS_AV_REMOTE_CONTROL) return AVRC_NO_RESOURCES; /* set up discovery database */ uuid_list.len = LEN_UUID_16; uuid_list.uu.uuid16 = service_uuid; if(p_db->p_attrs == NULL || p_db->num_attr == 0) { p_db->p_attrs = a2d_attr_list; p_db->num_attr = AVRC_NUM_ATTR; } result = SDP_InitDiscoveryDb(p_db->p_db, p_db->db_len, 1, &uuid_list, p_db->num_attr, p_db->p_attrs); if (result == TRUE) { /* store service_uuid and discovery db pointer */ avrc_cb.p_db = p_db->p_db; avrc_cb.service_uuid = service_uuid; avrc_cb.p_cback = p_cback; /* perform service search */ result = SDP_ServiceSearchAttributeRequest(bd_addr, p_db->p_db, avrc_sdp_cback); } return (result ? AVRC_SUCCESS : AVRC_FAIL); }
/******************************************************************************* ** ** Function bta_mce_get_remote_mas_instances ** ** Description Discovers MAS instances on remote device ** ** Returns void ** *******************************************************************************/ void bta_mce_get_remote_mas_instances(tBTA_MCE_MSG *p_data) { if(p_data == NULL) { APPL_TRACE_DEBUG0("MCE control block handle is null"); return; } tBTA_MCE_STATUS status = BTA_MCE_FAILURE; APPL_TRACE_DEBUG2("%s in, sdp_active:%d", __FUNCTION__, bta_mce_cb.sdp_active); if (bta_mce_cb.sdp_active != BTA_MCE_SDP_ACT_NONE) { /* SDP is still in progress */ status = BTA_MCE_BUSY; if(bta_mce_cb.p_dm_cback) bta_mce_cb.p_dm_cback(BTA_MCE_MAS_DISCOVERY_COMP_EVT, (tBTA_MCE *)&status, NULL); return; } bta_mce_cb.sdp_active = BTA_MCE_SDP_ACT_YES; bdcpy(bta_mce_cb.remote_addr, p_data->get_rmt_mas.bd_addr); SDP_InitDiscoveryDb (p_bta_mce_cfg->p_sdp_db, p_bta_mce_cfg->sdp_db_size, 1, (tBT_UUID*) &bta_mce_mas_uuid, 0, NULL); if (!SDP_ServiceSearchAttributeRequest2(p_data->get_rmt_mas.bd_addr, p_bta_mce_cfg->p_sdp_db, bta_mce_search_cback, NULL)) { bta_mce_cb.sdp_active = BTA_MCE_SDP_ACT_NONE; /* failed to start SDP. report the failure right away */ if (bta_mce_cb.p_dm_cback) bta_mce_cb.p_dm_cback(BTA_MCE_MAS_DISCOVERY_COMP_EVT, (tBTA_MCE *)&status, NULL); } /* else report the result when the cback is called */ }
/******************************************************************************* ** ** Function HID_HostGetSDPRecord ** ** Description This function reads the device SDP record ** ** Returns tHID_STATUS ** *******************************************************************************/ tHID_STATUS HID_HostGetSDPRecord ( BD_ADDR addr, tSDP_DISCOVERY_DB *p_db, UINT32 db_len, tHID_HOST_SDP_CALLBACK *sdp_cback ) { tSDP_UUID uuid_list; if( hh_cb.sdp_busy ) return HID_ERR_SDP_BUSY; uuid_list.len = 2; uuid_list.uu.uuid16 = UUID_SERVCLASS_HUMAN_INTERFACE; hh_cb.p_sdp_db = p_db; SDP_InitDiscoveryDb (p_db, db_len, 1, &uuid_list, 0, NULL); if (SDP_ServiceSearchRequest (addr, p_db, hidh_search_callback)) { hh_cb.sdp_cback = sdp_cback ; hh_cb.sdp_busy = TRUE; return HID_SUCCESS; } else return HID_ERR_NO_RESOURCES; }
/******************************************************************************* ** ** Function bta_ag_do_disc ** ** Description Do service discovery. ** ** ** Returns void ** *******************************************************************************/ void bta_ag_do_disc(tBTA_AG_SCB *p_scb, tBTA_SERVICE_MASK service) { tSDP_UUID uuid_list[2]; UINT16 num_uuid = 1; UINT16 attr_list[4]; UINT8 num_attr; BOOLEAN db_inited = FALSE; /* HFP initiator; get proto list and features */ if (service & BTA_HFP_SERVICE_MASK && p_scb->role == BTA_AG_INT) { attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST; attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST; attr_list[2] = ATTR_ID_BT_PROFILE_DESC_LIST; attr_list[3] = ATTR_ID_SUPPORTED_FEATURES; num_attr = 4; uuid_list[0].uu.uuid16 = UUID_SERVCLASS_HF_HANDSFREE; } /* HFP acceptor; get features */ else if (service & BTA_HFP_SERVICE_MASK && p_scb->role == BTA_AG_ACP) { attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST; attr_list[1] = ATTR_ID_BT_PROFILE_DESC_LIST; attr_list[2] = ATTR_ID_SUPPORTED_FEATURES; num_attr = 3; uuid_list[0].uu.uuid16 = UUID_SERVCLASS_HF_HANDSFREE; } /* HSP initiator; get proto list */ else if (service & BTA_HSP_SERVICE_MASK && p_scb->role == BTA_AG_INT) { attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST; attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST; attr_list[2] = ATTR_ID_BT_PROFILE_DESC_LIST; attr_list[3] = ATTR_ID_REMOTE_AUDIO_VOLUME_CONTROL; num_attr = 4; uuid_list[0].uu.uuid16 = UUID_SERVCLASS_HEADSET; /* Legacy from HSP v1.0 */ if (p_scb->hsp_version >= HSP_VERSION_1_2) { uuid_list[1].uu.uuid16 = UUID_SERVCLASS_HEADSET_HS; num_uuid = 2; } } /* HSP acceptor; no discovery */ else { return; } /* allocate buffer for sdp database */ p_scb->p_disc_db = (tSDP_DISCOVERY_DB *) GKI_getbuf(BTA_AG_DISC_BUF_SIZE); if(p_scb->p_disc_db) { /* set up service discovery database; attr happens to be attr_list len */ uuid_list[0].len = LEN_UUID_16; uuid_list[1].len = LEN_UUID_16; db_inited = SDP_InitDiscoveryDb(p_scb->p_disc_db, BTA_AG_DISC_BUF_SIZE, num_uuid, uuid_list, num_attr, attr_list); } if(db_inited) { /*Service discovery not initiated */ db_inited = SDP_ServiceSearchAttributeRequest(p_scb->peer_addr, p_scb->p_disc_db, bta_ag_sdp_cback_tbl[bta_ag_scb_to_idx(p_scb) - 1]); } if(!db_inited) { /*free discover db */ bta_ag_free_db(p_scb, NULL); /* sent failed event */ bta_ag_sm_execute(p_scb, BTA_AG_DISC_FAIL_EVT, NULL); } }