13fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/****************************************************************************** 23fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 31025687c6679608fe9df918f37011414ffc72b62Hemant Gupta * Copyright (c) 2014 The Android Open Source Project 43fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * Copyright (C) 2004-2012 Broadcom Corporation 53fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 63fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * Licensed under the Apache License, Version 2.0 (the "License"); 73fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * you may not use this file except in compliance with the License. 83fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * You may obtain a copy of the License at: 93fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * http://www.apache.org/licenses/LICENSE-2.0 113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * Unless required by applicable law or agreed to in writing, software 133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * distributed under the License is distributed on an "AS IS" BASIS, 143fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 153fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * See the License for the specific language governing permissions and 163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * limitations under the License. 173fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta ******************************************************************************/ 193fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/****************************************************************************** 213fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 223fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * This file contains the audio gateway functions controlling the RFCOMM 233fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * connections. 243fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta * 253fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta ******************************************************************************/ 263fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 273fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#include <string.h> 283fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#include "bta_api.h" 291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bta_hf_client_int.h" 303fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#include "port_api.h" 313fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#include "bd.h" 321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bt_utils.h" 333fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 343fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 353fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 361025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function bta_hf_client_port_cback 373fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 383fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Description RFCOMM Port callback 393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 403fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 413fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns void 423fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 433fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/ 441025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_port_cback(UINT32 code, UINT16 port_handle) 453fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 463fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta BT_HDR *p_buf; 473fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta UNUSED(code); 483fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* ignore port events for port handles other than connected handle */ 501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (port_handle != bta_hf_client_cb.scb.conn_handle) 513fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 52e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hf_client_port_cback ignoring handle:%d conn_handle = %d", 531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta port_handle, bta_hf_client_cb.scb.conn_handle); 541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) 581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta p_buf->event = BTA_HF_CLIENT_RFC_DATA_EVT; 601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_sys_sendmsg(p_buf); 613fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 623fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 633fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 643fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 653fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function bta_hf_client_mgmt_cback 673fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 683fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Description RFCOMM management callback 693fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 703fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 713fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns void 723fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 733fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/ 741025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic void bta_hf_client_mgmt_cback(UINT32 code, UINT16 port_handle) 753fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 761025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tBTA_HF_CLIENT_RFC *p_buf; 771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta UINT16 event; 783fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 79e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hf_client_mgmt_cback : code = %d, port_handle = %d, conn_handle = %d, serv_handle = %d", 801025687c6679608fe9df918f37011414ffc72b62Hemant Gupta code, port_handle, bta_hf_client_cb.scb.conn_handle, bta_hf_client_cb.scb.serv_handle); 813fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 821025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* ignore close event for port handles other than connected handle */ 831025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if ((code != PORT_SUCCESS) && (port_handle != bta_hf_client_cb.scb.conn_handle)) 843fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 85e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hf_client_mgmt_cback ignoring handle:%d", port_handle); 861025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 883fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 891025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (code == PORT_SUCCESS) 901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if ((bta_hf_client_cb.scb.conn_handle && (port_handle == bta_hf_client_cb.scb.conn_handle)) || /* outgoing connection */ 921025687c6679608fe9df918f37011414ffc72b62Hemant Gupta (port_handle == bta_hf_client_cb.scb.serv_handle)) /* incoming connection */ 933fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta event = BTA_HF_CLIENT_RFC_OPEN_EVT; 953fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 963fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta else 973fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 98e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR ("bta_hf_client_mgmt_cback: PORT_SUCCESS, ignoring handle = %d", port_handle); 991025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 1003fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 1013fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 1021025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* distinguish server close events */ 1031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else if (port_handle == bta_hf_client_cb.scb.conn_handle) 1041025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 1051025687c6679608fe9df918f37011414ffc72b62Hemant Gupta event = BTA_HF_CLIENT_RFC_CLOSE_EVT; 1061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 1071025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 1081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 1091025687c6679608fe9df918f37011414ffc72b62Hemant Gupta event = BTA_HF_CLIENT_RFC_SRV_CLOSE_EVT; 1101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 1113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if ((p_buf = (tBTA_HF_CLIENT_RFC *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_RFC))) != NULL) 1131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta { 1141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta p_buf->hdr.event = event; 1151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta p_buf->port_handle = port_handle; 1161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_sys_sendmsg(p_buf); 1171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta } 1183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 1193fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 1213fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function bta_hf_client_setup_port 1233fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Description Setup RFCOMM port for use by HF Client. 1253fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1263fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1273fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns void 1283fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1293fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/ 1301025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_setup_port(UINT16 handle) 1313fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 1321025687c6679608fe9df918f37011414ffc72b62Hemant Gupta PORT_SetEventMask(handle, PORT_EV_RXCHAR); 1331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta PORT_SetEventCallback(handle, bta_hf_client_port_cback); 1343fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 1353fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1363fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 1373fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function bta_hf_client_start_server 1393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1401025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Description Setup RFCOMM server for use by HF Client. 1413fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1423fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1433fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns void 1443fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1453fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/ 1461025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_start_server(void) 1473fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 1481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int i; 1491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta int port_status; 1503fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.serv_handle > 0) 1523fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 153e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s already started, handle: %d", __FUNCTION__, bta_hf_client_cb.scb.serv_handle); 1541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 1553fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 1563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_HF_HANDSFREE, bta_hf_client_cb.scb.serv_sec_mask, 1581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, bta_hf_client_cb.scn); 1593fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta port_status = RFCOMM_CreateConnection(UUID_SERVCLASS_HF_HANDSFREE, bta_hf_client_cb.scn, 1611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta TRUE, BTA_HF_CLIENT_MTU, (UINT8 *) bd_addr_any, &(bta_hf_client_cb.scb.serv_handle), 1621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_mgmt_cback); 1633fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (port_status == PORT_SUCCESS) 1653fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 1661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_setup_port(bta_hf_client_cb.scb.serv_handle); 1673fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 1681025687c6679608fe9df918f37011414ffc72b62Hemant Gupta else 1693fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 1701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* TODO: can we handle this better? */ 171e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hf_client_start_server: RFCOMM_CreateConnection returned error:%d", port_status); 1723fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 1731025687c6679608fe9df918f37011414ffc72b62Hemant Gupta 174e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hf_client_start_server handle: %d", bta_hf_client_cb.scb.serv_handle); 1753fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 1763fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1773fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 1783fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1791025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function bta_hf_client_close_server 1803fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Description Close RFCOMM server port for use by HF Client. 1823fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1833fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Returns void 1853fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 1863fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/ 1871025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_close_server(void) 1883fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 189e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s %d", __FUNCTION__, bta_hf_client_cb.scb.serv_handle); 1903fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1911025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.serv_handle == 0) 1923fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 193e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("%s already stopped", __FUNCTION__); 1941025687c6679608fe9df918f37011414ffc72b62Hemant Gupta return; 1953fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 1963fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 1971025687c6679608fe9df918f37011414ffc72b62Hemant Gupta RFCOMM_RemoveServer(bta_hf_client_cb.scb.serv_handle); 1981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.serv_handle = 0; 1993fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 2003fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2013fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 2023fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2031025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function bta_hf_client_rfc_do_open 2043fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2053fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Description Open an RFCOMM connection to the peer device. 2063fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2073fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2083fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns void 2093fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/ 2111025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_rfc_do_open(tBTA_HF_CLIENT_DATA *p_data) 2123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 2131025687c6679608fe9df918f37011414ffc72b62Hemant Gupta BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_HF_HANDSFREE, 2141025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_cb.scb.cli_sec_mask, BT_PSM_RFCOMM, 2151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta BTM_SEC_PROTO_RFCOMM, bta_hf_client_cb.scb.peer_scn); 2163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (RFCOMM_CreateConnection(UUID_SERVCLASS_HF_HANDSFREE, bta_hf_client_cb.scb.peer_scn, 2181025687c6679608fe9df918f37011414ffc72b62Hemant Gupta FALSE, BTA_HF_CLIENT_MTU, bta_hf_client_cb.scb.peer_addr, &(bta_hf_client_cb.scb.conn_handle), 2191025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_mgmt_cback) == PORT_SUCCESS) 2203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 2211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_setup_port(bta_hf_client_cb.scb.conn_handle); 222e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_hf_client_rfc_do_open : conn_handle = %d", bta_hf_client_cb.scb.conn_handle); 2233fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 2243fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* RFCOMM create connection failed; send ourselves RFCOMM close event */ 2253fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta else 2263fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 2271025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_sm_execute(BTA_HF_CLIENT_RFC_CLOSE_EVT, p_data); 2283fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 2293fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 2303fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2313fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************* 2323fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2331025687c6679608fe9df918f37011414ffc72b62Hemant Gupta** Function bta_hf_client_rfc_do_close 2343fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2353fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Description Close RFCOMM connection. 2363fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2373fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2383fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** Returns void 2393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta** 2403fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta*******************************************************************************/ 2411025687c6679608fe9df918f37011414ffc72b62Hemant Guptavoid bta_hf_client_rfc_do_close(tBTA_HF_CLIENT_DATA *p_data) 2423fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta{ 2431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta tBTA_HF_CLIENT_RFC *p_buf; 2443fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta UNUSED(p_data); 2453fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if (bta_hf_client_cb.scb.conn_handle) 2473fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 2481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta RFCOMM_RemoveConnection(bta_hf_client_cb.scb.conn_handle); 2493fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 2503fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta else 2513fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 2521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta /* Close API was called while HF Client is in Opening state. */ 2533fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* Need to trigger the state machine to send callback to the app */ 2543fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* and move back to INIT state. */ 2551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if ((p_buf = (tBTA_HF_CLIENT_RFC *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_RFC))) != NULL) 2563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 2571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta p_buf->hdr.event = BTA_HF_CLIENT_RFC_CLOSE_EVT; 2583fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta bta_sys_sendmsg(p_buf); 2593fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 2603fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta 2613fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta /* Cancel SDP if it had been started. */ 2621025687c6679608fe9df918f37011414ffc72b62Hemant Gupta if(bta_hf_client_cb.scb.p_disc_db) 2633fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta { 2641025687c6679608fe9df918f37011414ffc72b62Hemant Gupta (void)SDP_CancelServiceSearch (bta_hf_client_cb.scb.p_disc_db); 2651025687c6679608fe9df918f37011414ffc72b62Hemant Gupta bta_hf_client_free_db(NULL); 2663fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 2673fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta } 2683fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta} 269