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

#include <Drm2CommonTypes.h>
#include <uvector.h>
#include <dcf/DrmIStream.h>
#include <dcf/DrmDcfCommon.h>

class DrmInStream;

/////////dcf container
class DcfContainer : public FullBox
{
public:
    friend class DrmInStream;

    /** default constructor of DcfContainer */
    DcfContainer(istream& inRawData):FullBox(NULL),mConStream(inRawData){}

    /**
     * constructor for DcfContainer, used to parse DCF container
     * \param data  DCF container data
     * \param len   DCF container data len
     * \param off   the offset from the start of DCF container
     */
    DcfContainer(const uint8_t* data,istream& inRawData,uint64_t conOff);

    /** Destructor for DcfContainer */
    ~DcfContainer();

    /**
     * get the content type of one content
     * \param none
     * \return
     *   the content type
     */
    string getContentType(void) const;

    /**
     * get the encryption method apply to content
     * \param none
     * \return
     *   the encryption method
     */
    uint8_t getEncryptionMethod(void) const;

    /**
     * get the padding scheme apply to content
     * \param none
     * \return
     *   the padding scheme
     */
    uint8_t getPaddingScheme(void) const;

    /**
     * get the length of plain content
     * \param none
     * \return
     *   the length of plain content
     */
    uint64_t getPlaintextLength(void) const;

    /**
     * get the length of content ID
     * \param none
     * \return
     *   the length of content ID
     */
    uint16_t getContentIDLength(void) const;

    /**
     * get the length of rights issuer URL
     * \param none
     * \return
     *   the length of rights issuer URL
     */
    uint16_t getRightsIssuerURLLength(void) const;

    /**
     * get the length of textal header
     * \param none
     * \return
     *   the length of textal header
     */
    uint16_t getTextualHeadersLength(void) const;

    /**
     * get the content ID of one content
     * \param none
     * \return
     *   the content ID
     */
    string getContentID(void) const;

    /**
     * get the rights issuer URL
     * \param none
     * \return
     *   the rights issuer URL
     */
    string getRightsIssuerURL(void) const;

    /**
     * get the preview method
     * \param none
     * \return
     *   the preview method
     */
    string getPreviewMethod(void) const;

    /**
     * get the location of content
     * \param none
     * \return
     *   the location of content
     */
    string getContentLocation(void) const;

    /**
     * get the URL of content
     * \param none
     * \return
     *   the URL of content
     */
    string getContentURL(void) const;

    /**
     * get the customer head
     * \param none
     * \return
     *   the customer head
     */
    vector<string> getCustomerHead(void) const;

    /**
     * get the preview element data
     * \param none
     * \return
     *   the DRM Instream of preview element data
     */
    DrmInStream getPreviewElementData(void) const;

    /**
     * get the plain content
     * \param none
     * \return
     *   the DRM Instream of plain content
     */
    DrmInStream getDecryptContent(uint8_t* decryptKey) const;

    /**
     * get the istream of DCF
     * \param none
     * \return
     *   the istream of DCF
     */
    istream& getStream(void) const;

PRIVATE:
    static const uint32_t USER_DATA_FLAG = 0x01;

    uint8_t mContentTypeLen;
    string mContentType;
    uint8_t mEncryptionMethod;
    uint8_t mPaddingScheme;
    uint64_t mPlaintextLength;
    uint16_t mContentIDLength;
    uint16_t mRightsIssuerURLLength;
    uint16_t mTextualHeadersLength;
    string mContentID;
    string mRightsIssuerURL;
    vector<TextualHeader*> mTextualHeaders;
    bool mSilentFirst;
    string mSlientMethod;
    string mSilentRightsURL;
    string mPreviewMethod;
    string mPreviewElementURI;
    string mPreviewRightsURL;
    string mContentURL;
    string mContentVersion;
    string mContentLocation;
    vector<string> mCustomHeader;
    bool mHasUserData;
    uint64_t mDataLen;
    istream& mConStream;
    uint64_t mDecOffset;

PRIVATE:
    // parse text header
    bool parseTextualHeaders(const uint8_t* data, uint32_t len);
    void copy(const DcfContainer& container);
    DcfContainer(const DcfContainer& container):FullBox(NULL),mConStream(container.mConStream){}
    DcfContainer& operator=(const DcfContainer& other){return *this;}
};


#endif