[Scummvm-cvs-logs] SF.net SVN: scummvm:[44266] scummvm/trunk

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Wed Sep 23 02:15:00 CEST 2009


Revision: 44266
          http://scummvm.svn.sourceforge.net/scummvm/?rev=44266&view=rev
Author:   lordhoto
Date:     2009-09-23 00:15:00 +0000 (Wed, 23 Sep 2009)

Log Message:
-----------
Got rid of Common::File::addDefaultDirectory, instead implemented the solution proposed in "Case agnostic handling for directories (and files)" on -devel.

Modified Paths:
--------------
    scummvm/trunk/common/archive.cpp
    scummvm/trunk/common/archive.h
    scummvm/trunk/common/file.cpp
    scummvm/trunk/common/file.h
    scummvm/trunk/engines/agos/agos.cpp
    scummvm/trunk/engines/groovie/groovie.cpp
    scummvm/trunk/engines/m4/m4.cpp
    scummvm/trunk/engines/saga/saga.cpp
    scummvm/trunk/engines/scumm/scumm.cpp
    scummvm/trunk/engines/sword1/sword1.cpp
    scummvm/trunk/engines/sword2/sword2.cpp
    scummvm/trunk/engines/tinsel/tinsel.cpp
    scummvm/trunk/sound/softsynth/mt32.cpp

Modified: scummvm/trunk/common/archive.cpp
===================================================================
--- scummvm/trunk/common/archive.cpp	2009-09-23 00:14:06 UTC (rev 44265)
+++ scummvm/trunk/common/archive.cpp	2009-09-23 00:15:00 UTC (rev 44266)
@@ -123,7 +123,53 @@
 	add(name, new FSDirectory(dir, depth, flat), priority);
 }
 
+void SearchSet::addSubDirectoriesMatching(const FSNode &directory, String pattern, bool ignoreCase, int priority) {
+	FSList subDirs;
+	if (!directory.getChildren(subDirs))
+		return;
 
+	String nextPattern;
+	String::const_iterator sep = Common::find(pattern.begin(), pattern.end(), '/');
+	if (sep != pattern.end()) {
+		pattern = String(pattern.begin(), sep);
+
+		++sep;
+		if (sep != pattern.end())
+			nextPattern = String(sep, pattern.end());
+	}
+
+	// TODO: The code we have for displaying all matches, which vary only in case, might
+	// be a bit overhead, but as long as we want to display all useful information to the
+	// user we will need to keep track of all directory names added so far. We might
+	// want to reconsider this though.
+	typedef HashMap<String, bool, IgnoreCase_Hash, IgnoreCase_EqualTo> MatchList;
+	MatchList multipleMatches;
+	MatchList::iterator matchIter;
+
+	for (FSList::const_iterator i = subDirs.begin(); i != subDirs.end(); ++i) {
+		String name = i->getName();
+
+		if (Common::matchString(name.c_str(), pattern.c_str(), ignoreCase)) {
+			matchIter = multipleMatches.find(name);
+			if (matchIter == multipleMatches.end()) {
+				multipleMatches[name] = true;
+			} else {
+				if (matchIter->_value) {
+					warning("Clash in case for match of pattern \"%s\" found in directory \"%s\": \"%s\"", pattern.c_str(), directory.getPath().c_str(), matchIter->_key.c_str());
+					matchIter->_value = false;
+				}
+
+				warning("Clash in case for match of pattern \"%s\" found in directory \"%s\": \"%s\"", pattern.c_str(), directory.getPath().c_str(), name.c_str());
+			}
+
+			if (nextPattern.empty())
+				addDirectory(name, *i, priority);
+			else
+				addSubDirectoriesMatching(*i, nextPattern, ignoreCase, priority);
+		}
+	}
+}
+
 void SearchSet::remove(const String &name) {
 	ArchiveNodeList::iterator it = find(name);
 	if (it != _list.end()) {

Modified: scummvm/trunk/common/archive.h
===================================================================
--- scummvm/trunk/common/archive.h	2009-09-23 00:14:06 UTC (rev 44265)
+++ scummvm/trunk/common/archive.h	2009-09-23 00:15:00 UTC (rev 44266)
@@ -169,6 +169,52 @@
 	void addDirectory(const String &name, const FSNode &directory, int priority = 0, int depth = 1, bool flat = false);
 
 	/**
+	 * Create and add a sub directory by name (caseless).
+	 *
+	 * It is also possible to add sub directories of sub directories (of any depth) with this function.
+	 * The path seperator for this case is SLASH for *all* systems.
+	 *
+	 * An example would be:
+	 *
+	 *   "game/itedata"
+	 *
+	 * In this example the code would first try to search for all directories matching
+	 * "game" (case insensitive) in the path "directory" first and search through all
+	 * of the matches for "itedata" (case insensitive too).
+	 *
+	 * Note that it will add *all* matches found!
+	 *
+	 * Even though this method is currently implemented via addSubDirectoriesMatching it is not safe
+	 * to assume that this method is using anything other than a simple case insensitive compare.
+	 * Thus do not use any tokens like '*' or '?' in the "caselessName" parameter of this function!
+	 */
+	void addSubDirectoryMatching(const FSNode &directory, const String &caselessName, int priority = 0) {
+		addSubDirectoriesMatching(directory, caselessName, true, priority);
+	}
+
+	/**
+	 * Create and add sub directories by pattern.
+	 *
+	 * It is also possible to add sub directories of sub directories (of any depth) with this function.
+	 * The path seperator for this case is SLASH for *all* systems.
+	 *
+	 * An example would be:
+	 *
+	 *   "game/itedata"
+	 *
+	 * In this example the code would first try to search for all directories matching
+	 * "game" in the path "directory" first and search through all of the matches for
+	 * "itedata". If "ingoreCase" is set to true, the code would do a case insensitive
+	 * match, otherwise it is doing a case sensitive match.
+	 *
+	 * This method works of course also with tokens. For a list of available tokens
+	 * see the documentation for Common::matchString.
+	 *
+	 * @see Common::matchString
+	 */
+	void addSubDirectoriesMatching(const FSNode &directory, String pattern, bool ignoreCase, int priority = 0);
+
+	/**
 	 * Remove an archive from the searchable set.
 	 */
 	void remove(const String& name);

Modified: scummvm/trunk/common/file.cpp
===================================================================
--- scummvm/trunk/common/file.cpp	2009-09-23 00:14:06 UTC (rev 44265)
+++ scummvm/trunk/common/file.cpp	2009-09-23 00:15:00 UTC (rev 44266)
@@ -32,16 +32,6 @@
 
 namespace Common {
 
-void File::addDefaultDirectory(const String &directory) {
-	FSNode dir(directory);
-	addDefaultDirectory(dir);
-}
-
-void File::addDefaultDirectory(const FSNode &dir) {
-	if (dir.exists() && dir.isDirectory())
-		SearchMan.addDirectory(dir.getPath(), dir);
-}
-
 File::File()
 	: _handle(0) {
 }

Modified: scummvm/trunk/common/file.h
===================================================================
--- scummvm/trunk/common/file.h	2009-09-23 00:14:06 UTC (rev 44265)
+++ scummvm/trunk/common/file.h	2009-09-23 00:15:00 UTC (rev 44266)
@@ -48,10 +48,6 @@
 	String _name;
 
 public:
-
-	static void addDefaultDirectory(const String &directory);
-	static void addDefaultDirectory(const FSNode &directory);
-
 	File();
 	virtual ~File();
 

Modified: scummvm/trunk/engines/agos/agos.cpp
===================================================================
--- scummvm/trunk/engines/agos/agos.cpp	2009-09-23 00:14:06 UTC (rev 44265)
+++ scummvm/trunk/engines/agos/agos.cpp	2009-09-23 00:15:00 UTC (rev 44266)
@@ -512,24 +512,18 @@
 
 	// Add default file directories for Acorn version of
 	// Simon the Sorcerer 1
-	File::addDefaultDirectory(_gameDataDir.getChild("execute"));
-	File::addDefaultDirectory(_gameDataDir.getChild("EXECUTE"));
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "execute");
 
 	// Add default file directories for Amiga/Macintosh
 	// verisons of Simon the Sorcerer 2
-	File::addDefaultDirectory(_gameDataDir.getChild("voices"));
-	File::addDefaultDirectory(_gameDataDir.getChild("VOICES"));
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "voices");
 
 	// Add default file directories for Amiga & Macintosh
 	// versions of The Feeble Files
-	File::addDefaultDirectory(_gameDataDir.getChild("gfx"));
-	File::addDefaultDirectory(_gameDataDir.getChild("GFX"));
-	File::addDefaultDirectory(_gameDataDir.getChild("movies"));
-	File::addDefaultDirectory(_gameDataDir.getChild("MOVIES"));
-	File::addDefaultDirectory(_gameDataDir.getChild("sfx"));
-	File::addDefaultDirectory(_gameDataDir.getChild("SFX"));
-	File::addDefaultDirectory(_gameDataDir.getChild("speech"));
-	File::addDefaultDirectory(_gameDataDir.getChild("SPEECH"));
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "gfx");
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "movies");
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "sfx");
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "speech");
 
 	g_eventRec.registerRandomSource(_rnd, "agos");
 }

Modified: scummvm/trunk/engines/groovie/groovie.cpp
===================================================================
--- scummvm/trunk/engines/groovie/groovie.cpp	2009-09-23 00:14:06 UTC (rev 44265)
+++ scummvm/trunk/engines/groovie/groovie.cpp	2009-09-23 00:15:00 UTC (rev 44266)
@@ -40,9 +40,9 @@
 	_graphicsMan(NULL), _waitingForInput(false) {
 
 	// Adding the default directories
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("groovie"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("media"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("system"));
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "groovie");
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "media");
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "system");
 
 	// Initialize the custom debug levels
 	Common::addDebugChannel(kGroovieDebugAll, "All", "Debug everything");

Modified: scummvm/trunk/engines/m4/m4.cpp
===================================================================
--- scummvm/trunk/engines/m4/m4.cpp	2009-09-23 00:14:06 UTC (rev 44265)
+++ scummvm/trunk/engines/m4/m4.cpp	2009-09-23 00:15:00 UTC (rev 44266)
@@ -108,9 +108,8 @@
 	// FIXME
 	_vm = this;
 
-	Common::File::addDefaultDirectory(_gameDataDir);
-	Common::File::addDefaultDirectory("goodstuf");	// FIXME: This is nonsense
-	Common::File::addDefaultDirectory("resource");	// FIXME: This is nonsense
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "goodstuf");
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "resource");
 
 	Common::addDebugChannel(kDebugScript, "script", "Script debug level");
 	Common::addDebugChannel(kDebugConversations, "conversations", "Conversations debugging");

Modified: scummvm/trunk/engines/saga/saga.cpp
===================================================================
--- scummvm/trunk/engines/saga/saga.cpp	2009-09-23 00:14:06 UTC (rev 44265)
+++ scummvm/trunk/engines/saga/saga.cpp	2009-09-23 00:15:00 UTC (rev 44266)
@@ -93,26 +93,26 @@
 
 	// The Linux version of Inherit the Earth puts all data files in an
 	// 'itedata' sub-directory, except for voices.rsc
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("itedata"));
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "itedata");
 
 	// The Windows version of Inherit the Earth puts various data files in
 	// other subdirectories.
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("graphics"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("music"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("sound"));
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "graphics");
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "music");
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "sound");
 
 	// The Multi-OS version puts the voices file in the root directory of
 	// the CD. The rest of the data files are in game/itedata
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("game").getChild("itedata"));
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "game/itedata");
 
 	// Mac CD Wyrmkeep
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("patch"));
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "patch");
 
 	// Dinotopia
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("smack"));
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "smack");
 
 	// FTA2
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("video"));
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "video");
 
 	_displayClip.left = _displayClip.top = 0;
 	g_eventRec.registerRandomSource(_rnd, "saga");

Modified: scummvm/trunk/engines/scumm/scumm.cpp
===================================================================
--- scummvm/trunk/engines/scumm/scumm.cpp	2009-09-23 00:14:06 UTC (rev 44265)
+++ scummvm/trunk/engines/scumm/scumm.cpp	2009-09-23 00:15:00 UTC (rev 44266)
@@ -934,15 +934,14 @@
 	// Add default file directories.
 	if (((_game.platform == Common::kPlatformAmiga) || (_game.platform == Common::kPlatformAtariST)) && (_game.version <= 4)) {
 		// This is for the Amiga version of Indy3/Loom/Maniac/Zak
-		File::addDefaultDirectory(_gameDataDir.getChild("ROOMS"));
-		File::addDefaultDirectory(_gameDataDir.getChild("rooms"));
+		SearchMan.addSubDirectoryMatching(_gameDataDir, "rooms");
 	}
 
 	if ((_game.platform == Common::kPlatformMacintosh) && (_game.version == 3)) {
 		// This is for the Mac version of Indy3/Loom
-		File::addDefaultDirectory(_gameDataDir.getChild("Rooms 1"));
-		File::addDefaultDirectory(_gameDataDir.getChild("Rooms 2"));
-		File::addDefaultDirectory(_gameDataDir.getChild("Rooms 3"));
+		SearchMan.addSubDirectoryMatching(_gameDataDir, "rooms 1");
+		SearchMan.addSubDirectoryMatching(_gameDataDir, "rooms 2");
+		SearchMan.addSubDirectoryMatching(_gameDataDir, "rooms 3");
 	}
 
 #ifdef ENABLE_SCUMM_7_8
@@ -955,25 +954,19 @@
 		//
 		// This check for whether we play from CD is very crude, though.
 
-		File::addDefaultDirectory("/Volumes/MONKEY3_1/RESOURCE/");
-		File::addDefaultDirectory("/Volumes/MONKEY3_1/resource/");
-		File::addDefaultDirectory("/Volumes/MONKEY3_2/");
-		File::addDefaultDirectory("/Volumes/MONKEY3_2/RESOURCE/");
-		File::addDefaultDirectory("/Volumes/MONKEY3_2/resource/");
+		SearchMan.addSubDirectoryMatching(Common::FSNode("/"), "Volumes/MONKEY3_1/RESOURCE");
+		SearchMan.addSubDirectoryMatching(Common::FSNode("/"), "Volumes/MONKEY3_2");
+		SearchMan.addSubDirectoryMatching(Common::FSNode("/"), "Volumes/MONKEY3_2/RESOURCE");
 	} else
 #endif
-	if (_game.version == 8) {
+	if (_game.version == 8)
 		// This is for COMI
-		File::addDefaultDirectory(_gameDataDir.getChild("RESOURCE"));
-		File::addDefaultDirectory(_gameDataDir.getChild("resource"));
-	}
+		SearchMan.addSubDirectoryMatching(_gameDataDir, "resource");
 
 	if (_game.version == 7) {
 		// This is for Full Throttle & The Dig
-		File::addDefaultDirectory(_gameDataDir.getChild("VIDEO"));
-		File::addDefaultDirectory(_gameDataDir.getChild("video"));
-		File::addDefaultDirectory(_gameDataDir.getChild("DATA"));
-		File::addDefaultDirectory(_gameDataDir.getChild("data"));
+		SearchMan.addSubDirectoryMatching(_gameDataDir, "video");
+		SearchMan.addSubDirectoryMatching(_gameDataDir, "data");
 	}
 #endif
 

Modified: scummvm/trunk/engines/sword1/sword1.cpp
===================================================================
--- scummvm/trunk/engines/sword1/sword1.cpp	2009-09-23 00:14:06 UTC (rev 44265)
+++ scummvm/trunk/engines/sword1/sword1.cpp	2009-09-23 00:15:00 UTC (rev 44266)
@@ -56,19 +56,13 @@
 		_features = 0;
 
 	// Add default file directories
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("CLUSTERS"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("MUSIC"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("SPEECH"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("VIDEO"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("SMACKSHI"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("ENGLISH"));//PSX Demo
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("ITALIAN"));//PSX Demo
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("clusters"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("music"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("speech"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("video"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("smackshi"));
-	
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "clusters");
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "music");
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "speech");
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "video");
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "smackshi");
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "english");//PSX Demo
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "italian");//PSX Demo
 }
 
 SwordEngine::~SwordEngine() {

Modified: scummvm/trunk/engines/sword2/sword2.cpp
===================================================================
--- scummvm/trunk/engines/sword2/sword2.cpp	2009-09-23 00:14:06 UTC (rev 44265)
+++ scummvm/trunk/engines/sword2/sword2.cpp	2009-09-23 00:15:00 UTC (rev 44266)
@@ -257,14 +257,10 @@
 
 Sword2Engine::Sword2Engine(OSystem *syst) : Engine(syst) {
 	// Add default file directories
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("CLUSTERS"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("SWORD2"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("VIDEO"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("SMACKS"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("clusters"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("sword2"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("video"));
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("smacks"));
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "clusters");
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "sword2");
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "video");
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "smacks");
 
 	if (!scumm_stricmp(ConfMan.get("gameid").c_str(), "sword2demo") || !scumm_stricmp(ConfMan.get("gameid").c_str(), "sword2psxdemo"))
 		_features = GF_DEMO;

Modified: scummvm/trunk/engines/tinsel/tinsel.cpp
===================================================================
--- scummvm/trunk/engines/tinsel/tinsel.cpp	2009-09-23 00:14:06 UTC (rev 44265)
+++ scummvm/trunk/engines/tinsel/tinsel.cpp	2009-09-23 00:15:00 UTC (rev 44266)
@@ -844,7 +844,7 @@
 	_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume"));
 
 	// Add DW2 subfolder to search path in case user is running directly from the CDs
-	Common::File::addDefaultDirectory(_gameDataDir.getChild("dw2"));
+	SearchMan.addSubDirectoryMatching(_gameDataDir, "dw2");
 
 	// Add subfolders needed for psx versions of Discworld 1	
 	if (TinselV1PSX)

Modified: scummvm/trunk/sound/softsynth/mt32.cpp
===================================================================
--- scummvm/trunk/sound/softsynth/mt32.cpp	2009-09-23 00:14:06 UTC (rev 44265)
+++ scummvm/trunk/sound/softsynth/mt32.cpp	2009-09-23 00:15:00 UTC (rev 44266)
@@ -38,6 +38,7 @@
 #include "common/file.h"
 #include "common/system.h"
 #include "common/util.h"
+#include "common/archive.h"
 
 #include "graphics/fontman.h"
 #include "graphics/surface.h"
@@ -514,7 +515,7 @@
 MidiDriver *MidiDriver_MT32_create(Audio::Mixer *mixer) {
 	// HACK: It will stay here until engine plugin loader overhaul
 	if (ConfMan.hasKey("extrapath"))
-		Common::File::addDefaultDirectory(ConfMan.get("extrapath"));
+		SearchMan.addDirectory("extrapath", ConfMan.get("extrapath"));
 
 	MidiDriver *mididriver;
 


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