[Scummvm-cvs-logs] SF.net SVN: scummvm:[47995] scummvm/trunk/common/unarj.cpp

peres001 at users.sourceforge.net peres001 at users.sourceforge.net
Mon Feb 8 17:14:23 CET 2010


Revision: 47995
          http://scummvm.svn.sourceforge.net/scummvm/?rev=47995&view=rev
Author:   peres001
Date:     2010-02-08 16:14:23 +0000 (Mon, 08 Feb 2010)

Log Message:
-----------
Shuffled code around a bit.

Modified Paths:
--------------
    scummvm/trunk/common/unarj.cpp

Modified: scummvm/trunk/common/unarj.cpp
===================================================================
--- scummvm/trunk/common/unarj.cpp	2010-02-08 16:14:04 UTC (rev 47994)
+++ scummvm/trunk/common/unarj.cpp	2010-02-08 16:14:23 UTC (rev 47995)
@@ -189,47 +189,8 @@
 	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 @@
 }
 
 
+<<<<<<< HEAD:common/unarj.cpp
 SeekableReadStream *ArjFile::open(const Common::String &filename) {
 
 	if (_fallBack && SearchMan.hasFile(filename)) {
@@ -779,4 +741,91 @@
 }
 
 
+#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


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list