40# if defined(__cplusplus) && __cplusplus >= 201103L
41# define OVERRIDE override
48# define LIBGIG_DEPRECATED_API(msg) __attribute__ ((deprecated(msg)))
50# define LIBGIG_DEPRECATED_API(msg)
68# include <sys/types.h>
74#if defined _MSC_VER && _MSC_VER < 1600
77typedef __int16 int16_t;
78typedef __int32 int32_t;
79typedef __int64 int64_t;
80typedef unsigned __int8 uint8_t;
81typedef unsigned __int16 uint16_t;
82typedef unsigned __int32 uint32_t;
83typedef unsigned __int64 uint64_t;
89# if (_WIN32 && !_WIN64) || (__GNUC__ && !(__x86_64__ || __ppc64__))
90# if _WIN32_WINNT < 0x0501
92# define _WIN32_WINNT 0x0501
96 typedef unsigned int uint;
102# define CHUNK_ID_RIFF 0x52494646
103# define CHUNK_ID_RIFX 0x52494658
104# define CHUNK_ID_LIST 0x4C495354
106# define LIST_TYPE_INFO 0x494E464F
107# define CHUNK_ID_ICMT 0x49434D54
108# define CHUNK_ID_ICOP 0x49434F50
109# define CHUNK_ID_ICRD 0x49435244
110# define CHUNK_ID_IENG 0x49454E47
111# define CHUNK_ID_INAM 0x494E414D
112# define CHUNK_ID_IPRD 0x49505244
113# define CHUNK_ID_ISFT 0x49534654
115# define CHUNK_ID_SMPL 0x736D706C
118# define CHUNK_ID_RIFF 0x46464952
119# define CHUNK_ID_RIFX 0x58464952
120# define CHUNK_ID_LIST 0x5453494C
122# define LIST_TYPE_INFO 0x4F464E49
123# define CHUNK_ID_ICMT 0x544D4349
124# define CHUNK_ID_ICOP 0x504F4349
125# define CHUNK_ID_ICRD 0x44524349
126# define CHUNK_ID_IENG 0x474E4549
127# define CHUNK_ID_INAM 0x4D414E49
128# define CHUNK_ID_IPRD 0x44525049
129# define CHUNK_ID_ISFT 0x54465349
131# define CHUNK_ID_SMPL 0x6C706D73
135#define CHUNK_HEADER_SIZE(fileOffsetSize) (4 + fileOffsetSize)
136#define LIST_HEADER_SIZE(fileOffsetSize) (8 + fileOffsetSize)
137#define RIFF_HEADER_SIZE(fileOffsetSize) (8 + fileOffsetSize)
165 typedef std::string String;
172 stream_mode_read = 0,
173 stream_mode_read_write = 1,
174 stream_mode_closed = 2
180 stream_end_reached = 1,
231 std::vector<progress_t>
subdivide(
int iSubtasks);
232 std::vector<progress_t>
subdivide(std::vector<float> vSubTaskPortions);
290 mutable std::map<std::thread::id,file_offset_t> byThread;
291 mutable std::mutex mutex;
295 Chunk(File* pFile, List* pParent, uint32_t uiChunkID,
file_offset_t ullBodySize);
299 inline static String convertToString(uint32_t word) {
301 for (
int i = 0; i < 4; i++) {
302 uint8_t
byte = *((uint8_t*)(&word) + i);
346 typedef std::map<uint32_t,
RIFF::
Chunk*> ChunkMap;
347 typedef std::vector<
Chunk*> ChunkList;
348 typedef std::set<
Chunk*> ChunkSet;
351 ChunkList* pSubChunks;
352 ChunkMap* pSubChunksMap;
353 ChunkList::iterator ChunksIterator;
354 ChunkList::iterator ListIterator;
360 void LoadSubChunks(
progress_t* pProgress = NULL);
361 void LoadSubChunksRecursively(
progress_t* pProgress = NULL);
365 void DeleteChunkList();
388 File(uint32_t FileType);
389 File(
const String& path);
394 String GetFileName()
const;
395 void SetFileName(
const String& path);
396 Handle FileHandle()
const;
402 int GetFileOffsetSize()
const;
403 int GetRequiredFileOffsetSize();
404 bool IsIOPerThread()
const;
405 void SetIOPerThread(
bool enable);
407 virtual void Save(
progress_t* pProgress = NULL);
408 virtual void Save(
const String& path,
progress_t* pProgress = NULL);
416 struct IO : HandlePair {
418 mutable std::map<std::thread::id,HandlePair> byThread;
419 mutable std::mutex mutex;
428 Handle FileWriteHandle()
const;
429 HandlePair FileHandlePair()
const;
434 void __openExistingFile(
const String& path, uint32_t* FileType = NULL);
445 HandlePair& FileHandlePairUnsafeRef();
446 bool SetModeInternal(
stream_mode_t NewMode,
bool* pResetPos);
463 static String assemble(String format, va_list arg);
File * GetFile() const
Returns pointer to the chunk's File object.
List * GetParent() const
Returns pointer to the chunk's parent list chunk.
file_offset_t WriteInt16(int16_t *pData, file_offset_t WordCount=1)
Writes WordCount number of 16 Bit signed integer words from the buffer pointed by pData to the chunk'...
virtual void __resetPos()
Sets Chunk's read/write position to zero.
void Resize(file_offset_t NewSize)
Resize chunk.
int8_t ReadInt8()
Reads one 8 Bit signed integer word and increments the position within the chunk.
uint32_t ReadUint32()
Reads one 32 Bit unsigned integer word and increments the position within the chunk.
stream_state_t GetState() const
Returns the current state of the chunk object.
file_offset_t SetPos(file_offset_t Where, stream_whence_t Whence=stream_start)
Sets the position within the chunk body, thus within the data portion of the chunk (in bytes).
file_offset_t GetFilePos() const
Current, actual offset in file of current chunk data body read/write position.
void ReleaseChunkData()
Free loaded chunk body from RAM.
file_offset_t Write(void *pData, file_offset_t WordCount, file_offset_t WordSize)
Writes WordCount number of data words with given WordSize from the buffer pointed by pData.
file_offset_t RemainingBytes() const
Returns the number of bytes left to read in the chunk body.
int16_t ReadInt16()
Reads one 16 Bit signed integer word and increments the position within the chunk.
virtual file_offset_t WriteChunk(file_offset_t ullWritePos, file_offset_t ullCurrentDataOffset, progress_t *pProgress=NULL)
Write chunk persistently e.g.
file_offset_t GetPos() const
Current read/write position within the chunk data body (starting with 0).
file_offset_t WriteInt32(int32_t *pData, file_offset_t WordCount=1)
Writes WordCount number of 32 Bit signed integer words from the buffer pointed by pData to the chunk'...
file_offset_t ReadSceptical(void *pData, file_offset_t WordCount, file_offset_t WordSize)
Just an internal wrapper for the main Read() method with additional Exception throwing on errors.
virtual file_offset_t RequiredPhysicalSize(int fileOffsetSize)
Returns the actual total size in bytes (including header) of this Chunk if being stored to a file.
file_offset_t Read(void *pData, file_offset_t WordCount, file_offset_t WordSize)
Reads WordCount number of data words with given WordSize and copies it into a buffer pointed by pData...
uint32_t GetChunkID() const
Chunk ID in unsigned integer representation.
void * LoadChunkData()
Load chunk body into RAM.
String GetChunkIDString() const
Returns the String representation of the chunk's ID (e.g.
uint8_t ReadUint8()
Reads one 8 Bit unsigned integer word and increments the position within the chunk.
file_offset_t WriteInt8(int8_t *pData, file_offset_t WordCount=1)
Writes WordCount number of 8 Bit signed integer words from the buffer pointed by pData to the chunk's...
file_offset_t WriteUint16(uint16_t *pData, file_offset_t WordCount=1)
Writes WordCount number of 16 Bit unsigned integer words from the buffer pointed by pData to the chun...
file_offset_t WriteUint32(uint32_t *pData, file_offset_t WordCount=1)
Writes WordCount number of 32 Bit unsigned integer words from the buffer pointed by pData to the chun...
void ReadString(String &s, int size)
Reads a null-padded string of size characters and copies it into the string s.
uint16_t ReadUint16()
Reads one 16 Bit unsigned integer word and increments the position within the chunk.
file_offset_t GetSize() const
Chunk size in bytes (without header, thus the chunk data body)
int32_t ReadInt32()
Reads one 32 Bit signed integer word and increments the position within the chunk.
file_offset_t WriteUint8(uint8_t *pData, file_offset_t WordCount=1)
Writes WordCount number of 8 Bit unsigned integer words from the buffer pointed by pData to the chunk...
file_offset_t GetNewSize() const
New chunk size if it was modified with Resize(), otherwise value returned will be equal to GetSize().
Will be thrown whenever an error occurs while handling a RIFF file.
layout_t Layout
An ordinary RIFF file is always set to layout_standard.
int Handle
OS dependent type serving as file handle / descriptor for OS dependent file I/O operations.
int FileOffsetSize
Size of file offsets (in bytes) when this file was opened (or saved the last time).
size_t CountSubLists()
Returns number of sublists within the list.
Chunk * GetSubChunk(uint32_t ChunkID)
Returns subchunk with chunk ID ChunkID within this chunk list.
virtual file_offset_t RequiredPhysicalSize(int fileOffsetSize)
Returns the actual total size in bytes (including List chunk header and all subchunks) of this List C...
void MoveSubChunk(Chunk *pSrc, Chunk *pDst)
Moves a sub chunk witin this list.
List * GetFirstSubList()
Returns the first sublist within the list (that is a subchunk with chunk ID "LIST").
List * AddSubList(uint32_t uiListType)
Creates a new list sub chunk.
Chunk * GetFirstSubChunk()
Returns the first subchunk within the list (which may be an ordinary chunk as well as a list chunk).
virtual file_offset_t WriteChunk(file_offset_t ullWritePos, file_offset_t ullCurrentDataOffset, progress_t *pProgress=NULL)
Write list chunk persistently e.g.
void DeleteSubChunk(Chunk *pSubChunk)
Removes a sub chunk.
List * GetSubListAt(size_t pos)
Returns sublist chunk with list type ListType at supplied pos position among all subchunks of type Li...
size_t CountSubChunks()
Returns number of subchunks within the list (including list chunks).
List * GetSubList(uint32_t ListType)
Returns sublist chunk with list type ListType within this chunk list.
Chunk * GetNextSubChunk()
Returns the next subchunk within the list (which may be an ordinary chunk as well as a list chunk).
uint32_t GetListType() const
Returns unsigned integer representation of the list's ID.
String GetListTypeString() const
Returns string representation of the lists's id.
List * GetNextSubList()
Returns the next sublist (that is a subchunk with chunk ID "LIST") within the list.
Chunk * AddSubChunk(uint32_t uiChunkID, file_offset_t ullBodySize)
Creates a new sub chunk.
virtual void __resetPos()
Sets List Chunk's read/write position to zero and causes all sub chunks to do the same.
Chunk * GetSubChunkAt(size_t pos)
Returns subchunk at supplied pos position within this chunk list.
RIFF specific classes and definitions.
String libraryVersion()
Returns version of this C++ library.
stream_whence_t
File stream position dependent to these relations.
stream_state_t
Current state of the file stream.
String libraryName()
Returns the name of this C++ library.
offset_size_t
Size of RIFF file offsets used in all RIFF chunks' headers.
@ offset_size_64bit
Always use 64 bit offsets (even for files smaller than 4 GB).
@ offset_size_auto
Use 32 bit offsets for files smaller than 4 GB, use 64 bit offsets for files equal or larger than 4 G...
@ offset_size_32bit
Always use 32 bit offsets (even for files larger than 4 GB).
stream_mode_t
Whether file stream is open in read or in read/write mode.
layout_t
General RIFF chunk structure of a RIFF file.
@ layout_standard
Standard RIFF file layout: First chunk in file is a List chunk which contains all other chunks and th...
@ layout_flat
Not a "real" RIFF file: First chunk in file is an ordinary data chunk, not a List chunk,...
endian_t
Alignment of data bytes in memory (system dependant).
uint64_t file_offset_t
Type used by libgig for handling file positioning during file I/O tasks.
Used for indicating the progress of a certain task.
float __range_min
Only for internal usage, do not modify!
std::vector< progress_t > subdivide(int iSubtasks)
Divides this progress task into the requested amount of equal weighted sub-progress tasks and returns...
void(* callback)(progress_t *)
Callback function pointer which has to be assigned to a function for progress notification.
float factor
Reflects current progress as value between 0.0 and 1.0.
void * custom
This pointer can be used for arbitrary data.
float __range_max
Only for internal usage, do not modify!