/******************************************************************************
 *
 *  Copyright (C) 2003-2013 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.
 *
 ******************************************************************************/
#include <string.h>

#include "gki.h"
#include "avrc_api.h"
#include "avrc_int.h"


#if (AVRC_METADATA_INCLUDED == TRUE)

/**************************************************************************
**
** Function         AVRC_IsValidAvcType
**
** Description      Check if correct AVC type is specified
**
** Returns          returns TRUE if it is valid
**
**
*******************************************************************************/
BOOLEAN AVRC_IsValidAvcType(UINT8 pdu_id, UINT8 avc_type)
{
    BOOLEAN result=FALSE;

    if (avc_type < AVRC_RSP_NOT_IMPL) /* command msg */
    {
        switch (pdu_id)
        {
        case AVRC_PDU_GET_CAPABILITIES:            /* 0x10 */
        case AVRC_PDU_LIST_PLAYER_APP_ATTR:        /* 0x11 */
        case AVRC_PDU_LIST_PLAYER_APP_VALUES:      /* 0x12 */
        case AVRC_PDU_GET_CUR_PLAYER_APP_VALUE:    /* 0x13 */
        case AVRC_PDU_GET_PLAYER_APP_ATTR_TEXT:    /* 0x15 */
        case AVRC_PDU_GET_PLAYER_APP_VALUE_TEXT:   /* 0x16 */
        case AVRC_PDU_GET_ELEMENT_ATTR:            /* 0x20 */
        case AVRC_PDU_GET_PLAY_STATUS:             /* 0x30 */
             if (avc_type == AVRC_CMD_STATUS)
                result=TRUE;
             break;

        case AVRC_PDU_SET_PLAYER_APP_VALUE:        /* 0x14 */
        case AVRC_PDU_INFORM_DISPLAY_CHARSET:      /* 0x17 */
        case AVRC_PDU_INFORM_BATTERY_STAT_OF_CT:   /* 0x18 */
        case AVRC_PDU_REQUEST_CONTINUATION_RSP:    /* 0x40 */
        case AVRC_PDU_ABORT_CONTINUATION_RSP:      /* 0x41 */
             if (avc_type == AVRC_CMD_CTRL)
                result=TRUE;
             break;

        case AVRC_PDU_REGISTER_NOTIFICATION:       /* 0x31 */
             if (avc_type == AVRC_CMD_NOTIF)
                result=TRUE;
             break;
        }
    }
    else  /* response msg */
    {
        if (avc_type >= AVRC_RSP_NOT_IMPL  &&
           avc_type <= AVRC_RSP_INTERIM    )
           result=TRUE;
    }

    return result;
}

/*******************************************************************************
**
** Function         avrc_is_valid_player_attrib_value
**
** Description      Check if the given attrib value is valid for its attribute
**
** Returns          returns TRUE if it is valid
**
*******************************************************************************/
BOOLEAN avrc_is_valid_player_attrib_value(UINT8 attrib, UINT8 value)
{
    BOOLEAN result=FALSE;

    switch(attrib)
    {
    case AVRC_PLAYER_SETTING_EQUALIZER:
         if ((value > 0)  &&
            (value <= AVRC_PLAYER_VAL_ON))
            result=TRUE;
         break;

    case AVRC_PLAYER_SETTING_REPEAT:
         if ((value > 0)  &&
            (value <= AVRC_PLAYER_VAL_GROUP_REPEAT))
            result=TRUE;
         break;

    case AVRC_PLAYER_SETTING_SHUFFLE:
    case AVRC_PLAYER_SETTING_SCAN:
         if ((value > 0)  &&
            (value <= AVRC_PLAYER_VAL_GROUP_SHUFFLE))
            result=TRUE;
         break;
    }

    if (attrib >= AVRC_PLAYER_SETTING_LOW_MENU_EXT)
       result = TRUE;

    if (!result)
        AVRC_TRACE_ERROR(
            "avrc_is_valid_player_attrib_value() found not matching attrib(x%x)-value(x%x) pair!",
            attrib, value);

    return result;
}

/*******************************************************************************
**
** Function         AVRC_IsValidPlayerAttr
**
** Description      Check if the given attrib value is a valid one
**
** Returns          returns TRUE if it is valid
**
*******************************************************************************/
BOOLEAN AVRC_IsValidPlayerAttr(UINT8 attr)
{
    BOOLEAN result=FALSE;

    if ( (attr >= AVRC_PLAYER_SETTING_EQUALIZER && attr <= AVRC_PLAYER_SETTING_SCAN) ||
         (attr >= AVRC_PLAYER_SETTING_LOW_MENU_EXT) )
    {
       result = TRUE;
    }

    return result;
}



/*******************************************************************************
**
** Function         avrc_pars_pass_thru
**
** Description      This function parses the pass thru commands defined by
**                  Bluetooth SIG
**
** Returns          AVRC_STS_NO_ERROR, if the message in p_data is parsed successfully.
**                  Otherwise, the error code defined by AVRCP 1.4
**
*******************************************************************************/
tAVRC_STS avrc_pars_pass_thru(tAVRC_MSG_PASS *p_msg, UINT16 *p_vendor_unique_id)
{
    UINT8      *p_data;
    UINT32      co_id;
    UINT16      id;
    tAVRC_STS  status = AVRC_STS_BAD_CMD;

    if (p_msg->op_id == AVRC_ID_VENDOR && p_msg->pass_len == AVRC_PASS_THRU_GROUP_LEN)
    {
        p_data = p_msg->p_pass_data;
        AVRC_BE_STREAM_TO_CO_ID (co_id, p_data);
        if (co_id == AVRC_CO_METADATA)
        {
            BE_STREAM_TO_UINT16 (id, p_data);
            if (AVRC_IS_VALID_GROUP(id))
            {
                *p_vendor_unique_id = id;
                status = AVRC_STS_NO_ERROR;
            }
        }
    }
    return status;
}

/*******************************************************************************
**
** Function         avrc_opcode_from_pdu
**
** Description      This function returns the opcode of the given pdu
**
** Returns          AVRC_OP_VENDOR, AVRC_OP_PASS_THRU or AVRC_OP_BROWSE
**
*******************************************************************************/
UINT8 avrc_opcode_from_pdu(UINT8 pdu)
{
    UINT8 opcode = 0;

    switch (pdu)
    {
    case AVRC_PDU_NEXT_GROUP:
    case AVRC_PDU_PREV_GROUP: /* pass thru */
        opcode  = AVRC_OP_PASS_THRU;
        break;

    default: /* vendor */
        opcode  = AVRC_OP_VENDOR;
        break;
    }

    return opcode;
}

/*******************************************************************************
**
** Function         avrc_is_valid_opcode
**
** Description      This function returns the opcode of the given pdu
**
** Returns          AVRC_OP_VENDOR, AVRC_OP_PASS_THRU or AVRC_OP_BROWSE
**
*******************************************************************************/
BOOLEAN avrc_is_valid_opcode(UINT8 opcode)
{
    BOOLEAN is_valid = FALSE;
    switch (opcode)
    {
    case AVRC_OP_BROWSE:
    case AVRC_OP_PASS_THRU:
    case AVRC_OP_VENDOR:
        is_valid = TRUE;
        break;
    }
    return is_valid;
}

#endif /* (AVRC_METADATA_INCLUDED == TRUE) */

