/******************************************************************************
 *
 *  Copyright (C) 2010-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 functions that NCI vendor specific interface with the
 *  NFCC. On the receive side, it routes events to the appropriate handler
 *  (callback). On the transmit side, it manages the command transmission.
 *
 ******************************************************************************/
#include <string.h>
#include "gki.h"
#include "nfc_target.h"

#if (NFC_INCLUDED == TRUE)
#include "nfc_int.h"

/****************************************************************************
** Declarations
****************************************************************************/



/*******************************************************************************
**
** Function         NFC_RegVSCback
**
** Description      This function is called to register or de-register a callback
**                  function to receive Proprietary NCI response and notification
**                  events.
**                  The maximum number of callback functions allowed is NFC_NUM_VS_CBACKS
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
tNFC_STATUS NFC_RegVSCback (BOOLEAN          is_register,
                            tNFC_VS_CBACK   *p_cback)
{
    tNFC_STATUS status = NFC_STATUS_FAILED;
    int i;

    if (is_register)
    {
        for (i = 0; i < NFC_NUM_VS_CBACKS; i++)
        {
            /* find an empty spot to hold the callback function */
            if (nfc_cb.p_vs_cb[i] == NULL)
            {
                nfc_cb.p_vs_cb[i]  = p_cback;
                status             = NFC_STATUS_OK;
                break;
            }
        }
    }
    else
    {
        for (i = 0; i < NFC_NUM_VS_CBACKS; i++)
        {
            /* find the callback to de-register */
            if (nfc_cb.p_vs_cb[i] == p_cback)
            {
                nfc_cb.p_vs_cb[i]  = NULL;
                status             = NFC_STATUS_OK;
                break;
            }
        }
    }
    return status;
}


/*******************************************************************************
**
** Function         NFC_SendVsCommand
**
** Description      This function is called to send the given vendor specific
**                  command to NFCC. The response from NFCC is reported to the
**                  given tNFC_VS_CBACK as (oid).
**
** Parameters       oid - The opcode of the VS command.
**                  p_data - The parameters for the VS command
**
** Returns          tNFC_STATUS
**
*******************************************************************************/
tNFC_STATUS NFC_SendVsCommand (UINT8          oid,
                               BT_HDR        *p_data,
                               tNFC_VS_CBACK *p_cback)
{
    tNFC_STATUS     status = NFC_STATUS_OK;
    UINT8           *pp;

    /* Allow VSC with 0-length payload */
    if (p_data == NULL)
    {
        p_data = NCI_GET_CMD_BUF (0);
        if (p_data)
        {
            p_data->offset  = NCI_VSC_MSG_HDR_SIZE;
            p_data->len     = 0;
        }
    }

    /* Validate parameters */
    if ((p_data == NULL) || (p_data->offset < NCI_VSC_MSG_HDR_SIZE) || (p_data->len > NCI_MAX_VSC_SIZE))
    {
        NFC_TRACE_ERROR1 ("buffer offset must be >= %d", NCI_VSC_MSG_HDR_SIZE);
        if (p_data)
            GKI_freebuf (p_data);
        return NFC_STATUS_INVALID_PARAM;
    }

    p_data->event           = BT_EVT_TO_NFC_NCI;
    p_data->layer_specific  = NFC_WAIT_RSP_VSC;
    /* save the callback function in the BT_HDR, to receive the response */
    ((tNFC_NCI_VS_MSG *) p_data)->p_cback = p_cback;

    p_data->offset -= NCI_MSG_HDR_SIZE;
    pp              = (UINT8 *) (p_data + 1) + p_data->offset;
    NCI_MSG_BLD_HDR0 (pp, NCI_MT_CMD, NCI_GID_PROP);
    NCI_MSG_BLD_HDR1 (pp, oid);
    *pp             = (UINT8) p_data->len;
    p_data->len    += NCI_MSG_HDR_SIZE;
    nfc_ncif_check_cmd_queue (p_data);
    return status;
}




#endif /* NFC_INCLUDED == TRUE */
