/******************************************************************************
 *
 *  Copyright (c) 2014 The Android Open Source Project
 *  Copyright (C) 2004-2012 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  This file contains the audio gateway functions controlling the RFCOMM
 *  connections.
 *
 ******************************************************************************/

#include <string.h>
#include "bta_api.h"
#include "bta_hf_client_int.h"
#include "port_api.h"
#include "bd.h"
#include "bt_utils.h"

/*******************************************************************************
**
** Function         bta_hf_client_port_cback
**
** Description      RFCOMM Port callback
**
**
** Returns          void
**
*******************************************************************************/
static void bta_hf_client_port_cback(UINT32 code, UINT16 port_handle)
{
    BT_HDR      *p_buf;
    UNUSED(code);

    /* ignore port events for port handles other than connected handle */
    if (port_handle != bta_hf_client_cb.scb.conn_handle)
    {
        APPL_TRACE_DEBUG("bta_hf_client_port_cback ignoring handle:%d conn_handle = %d",
                          port_handle, bta_hf_client_cb.scb.conn_handle);
        return;
    }

    if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    {
        p_buf->event = BTA_HF_CLIENT_RFC_DATA_EVT;
        bta_sys_sendmsg(p_buf);
    }
}

/*******************************************************************************
**
** Function         bta_hf_client_mgmt_cback
**
** Description      RFCOMM management callback
**
**
** Returns          void
**
*******************************************************************************/
static void bta_hf_client_mgmt_cback(UINT32 code, UINT16 port_handle)
{
    tBTA_HF_CLIENT_RFC     *p_buf;
    UINT16                  event;

    APPL_TRACE_DEBUG("bta_hf_client_mgmt_cback : code = %d, port_handle = %d, conn_handle = %d, serv_handle = %d",
                        code, port_handle, bta_hf_client_cb.scb.conn_handle, bta_hf_client_cb.scb.serv_handle);

    /* ignore close event for port handles other than connected handle */
    if ((code != PORT_SUCCESS) && (port_handle != bta_hf_client_cb.scb.conn_handle))
    {
        APPL_TRACE_DEBUG("bta_hf_client_mgmt_cback ignoring handle:%d", port_handle);
        return;
    }

    if (code == PORT_SUCCESS)
    {
        if ((bta_hf_client_cb.scb.conn_handle && (port_handle == bta_hf_client_cb.scb.conn_handle)) || /* outgoing connection */
                (port_handle == bta_hf_client_cb.scb.serv_handle))                       /* incoming connection */
        {
            event = BTA_HF_CLIENT_RFC_OPEN_EVT;
        }
        else
        {
            APPL_TRACE_ERROR ("bta_hf_client_mgmt_cback: PORT_SUCCESS, ignoring handle = %d", port_handle);
            return;
        }
    }
    /* distinguish server close events */
    else if (port_handle == bta_hf_client_cb.scb.conn_handle)
    {
        event = BTA_HF_CLIENT_RFC_CLOSE_EVT;
    }
    else
    {
        event = BTA_HF_CLIENT_RFC_SRV_CLOSE_EVT;
    }

    if ((p_buf = (tBTA_HF_CLIENT_RFC *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_RFC))) != NULL)
    {
        p_buf->hdr.event = event;
        p_buf->port_handle = port_handle;
        bta_sys_sendmsg(p_buf);
    }
}

/*******************************************************************************
**
** Function         bta_hf_client_setup_port
**
** Description      Setup RFCOMM port for use by HF Client.
**
**
** Returns          void
**
*******************************************************************************/
void bta_hf_client_setup_port(UINT16 handle)
{
    PORT_SetEventMask(handle, PORT_EV_RXCHAR);
    PORT_SetEventCallback(handle, bta_hf_client_port_cback);
}

/*******************************************************************************
**
** Function         bta_hf_client_start_server
**
** Description      Setup RFCOMM server for use by HF Client.
**
**
** Returns          void
**
*******************************************************************************/
void bta_hf_client_start_server(void)
{
    int port_status;

    if (bta_hf_client_cb.scb.serv_handle > 0)
    {
        APPL_TRACE_DEBUG("%s already started, handle: %d", __FUNCTION__, bta_hf_client_cb.scb.serv_handle);
        return;
    }

    BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_HF_HANDSFREE, bta_hf_client_cb.scb.serv_sec_mask,
        BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, bta_hf_client_cb.scn);

    port_status =  RFCOMM_CreateConnection(UUID_SERVCLASS_HF_HANDSFREE, bta_hf_client_cb.scn,
        TRUE, BTA_HF_CLIENT_MTU, (UINT8 *) bd_addr_any, &(bta_hf_client_cb.scb.serv_handle),
        bta_hf_client_mgmt_cback);

    if (port_status  == PORT_SUCCESS)
    {
        bta_hf_client_setup_port(bta_hf_client_cb.scb.serv_handle);
    }
    else
    {
        /* TODO: can we handle this better? */
        APPL_TRACE_DEBUG("bta_hf_client_start_server: RFCOMM_CreateConnection returned error:%d", port_status);
    }

    APPL_TRACE_DEBUG("bta_hf_client_start_server handle: %d", bta_hf_client_cb.scb.serv_handle);
}

/*******************************************************************************
**
** Function         bta_hf_client_close_server
**
** Description      Close RFCOMM server port for use by HF Client.
**
**
** Returns          void
**
*******************************************************************************/
void bta_hf_client_close_server(void)
{
    APPL_TRACE_DEBUG("%s %d", __FUNCTION__, bta_hf_client_cb.scb.serv_handle);

    if (bta_hf_client_cb.scb.serv_handle == 0)
    {
        APPL_TRACE_DEBUG("%s already stopped", __FUNCTION__);
        return;
    }

    RFCOMM_RemoveServer(bta_hf_client_cb.scb.serv_handle);
    bta_hf_client_cb.scb.serv_handle = 0;
}

/*******************************************************************************
**
** Function         bta_hf_client_rfc_do_open
**
** Description      Open an RFCOMM connection to the peer device.
**
**
** Returns          void
**
*******************************************************************************/
void bta_hf_client_rfc_do_open(tBTA_HF_CLIENT_DATA *p_data)
{
    BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_HF_HANDSFREE,
                            bta_hf_client_cb.scb.cli_sec_mask, BT_PSM_RFCOMM,
                            BTM_SEC_PROTO_RFCOMM, bta_hf_client_cb.scb.peer_scn);

    if (RFCOMM_CreateConnection(UUID_SERVCLASS_HF_HANDSFREE, bta_hf_client_cb.scb.peer_scn,
            FALSE, BTA_HF_CLIENT_MTU, bta_hf_client_cb.scb.peer_addr, &(bta_hf_client_cb.scb.conn_handle),
            bta_hf_client_mgmt_cback) == PORT_SUCCESS)
    {
        bta_hf_client_setup_port(bta_hf_client_cb.scb.conn_handle);
        APPL_TRACE_DEBUG("bta_hf_client_rfc_do_open : conn_handle = %d", bta_hf_client_cb.scb.conn_handle);
    }
    /* RFCOMM create connection failed; send ourselves RFCOMM close event */
    else
    {
        bta_hf_client_sm_execute(BTA_HF_CLIENT_RFC_CLOSE_EVT, p_data);
    }
}

/*******************************************************************************
**
** Function         bta_hf_client_rfc_do_close
**
** Description      Close RFCOMM connection.
**
**
** Returns          void
**
*******************************************************************************/
void bta_hf_client_rfc_do_close(tBTA_HF_CLIENT_DATA *p_data)
{
    tBTA_HF_CLIENT_RFC     *p_buf;
    UNUSED(p_data);

    if (bta_hf_client_cb.scb.conn_handle)
    {
        RFCOMM_RemoveConnection(bta_hf_client_cb.scb.conn_handle);
    }
    else
    {
        /* Close API was called while HF Client is in Opening state.        */
        /* Need to trigger the state machine to send callback to the app    */
        /* and move back to INIT state.                                     */
        if ((p_buf = (tBTA_HF_CLIENT_RFC *) GKI_getbuf(sizeof(tBTA_HF_CLIENT_RFC))) != NULL)
        {
            p_buf->hdr.event = BTA_HF_CLIENT_RFC_CLOSE_EVT;
            bta_sys_sendmsg(p_buf);
        }

        /* Cancel SDP if it had been started. */
        if(bta_hf_client_cb.scb.p_disc_db)
        {
            (void)SDP_CancelServiceSearch (bta_hf_client_cb.scb.p_disc_db);
            bta_hf_client_free_db(NULL);
        }
    }
}
