summaryrefslogtreecommitdiff
path: root/XMPFiles/source/FormatSupport/IFF/ChunkPath.h
diff options
context:
space:
mode:
Diffstat (limited to 'XMPFiles/source/FormatSupport/IFF/ChunkPath.h')
-rw-r--r--XMPFiles/source/FormatSupport/IFF/ChunkPath.h190
1 files changed, 190 insertions, 0 deletions
diff --git a/XMPFiles/source/FormatSupport/IFF/ChunkPath.h b/XMPFiles/source/FormatSupport/IFF/ChunkPath.h
new file mode 100644
index 0000000..c0f149b
--- /dev/null
+++ b/XMPFiles/source/FormatSupport/IFF/ChunkPath.h
@@ -0,0 +1,190 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2010 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#ifndef _ChunkPath_h_
+#define _ChunkPath_h_
+
+#include "public/include/XMP_Environment.h" // ! This must be the first include.
+#include "public/include/XMP_Const.h"
+
+#include <limits.h> // For UINT_MAX.
+#include <vector>
+
+namespace IFF_RIFF
+{
+
+/**
+ A ChunkPath describes one certain chunk in the hierarchy of chunks
+ of the IFF/RIFF file format.
+ Each chunks gets identified by a structure of the type ChunkIdentifier.
+ Which consists of the 4byte ID of the chunk and, if applicable, the 4byte
+ type of the chunk.
+*/
+
+// IFF/RIFF ids
+enum {
+ // invalid ID
+ kChunk_NONE = UINT_MAX,
+
+ // format chunks
+ kChunk_RIFF = 0x52494646,
+ kChunk_RF64 = 0x52463634,
+ kChunk_FORM = 0x464F524D,
+ kChunk_JUNK = 0x4A554E4B,
+ kChunk_JUNQ = 0x4A554E51,
+
+
+ // other container chunks
+ kChunk_LIST = 0x4C495354,
+
+ // other relevant chunks
+ kChunk_XMP = 0x5F504D58, // "_PMX"
+
+ kChunk_data = 0x64617461,
+
+ //should occur only in AVI
+ kChunk_Cr8r = 0x43723872,
+ kChunk_PrmL = 0x50726D4C,
+
+ //should occur only in WAV
+ kChunk_DISP = 0x44495350,
+ kChunk_bext = 0x62657874,
+ kChunk_cart = 0x63617274,
+ kChunk_ds64 = 0x64733634,
+
+ // AIFF
+ kChunk_APPL = 0x4150504C,
+ kChunk_NAME = 0x4E414D45,
+ kChunk_AUTH = 0x41555448,
+ kChunk_CPR = 0x28632920,
+ kChunk_ANNO = 0x414E4E4F
+};
+
+// IFF/RIFF types
+enum {
+ kType_AVI_ = 0x41564920,
+ kType_AVIX = 0x41564958,
+ kType_WAVE = 0x57415645,
+ kType_AIFF = 0x41494646,
+ kType_AIFC = 0x41494643,
+ kType_INFO = 0x494E464F,
+ kType_Tdat = 0x54646174,
+
+ // AIFF
+ kType_XMP = 0x584D5020,
+ kType_FREE = 0x46524545,
+
+ kType_NONE = UINT_MAX
+};
+
+
+struct ChunkIdentifier
+{
+ XMP_Uns32 id;
+ XMP_Uns32 type;
+};
+
+/**
+* calculates the size of a ChunkIdentifier array.
+* Has to be a macro as the sizeof operator does nto work for pointer function parameters
+*/
+#define SizeOfCIArray(ciArray) ( sizeof(ciArray) / sizeof(ChunkIdentifier) )
+
+
+class ChunkPath
+{
+public:
+ /**
+ ctor/dtor
+ */
+ ChunkPath( const ChunkIdentifier* path = NULL, XMP_Uns32 size = 0 );
+ ChunkPath( const ChunkPath& path );
+ ChunkPath( const ChunkIdentifier& identifier );
+ ~ChunkPath();
+
+ ChunkPath & operator=( const ChunkPath &rhs );
+
+ /**
+ Append a ChunkIdentifier to the end of the path
+
+ @param id 4byte id of chunk
+ @param type 4byte type of chunk
+ */
+ void append( XMP_Uns32 id, XMP_Uns32 type = kType_NONE );
+ void append( const ChunkIdentifier& identifier );
+
+ /**
+ Append a whole path
+
+ @param path Array of ChunkIdentifiert objects
+ @param size number of elements in the given array
+ */
+ void append( const ChunkIdentifier* path = NULL, XMP_Uns32 size = 0 );
+
+ /**
+ Insert an identifier
+
+ @param identifier id and type
+ @param pos position within the path
+ */
+ void insert( const ChunkIdentifier& identifier, XMP_Uns32 pos = 0 );
+
+ /**
+ Remove the endmost ChunkIdentifier from the path
+ */
+ void remove();
+ /**
+ Remove the ChunkIdentifier at the passed position in the path.
+ Throw exception if the position is out of range.
+
+ @param pos Position of ChunkIdentifier in the path
+ */
+ void removeAt( XMP_Int32 pos );
+
+ /**
+ Return ChunkIdentifier at the passed position
+
+ @param pos Position of ChunkIdentifier in the path
+ @return ChunkIdentifier at passed position (throw exception if
+ the position is out of range)
+ */
+ const ChunkIdentifier& identifier( XMP_Int32 pos ) const;
+
+ /**
+ Return the number of ChunkIdentifier's in the path
+ */
+ XMP_Int32 length() const;
+
+ /**
+ Remove all ChunkIdentifier's from the path
+ */
+ void clear();
+
+ /**
+ Compare the passed ChunkPath with this path.
+
+ @param path Path to compare with this path
+ @return Match result
+ */
+ enum MatchResult
+ {
+ kNoMatch = 0,
+ kPartMatch = 1,
+ kFullMatch = 2
+ };
+
+ MatchResult match( const ChunkPath& path ) const;
+
+private:
+ std::vector<ChunkIdentifier> mPath;
+};
+
+}
+
+#endif