/******************************************************************************
 *
 *  Copyright (C) 2010-2014 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(bool 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_t oid, NFC_HDR* p_data,
                              tNFC_VS_CBACK* p_cback) {
  tNFC_STATUS status = NFC_STATUS_OK;
  uint8_t* 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 NFC_HDR, to receive the response */
  ((tNFC_NCI_VS_MSG*)p_data)->p_cback = p_cback;

  p_data->offset -= NCI_MSG_HDR_SIZE;
  pp = (uint8_t*)(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_t)p_data->len;
  p_data->len += NCI_MSG_HDR_SIZE;
  nfc_ncif_check_cmd_queue(p_data);
  return status;
}

#endif /* NFC_INCLUDED == TRUE */
