From 452d46b3bf6a3c77bc4583a56e7dc5e7a4ad385b Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 1 Jun 2008 21:10:29 +0000 Subject: [PATCH] Implement file fallback for archives svn-id: r32476 --- common/unarj.cpp | 17 ++++++++++++++++- common/unarj.h | 6 +++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/common/unarj.cpp b/common/unarj.cpp index 58f326c1ac7..57673341f7a 100644 --- a/common/unarj.cpp +++ b/common/unarj.cpp @@ -78,6 +78,7 @@ static uint32 GetCRC(byte *data, int len) { ArjFile::ArjFile() { InitCRC(); _isOpen = false; + _fallBack = false; } ArjFile::~ArjFile() { @@ -234,6 +235,15 @@ bool ArjFile::open(const Common::String &filename, AccessMode mode) { _isOpen = false; + if (_fallBack) { + _currArchive.open(filename); + if (_currArchive.isOpen()) { + _isOpen = true; + _uncompressed = &_currArchive; + return true; + } + } + if (!_fileMap.contains(filename)) return false; @@ -279,7 +289,12 @@ bool ArjFile::open(const Common::String &filename, AccessMode mode) { void ArjFile::close() { _isOpen = false; - delete _uncompressed; + if (_fallBack) { + _currArchive.close(); + } else { + delete _uncompressed; + } + _uncompressed = NULL; free(_uncompressedData); diff --git a/common/unarj.h b/common/unarj.h index 289ab52ad04..b015999671f 100644 --- a/common/unarj.h +++ b/common/unarj.h @@ -106,6 +106,8 @@ public: ArjFile(); ~ArjFile(); + void enableFallback(bool val) { _fallBack = val; } + void registerArchive(const String &filename); bool open(const Common::String &filename, AccessMode mode = kFileReadMode); @@ -119,6 +121,8 @@ public: bool isOpen() { return _isOpen; } private: + bool _fallBack; + File _currArchive; Array _headers; ArjFilesMap _fileMap; @@ -128,7 +132,7 @@ private: byte *_compressedData; MemoryWriteStream *_outstream; MemoryReadStream *_compressed; - MemoryReadStream *_uncompressed; + SeekableReadStream *_uncompressed; bool _isOpen;