diff options
author | Max Horn | 2008-02-03 18:56:47 +0000 |
---|---|---|
committer | Max Horn | 2008-02-03 18:56:47 +0000 |
commit | 8a73356a2d6e2d6b7ecefb53e0d5e82484f0e697 (patch) | |
tree | 7a5fbed1f61904961fad43411f65d8e174955f2c /base | |
parent | 15975bdf7324a8b892562768fe73b6e17816d56f (diff) | |
download | scummvm-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.cpp | 41 | ||||
-rw-r--r-- | base/plugins.h | 69 |
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; |