/*
 * The contents of this file are subject to the Mozilla Public
 * License Version 1.1 (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.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 * The Original Code is MPEG4IP.
 *
 * The Initial Developer of the Original Code is Cisco Systems Inc.
 * Portions created by Cisco Systems Inc. are
 * Copyright (C) Cisco Systems Inc. 2001.  All Rights Reserved.
 *
 * Contributor(s):
 *      Dave Mackie     dmackie@cisco.com
 */

#ifndef MP4V2_IMPL_MP4DESCRIPTOR_H
#define MP4V2_IMPL_MP4DESCRIPTOR_H

namespace mp4v2 {
namespace impl {

///////////////////////////////////////////////////////////////////////////////

class MP4Descriptor {
public:
    MP4Descriptor(MP4Atom& parentAtom, uint8_t tag = 0);

    virtual ~MP4Descriptor();

    uint8_t GetTag() {
        return m_tag;
    }
    void SetTag(uint8_t tag) {
        m_tag = tag;
    }

    void AddProperty(MP4Property* pProperty);

    virtual void Generate();
    virtual void Read(MP4File& file);
    virtual void Write(MP4File& file);
    virtual void Dump(uint8_t indent, bool dumpImplicits);

    MP4Property* GetProperty(uint32_t index) {
        return m_pProperties[index];
    }

    // use with extreme caution
    void SetProperty(uint32_t index, MP4Property* pProperty) {
        m_pProperties[index] = pProperty;
    }

    bool FindProperty( const char* name, MP4Property** ppProperty,
                       uint32_t* pIndex = NULL)
    {
        return FindContainedProperty(name, ppProperty, pIndex);
    }

    void WriteToMemory(MP4File& file,
                       uint8_t** ppBytes, uint64_t* pNumBytes);

protected:
    void SetReadMutate(uint32_t propIndex) {
        m_readMutatePoint = propIndex;
    }

    void ReadHeader(MP4File& file);
    void ReadProperties(MP4File& file,
                        uint32_t startIndex = 0, uint32_t count = 0xFFFFFFFF);

    virtual void Mutate() {
        // default is a no-op
    };

    bool FindContainedProperty(const char* name,
                               MP4Property** ppProperty, uint32_t* pIndex);

    uint8_t GetDepth();

protected:
    MP4Atom&            m_parentAtom;
    uint8_t             m_tag;
    uint64_t            m_start;
    uint32_t            m_size;
    MP4PropertyArray    m_pProperties;
    uint32_t            m_readMutatePoint;
private:
    MP4Descriptor();
    MP4Descriptor ( const MP4Descriptor &src );
    MP4Descriptor &operator= ( const MP4Descriptor &src );
};

///////////////////////////////////////////////////////////////////////////////

}
} // namespace mp4v2::impl

#endif // MP4V2_IMPL_MP4DESCRIPTOR_H
