void ChunkedFile::parseChunks() { uint8* ptr = GetData(); // Make sure there's enough data to read u_map_fcc struct and the uint32 size after it while (ptr <= GetData() + GetDataSize() - 8) { u_map_fcc header = *(u_map_fcc*)ptr; if (IsInterestingChunk(header)) { uint32 size = *(uint32*)(ptr + 4); if (size <= data_size) { std::swap(header.fcc_txt[0], header.fcc_txt[3]); std::swap(header.fcc_txt[1], header.fcc_txt[2]); FileChunk* chunk = new FileChunk(ptr, size); chunk->parseSubChunks(); chunks.insert({ std::string(header.fcc_txt, 4), chunk }); } // move to next chunk ptr += size + 8; } else ++ptr; } }
void FileChunk::parseSubChunks() { uint8* ptr = data + 8; // skip self while (ptr < data + size) { u_map_fcc header = *(u_map_fcc*)ptr; if (IsInterestingChunk(header)) { uint32 subsize = *(uint32*)(ptr + 4); if (subsize < size) { std::swap(header.fcc_txt[0], header.fcc_txt[3]); std::swap(header.fcc_txt[1], header.fcc_txt[2]); FileChunk* chunk = new FileChunk(ptr, subsize); chunk->parseSubChunks(); subchunks.insert({ std::string(header.fcc_txt, 4), chunk }); } // move to next chunk ptr += subsize + 8; } else ++ptr; } }
void ChunkedFile::parseChunks() { uint8* ptr = GetData(); while (ptr < GetData() + GetDataSize()) { u_map_fcc header = *(u_map_fcc*)ptr; uint32 size = 0; if (IsInterestingChunk(header)) { size = *(uint32*)(ptr + 4); if (size <= data_size) { std::swap(header.fcc_txt[0], header.fcc_txt[3]); std::swap(header.fcc_txt[1], header.fcc_txt[2]); FileChunk* chunk = new FileChunk{ ptr, size }; chunk->parseSubChunks(); chunks.insert({ std::string(header.fcc_txt, 4), chunk }); } } // move to next chunk ptr += size + 8; } }