diff options
author | Nicola Mettifogo | 2010-02-08 16:14:23 +0000 |
---|---|---|
committer | Nicola Mettifogo | 2010-02-08 16:14:23 +0000 |
commit | 2df073bb68e1ecd20fa0a6814daab48144f08256 (patch) | |
tree | 112a92b93f6a47bd60bda133bf650b97d337a3ce /common | |
parent | b658c61155ff189fe4381ba774993a69a3f572ea (diff) | |
download | scummvm-rg350-2df073bb68e1ecd20fa0a6814daab48144f08256.tar.gz scummvm-rg350-2df073bb68e1ecd20fa0a6814daab48144f08256.tar.bz2 scummvm-rg350-2df073bb68e1ecd20fa0a6814daab48144f08256.zip |
Shuffled code around a bit.
svn-id: r47995
Diffstat (limited to 'common')
-rw-r--r-- | common/unarj.cpp | 127 |
1 files 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 |