[Scummvm-cvs-logs] SF.net SVN: scummvm:[33878] scummvm/trunk/engines/kyra/resource.cpp

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Fri Aug 15 00:09:36 CEST 2008


Revision: 33878
          http://scummvm.svn.sourceforge.net/scummvm/?rev=33878&view=rev
Author:   lordhoto
Date:     2008-08-14 22:09:36 +0000 (Thu, 14 Aug 2008)

Log Message:
-----------
Improved version of my resource loading patch from -devel (check also r33876).

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/resource.cpp

Modified: scummvm/trunk/engines/kyra/resource.cpp
===================================================================
--- scummvm/trunk/engines/kyra/resource.cpp	2008-08-14 22:01:56 UTC (rev 33877)
+++ scummvm/trunk/engines/kyra/resource.cpp	2008-08-14 22:09:36 UTC (rev 33878)
@@ -184,8 +184,14 @@
 	for (ResArchiveLoader::FileList::iterator i = files.begin(); i != files.end(); ++i) {
 		iter = _map.find(i->filename);
 		if (iter == _map.end()) {
+			// We do an internal check for a file in gamepath with same filename to
+			// allow overwriting files inside archives with plain files inside the
+		    // game directory
+			checkFile(i->filename);
+
 			// A new file entry, so we just insert it into the file map.
-			_map[i->filename] = i->entry;
+			if (_map.find(i->filename) == _map.end())
+				_map[i->filename] = i->entry;
 		} else if (!iter->_value.parent.empty()) {
 			if (!iter->_value.parent.equalsIgnoreCase(filename)) {
 				ResFileMap::iterator oldParent = _map.find(iter->_value.parent);
@@ -353,7 +359,17 @@
 Common::SeekableReadStream *Resource::getFileStream(const Common::String &file) {
 	CompFileMap::iterator compEntry;
 
-	if (Common::File::exists(file)) {
+	if ((compEntry = _compFiles.find(file)) != _compFiles.end())
+		return new Common::MemoryReadStream(compEntry->_value.data, compEntry->_value.size, false);		
+
+	if (!isAccessable(file))
+		return 0;
+
+	ResFileMap::const_iterator iter = _map.find(file);
+	if (iter == _map.end())
+		return 0;
+
+	if (iter->_value.parent.empty()) {
 		Common::File *stream = new Common::File();
 		if (!stream->open(file)) {
 			delete stream;
@@ -361,28 +377,15 @@
 			error("Couldn't open file '%s'", file.c_str());
 		}
 		return stream;
-	} else if ((compEntry = _compFiles.find(file)) != _compFiles.end()) {
-		return new Common::MemoryReadStream(compEntry->_value.data, compEntry->_value.size, false);		
 	} else {
-		if (!isAccessable(file))
-			return 0;
+		Common::SeekableReadStream *parent = getFileStream(iter->_value.parent);
+		assert(parent);
 
-		ResFileMap::const_iterator iter = _map.find(file);
-		if (iter == _map.end())
-			return 0;
+		ResFileMap::const_iterator parentIter = _map.find(iter->_value.parent);
+		const ResArchiveLoader *loader = getLoader(parentIter->_value.type);
+		assert(loader);
 
-		if (!iter->_value.parent.empty()) {
-			Common::SeekableReadStream *parent = getFileStream(iter->_value.parent);
-			assert(parent);
-
-			ResFileMap::const_iterator parentIter = _map.find(iter->_value.parent);
-			const ResArchiveLoader *loader = getLoader(parentIter->_value.type);
-			assert(loader);
-
-			return loader->loadFileFromArchive(file, parent, iter->_value);
-		} else {
-			error("Couldn't open file '%s'", file.c_str());
-		}
+		return loader->loadFileFromArchive(file, parent, iter->_value);
 	}
 
 	return 0;
@@ -414,7 +417,19 @@
 	if (_map.find(file) == _map.end()) {
 		CompFileMap::const_iterator iter;
 
-		if (Common::File::exists(file)) {
+		if ((iter = _compFiles.find(file)) != _compFiles.end()) {
+			ResFileEntry entry;
+			entry.parent = "";
+			entry.size = iter->_value.size;
+			entry.mounted = false;
+			entry.preload = false;
+			entry.prot = false;
+			entry.type = ResFileEntry::kAutoDetect;
+			entry.offset = 0;
+			_map[file] = entry;
+
+			detectFileTypes();
+		} else if (Common::File::exists(file)) {
 			Common::File temp;
 			if (temp.open(file)) {
 				ResFileEntry entry;
@@ -430,18 +445,6 @@
 
 				detectFileTypes();
 			}
-		} else if ((iter = _compFiles.find(file)) != _compFiles.end()) {
-			ResFileEntry entry;
-			entry.parent = "";
-			entry.size = iter->_value.size;
-			entry.mounted = false;
-			entry.preload = false;
-			entry.prot = false;
-			entry.type = ResFileEntry::kAutoDetect;
-			entry.offset = 0;
-			_map[file] = entry;
-
-			detectFileTypes();
 		}
 	}
 }


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