[Scummvm-cvs-logs] CVS: scummvm/base plugins.cpp,1.38,1.39 plugins.h,1.25,1.26

Max Horn fingolfin at users.sourceforge.net
Fri Mar 25 09:57:57 CET 2005


Update of /cvsroot/scummvm/scummvm/base
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20727/base

Modified Files:
	plugins.cpp plugins.h 
Log Message:
Patch #1117443 (Experimental plugin code revision)

Index: plugins.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/base/plugins.cpp,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- plugins.cpp	6 Feb 2005 17:21:31 -0000	1.38
+++ plugins.cpp	25 Mar 2005 17:55:51 -0000	1.39
@@ -39,16 +39,25 @@
 
 #ifdef UNIX
 #include <dlfcn.h>
-#define DYNAMIC_PLUGIN_PATH(name) (name "/" PLUGIN_PREFIX name PLUGIN_SUFFIX)
+#define PLUGIN_DIRECTORY	"plugins/"
 #else
 #ifdef __DC__
 #include "dcloader.h"
-#define DYNAMIC_PLUGIN_PATH(name) (name ".plg")
+#define PLUGIN_DIRECTORY	""
+#define PLUGIN_PREFIX		""
+#define PLUGIN_SUFFIX		".plg"
 #else
 #error No support for loading plugins on non-unix systems at this point!
 #endif
 #endif
 
+#else
+
+PluginRegistrator::PluginRegistrator(const char *name, GameList games, EngineFactory ef, DetectFunc df)
+	: _name(name), _ef(ef), _df(df), _games(games) {
+	//printf("Automatically registered plugin '%s'\n", name);
+}
+
 #endif
 
 
@@ -108,7 +117,7 @@
 	void *findSymbol(const char *symbol);
 
 public:
-	DynamicPlugin(const char *filename)
+	DynamicPlugin(const Common::String &filename)
 		: _dlHandle(0), _filename(filename), _ef(0), _df(0), _games() {}
 
 	const char *getName() const					{ return _name.c_str(); }
@@ -222,48 +231,56 @@
 	// Hence one more symbol should be exported by plugins which returns
 	// the "ABI" version the plugin was built for, and we can compare that
 	// to the ABI version of the executable.
-	#define LOAD_MODULE(name, NAME) \
-		tryLoadPlugin(new DynamicPlugin(DYNAMIC_PLUGIN_PATH(name)));
-#else
-	// "Loader" for the static plugins
-	#define LOAD_MODULE(name, NAME) \
-		tryLoadPlugin(new StaticPlugin(name, Engine_##NAME##_gameList(), Engine_##NAME##_create, Engine_##NAME##_detectGames));
-#endif
 
 	// Load all plugins.
-	// Right now the list is hardcoded. On the long run, of course it should
-	// automatically be determined.
-#ifndef DISABLE_SCUMM
-	LOAD_MODULE("scumm", SCUMM);
-#endif
-
-#ifndef DISABLE_SIMON
-	LOAD_MODULE("simon", SIMON);
-#endif
-
-#ifndef DISABLE_SKY
-	LOAD_MODULE("sky", SKY);
-#endif
-
-#ifndef DISABLE_SWORD1
-	LOAD_MODULE("sword1", SWORD1);
-#endif
+	// Scan for all plugins in this directory
+	FilesystemNode dir(PLUGIN_DIRECTORY);
+	FSList files(dir.listDir(FilesystemNode::kListFilesOnly));
+	
+	for (FSList::const_iterator i = files.begin(); i != files.end(); ++i) {
+		Common::String name(i->displayName());
+		if (name.hasPrefix(PLUGIN_PREFIX) && name.hasSuffix(PLUGIN_SUFFIX)) {
+			tryLoadPlugin(new DynamicPlugin(i->path()));
+		}
+	}
 
-#ifndef DISABLE_SWORD2
-	LOAD_MODULE("sword2", SWORD2);
-#endif
+#else
+	#define LINK_PLUGIN(ID) \
+		extern PluginRegistrator g_##ID##_PluginReg; \
+		plugin = &g_##ID##_PluginReg; \
+		tryLoadPlugin(new StaticPlugin(plugin->_name, plugin->_games, plugin->_ef, plugin->_df));
 
-#ifndef DISABLE_QUEEN
-	LOAD_MODULE("queen", QUEEN);
-#endif
+	// "Loader" for the static plugins.
+	// Iterate over all registered (static) plugins and load them.
+	PluginRegistrator *plugin;
+	
+	#ifndef DISABLE_SIMON
+	LINK_PLUGIN(SCUMM)
+	#endif
+	#ifndef DISABLE_SKY
+	LINK_PLUGIN(SKY)
+	#endif
+	#ifndef DISABLE_SWORD1
+	LINK_PLUGIN(SWORD1)
+	#endif
+	#ifndef DISABLE_SWORD2
+	LINK_PLUGIN(SWORD2)
+	#endif
+	#ifndef DISABLE_SIMON
+	LINK_PLUGIN(SIMON)
+	#endif
+	#ifndef DISABLE_QUEEN
+	LINK_PLUGIN(QUEEN)
+	#endif
+	#ifndef DISABLE_SAGA
+	LINK_PLUGIN(SAGA)
+	#endif
+	#ifndef DISABLE_KYRA
+	//LINK_PLUGIN(KYRA)
+	#endif
 
-#ifndef DISABLE_KYRA
-	LOAD_MODULE("kyra", KYRA);
 #endif
 
-#ifndef DISABLE_SAGA
-	LOAD_MODULE("saga", SAGA);
-#endif
 }
 
 void PluginManager::unloadPlugins() {

Index: plugins.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/base/plugins.h,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -d -r1.25 -r1.26
--- plugins.h	6 Jan 2005 18:38:33 -0000	1.25
+++ plugins.h	25 Mar 2005 17:55:51 -0000	1.26
@@ -78,7 +78,7 @@
 
 
 /**
- * The REGISTER_PLUGIN is a convenience macro meant to ease writing
+ * REGISTER_PLUGIN is a convenience macro meant to ease writing
  * the plugin interface for our modules. In particular, using it
  * makes it possible to compile the very same code in a module
  * both as a static and a dynamic plugin.
@@ -87,17 +87,40 @@
  * @todo	on Windows, we might need __declspec(dllexport) ?
  */
 #ifndef DYNAMIC_MODULES
-#define REGISTER_PLUGIN(name,gameListFactory,engineFactory,detectGames)
+#define REGISTER_PLUGIN(ID,name) \
+	PluginRegistrator g_##ID##_PluginReg(name, Engine_##ID##_gameList(), Engine_##ID##_create, Engine_##ID##_detectGames);
 #else
-#define REGISTER_PLUGIN(name,gameListFactory,engineFactory,detectGames) \
+#define REGISTER_PLUGIN(ID,name) \
 	extern "C" { \
 		const char *PLUGIN_name() { return name; } \
-		GameList PLUGIN_getSupportedGames() { return gameListFactory(); } \
-		Engine *PLUGIN_createEngine(GameDetector *detector, OSystem *syst) { return engineFactory(detector, syst); } \
-		DetectedGameList PLUGIN_detectGames(const FSList &fslist) { return detectGames(fslist); } \
+		GameList PLUGIN_getSupportedGames() { return Engine_##ID##_gameList(); } \
+		Engine *PLUGIN_createEngine(GameDetector *detector, OSystem *syst) { return Engine_##ID##_create(detector, syst); } \
+		DetectedGameList PLUGIN_detectGames(const FSList &fslist) { return Engine_##ID##_detectGames(fslist); } \
 	}
 #endif
 
+#ifndef DYNAMIC_MODULES
+/**
+ * The PluginRegistrator class is used by the static version of REGISTER_PLUGIN
+ * to allow static 'plugins' to register with the PluginManager.
+ */
+class PluginRegistrator {
+	friend class PluginManager;
+public:
+	typedef Engine *(*EngineFactory)(GameDetector *detector, OSystem *syst);
+	typedef DetectedGameList (*DetectFunc)(const FSList &fslist);
+
+protected:
+	const char *_name;
+	EngineFactory _ef;
+	DetectFunc _df;
+	GameList _games;
+
+public:
+	PluginRegistrator(const char *name, GameList games, EngineFactory ef, DetectFunc df);
+};
+#endif
+
 
 /** List of plugins. */
 typedef Common::Array<Plugin *> PluginList;
@@ -133,49 +156,4 @@
 };
 
 
-#ifndef DYNAMIC_MODULES
-
-#define DECLARE_PLUGIN(name) \
-	extern GameList Engine_##name##_gameList(); \
-	extern Engine *Engine_##name##_create(GameDetector *detector, OSystem *syst); \
-	extern DetectedGameList Engine_##name##_detectGames(const FSList &fslist);
-
-// Factory functions => no need to include the specific classes
-// in this header. This serves two purposes:
-// 1) Clean separation from the game modules (scumm, simon) and the generic code
-// 2) Faster (compiler doesn't have to parse lengthy header files)
-#ifndef DISABLE_SCUMM
-DECLARE_PLUGIN(SCUMM)
-#endif
-
-#ifndef DISABLE_SIMON
-DECLARE_PLUGIN(SIMON)
-#endif
-
-#ifndef DISABLE_SKY
-DECLARE_PLUGIN(SKY)
-#endif
-
-#ifndef DISABLE_SWORD1
-DECLARE_PLUGIN(SWORD1)
-#endif
-
-#ifndef DISABLE_SWORD2
-DECLARE_PLUGIN(SWORD2)
-#endif
-
-#ifndef DISABLE_QUEEN
-DECLARE_PLUGIN(QUEEN)
-#endif
-
-#ifndef DISABLE_KYRA
-DECLARE_PLUGIN(KYRA)
-#endif
-
-#ifndef DISABLE_SAGA
-DECLARE_PLUGIN(SAGA)
-#endif
-
-#endif
-
 #endif





More information about the Scummvm-git-logs mailing list