From 2df073bb68e1ecd20fa0a6814daab48144f08256 Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Mon, 8 Feb 2010 16:14:23 +0000 Subject: Shuffled code around a bit. svn-id: r47995 --- common/unarj.cpp | 127 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 88 insertions(+), 39 deletions(-) diff --git a/common/unarj.cpp b/common/unarj.cpp index ec5d2e74f0..e4a8691e5e 100644 --- a/common/unarj.cpp +++ b/common/unarj.cpp @@ -189,46 +189,7 @@ static uint32 GetCRC(byte *data, int len) { return CRC ^ 0xFFFFFFFF; } -ArjFile::ArjFile() { - InitCRC(); - _fallBack = false; -} - -ArjFile::~ArjFile() { - for (uint i = 0; i < _headers.size(); i++) - delete _headers[i]; -} - -void ArjFile::registerArchive(const String &filename) { - int32 first_hdr_pos; - ArjHeader *header; - File archiveFile; - - if (!archiveFile.open(filename)) - return; - - first_hdr_pos = findHeader(archiveFile); - - if (first_hdr_pos < 0) { - warning("ArjFile::registerArchive(): Could not find a valid header"); - return; - } - - archiveFile.seek(first_hdr_pos, SEEK_SET); - if (readHeader(archiveFile) == NULL) - return; - - while ((header = readHeader(archiveFile)) != NULL) { - _headers.push_back(header); - archiveFile.seek(header->compSize, SEEK_CUR); - - _fileMap[header->filename] = _headers.size() - 1; - _archMap[header->filename] = filename; - } - - debug(0, "ArjFile::registerArchive(%s): Located %d files", filename.c_str(), _headers.size()); -} // // Source for findHeader and readHeader: arj_arcv.c @@ -344,6 +305,7 @@ ArjHeader *readHeader(SeekableReadStream &stream) { } +<<<<<<< HEAD:common/unarj.cpp SeekableReadStream *ArjFile::open(const Common::String &filename) { if (_fallBack && SearchMan.hasFile(filename)) { @@ -779,4 +741,91 @@ void ArjDecoder::decode_f(int32 origsize) { } +#pragma mark ArjFile implementation + +ArjFile::ArjFile() { + InitCRC(); + _fallBack = false; +} + +ArjFile::~ArjFile() { + for (uint i = 0; i < _headers.size(); i++) + delete _headers[i]; +} + +void ArjFile::registerArchive(const String &filename) { + int32 first_hdr_pos; + ArjHeader *header; + File archiveFile; + + if (!archiveFile.open(filename)) + return; + + first_hdr_pos = findHeader(archiveFile); + + if (first_hdr_pos < 0) { + warning("ArjFile::registerArchive(): Could not find a valid header"); + return; + } + + archiveFile.seek(first_hdr_pos, SEEK_SET); + if (readHeader(archiveFile) == NULL) + return; + + while ((header = readHeader(archiveFile)) != NULL) { + _headers.push_back(header); + + archiveFile.seek(header->compSize, SEEK_CUR); + + _fileMap[header->filename] = _headers.size() - 1; + _archMap[header->filename] = filename; + } + + debug(0, "ArjFile::registerArchive(%s): Located %d files", filename.c_str(), _headers.size()); +} + +SeekableReadStream *ArjFile::open(const Common::String &filename) { + + if (_fallBack && SearchMan.hasFile(filename)) { + return SearchMan.createReadStreamForMember(filename); + } + + if (!_fileMap.contains(filename)) + return 0; + + ArjHeader *hdr = _headers[_fileMap[filename]]; + + // TODO: It would be good if ArjFile could decompress files in a streaming + // mode, so it would not need to pre-allocate the entire output. + byte *uncompressedData = (byte *)malloc(hdr->origSize); + + File archiveFile; + archiveFile.open(_archMap[filename]); + archiveFile.seek(hdr->pos, SEEK_SET); + + if (hdr->method == 0) { // store + int32 len = archiveFile.read(uncompressedData, hdr->origSize); + assert(len == hdr->origSize); + } else { + ArjDecoder *decoder = new ArjDecoder(hdr); + + // TODO: It might not be appropriate to use this wrapper inside ArjFile. + // If reading from archiveFile directly is too slow to be usable, + // maybe the filesystem code should instead wrap its files + // in a BufferedReadStream. + decoder->_compressed = new BufferedReadStream(&archiveFile, 4096, false); + decoder->_outstream = new MemoryWriteStream(uncompressedData, hdr->origSize); + + if (hdr->method == 1 || hdr->method == 2 || hdr->method == 3) + decoder->decode(hdr->origSize); + else if (hdr->method == 4) + decoder->decode_f(hdr->origSize); + + delete decoder; + } + + return new MemoryReadStream(uncompressedData, hdr->origSize, true); +} + + } // End of namespace Common -- cgit v1.2.3