/******************************************************************************
 *
 *  Copyright (C) 2003-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 is the implementation file for audio gateway call-in functions.
 *
 ******************************************************************************/

#include <string.h>

#include "bt_common.h"
#include "bta_ag_api.h"
#include "bta_ag_ci.h"
#include "bta_ag_int.h"
#include "bta_api.h"

/******************************************************************************
 *
 * Function         bta_ag_ci_rx_write
 *
 * Description      This function is called to send data to the AG when the AG
 *                  is configured for AT command pass-through.  The function
 *                  copies data to an event buffer and sends it.
 *
 * Returns          void
 *
 *****************************************************************************/
void bta_ag_ci_rx_write(uint16_t handle, char* p_data, uint16_t len) {
  uint16_t len_remaining = len;
  char* p_data_area;

  if (len > (RFCOMM_DATA_BUF_SIZE - sizeof(tBTA_AG_CI_RX_WRITE) - 1))
    len = RFCOMM_DATA_BUF_SIZE - sizeof(tBTA_AG_CI_RX_WRITE) - 1;

  while (len_remaining) {
    if (len_remaining < len) len = len_remaining;

    tBTA_AG_CI_RX_WRITE* p_buf =
        (tBTA_AG_CI_RX_WRITE*)osi_malloc(sizeof(tBTA_AG_CI_RX_WRITE) + len + 1);
    p_buf->hdr.event = BTA_AG_CI_RX_WRITE_EVT;
    p_buf->hdr.layer_specific = handle;

    p_data_area = (char*)(p_buf + 1); /* Point to data area after header */
    strncpy(p_data_area, p_data, len);
    p_data_area[len] = 0;

    bta_sys_sendmsg(p_buf);

    len_remaining -= len;
    p_data += len;
  }
}

/******************************************************************************
 *
 * Function         bta_ag_ci_slc_ready
 *
 * Description      This function is called to notify AG that SLC is up at
 *                  the application. This funcion is only used when the app
 *                  is running in pass-through mode.
 *
 * Returns          void
 *
 *****************************************************************************/
void bta_ag_ci_slc_ready(uint16_t handle) {
  tBTA_AG_DATA* p_buf = (tBTA_AG_DATA*)osi_malloc(sizeof(tBTA_AG_DATA));

  p_buf->hdr.event = BTA_AG_CI_SLC_READY_EVT;
  p_buf->hdr.layer_specific = handle;

  bta_sys_sendmsg(p_buf);
}
