/*
 * 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_DCF_H__
#define __PARSER_DCF_H__

#ifdef __cplusplus
extern "C" {
#endif

#include <drm_common_types.h>

#define MAX_ENCRYPTION_METHOD_LEN                            64
#define MAX_RIGHTS_ISSUER_LEN                                256
#define MAX_CONTENT_NAME_LEN                                 64
#define MAX_CONTENT_DESCRIPTION_LEN                          256
#define MAX_CONTENT_VENDOR_LEN                               256
#define MAX_ICON_URI_LEN                                     256
#define MAX_CONTENT_TYPE_LEN                                 64
#define MAX_CONTENT_URI_LEN                                  256

#define HEADER_ENCRYPTION_METHOD                             "Encryption-Method: "
#define HEADER_RIGHTS_ISSUER                                 "Rights-Issuer: "
#define HEADER_CONTENT_NAME                                  "Content-Name: "
#define HEADER_CONTENT_DESCRIPTION                           "Content-Description: "
#define HEADER_CONTENT_VENDOR                                "Content-Vendor: "
#define HEADER_ICON_URI                                      "Icon-Uri: "

#define HEADER_ENCRYPTION_METHOD_LEN                         19
#define HEADER_RIGHTS_ISSUER_LEN                             15
#define HEADER_CONTENT_NAME_LEN                              14
#define HEADER_CONTENT_DESCRIPTION_LEN                       21
#define HEADER_CONTENT_VENDOR_LEN                            16
#define HEADER_ICON_URI_LEN                                  10

#define UINT_VAR_FLAG                                        0x80
#define UINT_VAR_DATA                                        0x7F
#define MAX_UINT_VAR_BYTE                                    5
#define DRM_UINT_VAR_ERR                                     -1

typedef struct _T_DRM_DCF_Info {
    uint8_t Version;
    uint8_t ContentTypeLen;                                  /**< Length of the ContentType field */
    uint8_t ContentURILen;                                   /**< Length of the ContentURI field */
    uint8_t unUsed;
    uint8_t ContentType[MAX_CONTENT_TYPE_LEN];               /**< The MIME media type of the plaintext data */
    uint8_t ContentURI[MAX_CONTENT_URI_LEN];                 /**< The unique identifier of this content object */
    int32_t HeadersLen;                                      /**< Length of the Headers field */
    int32_t EncryptedDataLen;                                /**< Length of the encrypted data field */
    int32_t DecryptedDataLen;                                /**< Length of the decrypted data field */
    uint8_t Encryption_Method[MAX_ENCRYPTION_METHOD_LEN];    /**< Encryption method */
    uint8_t Rights_Issuer[MAX_RIGHTS_ISSUER_LEN];            /**< Rights issuer */
    uint8_t Content_Name[MAX_CONTENT_NAME_LEN];              /**< Content name */
    uint8_t ContentDescription[MAX_CONTENT_DESCRIPTION_LEN]; /**< Content description */
    uint8_t ContentVendor[MAX_CONTENT_VENDOR_LEN];           /**< Content vendor */
    uint8_t Icon_URI[MAX_ICON_URI_LEN];                      /**< Icon URI */
} T_DRM_DCF_Info;

/**
 * Parse the DRM content format data
 *
 * \param buffer            (in)Input the DCF format data
 * \param bufferLen         (in)The input buffer length
 * \param pDcfInfo          (out)A structure pointer which contain information of DCF headers
 * \param ppEncryptedData   (out)The location of encrypted data
 *
 * \return
 *      -TRUE, when success
 *      -FALSE, when failed
 */
int32_t drm_dcfParser(uint8_t *buffer, int32_t bufferLen, T_DRM_DCF_Info *pDcfInfo,
                      uint8_t **ppEncryptedData);

#ifdef __cplusplus
}
#endif

#endif /* __PARSER_DCF_H__ */