29 |
|
|
30 |
namespace RIFF { |
namespace RIFF { |
31 |
|
|
32 |
|
// *************** Internal functions ************** |
33 |
|
// * |
34 |
|
|
35 |
|
/// Returns a human readable path of the given chunk. |
36 |
|
String __resolveChunkPath(Chunk* pCk) { |
37 |
|
String sPath; |
38 |
|
for (Chunk* pChunk = pCk; pChunk; pChunk = pChunk->GetParent()) { |
39 |
|
if (pChunk->GetChunkID() == CHUNK_ID_LIST) { |
40 |
|
List* pList = (List*) pChunk; |
41 |
|
sPath = "->'" + pList->GetListTypeString() + "'" + sPath; |
42 |
|
} else { |
43 |
|
sPath = "->'" + pChunk->GetChunkIDString() + "'" + sPath; |
44 |
|
} |
45 |
|
} |
46 |
|
return sPath; |
47 |
|
} |
48 |
|
|
49 |
|
|
50 |
|
|
51 |
// *************** Chunk ************** |
// *************** Chunk ************** |
52 |
// * |
// * |
53 |
|
|
794 |
* @see File::Save() |
* @see File::Save() |
795 |
*/ |
*/ |
796 |
void Chunk::Resize(int iNewSize) { |
void Chunk::Resize(int iNewSize) { |
797 |
if (iNewSize <= 0) throw Exception("Chunk size must be at least one byte"); |
if (iNewSize <= 0) |
798 |
|
throw Exception("There is at least one empty chunk (zero size): " + __resolveChunkPath(this)); |
799 |
if (NewChunkSize == iNewSize) return; |
if (NewChunkSize == iNewSize) return; |
800 |
NewChunkSize = iNewSize; |
NewChunkSize = iNewSize; |
801 |
pFile->LogAsResized(this); |
pFile->LogAsResized(this); |
1527 |
return false; |
return false; |
1528 |
} |
} |
1529 |
|
|
1530 |
|
/** @brief Set the byte order to be used when saving. |
1531 |
|
* |
1532 |
|
* Set the byte order to be used in the file. A value of |
1533 |
|
* endian_little will create a RIFF file, endian_big a RIFX file |
1534 |
|
* and endian_native will create a RIFF file on little-endian |
1535 |
|
* machines and RIFX on big-endian machines. |
1536 |
|
* |
1537 |
|
* @param Endian - endianess to use when file is saved. |
1538 |
|
*/ |
1539 |
|
void File::SetByteOrder(endian_t Endian) { |
1540 |
|
#if WORDS_BIGENDIAN |
1541 |
|
bEndianNative = Endian != endian_little; |
1542 |
|
#else |
1543 |
|
bEndianNative = Endian != endian_big; |
1544 |
|
#endif |
1545 |
|
} |
1546 |
|
|
1547 |
/** @brief Save changes to same file. |
/** @brief Save changes to same file. |
1548 |
* |
* |
1549 |
* Make all changes of all chunks persistent by writing them to the |
* Make all changes of all chunks persistent by writing them to the |
1572 |
unsigned long ulPositiveSizeDiff = 0; |
unsigned long ulPositiveSizeDiff = 0; |
1573 |
for (ChunkList::iterator iter = ResizedChunks.begin(), end = ResizedChunks.end(); iter != end; ++iter) { |
for (ChunkList::iterator iter = ResizedChunks.begin(), end = ResizedChunks.end(); iter != end; ++iter) { |
1574 |
if ((*iter)->GetNewSize() == 0) { |
if ((*iter)->GetNewSize() == 0) { |
1575 |
// just to make the exception message a bit more verbose: resolve the chunk's path |
throw Exception("There is at least one empty chunk (zero size): " + __resolveChunkPath(*iter)); |
|
String sChunkPath; |
|
|
for (Chunk* pChunk = *iter; pChunk; pChunk = pChunk->GetParent()) { |
|
|
if (pChunk->GetChunkID() == CHUNK_ID_LIST) { |
|
|
List* pList = (List*) pChunk; |
|
|
sChunkPath = "->'" + pList->GetListTypeString() + "'" + sChunkPath; |
|
|
} else { |
|
|
sChunkPath = "->'" + pChunk->GetChunkIDString() + "'" + sChunkPath; |
|
|
} |
|
|
} |
|
|
throw Exception("There is at least one empty chunk (zero size): " + sChunkPath); |
|
1576 |
} |
} |
1577 |
if ((*iter)->GetNewSize() + 1L > (*iter)->GetSize()) { |
if ((*iter)->GetNewSize() + 1L > (*iter)->GetSize()) { |
1578 |
unsigned long ulDiff = (*iter)->GetNewSize() - (*iter)->GetSize() + 1L; // +1 in case we have to add a pad byte |
unsigned long ulDiff = (*iter)->GetNewSize() - (*iter)->GetSize() + 1L; // +1 in case we have to add a pad byte |