From 292705ddc3b96dee96f742bc327c73d1c8618b92 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 13 Dec 2023 16:57:49 +0100 Subject: [PATCH] fixed OpenDecompressor flag handling. --- src/common/filesystem/include/fs_files.h | 11 +++++++++-- .../filesystem/source/files_decompress.cpp | 19 +++++++++++-------- src/common/filesystem/source/resourcefile.cpp | 2 +- src/maploader/maploader.cpp | 4 ++-- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/common/filesystem/include/fs_files.h b/src/common/filesystem/include/fs_files.h index 650226877..b7d314837 100644 --- a/src/common/filesystem/include/fs_files.h +++ b/src/common/filesystem/include/fs_files.h @@ -73,7 +73,7 @@ public: }; // Zip compression methods, extended by some internal types to be passed to OpenDecompressor -enum +enum ECompressionMethod { METHOD_STORED = 0, METHOD_SHRINK = 1, @@ -96,6 +96,13 @@ enum METHOD_TRANSFEROWNER = 0x8000, }; +enum EDecompressFlags +{ + DCF_TRANSFEROWNER = 1, + DCF_SEEKABLE = 2, + DCF_EXCEPTIONS = 4 +}; + class FileReader; // an opaque memory buffer to the file's content. Can either own the memory or just point to an external buffer. @@ -283,7 +290,7 @@ public: bool OpenMemoryArray(std::vector& data); // take the given array bool OpenMemoryArray(FileData& data); // take the given array bool OpenMemoryArray(std::function&)> getter); // read contents to a buffer and return a reader to it - bool OpenDecompressor(FileReader &parent, Size length, int method, bool seekable, bool exceptions = false); // creates a decompressor stream. 'seekable' uses a buffered version so that the Seek and Tell methods can be used. + bool OpenDecompressor(FileReader &parent, Size length, int method, int flags = 0); // creates a decompressor stream. 'seekable' uses a buffered version so that the Seek and Tell methods can be used. Size Tell() const { diff --git a/src/common/filesystem/source/files_decompress.cpp b/src/common/filesystem/source/files_decompress.cpp index 62c85b3a2..0bbb80c52 100644 --- a/src/common/filesystem/source/files_decompress.cpp +++ b/src/common/filesystem/source/files_decompress.cpp @@ -848,14 +848,16 @@ public: }; -bool FileReader::OpenDecompressor(FileReader &parent, Size length, int method, bool seekable, bool exceptions) +bool FileReader::OpenDecompressor(FileReader &parent, Size length, int method, int flags) { FileReaderInterface* fr = nullptr; DecompressorBase* dec = nullptr; try { FileReader* p = &parent; - switch (method & ~METHOD_TRANSFEROWNER) + bool exceptions = !!(flags & DCF_EXCEPTIONS); + + switch (method) { case METHOD_DEFLATE: case METHOD_ZLIB: @@ -975,13 +977,13 @@ bool FileReader::OpenDecompressor(FileReader &parent, Size length, int method, b } if (dec) { - if (method & METHOD_TRANSFEROWNER) + if (flags & DCF_TRANSFEROWNER) { dec->SetOwnsReader(); } dec->Length = length; } - if (!seekable) + if (!(flags & DCF_SEEKABLE)) { Close(); mReader = fr; @@ -1003,16 +1005,17 @@ bool FileReader::OpenDecompressor(FileReader &parent, Size length, int method, b bool FCompressedBuffer::Decompress(char* destbuffer) { - FileReader mr; - mr.OpenMemory(mBuffer, mCompressedSize); if (mMethod == METHOD_STORED) { - return mr.Read(destbuffer, mSize) != mSize; + memcpy(destbuffer, mBuffer, mSize); + return true; } else { + FileReader mr; + mr.OpenMemory(mBuffer, mCompressedSize); FileReader frz; - if (frz.OpenDecompressor(mr, mSize, mMethod, false, false)) + if (frz.OpenDecompressor(mr, mSize, mMethod)) { return frz.Read(destbuffer, mSize) != mSize; } diff --git a/src/common/filesystem/source/resourcefile.cpp b/src/common/filesystem/source/resourcefile.cpp index 2b5fa5d48..a13f62e64 100644 --- a/src/common/filesystem/source/resourcefile.cpp +++ b/src/common/filesystem/source/resourcefile.cpp @@ -564,7 +564,7 @@ FileReader FResourceFile::GetEntryReader(uint32_t entry, bool newreader) { FileReader fri; fri.OpenFilePart(Reader, Entries[entry].Position, Entries[entry].CompressedSize); - fr.OpenDecompressor(fri, Entries[entry].Length, Entries[entry].Method | METHOD_TRANSFEROWNER, true, true); + fr.OpenDecompressor(fri, Entries[entry].Length, Entries[entry].Method, FileSys::DCF_TRANSFEROWNER | FileSys::DCF_SEEKABLE | FileSys::DCF_EXCEPTIONS); } } return fr; diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 727415be1..d6ae5d4ff 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -738,7 +738,7 @@ bool MapLoader::LoadExtendedNodes (FileReader &dalump, uint32_t id) if (compressed) { FileReader zip; - if (zip.OpenDecompressor(dalump, -1, FileSys::METHOD_ZLIB, false, true)) + if (zip.OpenDecompressor(dalump, -1, FileSys::METHOD_ZLIB, FileSys::DCF_EXCEPTIONS)) { LoadZNodes(zip, type); return true; @@ -3344,7 +3344,7 @@ void MapLoader::LoadLightmap(MapData *map) return; FileReader fr; - if (!fr.OpenDecompressor(map->Reader(ML_LIGHTMAP), -1, FileSys::METHOD_ZLIB, false, false)) + if (!fr.OpenDecompressor(map->Reader(ML_LIGHTMAP), -1, FileSys::METHOD_ZLIB)) return;