2 |
* * |
* * |
3 |
* libgig - C++ cross-platform Gigasampler format file access library * |
* libgig - C++ cross-platform Gigasampler format file access library * |
4 |
* * |
* * |
5 |
* Copyright (C) 2003-2016 by Christian Schoenebeck * |
* Copyright (C) 2003-2018 by Christian Schoenebeck * |
6 |
* <cuse@users.sourceforge.net> * |
* <cuse@users.sourceforge.net> * |
7 |
* * |
* * |
8 |
* This library is free software; you can redistribute it and/or modify * |
* This library is free software; you can redistribute it and/or modify * |
70 |
// * |
// * |
71 |
|
|
72 |
Chunk::Chunk(File* pFile) { |
Chunk::Chunk(File* pFile) { |
73 |
#if DEBUG |
#if DEBUG_RIFF |
74 |
std::cout << "Chunk::Chunk(File* pFile)" << std::endl; |
std::cout << "Chunk::Chunk(File* pFile)" << std::endl; |
75 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
76 |
ullPos = 0; |
ullPos = 0; |
77 |
pParent = NULL; |
pParent = NULL; |
78 |
pChunkData = NULL; |
pChunkData = NULL; |
84 |
} |
} |
85 |
|
|
86 |
Chunk::Chunk(File* pFile, file_offset_t StartPos, List* Parent) { |
Chunk::Chunk(File* pFile, file_offset_t StartPos, List* Parent) { |
87 |
#if DEBUG |
#if DEBUG_RIFF |
88 |
std::cout << "Chunk::Chunk(File*,file_offset_t,List*),StartPos=" << StartPos << std::endl; |
std::cout << "Chunk::Chunk(File*,file_offset_t,List*),StartPos=" << StartPos << std::endl; |
89 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
90 |
this->pFile = pFile; |
this->pFile = pFile; |
91 |
ullStartPos = StartPos + CHUNK_HEADER_SIZE(pFile->FileOffsetSize); |
ullStartPos = StartPos + CHUNK_HEADER_SIZE(pFile->FileOffsetSize); |
92 |
pParent = Parent; |
pParent = Parent; |
115 |
} |
} |
116 |
|
|
117 |
void Chunk::ReadHeader(file_offset_t filePos) { |
void Chunk::ReadHeader(file_offset_t filePos) { |
118 |
#if DEBUG |
#if DEBUG_RIFF |
119 |
std::cout << "Chunk::Readheader(" << filePos << ") "; |
std::cout << "Chunk::Readheader(" << filePos << ") "; |
120 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
121 |
ChunkID = 0; |
ChunkID = 0; |
122 |
ullNewChunkSize = ullCurrentChunkSize = 0; |
ullNewChunkSize = ullCurrentChunkSize = 0; |
123 |
#if POSIX |
#if POSIX |
153 |
else |
else |
154 |
swapBytes_64(&ullCurrentChunkSize); |
swapBytes_64(&ullCurrentChunkSize); |
155 |
} |
} |
156 |
#if DEBUG |
#if DEBUG_RIFF |
157 |
std::cout << "ckID=" << convertToString(ChunkID) << " "; |
std::cout << "ckID=" << convertToString(ChunkID) << " "; |
158 |
std::cout << "ckSize=" << ullCurrentChunkSize << " "; |
std::cout << "ckSize=" << ullCurrentChunkSize << " "; |
159 |
std::cout << "bEndianNative=" << pFile->bEndianNative << std::endl; |
std::cout << "bEndianNative=" << pFile->bEndianNative << std::endl; |
160 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
161 |
ullNewChunkSize = ullCurrentChunkSize; |
ullNewChunkSize = ullCurrentChunkSize; |
162 |
} |
} |
163 |
} |
} |
222 |
* data |
* data |
223 |
*/ |
*/ |
224 |
file_offset_t Chunk::SetPos(file_offset_t Where, stream_whence_t Whence) { |
file_offset_t Chunk::SetPos(file_offset_t Where, stream_whence_t Whence) { |
225 |
#if DEBUG |
#if DEBUG_RIFF |
226 |
std::cout << "Chunk::SetPos(file_offset_t,stream_whence_t)" << std::endl; |
std::cout << "Chunk::SetPos(file_offset_t,stream_whence_t)" << std::endl; |
227 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
228 |
switch (Whence) { |
switch (Whence) { |
229 |
case stream_curpos: |
case stream_curpos: |
230 |
ullPos += Where; |
ullPos += Where; |
254 |
* @returns number of bytes left to read |
* @returns number of bytes left to read |
255 |
*/ |
*/ |
256 |
file_offset_t Chunk::RemainingBytes() const { |
file_offset_t Chunk::RemainingBytes() const { |
257 |
#if DEBUG |
#if DEBUG_RIFF |
258 |
std::cout << "Chunk::Remainingbytes()=" << ullCurrentChunkSize - ullPos << std::endl; |
std::cout << "Chunk::Remainingbytes()=" << ullCurrentChunkSize - ullPos << std::endl; |
259 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
260 |
return (ullCurrentChunkSize > ullPos) ? ullCurrentChunkSize - ullPos : 0; |
return (ullCurrentChunkSize > ullPos) ? ullCurrentChunkSize - ullPos : 0; |
261 |
} |
} |
262 |
|
|
285 |
* possible without SetPos() |
* possible without SetPos() |
286 |
*/ |
*/ |
287 |
stream_state_t Chunk::GetState() const { |
stream_state_t Chunk::GetState() const { |
288 |
#if DEBUG |
#if DEBUG_RIFF |
289 |
std::cout << "Chunk::GetState()" << std::endl; |
std::cout << "Chunk::GetState()" << std::endl; |
290 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
291 |
#if POSIX |
#if POSIX |
292 |
if (pFile->hFileRead == 0) return stream_closed; |
if (pFile->hFileRead == 0) return stream_closed; |
293 |
#elif defined (WIN32) |
#elif defined (WIN32) |
316 |
* of file reached or error occurred |
* of file reached or error occurred |
317 |
*/ |
*/ |
318 |
file_offset_t Chunk::Read(void* pData, file_offset_t WordCount, file_offset_t WordSize) { |
file_offset_t Chunk::Read(void* pData, file_offset_t WordCount, file_offset_t WordSize) { |
319 |
#if DEBUG |
#if DEBUG_RIFF |
320 |
std::cout << "Chunk::Read(void*,file_offset_t,file_offset_t)" << std::endl; |
std::cout << "Chunk::Read(void*,file_offset_t,file_offset_t)" << std::endl; |
321 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
322 |
//if (ulStartPos == 0) return 0; // is only 0 if this is a new chunk, so nothing to read (yet) |
//if (ulStartPos == 0) return 0; // is only 0 if this is a new chunk, so nothing to read (yet) |
323 |
if (ullPos >= ullCurrentChunkSize) return 0; |
if (ullPos >= ullCurrentChunkSize) return 0; |
324 |
if (ullPos + WordCount * WordSize >= ullCurrentChunkSize) WordCount = (ullCurrentChunkSize - ullPos) / WordSize; |
if (ullPos + WordCount * WordSize >= ullCurrentChunkSize) WordCount = (ullCurrentChunkSize - ullPos) / WordSize; |
326 |
if (lseek(pFile->hFileRead, ullStartPos + ullPos, SEEK_SET) < 0) return 0; |
if (lseek(pFile->hFileRead, ullStartPos + ullPos, SEEK_SET) < 0) return 0; |
327 |
ssize_t readWords = read(pFile->hFileRead, pData, WordCount * WordSize); |
ssize_t readWords = read(pFile->hFileRead, pData, WordCount * WordSize); |
328 |
if (readWords < 1) { |
if (readWords < 1) { |
329 |
#if DEBUG |
#if DEBUG_RIFF |
330 |
std::cerr << "POSIX read() failed: " << strerror(errno) << std::endl << std::flush; |
std::cerr << "POSIX read() failed: " << strerror(errno) << std::endl << std::flush; |
331 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
332 |
return 0; |
return 0; |
333 |
} |
} |
334 |
readWords /= WordSize; |
readWords /= WordSize; |
459 |
* \a WordCount integers could be read! |
* \a WordCount integers could be read! |
460 |
*/ |
*/ |
461 |
file_offset_t Chunk::ReadInt8(int8_t* pData, file_offset_t WordCount) { |
file_offset_t Chunk::ReadInt8(int8_t* pData, file_offset_t WordCount) { |
462 |
#if DEBUG |
#if DEBUG_RIFF |
463 |
std::cout << "Chunk::ReadInt8(int8_t*,file_offset_t)" << std::endl; |
std::cout << "Chunk::ReadInt8(int8_t*,file_offset_t)" << std::endl; |
464 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
465 |
return ReadSceptical(pData, WordCount, 1); |
return ReadSceptical(pData, WordCount, 1); |
466 |
} |
} |
467 |
|
|
496 |
* \a WordCount integers could be read! |
* \a WordCount integers could be read! |
497 |
*/ |
*/ |
498 |
file_offset_t Chunk::ReadUint8(uint8_t* pData, file_offset_t WordCount) { |
file_offset_t Chunk::ReadUint8(uint8_t* pData, file_offset_t WordCount) { |
499 |
#if DEBUG |
#if DEBUG_RIFF |
500 |
std::cout << "Chunk::ReadUint8(uint8_t*,file_offset_t)" << std::endl; |
std::cout << "Chunk::ReadUint8(uint8_t*,file_offset_t)" << std::endl; |
501 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
502 |
return ReadSceptical(pData, WordCount, 1); |
return ReadSceptical(pData, WordCount, 1); |
503 |
} |
} |
504 |
|
|
533 |
* \a WordCount integers could be read! |
* \a WordCount integers could be read! |
534 |
*/ |
*/ |
535 |
file_offset_t Chunk::ReadInt16(int16_t* pData, file_offset_t WordCount) { |
file_offset_t Chunk::ReadInt16(int16_t* pData, file_offset_t WordCount) { |
536 |
#if DEBUG |
#if DEBUG_RIFF |
537 |
std::cout << "Chunk::ReadInt16(int16_t*,file_offset_t)" << std::endl; |
std::cout << "Chunk::ReadInt16(int16_t*,file_offset_t)" << std::endl; |
538 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
539 |
return ReadSceptical(pData, WordCount, 2); |
return ReadSceptical(pData, WordCount, 2); |
540 |
} |
} |
541 |
|
|
570 |
* \a WordCount integers could be read! |
* \a WordCount integers could be read! |
571 |
*/ |
*/ |
572 |
file_offset_t Chunk::ReadUint16(uint16_t* pData, file_offset_t WordCount) { |
file_offset_t Chunk::ReadUint16(uint16_t* pData, file_offset_t WordCount) { |
573 |
#if DEBUG |
#if DEBUG_RIFF |
574 |
std::cout << "Chunk::ReadUint16(uint16_t*,file_offset_t)" << std::endl; |
std::cout << "Chunk::ReadUint16(uint16_t*,file_offset_t)" << std::endl; |
575 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
576 |
return ReadSceptical(pData, WordCount, 2); |
return ReadSceptical(pData, WordCount, 2); |
577 |
} |
} |
578 |
|
|
607 |
* \a WordCount integers could be read! |
* \a WordCount integers could be read! |
608 |
*/ |
*/ |
609 |
file_offset_t Chunk::ReadInt32(int32_t* pData, file_offset_t WordCount) { |
file_offset_t Chunk::ReadInt32(int32_t* pData, file_offset_t WordCount) { |
610 |
#if DEBUG |
#if DEBUG_RIFF |
611 |
std::cout << "Chunk::ReadInt32(int32_t*,file_offset_t)" << std::endl; |
std::cout << "Chunk::ReadInt32(int32_t*,file_offset_t)" << std::endl; |
612 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
613 |
return ReadSceptical(pData, WordCount, 4); |
return ReadSceptical(pData, WordCount, 4); |
614 |
} |
} |
615 |
|
|
644 |
* \a WordCount integers could be read! |
* \a WordCount integers could be read! |
645 |
*/ |
*/ |
646 |
file_offset_t Chunk::ReadUint32(uint32_t* pData, file_offset_t WordCount) { |
file_offset_t Chunk::ReadUint32(uint32_t* pData, file_offset_t WordCount) { |
647 |
#if DEBUG |
#if DEBUG_RIFF |
648 |
std::cout << "Chunk::ReadUint32(uint32_t*,file_offset_t)" << std::endl; |
std::cout << "Chunk::ReadUint32(uint32_t*,file_offset_t)" << std::endl; |
649 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
650 |
return ReadSceptical(pData, WordCount, 4); |
return ReadSceptical(pData, WordCount, 4); |
651 |
} |
} |
652 |
|
|
693 |
* @throws RIFF::Exception if an error occurred |
* @throws RIFF::Exception if an error occurred |
694 |
*/ |
*/ |
695 |
int8_t Chunk::ReadInt8() { |
int8_t Chunk::ReadInt8() { |
696 |
#if DEBUG |
#if DEBUG_RIFF |
697 |
std::cout << "Chunk::ReadInt8()" << std::endl; |
std::cout << "Chunk::ReadInt8()" << std::endl; |
698 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
699 |
int8_t word; |
int8_t word; |
700 |
ReadSceptical(&word,1,1); |
ReadSceptical(&word,1,1); |
701 |
return word; |
return word; |
709 |
* @throws RIFF::Exception if an error occurred |
* @throws RIFF::Exception if an error occurred |
710 |
*/ |
*/ |
711 |
uint8_t Chunk::ReadUint8() { |
uint8_t Chunk::ReadUint8() { |
712 |
#if DEBUG |
#if DEBUG_RIFF |
713 |
std::cout << "Chunk::ReadUint8()" << std::endl; |
std::cout << "Chunk::ReadUint8()" << std::endl; |
714 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
715 |
uint8_t word; |
uint8_t word; |
716 |
ReadSceptical(&word,1,1); |
ReadSceptical(&word,1,1); |
717 |
return word; |
return word; |
726 |
* @throws RIFF::Exception if an error occurred |
* @throws RIFF::Exception if an error occurred |
727 |
*/ |
*/ |
728 |
int16_t Chunk::ReadInt16() { |
int16_t Chunk::ReadInt16() { |
729 |
#if DEBUG |
#if DEBUG_RIFF |
730 |
std::cout << "Chunk::ReadInt16()" << std::endl; |
std::cout << "Chunk::ReadInt16()" << std::endl; |
731 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
732 |
int16_t word; |
int16_t word; |
733 |
ReadSceptical(&word,1,2); |
ReadSceptical(&word,1,2); |
734 |
return word; |
return word; |
743 |
* @throws RIFF::Exception if an error occurred |
* @throws RIFF::Exception if an error occurred |
744 |
*/ |
*/ |
745 |
uint16_t Chunk::ReadUint16() { |
uint16_t Chunk::ReadUint16() { |
746 |
#if DEBUG |
#if DEBUG_RIFF |
747 |
std::cout << "Chunk::ReadUint16()" << std::endl; |
std::cout << "Chunk::ReadUint16()" << std::endl; |
748 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
749 |
uint16_t word; |
uint16_t word; |
750 |
ReadSceptical(&word,1,2); |
ReadSceptical(&word,1,2); |
751 |
return word; |
return word; |
760 |
* @throws RIFF::Exception if an error occurred |
* @throws RIFF::Exception if an error occurred |
761 |
*/ |
*/ |
762 |
int32_t Chunk::ReadInt32() { |
int32_t Chunk::ReadInt32() { |
763 |
#if DEBUG |
#if DEBUG_RIFF |
764 |
std::cout << "Chunk::ReadInt32()" << std::endl; |
std::cout << "Chunk::ReadInt32()" << std::endl; |
765 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
766 |
int32_t word; |
int32_t word; |
767 |
ReadSceptical(&word,1,4); |
ReadSceptical(&word,1,4); |
768 |
return word; |
return word; |
777 |
* @throws RIFF::Exception if an error occurred |
* @throws RIFF::Exception if an error occurred |
778 |
*/ |
*/ |
779 |
uint32_t Chunk::ReadUint32() { |
uint32_t Chunk::ReadUint32() { |
780 |
#if DEBUG |
#if DEBUG_RIFF |
781 |
std::cout << "Chunk::ReadUint32()" << std::endl; |
std::cout << "Chunk::ReadUint32()" << std::endl; |
782 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
783 |
uint32_t word; |
uint32_t word; |
784 |
ReadSceptical(&word,1,4); |
ReadSceptical(&word,1,4); |
785 |
return word; |
return word; |
1008 |
// * |
// * |
1009 |
|
|
1010 |
List::List(File* pFile) : Chunk(pFile) { |
List::List(File* pFile) : Chunk(pFile) { |
1011 |
#if DEBUG |
#if DEBUG_RIFF |
1012 |
std::cout << "List::List(File* pFile)" << std::endl; |
std::cout << "List::List(File* pFile)" << std::endl; |
1013 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
1014 |
pSubChunks = NULL; |
pSubChunks = NULL; |
1015 |
pSubChunksMap = NULL; |
pSubChunksMap = NULL; |
1016 |
} |
} |
1017 |
|
|
1018 |
List::List(File* pFile, file_offset_t StartPos, List* Parent) |
List::List(File* pFile, file_offset_t StartPos, List* Parent) |
1019 |
: Chunk(pFile, StartPos, Parent) { |
: Chunk(pFile, StartPos, Parent) { |
1020 |
#if DEBUG |
#if DEBUG_RIFF |
1021 |
std::cout << "List::List(File*,file_offset_t,List*)" << std::endl; |
std::cout << "List::List(File*,file_offset_t,List*)" << std::endl; |
1022 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
1023 |
pSubChunks = NULL; |
pSubChunks = NULL; |
1024 |
pSubChunksMap = NULL; |
pSubChunksMap = NULL; |
1025 |
ReadHeader(StartPos); |
ReadHeader(StartPos); |
1034 |
} |
} |
1035 |
|
|
1036 |
List::~List() { |
List::~List() { |
1037 |
#if DEBUG |
#if DEBUG_RIFF |
1038 |
std::cout << "List::~List()" << std::endl; |
std::cout << "List::~List()" << std::endl; |
1039 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
1040 |
DeleteChunkList(); |
DeleteChunkList(); |
1041 |
} |
} |
1042 |
|
|
1069 |
* that ID |
* that ID |
1070 |
*/ |
*/ |
1071 |
Chunk* List::GetSubChunk(uint32_t ChunkID) { |
Chunk* List::GetSubChunk(uint32_t ChunkID) { |
1072 |
#if DEBUG |
#if DEBUG_RIFF |
1073 |
std::cout << "List::GetSubChunk(uint32_t)" << std::endl; |
std::cout << "List::GetSubChunk(uint32_t)" << std::endl; |
1074 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
1075 |
if (!pSubChunksMap) LoadSubChunks(); |
if (!pSubChunksMap) LoadSubChunks(); |
1076 |
return (*pSubChunksMap)[ChunkID]; |
return (*pSubChunksMap)[ChunkID]; |
1077 |
} |
} |
1088 |
* that type |
* that type |
1089 |
*/ |
*/ |
1090 |
List* List::GetSubList(uint32_t ListType) { |
List* List::GetSubList(uint32_t ListType) { |
1091 |
#if DEBUG |
#if DEBUG_RIFF |
1092 |
std::cout << "List::GetSubList(uint32_t)" << std::endl; |
std::cout << "List::GetSubList(uint32_t)" << std::endl; |
1093 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
1094 |
if (!pSubChunks) LoadSubChunks(); |
if (!pSubChunks) LoadSubChunks(); |
1095 |
ChunkList::iterator iter = pSubChunks->begin(); |
ChunkList::iterator iter = pSubChunks->begin(); |
1096 |
ChunkList::iterator end = pSubChunks->end(); |
ChunkList::iterator end = pSubChunks->end(); |
1114 |
* otherwise |
* otherwise |
1115 |
*/ |
*/ |
1116 |
Chunk* List::GetFirstSubChunk() { |
Chunk* List::GetFirstSubChunk() { |
1117 |
#if DEBUG |
#if DEBUG_RIFF |
1118 |
std::cout << "List::GetFirstSubChunk()" << std::endl; |
std::cout << "List::GetFirstSubChunk()" << std::endl; |
1119 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
1120 |
if (!pSubChunks) LoadSubChunks(); |
if (!pSubChunks) LoadSubChunks(); |
1121 |
ChunksIterator = pSubChunks->begin(); |
ChunksIterator = pSubChunks->begin(); |
1122 |
return (ChunksIterator != pSubChunks->end()) ? *ChunksIterator : NULL; |
return (ChunksIterator != pSubChunks->end()) ? *ChunksIterator : NULL; |
1131 |
* end of list is reached |
* end of list is reached |
1132 |
*/ |
*/ |
1133 |
Chunk* List::GetNextSubChunk() { |
Chunk* List::GetNextSubChunk() { |
1134 |
#if DEBUG |
#if DEBUG_RIFF |
1135 |
std::cout << "List::GetNextSubChunk()" << std::endl; |
std::cout << "List::GetNextSubChunk()" << std::endl; |
1136 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
1137 |
if (!pSubChunks) return NULL; |
if (!pSubChunks) return NULL; |
1138 |
ChunksIterator++; |
ChunksIterator++; |
1139 |
return (ChunksIterator != pSubChunks->end()) ? *ChunksIterator : NULL; |
return (ChunksIterator != pSubChunks->end()) ? *ChunksIterator : NULL; |
1149 |
* otherwise |
* otherwise |
1150 |
*/ |
*/ |
1151 |
List* List::GetFirstSubList() { |
List* List::GetFirstSubList() { |
1152 |
#if DEBUG |
#if DEBUG_RIFF |
1153 |
std::cout << "List::GetFirstSubList()" << std::endl; |
std::cout << "List::GetFirstSubList()" << std::endl; |
1154 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
1155 |
if (!pSubChunks) LoadSubChunks(); |
if (!pSubChunks) LoadSubChunks(); |
1156 |
ListIterator = pSubChunks->begin(); |
ListIterator = pSubChunks->begin(); |
1157 |
ChunkList::iterator end = pSubChunks->end(); |
ChunkList::iterator end = pSubChunks->end(); |
1171 |
* end of list is reached |
* end of list is reached |
1172 |
*/ |
*/ |
1173 |
List* List::GetNextSubList() { |
List* List::GetNextSubList() { |
1174 |
#if DEBUG |
#if DEBUG_RIFF |
1175 |
std::cout << "List::GetNextSubList()" << std::endl; |
std::cout << "List::GetNextSubList()" << std::endl; |
1176 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
1177 |
if (!pSubChunks) return NULL; |
if (!pSubChunks) return NULL; |
1178 |
if (ListIterator == pSubChunks->end()) return NULL; |
if (ListIterator == pSubChunks->end()) return NULL; |
1179 |
ListIterator++; |
ListIterator++; |
1375 |
} |
} |
1376 |
|
|
1377 |
void List::ReadHeader(file_offset_t filePos) { |
void List::ReadHeader(file_offset_t filePos) { |
1378 |
#if DEBUG |
#if DEBUG_RIFF |
1379 |
std::cout << "List::Readheader(file_offset_t) "; |
std::cout << "List::Readheader(file_offset_t) "; |
1380 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
1381 |
Chunk::ReadHeader(filePos); |
Chunk::ReadHeader(filePos); |
1382 |
if (ullCurrentChunkSize < 4) return; |
if (ullCurrentChunkSize < 4) return; |
1383 |
ullNewChunkSize = ullCurrentChunkSize -= 4; |
ullNewChunkSize = ullCurrentChunkSize -= 4; |
1394 |
fseeko(pFile->hFileRead, filePos + CHUNK_HEADER_SIZE(pFile->FileOffsetSize), SEEK_SET); |
fseeko(pFile->hFileRead, filePos + CHUNK_HEADER_SIZE(pFile->FileOffsetSize), SEEK_SET); |
1395 |
fread(&ListType, 4, 1, pFile->hFileRead); |
fread(&ListType, 4, 1, pFile->hFileRead); |
1396 |
#endif // POSIX |
#endif // POSIX |
1397 |
#if DEBUG |
#if DEBUG_RIFF |
1398 |
std::cout << "listType=" << convertToString(ListType) << std::endl; |
std::cout << "listType=" << convertToString(ListType) << std::endl; |
1399 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
1400 |
if (!pFile->bEndianNative) { |
if (!pFile->bEndianNative) { |
1401 |
//swapBytes_32(&ListType); |
//swapBytes_32(&ListType); |
1402 |
} |
} |
1423 |
} |
} |
1424 |
|
|
1425 |
void List::LoadSubChunks(progress_t* pProgress) { |
void List::LoadSubChunks(progress_t* pProgress) { |
1426 |
#if DEBUG |
#if DEBUG_RIFF |
1427 |
std::cout << "List::LoadSubChunks()"; |
std::cout << "List::LoadSubChunks()"; |
1428 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
1429 |
if (!pSubChunks) { |
if (!pSubChunks) { |
1430 |
pSubChunks = new ChunkList(); |
pSubChunks = new ChunkList(); |
1431 |
pSubChunksMap = new ChunkMap(); |
pSubChunksMap = new ChunkMap(); |
1440 |
Chunk* ck; |
Chunk* ck; |
1441 |
uint32_t ckid; |
uint32_t ckid; |
1442 |
Read(&ckid, 4, 1); |
Read(&ckid, 4, 1); |
1443 |
#if DEBUG |
#if DEBUG_RIFF |
1444 |
std::cout << " ckid=" << convertToString(ckid) << std::endl; |
std::cout << " ckid=" << convertToString(ckid) << std::endl; |
1445 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
1446 |
if (ckid == CHUNK_ID_LIST) { |
if (ckid == CHUNK_ID_LIST) { |
1447 |
ck = new RIFF::List(pFile, ullStartPos + ullPos - 4, this); |
ck = new RIFF::List(pFile, ullStartPos + ullPos - 4, this); |
1448 |
SetPos(ck->GetSize() + LIST_HEADER_SIZE(pFile->FileOffsetSize) - 4, RIFF::stream_curpos); |
SetPos(ck->GetSize() + LIST_HEADER_SIZE(pFile->FileOffsetSize) - 4, RIFF::stream_curpos); |
1583 |
: List(this), Filename(path), bIsNewFile(false), Layout(layout_standard), |
: List(this), Filename(path), bIsNewFile(false), Layout(layout_standard), |
1584 |
FileOffsetPreference(offset_size_auto) |
FileOffsetPreference(offset_size_auto) |
1585 |
{ |
{ |
1586 |
#if DEBUG |
#if DEBUG_RIFF |
1587 |
std::cout << "File::File("<<path<<")" << std::endl; |
std::cout << "File::File("<<path<<")" << std::endl; |
1588 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
1589 |
bEndianNative = true; |
bEndianNative = true; |
1590 |
FileOffsetSize = 4; |
FileOffsetSize = 4; |
1591 |
try { |
try { |
1812 |
#if POSIX |
#if POSIX |
1813 |
if (hFileRead) close(hFileRead); |
if (hFileRead) close(hFileRead); |
1814 |
if (hFileWrite) close(hFileWrite); |
if (hFileWrite) close(hFileWrite); |
1815 |
|
hFileRead = hFileWrite = 0; |
1816 |
#elif defined(WIN32) |
#elif defined(WIN32) |
1817 |
if (hFileRead != INVALID_HANDLE_VALUE) CloseHandle(hFileRead); |
if (hFileRead != INVALID_HANDLE_VALUE) CloseHandle(hFileRead); |
1818 |
if (hFileWrite != INVALID_HANDLE_VALUE) CloseHandle(hFileWrite); |
if (hFileWrite != INVALID_HANDLE_VALUE) CloseHandle(hFileWrite); |
1819 |
|
hFileRead = hFileWrite = INVALID_HANDLE_VALUE; |
1820 |
#else |
#else |
1821 |
if (hFileRead) fclose(hFileRead); |
if (hFileRead) fclose(hFileRead); |
1822 |
if (hFileWrite) fclose(hFileWrite); |
if (hFileWrite) fclose(hFileWrite); |
1823 |
|
hFileRead = hFileWrite = NULL; |
1824 |
#endif |
#endif |
|
hFileRead = hFileWrite = 0; |
|
1825 |
break; |
break; |
1826 |
default: |
default: |
1827 |
throw Exception("Unknown file access mode"); |
throw Exception("Unknown file access mode"); |
2081 |
} |
} |
2082 |
|
|
2083 |
File::~File() { |
File::~File() { |
2084 |
#if DEBUG |
#if DEBUG_RIFF |
2085 |
std::cout << "File::~File()" << std::endl; |
std::cout << "File::~File()" << std::endl; |
2086 |
#endif // DEBUG |
#endif // DEBUG_RIFF |
2087 |
Cleanup(); |
Cleanup(); |
2088 |
} |
} |
2089 |
|
|
2253 |
// *************** Exception *************** |
// *************** Exception *************** |
2254 |
// * |
// * |
2255 |
|
|
2256 |
|
Exception::Exception() { |
2257 |
|
} |
2258 |
|
|
2259 |
|
Exception::Exception(String format, ...) { |
2260 |
|
va_list arg; |
2261 |
|
va_start(arg, format); |
2262 |
|
Message = assemble(format, arg); |
2263 |
|
va_end(arg); |
2264 |
|
} |
2265 |
|
|
2266 |
|
Exception::Exception(String format, va_list arg) { |
2267 |
|
Message = assemble(format, arg); |
2268 |
|
} |
2269 |
|
|
2270 |
void Exception::PrintMessage() { |
void Exception::PrintMessage() { |
2271 |
std::cout << "RIFF::Exception: " << Message << std::endl; |
std::cout << "RIFF::Exception: " << Message << std::endl; |
2272 |
} |
} |
2273 |
|
|
2274 |
|
String Exception::assemble(String format, va_list arg) { |
2275 |
|
char* buf = NULL; |
2276 |
|
vasprintf(&buf, format.c_str(), arg); |
2277 |
|
String s = buf; |
2278 |
|
free(buf); |
2279 |
|
return s; |
2280 |
|
} |
2281 |
|
|
2282 |
|
|
2283 |
// *************** functions *************** |
// *************** functions *************** |
2284 |
// * |
// * |