15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2003-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains the audio gateway functions performing SDP 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * operations. 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_api.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_int.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdp_api.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 33258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 345cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "utl.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Number of protocol elements in protocol element list. */ 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_NUM_PROTO_ELEMS 2 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Number of elements in service class id list. */ 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_NUM_SVC_ELEMS 2 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* size of database for service discovery */ 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTA_AG_DISC_BUF_SIZE 44258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#define BTA_AG_DISC_BUF_SIZE BT_DEFAULT_BUFFER_SIZE 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* declare sdp callback functions */ 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sdp_cback_1(UINT16 status); 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sdp_cback_2(UINT16 status); 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sdp_cback_3(UINT16 status); 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* SDP callback function table */ 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef tSDP_DISC_CMPL_CB *tBTA_AG_SDP_CBACK; 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_SDP_CBACK bta_ag_sdp_cback_tbl[] = 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sdp_cback_1, 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sdp_cback_2, 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sdp_cback_3 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sdp_cback 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description SDP callback function. 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_sdp_cback(UINT16 status, UINT8 idx) 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 event; 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *p_scb; 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 76e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_sdp_cback status:0x%x", status); 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb = bta_ag_scb_by_idx(idx)) != NULL) 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set event according to int/acp */ 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->role == BTA_AG_ACP) 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = BTA_AG_DISC_ACP_RES_EVT; 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = BTA_AG_DISC_INT_RES_EVT; 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 905fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov tBTA_AG_DISC_RESULT *p_buf = 915fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov (tBTA_AG_DISC_RESULT *)osi_malloc(sizeof(tBTA_AG_DISC_RESULT)); 925fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_buf->hdr.event = event; 935fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_buf->hdr.layer_specific = idx; 945fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_buf->status = status; 955fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov bta_sys_sendmsg(p_buf); 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sdp_cback_1 to 3 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description SDP callback functions. Since there is no way to 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** distinguish scb from the callback we need separate 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** callbacks for each scb. 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sdp_cback_1(UINT16 status) {bta_ag_sdp_cback(status, 1);} 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sdp_cback_2(UINT16 status) {bta_ag_sdp_cback(status, 2);} 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sdp_cback_3(UINT16 status) {bta_ag_sdp_cback(status, 3);} 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_add_record 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by a server application to add 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HSP or HFP information to an SDP record. Prior to 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** calling this function the application must call 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SDP_CreateRecord() to create an SDP record. 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if function execution succeeded, 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** FALSE if function execution failed. 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_ag_add_record(UINT16 service_uuid, char *p_service_name, UINT8 scn, 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_FEAT features, UINT32 sdp_handle) 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_PROTOCOL_ELEM proto_elem_list[BTA_AG_NUM_PROTO_ELEMS]; 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 svc_class_id_list[BTA_AG_NUM_SVC_ELEMS]; 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 browse_list[] = {UUID_SERVCLASS_PUBLIC_BROWSE_GROUP}; 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 version; 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 profile_uuid; 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 network; 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN result = TRUE; 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN codec_supported = FALSE; 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 buf[2]; 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 141e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_add_record uuid: %x", service_uuid); 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset( proto_elem_list, 0 , BTA_AG_NUM_PROTO_ELEMS*sizeof(tSDP_PROTOCOL_ELEM)); 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add the protocol element sequence */ 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[0].protocol_uuid = UUID_PROTOCOL_L2CAP; 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[0].num_params = 0; 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[1].protocol_uuid = UUID_PROTOCOL_RFCOMM; 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[1].num_params = 1; 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[1].params[0] = scn; 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddProtocolList(sdp_handle, BTA_AG_NUM_PROTO_ELEMS, proto_elem_list); 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add service class id list */ 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project svc_class_id_list[0] = service_uuid; 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project svc_class_id_list[1] = UUID_SERVCLASS_GENERIC_AUDIO; 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddServiceClassIdList(sdp_handle, BTA_AG_NUM_SVC_ELEMS, svc_class_id_list); 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add profile descriptor list */ 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (service_uuid == UUID_SERVCLASS_AG_HANDSFREE) 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project profile_uuid = UUID_SERVCLASS_HF_HANDSFREE; 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project version = HFP_VERSION_1_6; 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project profile_uuid = UUID_SERVCLASS_HEADSET; 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project version = HSP_VERSION_1_2; 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddProfileDescriptorList(sdp_handle, profile_uuid, version); 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add service name */ 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_service_name != NULL && p_service_name[0] != 0) 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE, 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT32)(strlen(p_service_name)+1), (UINT8 *) p_service_name); 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add features and network */ 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (service_uuid == UUID_SERVCLASS_AG_HANDSFREE) 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project network = (features & BTA_AG_FEAT_REJECT) ? 1 : 0; 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddAttribute(sdp_handle, ATTR_ID_DATA_STORES_OR_NETWORK, 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT_DESC_TYPE, 1, &network); 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (features & BTA_AG_FEAT_CODEC) 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project codec_supported = TRUE; 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project features &= BTA_AG_SDP_FEAT_SPEC; 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Codec bit position is different in SDP and in BRSF */ 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (codec_supported) 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project features |= 0x0020; 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_FIELD(buf, features); 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SUPPORTED_FEATURES, UINT_DESC_TYPE, 2, buf); 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add browse group list */ 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddUuidSequence(sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, browse_list); 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_create_records 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Create SDP records for registered services. 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_create_records(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_SERVICE_MASK services; 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project services = p_scb->reg_services >> BTA_HSP_SERVICE_ID; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTA_AG_NUM_IDX && services != 0; i++, services >>= 1) 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if service is set in mask */ 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (services & 1) 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add sdp record if not already registered */ 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.profile[i].sdp_handle == 0) 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.profile[i].sdp_handle = SDP_CreateRecord(); 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.profile[i].scn = BTM_AllocateSCN(); 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_add_record(bta_ag_uuid[i], p_data->api_register.p_name[i], 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.profile[i].scn, p_data->api_register.features, 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.profile[i].sdp_handle); 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_add_uuid(bta_ag_uuid[i]); 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->hsp_version = HSP_VERSION_1_2; 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_del_records 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Delete SDP records for any registered services. 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_del_records(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *p = &bta_ag_cb.scb[0]; 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_SERVICE_MASK services; 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_SERVICE_MASK others = 0; 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 2585cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get services of all other registered servers */ 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTA_AG_NUM_IDX; i++, p++) 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p) 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project continue; 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p->in_use && p->dealloc == FALSE) 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project others |= p->reg_services; 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project others >>= BTA_HSP_SERVICE_ID; 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project services = p_scb->reg_services >> BTA_HSP_SERVICE_ID; 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTA_AG_NUM_IDX && services != 0; i++, services >>= 1, others >>= 1) 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if service registered for this scb and not registered for any other scb */ 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((services & 1) == 1) && ((others & 1) == 0)) 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 281e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_del_records %d", i); 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.profile[i].sdp_handle != 0) 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SDP_DeleteRecord(bta_ag_cb.profile[i].sdp_handle); 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.profile[i].sdp_handle = 0; 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_FreeSCN(bta_ag_cb.profile[i].scn); 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SecClrService(bta_ag_sec_id[i]); 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_remove_uuid(bta_ag_uuid[i]); 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sdp_find_attr 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Process SDP discovery results to find requested attributes 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** for requested service. 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if results found, FALSE otherwise. 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_ag_sdp_find_attr(tBTA_AG_SCB *p_scb, tBTA_SERVICE_MASK service) 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_DISC_REC *p_rec = NULL; 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_DISC_ATTR *p_attr; 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_PROTOCOL_ELEM pe; 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 uuid; 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN result = FALSE; 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (service & BTA_HFP_SERVICE_MASK) 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid = UUID_SERVCLASS_HF_HANDSFREE; 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_version = HFP_VERSION_1_1; /* Default version */ 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (service & BTA_HSP_SERVICE_MASK && p_scb->role == BTA_AG_INT) 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid = UUID_SERVCLASS_HEADSET_HS; 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_version = 0x0100; /* Default version */ 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* loop through all records we found */ 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (TRUE) 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get next record; if none found, we're done */ 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_rec = SDP_FindServiceInDb(p_scb->p_disc_db, uuid, p_rec)) == NULL) 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (uuid == UUID_SERVCLASS_HEADSET_HS) 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Search again in case the peer device is HSP v1.0 */ 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid = UUID_SERVCLASS_HEADSET; 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_rec = SDP_FindServiceInDb(p_scb->p_disc_db, uuid, p_rec)) == NULL) 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get scn from proto desc list if initiator */ 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->role == BTA_AG_INT) 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_scn = (UINT8) pe.params[0]; 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project continue; 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get profile version (if failure, version parameter is not updated) */ 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SDP_FindProfileVersionInRec(p_rec, uuid, &p_scb->peer_version); 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get features if HFP */ 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (service & BTA_HFP_SERVICE_MASK) 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES)) != NULL) 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Found attribute. Get value. */ 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There might be race condition between SDP and BRSF. */ 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Do not update if we already received BRSF. */ 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->peer_features == 0) 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_features = p_attr->attr_value.v.u16; 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* HSP */ 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_REMOTE_AUDIO_VOLUME_CONTROL)) != NULL) 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Remote volume control of HSP */ 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_attr->attr_value.v.u8) 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_features |= BTA_AG_PEER_FEAT_VOL; 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_features &= ~BTA_AG_PEER_FEAT_VOL; 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* found what we needed */ 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = TRUE; 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_do_disc 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Do service discovery. 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_do_disc(tBTA_AG_SCB *p_scb, tBTA_SERVICE_MASK service) 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_UUID uuid_list[2]; 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 num_uuid = 1; 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 attr_list[4]; 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_attr; 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN db_inited = FALSE; 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HFP initiator; get proto list and features */ 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (service & BTA_HFP_SERVICE_MASK && p_scb->role == BTA_AG_INT) 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST; 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST; 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[2] = ATTR_ID_BT_PROFILE_DESC_LIST; 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[3] = ATTR_ID_SUPPORTED_FEATURES; 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_attr = 4; 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_list[0].uu.uuid16 = UUID_SERVCLASS_HF_HANDSFREE; 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HFP acceptor; get features */ 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (service & BTA_HFP_SERVICE_MASK && p_scb->role == BTA_AG_ACP) 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST; 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[1] = ATTR_ID_BT_PROFILE_DESC_LIST; 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[2] = ATTR_ID_SUPPORTED_FEATURES; 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_attr = 3; 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_list[0].uu.uuid16 = UUID_SERVCLASS_HF_HANDSFREE; 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HSP initiator; get proto list */ 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (service & BTA_HSP_SERVICE_MASK && p_scb->role == BTA_AG_INT) 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST; 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST; 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[2] = ATTR_ID_BT_PROFILE_DESC_LIST; 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[3] = ATTR_ID_REMOTE_AUDIO_VOLUME_CONTROL; 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_attr = 4; 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_list[0].uu.uuid16 = UUID_SERVCLASS_HEADSET; /* Legacy from HSP v1.0 */ 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->hsp_version >= HSP_VERSION_1_2) 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_list[1].uu.uuid16 = UUID_SERVCLASS_HEADSET_HS; 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_uuid = 2; 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HSP acceptor; no discovery */ 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* allocate buffer for sdp database */ 4555fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_scb->p_disc_db = (tSDP_DISCOVERY_DB *)osi_malloc(BTA_AG_DISC_BUF_SIZE); 4565fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov /* set up service discovery database; attr happens to be attr_list len */ 4575fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov uuid_list[0].len = LEN_UUID_16; 4585fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov uuid_list[1].len = LEN_UUID_16; 4595fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov db_inited = SDP_InitDiscoveryDb(p_scb->p_disc_db, BTA_AG_DISC_BUF_SIZE, 4605fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov num_uuid, uuid_list, num_attr, attr_list); 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(db_inited) 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*Service discovery not initiated */ 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project db_inited = SDP_ServiceSearchAttributeRequest(p_scb->peer_addr, p_scb->p_disc_db, 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sdp_cback_tbl[bta_ag_scb_to_idx(p_scb) - 1]); 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!db_inited) 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*free discover db */ 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_free_db(p_scb, NULL); 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sent failed event */ 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sm_execute(p_scb, BTA_AG_DISC_FAIL_EVT, NULL); 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_free_db 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Free discovery database. 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_free_db(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4915cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 492abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free_and_reset((void **)&p_scb->p_disc_db); 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 494