aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicola Mettifogo2010-02-08 16:14:23 +0000
committerNicola Mettifogo2010-02-08 16:14:23 +0000
commit2df073bb68e1ecd20fa0a6814daab48144f08256 (patch)
tree112a92b93f6a47bd60bda133bf650b97d337a3ce
parentb658c61155ff189fe4381ba774993a69a3f572ea (diff)
downloadscummvm-rg350-2df073bb68e1ecd20fa0a6814daab48144f08256.tar.gz
scummvm-rg350-2df073bb68e1ecd20fa0a6814daab48144f08256.tar.bz2
scummvm-rg350-2df073bb68e1ecd20fa0a6814daab48144f08256.zip
Shuffled code around a bit.
svn-id: r47995
-rw-r--r--common/unarj.cpp127
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