/******************************************************************************
 *
 *  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 is the implementation of the API for PAN subsystem of BTA,
 *  Broadcom's Bluetooth application layer for mobile phones.
 *
 ******************************************************************************/

#include "bt_target.h"

#include "bta_api.h"
#include "bta_sys.h"
#include "pan_api.h"
#include "bt_common.h"
#include "bta_pan_api.h"
#include "bta_pan_int.h"
#include <string.h>
#include "bt_utils.h"

#if defined(BTA_PAN_INCLUDED) && (BTA_PAN_INCLUDED == TRUE)

static const tBTA_SYS_REG bta_pan_reg =
{
    bta_pan_hdl_event,
    BTA_PanDisable
};

/*******************************************************************************
**
** Function         BTA_PanEnable
**
** Description      Enable PAN service.  This function must be
**                  called before any other functions in the PAN API are called.
**                  When the enable operation is complete the callback function
**                  will be called with a BTA_PAN_ENABLE_EVT.
**
** Returns          void
**
*******************************************************************************/
void BTA_PanEnable(tBTA_PAN_CBACK p_cback)
{
    tBTA_PAN_API_ENABLE *p_buf =
        (tBTA_PAN_API_ENABLE *)osi_malloc(sizeof(tBTA_PAN_API_ENABLE));

    /* register with BTA system manager */
    bta_sys_register(BTA_ID_PAN, &bta_pan_reg);

    p_buf->hdr.event = BTA_PAN_API_ENABLE_EVT;
    p_buf->p_cback = p_cback;

    bta_sys_sendmsg(p_buf);
}



/*******************************************************************************
**
** Function         BTA_PanDisable
**
** Description      Disables PAN service.
**
**
** Returns          void
**
*******************************************************************************/
void BTA_PanDisable(void)
{
    BT_HDR *p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR));

    bta_sys_deregister(BTA_ID_PAN);
    p_buf->event = BTA_PAN_API_DISABLE_EVT;

    bta_sys_sendmsg(p_buf);
}

/*******************************************************************************
**
** Function         BTA_PanSetRole
**
** Description      Sets PAN roles. When the enable operation is complete
**                  the callback function will be called with a BTA_PAN_SET_ROLE_EVT.
**
** Returns          void
**
*******************************************************************************/
void BTA_PanSetRole(tBTA_PAN_ROLE role, tBTA_PAN_ROLE_INFO *p_user_info, tBTA_PAN_ROLE_INFO *p_gn_info,
                                        tBTA_PAN_ROLE_INFO *p_nap_info)
{
    tBTA_PAN_API_SET_ROLE  *p_buf =
        (tBTA_PAN_API_SET_ROLE *)osi_calloc(sizeof(tBTA_PAN_API_SET_ROLE));

    p_buf->hdr.event = BTA_PAN_API_SET_ROLE_EVT;
    p_buf->role = role;

    if (p_user_info && (role & BTA_PAN_ROLE_PANU)) {
        if (p_user_info->p_srv_name)
            strlcpy(p_buf->user_name, p_user_info->p_srv_name, BTA_SERVICE_NAME_LEN);

        p_buf->user_app_id = p_user_info->app_id;
        p_buf->user_sec_mask = p_user_info->sec_mask;
    }

    if (p_gn_info && (role & BTA_PAN_ROLE_GN)) {
        if (p_gn_info->p_srv_name)
            strlcpy(p_buf->gn_name, p_gn_info->p_srv_name, BTA_SERVICE_NAME_LEN);

        p_buf->gn_app_id = p_gn_info->app_id;
        p_buf->gn_sec_mask = p_gn_info->sec_mask;
    }

    if (p_nap_info && (role & BTA_PAN_ROLE_NAP)) {
      if (p_nap_info->p_srv_name)
          strlcpy(p_buf->nap_name, p_nap_info->p_srv_name, BTA_SERVICE_NAME_LEN);

      p_buf->nap_app_id = p_nap_info->app_id;
      p_buf->nap_sec_mask = p_nap_info->sec_mask;

    }

    bta_sys_sendmsg(p_buf);
}

/*******************************************************************************
**
** Function         BTA_PanOpen
**
** Description      Opens a connection to a peer device.
**                  When connection is open callback function is called
**                  with a BTA_PAN_OPEN_EVT.
**
**
** Returns          void
**
*******************************************************************************/
void BTA_PanOpen(BD_ADDR bd_addr, tBTA_PAN_ROLE    local_role, tBTA_PAN_ROLE    peer_role)
{
    tBTA_PAN_API_OPEN *p_buf =
        (tBTA_PAN_API_OPEN *)osi_malloc(sizeof(tBTA_PAN_API_OPEN));

    p_buf->hdr.event = BTA_PAN_API_OPEN_EVT;
    p_buf->local_role = local_role;
    p_buf->peer_role = peer_role;
    bdcpy(p_buf->bd_addr, bd_addr);

    bta_sys_sendmsg(p_buf);
}

/*******************************************************************************
**
** Function         BTA_PanClose
**
** Description      Close a PAN  connection to a peer device.
**
**
** Returns          void
**
*******************************************************************************/
void BTA_PanClose(UINT16 handle)
{
    BT_HDR *p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR));

    p_buf->event = BTA_PAN_API_CLOSE_EVT;
    p_buf->layer_specific = handle;

    bta_sys_sendmsg(p_buf);
}
#else

void BTA_PanEnable(tBTA_PAN_CBACK p_cback)
{
    UNUSED(p_cback);
}

void BTA_PanDisable(void)
{
}

void BTA_PanSetRole(tBTA_PAN_ROLE role, tBTA_PAN_ROLE_INFO *p_user_info, tBTA_PAN_ROLE_INFO *p_gn_info,
                    tBTA_PAN_ROLE_INFO *p_nap_info)
{
    UNUSED(role);
    UNUSED(p_user_info);
    UNUSED(p_gn_info);
    UNUSED(p_nap_info);
}

void BTA_PanOpen(BD_ADDR bd_addr, tBTA_PAN_ROLE local_role, tBTA_PAN_ROLE peer_role)
{
    UNUSED(bd_addr);
    UNUSED(local_role);
    UNUSED(peer_role);
}

void BTA_PanClose(UINT16 handle)
{
    UNUSED(handle);
}

#endif /* BTA_PAN_INCLUDED */
