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" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.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 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_DISC_BUF_SIZE GKI_MAX_BUF_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 tBTA_AG_DISC_RESULT *p_buf; 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 event; 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *p_scb; 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 77e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_sdp_cback status:0x%x", status); 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_scb = bta_ag_scb_by_idx(idx)) != NULL) 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set event according to int/acp */ 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->role == BTA_AG_ACP) 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = BTA_AG_DISC_ACP_RES_EVT; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = BTA_AG_DISC_INT_RES_EVT; 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (tBTA_AG_DISC_RESULT *) GKI_getbuf(sizeof(tBTA_AG_DISC_RESULT))) != NULL) 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->hdr.event = event; 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->hdr.layer_specific = idx; 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->status = status; 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_buf); 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/******************************************************************************* 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sdp_cback_1 to 3 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description SDP callback functions. Since there is no way to 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** distinguish scb from the callback we need separate 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** callbacks for each scb. 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sdp_cback_1(UINT16 status) {bta_ag_sdp_cback(status, 1);} 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sdp_cback_2(UINT16 status) {bta_ag_sdp_cback(status, 2);} 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_sdp_cback_3(UINT16 status) {bta_ag_sdp_cback(status, 3);} 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_add_record 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by a server application to add 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HSP or HFP information to an SDP record. Prior to 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** calling this function the application must call 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SDP_CreateRecord() to create an SDP record. 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if function execution succeeded, 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** FALSE if function execution failed. 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_ag_add_record(UINT16 service_uuid, char *p_service_name, UINT8 scn, 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_FEAT features, UINT32 sdp_handle) 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_PROTOCOL_ELEM proto_elem_list[BTA_AG_NUM_PROTO_ELEMS]; 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 svc_class_id_list[BTA_AG_NUM_SVC_ELEMS]; 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 browse_list[] = {UUID_SERVCLASS_PUBLIC_BROWSE_GROUP}; 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 version; 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 profile_uuid; 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 network; 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN result = TRUE; 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN codec_supported = FALSE; 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 buf[2]; 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 143e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_add_record uuid: %x", service_uuid); 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset( proto_elem_list, 0 , BTA_AG_NUM_PROTO_ELEMS*sizeof(tSDP_PROTOCOL_ELEM)); 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add the protocol element sequence */ 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[0].protocol_uuid = UUID_PROTOCOL_L2CAP; 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[0].num_params = 0; 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[1].protocol_uuid = UUID_PROTOCOL_RFCOMM; 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[1].num_params = 1; 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_elem_list[1].params[0] = scn; 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddProtocolList(sdp_handle, BTA_AG_NUM_PROTO_ELEMS, proto_elem_list); 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add service class id list */ 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project svc_class_id_list[0] = service_uuid; 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project svc_class_id_list[1] = UUID_SERVCLASS_GENERIC_AUDIO; 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddServiceClassIdList(sdp_handle, BTA_AG_NUM_SVC_ELEMS, svc_class_id_list); 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add profile descriptor list */ 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (service_uuid == UUID_SERVCLASS_AG_HANDSFREE) 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project profile_uuid = UUID_SERVCLASS_HF_HANDSFREE; 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project version = HFP_VERSION_1_6; 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project profile_uuid = UUID_SERVCLASS_HEADSET; 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project version = HSP_VERSION_1_2; 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddProfileDescriptorList(sdp_handle, profile_uuid, version); 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add service name */ 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_service_name != NULL && p_service_name[0] != 0) 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE, 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT32)(strlen(p_service_name)+1), (UINT8 *) p_service_name); 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add features and network */ 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (service_uuid == UUID_SERVCLASS_AG_HANDSFREE) 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project network = (features & BTA_AG_FEAT_REJECT) ? 1 : 0; 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddAttribute(sdp_handle, ATTR_ID_DATA_STORES_OR_NETWORK, 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT_DESC_TYPE, 1, &network); 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (features & BTA_AG_FEAT_CODEC) 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project codec_supported = TRUE; 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project features &= BTA_AG_SDP_FEAT_SPEC; 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Codec bit position is different in SDP and in BRSF */ 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (codec_supported) 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project features |= 0x0020; 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_FIELD(buf, features); 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SUPPORTED_FEATURES, UINT_DESC_TYPE, 2, buf); 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add browse group list */ 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddUuidSequence(sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, browse_list); 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_create_records 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Create SDP records for registered services. 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_create_records(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_SERVICE_MASK services; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project services = p_scb->reg_services >> BTA_HSP_SERVICE_ID; 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTA_AG_NUM_IDX && services != 0; i++, services >>= 1) 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if service is set in mask */ 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (services & 1) 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add sdp record if not already registered */ 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.profile[i].sdp_handle == 0) 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.profile[i].sdp_handle = SDP_CreateRecord(); 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.profile[i].scn = BTM_AllocateSCN(); 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_add_record(bta_ag_uuid[i], p_data->api_register.p_name[i], 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.profile[i].scn, p_data->api_register.features, 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.profile[i].sdp_handle); 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_add_uuid(bta_ag_uuid[i]); 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->hsp_version = HSP_VERSION_1_2; 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_del_records 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Delete SDP records for any registered services. 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_del_records(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AG_SCB *p = &bta_ag_cb.scb[0]; 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_SERVICE_MASK services; 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_SERVICE_MASK others = 0; 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 2605cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get services of all other registered servers */ 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTA_AG_NUM_IDX; i++, p++) 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb == p) 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project continue; 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p->in_use && p->dealloc == FALSE) 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project others |= p->reg_services; 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project others >>= BTA_HSP_SERVICE_ID; 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project services = p_scb->reg_services >> BTA_HSP_SERVICE_ID; 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTA_AG_NUM_IDX && services != 0; i++, services >>= 1, others >>= 1) 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if service registered for this scb and not registered for any other scb */ 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((services & 1) == 1) && ((others & 1) == 0)) 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 283e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_ag_del_records %d", i); 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_ag_cb.profile[i].sdp_handle != 0) 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SDP_DeleteRecord(bta_ag_cb.profile[i].sdp_handle); 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_cb.profile[i].sdp_handle = 0; 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_FreeSCN(bta_ag_cb.profile[i].scn); 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SecClrService(bta_ag_sec_id[i]); 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_remove_uuid(bta_ag_uuid[i]); 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/******************************************************************************* 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_sdp_find_attr 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Process SDP discovery results to find requested attributes 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** for requested service. 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if results found, FALSE otherwise. 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_ag_sdp_find_attr(tBTA_AG_SCB *p_scb, tBTA_SERVICE_MASK service) 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_DISC_REC *p_rec = NULL; 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_DISC_ATTR *p_attr; 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_PROTOCOL_ELEM pe; 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 uuid; 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN result = FALSE; 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (service & BTA_HFP_SERVICE_MASK) 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid = UUID_SERVCLASS_HF_HANDSFREE; 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_version = HFP_VERSION_1_1; /* Default version */ 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (service & BTA_HSP_SERVICE_MASK && p_scb->role == BTA_AG_INT) 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid = UUID_SERVCLASS_HEADSET_HS; 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_version = 0x0100; /* Default version */ 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* loop through all records we found */ 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (TRUE) 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get next record; if none found, we're done */ 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_rec = SDP_FindServiceInDb(p_scb->p_disc_db, uuid, p_rec)) == NULL) 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (uuid == UUID_SERVCLASS_HEADSET_HS) 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Search again in case the peer device is HSP v1.0 */ 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid = UUID_SERVCLASS_HEADSET; 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_rec = SDP_FindServiceInDb(p_scb->p_disc_db, uuid, p_rec)) == NULL) 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get scn from proto desc list if initiator */ 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->role == BTA_AG_INT) 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_scn = (UINT8) pe.params[0]; 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project continue; 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get profile version (if failure, version parameter is not updated) */ 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SDP_FindProfileVersionInRec(p_rec, uuid, &p_scb->peer_version); 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get features if HFP */ 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (service & BTA_HFP_SERVICE_MASK) 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES)) != NULL) 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Found attribute. Get value. */ 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There might be race condition between SDP and BRSF. */ 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Do not update if we already received BRSF. */ 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->peer_features == 0) 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_features = p_attr->attr_value.v.u16; 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* HSP */ 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_REMOTE_AUDIO_VOLUME_CONTROL)) != NULL) 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Remote volume control of HSP */ 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_attr->attr_value.v.u8) 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_features |= BTA_AG_PEER_FEAT_VOL; 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->peer_features &= ~BTA_AG_PEER_FEAT_VOL; 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* found what we needed */ 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = TRUE; 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_do_disc 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Do service discovery. 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_do_disc(tBTA_AG_SCB *p_scb, tBTA_SERVICE_MASK service) 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_UUID uuid_list[2]; 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 num_uuid = 1; 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 attr_list[4]; 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_attr; 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN db_inited = FALSE; 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HFP initiator; get proto list and features */ 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (service & BTA_HFP_SERVICE_MASK && p_scb->role == BTA_AG_INT) 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST; 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST; 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[2] = ATTR_ID_BT_PROFILE_DESC_LIST; 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[3] = ATTR_ID_SUPPORTED_FEATURES; 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_attr = 4; 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_list[0].uu.uuid16 = UUID_SERVCLASS_HF_HANDSFREE; 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HFP acceptor; get features */ 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (service & BTA_HFP_SERVICE_MASK && p_scb->role == BTA_AG_ACP) 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST; 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[1] = ATTR_ID_BT_PROFILE_DESC_LIST; 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[2] = ATTR_ID_SUPPORTED_FEATURES; 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_attr = 3; 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_list[0].uu.uuid16 = UUID_SERVCLASS_HF_HANDSFREE; 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HSP initiator; get proto list */ 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (service & BTA_HSP_SERVICE_MASK && p_scb->role == BTA_AG_INT) 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST; 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST; 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[2] = ATTR_ID_BT_PROFILE_DESC_LIST; 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project attr_list[3] = ATTR_ID_REMOTE_AUDIO_VOLUME_CONTROL; 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_attr = 4; 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_list[0].uu.uuid16 = UUID_SERVCLASS_HEADSET; /* Legacy from HSP v1.0 */ 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->hsp_version >= HSP_VERSION_1_2) 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_list[1].uu.uuid16 = UUID_SERVCLASS_HEADSET_HS; 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_uuid = 2; 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HSP acceptor; no discovery */ 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* allocate buffer for sdp database */ 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_disc_db = (tSDP_DISCOVERY_DB *) GKI_getbuf(BTA_AG_DISC_BUF_SIZE); 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_scb->p_disc_db) 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set up service discovery database; attr happens to be attr_list len */ 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_list[0].len = LEN_UUID_16; 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_list[1].len = LEN_UUID_16; 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project db_inited = SDP_InitDiscoveryDb(p_scb->p_disc_db, BTA_AG_DISC_BUF_SIZE, num_uuid, 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_list, num_attr, attr_list); 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(db_inited) 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*Service discovery not initiated */ 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project db_inited = SDP_ServiceSearchAttributeRequest(p_scb->peer_addr, p_scb->p_disc_db, 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sdp_cback_tbl[bta_ag_scb_to_idx(p_scb) - 1]); 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!db_inited) 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*free discover db */ 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_free_db(p_scb, NULL); 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sent failed event */ 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_sm_execute(p_scb, BTA_AG_DISC_FAIL_EVT, NULL); 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_free_db 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Free discovery database. 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_free_db(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data) 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4975cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 4985cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->p_disc_db != NULL) 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_scb->p_disc_db); 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_scb->p_disc_db = NULL; 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 505