aboutsummaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
authorMax Horn2008-02-03 18:56:47 +0000
committerMax Horn2008-02-03 18:56:47 +0000
commit8a73356a2d6e2d6b7ecefb53e0d5e82484f0e697 (patch)
tree7a5fbed1f61904961fad43411f65d8e174955f2c /base
parent15975bdf7324a8b892562768fe73b6e17816d56f (diff)
downloadscummvm-rg350-8a73356a2d6e2d6b7ecefb53e0d5e82484f0e697.tar.gz
scummvm-rg350-8a73356a2d6e2d6b7ecefb53e0d5e82484f0e697.tar.bz2
scummvm-rg350-8a73356a2d6e2d6b7ecefb53e0d5e82484f0e697.zip
Revised Engine plugin API to only provide a single func which returns a MetaEngine instance. Used this to simplify the rest of the plugin system
svn-id: r30780
Diffstat (limited to 'base')
-rw-r--r--base/plugins.cpp41
-rw-r--r--base/plugins.h69
2 files changed, 29 insertions, 81 deletions
diff --git a/base/plugins.cpp b/base/plugins.cpp
index 7ccd99ce34..67ead04649 100644
--- a/base/plugins.cpp
+++ b/base/plugins.cpp
@@ -25,42 +25,47 @@
#include "base/plugins.h"
#include "common/util.h"
+#include "engines/metaengine.h"
#ifndef DYNAMIC_MODULES
class StaticPlugin : public Plugin {
- PluginRegistrator *_plugin;
+ MetaEngine *_metaengine;
public:
- StaticPlugin(PluginRegistrator *plugin)
- : _plugin(plugin) {
- assert(_plugin);
+ StaticPlugin(MetaEngine *metaengine)
+ : _metaengine(metaengine) {
+ assert(_metaengine);
}
~StaticPlugin() {
- delete _plugin;
+ delete _metaengine;
}
virtual bool loadPlugin() { return true; }
virtual void unloadPlugin() {}
- const char *getName() const { return _plugin->_name; }
- const char *getCopyright() const { return _plugin->_copyright; }
+ const char *getName() const {
+ return _metaengine->getName();
+ }
+
+ const char *getCopyright() const {
+ return _metaengine->getCopyright();
+ }
PluginError createInstance(OSystem *syst, Engine **engine) const {
- assert(_plugin->_ef);
- return (*_plugin->_ef)(syst, engine);
+ return _metaengine->createInstance(syst, engine);
}
- GameList getSupportedGames() const { return _plugin->_games; }
+ GameList getSupportedGames() const {
+ return _metaengine->getSupportedGames();
+ }
GameDescriptor findGame(const char *gameid) const {
- assert(_plugin->_qf);
- return (*_plugin->_qf)(gameid);
+ return _metaengine->findGame(gameid);
}
GameList detectGames(const FSList &fslist) const {
- assert(_plugin->_df);
- return (*_plugin->_df)(fslist);
+ return _metaengine->detectGames(fslist);
}
};
@@ -76,15 +81,11 @@ public:
PluginList pl;
#define LINK_PLUGIN(ID) \
- extern PluginRegistrator *g_##ID##_PluginReg; \
- extern void g_##ID##_PluginReg_alloc(); \
- g_##ID##_PluginReg_alloc(); \
- plugin = g_##ID##_PluginReg; \
- pl.push_back(new StaticPlugin(plugin));
+ extern MetaEngine *g_##ID##_MetaEngine_alloc(); \
+ pl.push_back(new StaticPlugin(g_##ID##_MetaEngine_alloc()));
// "Loader" for the static plugins.
// Iterate over all registered (static) plugins and load them.
- PluginRegistrator *plugin;
#ifndef DISABLE_SCUMM
LINK_PLUGIN(SCUMM)
diff --git a/base/plugins.h b/base/plugins.h
index b37c4eba29..966d65d959 100644
--- a/base/plugins.h
+++ b/base/plugins.h
@@ -35,6 +35,7 @@
class Engine;
class FSList;
+class MetaEngine;
class OSystem;
/**
@@ -67,75 +68,25 @@ public:
* makes it possible to compile the very same code in a module
* both as a static and a dynamic plugin.
*
- * Each plugin has to define the following functions:
- * - GameList Engine_##ID##_gameIDList()
- * -> returns a list of gameid/desc pairs. Only used to implement '--list-games'.
- * - GameDescriptor Engine_##ID##_findGameID(const char *gameid)
- * -> asks the Engine for a GameDescriptor matching the gameid. If that is not
- * possible, the engine MUST set the gameid of the returned value to 0.
- * Note: This MUST succeed for every gameID on the list returned by
- * gameIDList(), but MAY also work for additional gameids (e.g. to support
- * obsolete targets).
- * - GameList Engine_##ID##_detectGames(const FSList &fslist)
- * -> scans through the given file list (usually the contents of a directory),
- * and attempts to detects games present in that location.
- * - PluginError Engine_##ID##_create(OSystem *syst, Engine **engine)
- * -> factory function, create an instance of the Engine class.
- *
* @todo add some means to query the plugin API version etc.
*/
#ifndef DYNAMIC_MODULES
-#define REGISTER_PLUGIN(ID,name,copyright) \
- PluginRegistrator *g_##ID##_PluginReg; \
- void g_##ID##_PluginReg_alloc() { \
- g_##ID##_PluginReg = new PluginRegistrator(name, copyright, \
- Engine_##ID##_gameIDList(), \
- Engine_##ID##_findGameID, \
- Engine_##ID##_create, \
- Engine_##ID##_detectGames \
- );\
+#define REGISTER_PLUGIN(ID,METAENGINE) \
+ MetaEngine *g_##ID##_MetaEngine_alloc() { \
+ return new METAENGINE(); \
} \
void dummyFuncToAllowTrailingSemicolon()
#else
-#define REGISTER_PLUGIN(ID,name,copyright) \
+#define REGISTER_PLUGIN(ID,METAENGINE) \
extern "C" { \
- PLUGIN_EXPORT const char *PLUGIN_name() { return name; } \
- PLUGIN_EXPORT const char *PLUGIN_copyright() { return copyright; } \
- PLUGIN_EXPORT GameList PLUGIN_gameIDList() { return Engine_##ID##_gameIDList(); } \
- PLUGIN_EXPORT GameDescriptor PLUGIN_findGameID(const char *gameid) { return Engine_##ID##_findGameID(gameid); } \
- PLUGIN_EXPORT PluginError PLUGIN_createEngine(OSystem *syst, Engine **engine) { return Engine_##ID##_create(syst, engine); } \
- PLUGIN_EXPORT GameList PLUGIN_detectGames(const FSList &fslist) { return Engine_##ID##_detectGames(fslist); } \
+ PLUGIN_EXPORT MetaEngine *PLUGIN_MetaEngine_alloc() { \
+ return new METAENGINE(); \
+ } \
} \
void dummyFuncToAllowTrailingSemicolon()
#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 StaticPlugin;
-public:
- typedef GameDescriptor (*GameIDQueryFunc)(const char *gameid);
- typedef PluginError (*EngineFactory)(OSystem *syst, Engine **engine);
- typedef GameList (*DetectFunc)(const FSList &fslist);
-
-protected:
- const char *_name;
- const char *_copyright;
- GameIDQueryFunc _qf;
- EngineFactory _ef;
- DetectFunc _df;
- GameList _games;
-
-public:
- PluginRegistrator(const char *name, const char *copyright, GameList games, GameIDQueryFunc qf, EngineFactory ef, DetectFunc df)
- : _name(name), _copyright(copyright), _qf(qf), _ef(ef), _df(df), _games(games) {}
-};
-#endif
-
/** List of plugins. */
typedef Common::Array<Plugin *> PluginList;
@@ -154,13 +105,9 @@ public:
virtual PluginList getPlugins() = 0;
};
-//class PluginManager;
-
/**
* Instances of this class manage all plugins, including loading them,
* making wrapper objects of class Plugin available, and unloading them.
- *
- * @todo Add support for dynamic plugins (this may need additional API, e.g. for a plugin path)
*/
class PluginManager : public Common::Singleton<PluginManager> {
typedef Common::List<PluginProvider *> ProviderList;