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