/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * 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.
 */

#ifndef __PARSER_REL_H__
#define __PARSER_REL_H__

#ifdef __cplusplus
extern "C" {
#endif

#include <drm_common_types.h>

#define WRITE_RO_FLAG(whoIsAble, boolValue, Indicator, RIGHTS) do{\
    whoIsAble = boolValue;\
    Indicator |= RIGHTS;\
}while(0)

#define CHECK_VALIDITY(ret) do{\
    if(ret == NULL){\
        if(XML_ERROR_NO_SUCH_NODE != xml_errno)\
            return FALSE;\
    }\
    else\
    {\
        if(XML_ERROR_OK != xml_errno)\
            return FALSE;\
    }\
}while(0)

#define YMD_HMS_2_INT(year, mon, day, date, hour, min, sec, time) do{\
    date = year * 10000 + mon * 100 + day;\
    time = hour * 10000 + min * 100 + sec;\
}while(0)

#define DRM_UID_LEN         256
#define DRM_KEY_LEN         16

#define XML_DOM_PARSER

typedef struct _T_DRM_DATETIME {
    int32_t date; /**< year * 10000 + mon *100 + day */
    int32_t time; /**< hour * 10000 + min *100 + sec */
} T_DRM_DATETIME;

typedef struct _T_DRM_Rights_Constraint {
    uint8_t Indicator;          /**< Indicate which is constrainted, the first one indicate 0001, second one indicate 0010 */
    uint8_t unUsed[3];
    int32_t Count;              /**< The times that can be used */
    T_DRM_DATETIME StartTime;   /**< The starting time */
    T_DRM_DATETIME EndTime;     /**< The ending time */
    T_DRM_DATETIME Interval;    /**< The interval time */
} T_DRM_Rights_Constraint;

typedef struct _T_DRM_Rights {
    uint8_t Version[8];                         /**< Version number */
    uint8_t uid[256];                           /**< record the rights object name */
    uint8_t KeyValue[16];                       /**< Decode base64 */
    int32_t bIsPlayable;                        /**< Is playable */
    int32_t bIsDisplayable;                     /**< Is displayable */
    int32_t bIsExecuteable;                     /**< Is executeable */
    int32_t bIsPrintable;                       /**< Is printable */
    T_DRM_Rights_Constraint PlayConstraint;     /**< Play constraint */
    T_DRM_Rights_Constraint DisplayConstraint;  /**< Display constraint */
    T_DRM_Rights_Constraint ExecuteConstraint;  /**< Execute constraint */
    T_DRM_Rights_Constraint PrintConstraint;    /**< Print constraint */
} T_DRM_Rights;

/**
 * Input year and month, return how many days that month have
 * \param year          (in)Input the year
 * \param month         (in)Input the month
 * \return
 *      -A positive integer, which is how many days that month have
 *      -When wrong input, return -1
 */
int32_t drm_monthDays(int32_t year, int32_t month);

/**
 * Check whether the date and time is valid.
 * \param year          year of the date
 * \param month         month of the date
 * \param day           day of the date
 * \param hour          hour of the time
 * \param min           minute of the time
 * \param sec           second of the time
 * \return
 *      -when it is a valid time, return 0
 *      -when it is a invalid time, return -1
 */
int32_t drm_checkDate(int32_t year, int32_t month, int32_t day, int32_t hour, int32_t min, int32_t sec);

/**
 * Parse the rights object include xml format and wbxml format data
 *
 * \param buffer        (in)Input the DRM rights object data
 * \param bufferLen     (in)The buffer length
 * \param format        (in)Which format, xml or wbxml
 * \param pRights       (out)A structure pointer which save the rights information
 *
 * \return
 *      -TRUE, when success
 *      -FALSE, when failed
 */
int32_t drm_relParser(uint8_t* buffer, int32_t bufferLen, int32_t Format, T_DRM_Rights* pRights);

#ifdef __cplusplus
}
#endif

#endif /* __PARSER_REL_H__ */