Saveload: Allow discarding chunks with a load handler

This commit is contained in:
Jonathan G Rennison
2019-12-26 20:30:55 +00:00
parent 0394a734ed
commit c75ed00f0f

View File

@@ -2220,25 +2220,22 @@ static const ChunkHandler *SlFindChunkHandler(uint32 id)
/** Load all chunks */ /** Load all chunks */
static void SlLoadChunks() static void SlLoadChunks()
{ {
uint32 id; for (uint32 id = SlReadUint32(); id != 0; id = SlReadUint32()) {
const ChunkHandler *ch;
for (id = SlReadUint32(); id != 0; id = SlReadUint32()) {
DEBUG(sl, 2, "Loading chunk %c%c%c%c", id >> 24, id >> 16, id >> 8, id); DEBUG(sl, 2, "Loading chunk %c%c%c%c", id >> 24, id >> 16, id >> 8, id);
size_t read = 0; size_t read = 0;
if (_debug_sl_level >= 3) read = SlGetBytesRead(); if (_debug_sl_level >= 3) read = SlGetBytesRead();
ch = SlFindChunkHandler(id);
if (ch == nullptr) {
if (SlXvIsChunkDiscardable(id)) { if (SlXvIsChunkDiscardable(id)) {
DEBUG(sl, 1, "Discarding chunk %c%c%c%c", id >> 24, id >> 16, id >> 8, id); DEBUG(sl, 1, "Discarding chunk %c%c%c%c", id >> 24, id >> 16, id >> 8, id);
SlLoadCheckChunk(nullptr); SlLoadCheckChunk(nullptr);
} else { } else {
const ChunkHandler *ch = SlFindChunkHandler(id);
if (ch == nullptr) {
SlErrorCorrupt("Unknown chunk type"); SlErrorCorrupt("Unknown chunk type");
}
} else { } else {
SlLoadChunk(ch); SlLoadChunk(ch);
} }
}
DEBUG(sl, 3, "Loaded chunk %c%c%c%c (" PRINTF_SIZE " bytes)", id >> 24, id >> 16, id >> 8, id, SlGetBytesRead() - read); DEBUG(sl, 3, "Loaded chunk %c%c%c%c (" PRINTF_SIZE " bytes)", id >> 24, id >> 16, id >> 8, id, SlGetBytesRead() - read);
} }
} }
@@ -2254,8 +2251,12 @@ static void SlLoadCheckChunks()
size_t read = 0; size_t read = 0;
if (_debug_sl_level >= 3) read = SlGetBytesRead(); if (_debug_sl_level >= 3) read = SlGetBytesRead();
if (SlXvIsChunkDiscardable(id)) {
ch = nullptr;
} else {
ch = SlFindChunkHandler(id); ch = SlFindChunkHandler(id);
if (ch == nullptr && !SlXvIsChunkDiscardable(id)) SlErrorCorrupt("Unknown chunk type"); if (ch == nullptr) SlErrorCorrupt("Unknown chunk type");
}
SlLoadCheckChunk(ch); SlLoadCheckChunk(ch);
DEBUG(sl, 3, "Loaded chunk %c%c%c%c (" PRINTF_SIZE " bytes)", id >> 24, id >> 16, id >> 8, id, SlGetBytesRead() - read); DEBUG(sl, 3, "Loaded chunk %c%c%c%c (" PRINTF_SIZE " bytes)", id >> 24, id >> 16, id >> 8, id, SlGetBytesRead() - read);
} }