diff options
author | Max Horn | 2008-11-07 09:50:51 +0000 |
---|---|---|
committer | Max Horn | 2008-11-07 09:50:51 +0000 |
commit | 81431f18cd620c521c7b880d6c8b41279721bafb (patch) | |
tree | 3793569cae34030607131b83c33284d291224b41 | |
parent | 060aa5b002a7c1808e6e54ab5585a40a18c5a0b4 (diff) | |
download | scummvm-rg350-81431f18cd620c521c7b880d6c8b41279721bafb.tar.gz scummvm-rg350-81431f18cd620c521c7b880d6c8b41279721bafb.tar.bz2 scummvm-rg350-81431f18cd620c521c7b880d6c8b41279721bafb.zip |
Refactoring the Arj decoder code, phase 2
svn-id: r34923
-rw-r--r-- | common/unarj.cpp | 36 | ||||
-rw-r--r-- | common/unarj.h | 5 |
2 files changed, 14 insertions, 27 deletions
diff --git a/common/unarj.cpp b/common/unarj.cpp index 7966fba135..d44e52e0dc 100644 --- a/common/unarj.cpp +++ b/common/unarj.cpp @@ -179,10 +179,9 @@ static uint32 GetCRC(byte *data, int len) { return CRC ^ 0xFFFFFFFF; } -ArjFile::ArjFile() : _uncompressedData(NULL) { +ArjFile::ArjFile() : _uncompressed(0) { _decoder = new ArjDecoder; InitCRC(); - _isOpen = false; _fallBack = false; } @@ -342,15 +341,12 @@ ArjHeader *ArjDecoder::readHeader(SeekableReadStream &stream) { bool ArjFile::open(const Common::String &filename) { - if (_isOpen) + if (_uncompressed) error("Attempt to open another instance of archive"); - _isOpen = false; - if (_fallBack) { _currArchive.open(filename); if (_currArchive.isOpen()) { - _isOpen = true; _uncompressed = &_currArchive; return true; } @@ -359,19 +355,13 @@ bool ArjFile::open(const Common::String &filename) { if (!_fileMap.contains(filename)) return false; - _isOpen = true; - ArjHeader *hdr = _headers[_fileMap[filename]]; _decoder->_compsize = hdr->compSize; _decoder->_origsize = hdr->origSize; - // FIXME: This hotfix prevents Drascula from leaking memory. - // As far as sanity checks go this is not bad, but the engine should be fixed. - free(_uncompressedData); - - _uncompressedData = (byte *)malloc(_decoder->_origsize); - _decoder->_outstream = new MemoryWriteStream(_uncompressedData, _decoder->_origsize); + byte *uncompressedData = (byte *)malloc(_decoder->_origsize); + _decoder->_outstream = new MemoryWriteStream(uncompressedData, _decoder->_origsize); _currArchive.open(_archMap[filename]); _currArchive.seek(hdr->pos, SEEK_SET); @@ -379,7 +369,7 @@ bool ArjFile::open(const Common::String &filename) { printf("Arj archive method %d, file '%s'\n", hdr->method, filename.c_str()); if (hdr->method == 0) { // store - _currArchive.read(_uncompressedData, _decoder-> _origsize); + _currArchive.read(uncompressedData, _decoder-> _origsize); } else { byte *_compressedData = (byte *)malloc(_decoder->_compsize); _currArchive.read(_compressedData, _decoder->_compsize); @@ -399,47 +389,47 @@ printf("Arj archive method %d, file '%s'\n", hdr->method, filename.c_str()); delete _decoder->_outstream; _decoder->_outstream = NULL; - _uncompressed = new MemoryReadStream(_uncompressedData, _decoder->_origsize); + _uncompressed = new MemoryReadStream(uncompressedData, _decoder->_origsize, true); + assert(_uncompressed); return true; } void ArjFile::close() { - if (!_isOpen) + if (!_uncompressed) return; - _isOpen = false; - if (_fallBack) { _currArchive.close(); - return; } else { delete _uncompressed; } _uncompressed = NULL; - - free(_uncompressedData); - _uncompressedData = NULL; } uint32 ArjFile::read(void *dataPtr, uint32 dataSize) { + assert(_uncompressed); return _uncompressed->read(dataPtr, dataSize); } bool ArjFile::eos() const { + assert(_uncompressed); return _uncompressed->eos(); } int32 ArjFile::pos() const { + assert(_uncompressed); return _uncompressed->pos(); } int32 ArjFile::size() const { + assert(_uncompressed); return _uncompressed->size(); } bool ArjFile::seek(int32 offset, int whence) { + assert(_uncompressed); return _uncompressed->seek(offset, whence); } diff --git a/common/unarj.h b/common/unarj.h index 4e9750609e..f3473a6d79 100644 --- a/common/unarj.h +++ b/common/unarj.h @@ -53,7 +53,7 @@ public: int32 pos() const; int32 size() const; bool seek(int32 offset, int whence = SEEK_SET); - bool isOpen() { return _isOpen; } + bool isOpen() { return _uncompressed != 0; } private: bool _fallBack; @@ -63,11 +63,8 @@ private: ArjFilesMap _fileMap; StringMap _archMap; - byte *_uncompressedData; SeekableReadStream *_uncompressed; - bool _isOpen; - ArjDecoder *_decoder; }; |