13fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/****************************************************************************** 23fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 31025687c6679608fe9df918f37011414ffc72b62Hemant Gupta * Copyright (c) 2014 The Android Open Source Project 43fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * Copyright (C) 2003-2012 Broadcom Corporation 53fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 63fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * Licensed under the Apache License, Version 2.0 (the "License"); 73fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * you may not use this file except in compliance with the License. 83fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * You may obtain a copy of the License at: 93fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * http://www.apache.org/licenses/LICENSE-2.0 113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * Unless required by applicable law or agreed to in writing, software 133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * distributed under the License is distributed on an "AS IS" BASIS, 143fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 153fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * See the License for the specific language governing permissions and 163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * limitations under the License. 173fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta ******************************************************************************/ 193fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/****************************************************************************** 213fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 223fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * This file contains the audio gateway functions performing SDP 233fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * operations. 243fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 253fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta ******************************************************************************/ 263fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 273fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#include <string.h> 283fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#include "bta_api.h" 293fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#include "bta_sys.h" 301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bt_utils.h" 311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bta_hf_client_api.h" 321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bta_hf_client_int.h" 333fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 343fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/* Number of protocol elements in protocol element list. */ 351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_NUM_PROTO_ELEMS 2 363fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 373fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/* Number of elements in service class id list. */ 381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTA_HF_CLIENT_NUM_SVC_ELEMS 2 393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 403fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 413fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function bta_hf_client_sdp_cback 433fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 443fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Description SDP callback function. 453fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 463fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 473fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns void 483fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 493fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/ 501025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_sdp_cback(UINT16 status) 513fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tBTA_HF_CLIENT_DISC_RESULT *p_buf; 531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT16 event; 543fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 55e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hf_client_sdp_cback status:0x%x", status); 563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* set event according to int/acp */ 581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.role == BTA_HF_CLIENT_ACP) 593fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta event = BTA_HF_CLIENT_DISC_ACP_RES_EVT; 611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta event = BTA_HF_CLIENT_DISC_INT_RES_EVT; 651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 663fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if ((p_buf = (tBTA_HF_CLIENT_DISC_RESULT *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_DISC_RESULT))) != NULL) 681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta p_buf->hdr.event = event; 701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta p_buf->status = status; 711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_sys_sendmsg(p_buf); 723fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 733fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 743fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 753fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/****************************************************************************** 763fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function bta_hf_client_add_record 783fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 793fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Description This function is called by a server application to add 801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** HFP Client information to an SDP record. Prior to 813fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** calling this function the application must call 823fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** SDP_CreateRecord() to create an SDP record. 833fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 843fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns TRUE if function execution succeeded, 853fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** FALSE if function execution failed. 863fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 873fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta******************************************************************************/ 881025687c6679608fe9df918f37011414ffc72b62Hemant GuptaBOOLEAN bta_hf_client_add_record(char *p_service_name, UINT8 scn, 891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tBTA_HF_CLIENT_FEAT features, UINT32 sdp_handle) 903fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tSDP_PROTOCOL_ELEM proto_elem_list[BTA_HF_CLIENT_NUM_PROTO_ELEMS]; 921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT16 svc_class_id_list[BTA_HF_CLIENT_NUM_SVC_ELEMS]; 933fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta UINT16 browse_list[] = {UUID_SERVCLASS_PUBLIC_BROWSE_GROUP}; 943fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta UINT16 version; 953fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta UINT16 profile_uuid; 963fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta BOOLEAN result = TRUE; 973fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta BOOLEAN codec_supported = FALSE; 983fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta UINT8 buf[2]; 991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT16 sdp_features = 0; 1003fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 101e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hf_client_add_record"); 1023fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta memset( proto_elem_list, 0 , BTA_HF_CLIENT_NUM_PROTO_ELEMS*sizeof(tSDP_PROTOCOL_ELEM)); 1043fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1053fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* add the protocol element sequence */ 1063fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta proto_elem_list[0].protocol_uuid = UUID_PROTOCOL_L2CAP; 1073fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta proto_elem_list[0].num_params = 0; 1083fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta proto_elem_list[1].protocol_uuid = UUID_PROTOCOL_RFCOMM; 1093fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta proto_elem_list[1].num_params = 1; 1103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta proto_elem_list[1].params[0] = scn; 1111025687c6679608fe9df918f37011414ffc72b62Hemant Gupta result &= SDP_AddProtocolList(sdp_handle, BTA_HF_CLIENT_NUM_PROTO_ELEMS, proto_elem_list); 1123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* add service class id list */ 1141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta svc_class_id_list[0] = UUID_SERVCLASS_HF_HANDSFREE; 1153fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta svc_class_id_list[1] = UUID_SERVCLASS_GENERIC_AUDIO; 1161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta result &= SDP_AddServiceClassIdList(sdp_handle, BTA_HF_CLIENT_NUM_SVC_ELEMS, svc_class_id_list); 1173fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* add profile descriptor list */ 1191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta profile_uuid = UUID_SERVCLASS_HF_HANDSFREE; 1201025687c6679608fe9df918f37011414ffc72b62Hemant Gupta version = HFP_VERSION_1_6; 1211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1223fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta result &= SDP_AddProfileDescriptorList(sdp_handle, profile_uuid, version); 1233fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1243fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* add service name */ 1253fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta if (p_service_name != NULL && p_service_name[0] != 0) 1263fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 1273fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE, 1283fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta (UINT32)(strlen(p_service_name)+1), (UINT8 *) p_service_name); 1293fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 1303fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* add features */ 1321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (features & BTA_HF_CLIENT_FEAT_ECNR) 1331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta sdp_features |= BTA_HF_CLIENT_FEAT_ECNR; 1343fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1351025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (features & BTA_HF_CLIENT_FEAT_3WAY) 1361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta sdp_features |= BTA_HF_CLIENT_FEAT_3WAY; 1373fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (features & BTA_HF_CLIENT_FEAT_CLI) 1391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta sdp_features |= BTA_HF_CLIENT_FEAT_CLI; 1403fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (features & BTA_HF_CLIENT_FEAT_VREC) 1421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta sdp_features |= BTA_HF_CLIENT_FEAT_VREC; 1433fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (features & BTA_HF_CLIENT_FEAT_VOL) 1451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta sdp_features |= BTA_HF_CLIENT_FEAT_VOL; 1461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* Codec bit position is different in SDP (bit 5) and in BRSF (bit 7) */ 1481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (features & BTA_HF_CLIENT_FEAT_CODEC) 1491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta sdp_features |= 0x0020; 1501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT16_TO_BE_FIELD(buf, sdp_features); 1521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SUPPORTED_FEATURES, UINT_DESC_TYPE, 2, buf); 1533fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1543fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* add browse group list */ 1553fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta result &= SDP_AddUuidSequence(sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, browse_list); 1563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1573fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta return result; 1583fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 1593fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1603fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 1613fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function bta_hf_client_create_record 1633fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Description Create SDP record for registered service. 1653fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1663fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1673fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns void 1683fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1693fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/ 1701025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_create_record(tBTA_HF_CLIENT_DATA *p_data) 1713fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 1721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* add sdp record if not already registered */ 1731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.sdp_handle == 0) 1743fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 1751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.sdp_handle = SDP_CreateRecord(); 1761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scn = BTM_AllocateSCN(); 1771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_add_record(p_data->api_register.name, 1781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scn, 1791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta p_data->api_register.features, 1801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.sdp_handle); 1811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 1821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_sys_add_uuid(UUID_SERVCLASS_HF_HANDSFREE); 1833fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 1843fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1853fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 1863fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1873fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 1883fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function bta_hf_client_del_record 1903fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Description Delete SDP record for registered service. 1923fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1933fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1943fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns void 1953fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1963fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/ 1971025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_del_record(tBTA_HF_CLIENT_DATA *p_data) 1983fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 1993fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta UNUSED(p_data); 2003fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 201e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hf_client_del_record"); 2023fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.sdp_handle != 0) 2043fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 2051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta SDP_DeleteRecord(bta_hf_client_cb.sdp_handle); 2061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.sdp_handle = 0; 2071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta BTM_FreeSCN(bta_hf_client_cb.scn); 2081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta BTM_SecClrService(BTM_SEC_SERVICE_HF_HANDSFREE); 2091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_sys_remove_uuid(UUID_SERVCLASS_HF_HANDSFREE); 2103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 2113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 2123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 2143fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function bta_hf_client_sdp_find_attr 2163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Description Process SDP discovery results to find requested attribute 2183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2193fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns TRUE if results found, FALSE otherwise. 2213fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2223fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/ 2231025687c6679608fe9df918f37011414ffc72b62Hemant GuptaBOOLEAN bta_hf_client_sdp_find_attr(void) 2243fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 2253fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta tSDP_DISC_REC *p_rec = NULL; 2263fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta tSDP_DISC_ATTR *p_attr; 2273fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta tSDP_PROTOCOL_ELEM pe; 2283fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta BOOLEAN result = FALSE; 2293fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2301025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.peer_version = HFP_VERSION_1_1; /* Default version */ 2313fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2323fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* loop through all records we found */ 2333fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta while (TRUE) 2343fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 2353fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* get next record; if none found, we're done */ 2361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if ((p_rec = SDP_FindServiceInDb(bta_hf_client_cb.scb.p_disc_db, UUID_SERVCLASS_AG_HANDSFREE, p_rec)) == NULL) 2373fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 2381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta break; 2393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 2403fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2413fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* get scn from proto desc list if initiator */ 2421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.role == BTA_HF_CLIENT_INT) 2433fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 2443fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) 2453fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 2461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.peer_scn = (UINT8) pe.params[0]; 2473fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 2483fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta else 2493fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 2503fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta continue; 2513fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 2523fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 2533fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2543fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* get profile version (if failure, version parameter is not updated) */ 2551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_HF_HANDSFREE, &bta_hf_client_cb.scb.peer_version); 2563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* get features */ 2581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES)) != NULL) 2593fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 2601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* Found attribute. Get value. */ 2611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* There might be race condition between SDP and BRSF. */ 2621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* Do not update if we already received BRSF. */ 2631025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.peer_features == 0) 2643fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 2651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.peer_features = p_attr->attr_value.v.u16; 2661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* SDP and BRSF WBS bit are different, correct it if set */ 2681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.peer_features & 0x0020) 2691025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 2701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.peer_features &= ~0x0020; 2711025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.peer_features |= BTA_HF_CLIENT_PEER_CODEC; 2721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 2733fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* get network for ability to reject calls */ 2751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_NETWORK)) != NULL) 2761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 2771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (p_attr->attr_value.v.u16 == 0x01) 2781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 2791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.peer_features |= BTA_HF_CLIENT_PEER_REJECT; 2801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 2811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 2821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 2833fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 2843fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2853fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* found what we needed */ 2863fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta result = TRUE; 2873fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta break; 2883fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 2891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 290e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s peer_version=0x%x peer_features=0x%x", 2911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta __FUNCTION__, bta_hf_client_cb.scb.peer_version, 2921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.peer_features); 2931025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 2943fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta return result; 2953fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 2963fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2973fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 2983fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function bta_hf_client_do_disc 3003fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 3013fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Description Do service discovery. 3023fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 3033fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 3043fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns void 3053fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 3063fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/ 3071025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_do_disc(void) 3083fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 3093fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta tSDP_UUID uuid_list[2]; 3103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta UINT16 num_uuid = 1; 3113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta UINT16 attr_list[4]; 3123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta UINT8 num_attr; 3133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta BOOLEAN db_inited = FALSE; 3143fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* initiator; get proto list and features */ 3161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.role == BTA_HF_CLIENT_INT) 3173fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 3183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST; 3193fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST; 3203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta attr_list[2] = ATTR_ID_BT_PROFILE_DESC_LIST; 3213fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta attr_list[3] = ATTR_ID_SUPPORTED_FEATURES; 3223fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta num_attr = 4; 3231025687c6679608fe9df918f37011414ffc72b62Hemant Gupta uuid_list[0].uu.uuid16 = UUID_SERVCLASS_AG_HANDSFREE; 3243fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 3251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* acceptor; get features */ 3261025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 3273fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 3283fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST; 3293fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta attr_list[1] = ATTR_ID_BT_PROFILE_DESC_LIST; 3303fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta attr_list[2] = ATTR_ID_SUPPORTED_FEATURES; 3313fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta num_attr = 3; 3321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta uuid_list[0].uu.uuid16 = UUID_SERVCLASS_AG_HANDSFREE; 3333fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 3343fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3353fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* allocate buffer for sdp database */ 3361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.p_disc_db = (tSDP_DISCOVERY_DB *) GKI_getbuf(GKI_MAX_BUF_SIZE); 3373fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.p_disc_db) 3393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 3403fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* set up service discovery database; attr happens to be attr_list len */ 3413fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta uuid_list[0].len = LEN_UUID_16; 3423fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta uuid_list[1].len = LEN_UUID_16; 3431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta db_inited = SDP_InitDiscoveryDb(bta_hf_client_cb.scb.p_disc_db, GKI_MAX_BUF_SIZE, num_uuid, 3443fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta uuid_list, num_attr, attr_list); 3453fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 3463fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (db_inited) 3483fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 3493fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /*Service discovery not initiated */ 3501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta db_inited = SDP_ServiceSearchAttributeRequest(bta_hf_client_cb.scb.peer_addr, 3511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.p_disc_db, bta_hf_client_sdp_cback); 3523fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 3533fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (!db_inited) 3553fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 3563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /*free discover db */ 3571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_free_db(NULL); 3583fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* sent failed event */ 3591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_sm_execute(BTA_HF_CLIENT_DISC_FAIL_EVT, NULL); 3603fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 3613fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3623fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 3633fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3643fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 3653fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 3661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function bta_hf_client_free_db 3673fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 3683fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Description Free discovery database. 3693fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 3703fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 3713fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns void 3723fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 3733fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/ 3741025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_free_db(tBTA_HF_CLIENT_DATA *p_data) 3753fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 3763fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta UNUSED(p_data); 3773fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 3781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.p_disc_db != NULL) 3793fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 3801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta GKI_freebuf(bta_hf_client_cb.scb.p_disc_db); 3811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.p_disc_db = NULL; 3823fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 3833fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 384