aboutsummaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
Diffstat (limited to 'base')
-rw-r--r--base/commandLine.cpp21
-rw-r--r--base/main.cpp13
-rw-r--r--base/plugins.cpp24
-rw-r--r--base/plugins.h28
4 files changed, 40 insertions, 46 deletions
diff --git a/base/commandLine.cpp b/base/commandLine.cpp
index 640daa1793..2e981fb75a 100644
--- a/base/commandLine.cpp
+++ b/base/commandLine.cpp
@@ -673,9 +673,9 @@ static void listGames() {
printf("Game ID Full Title \n"
"-------------------- ------------------------------------------------------\n");
- const EnginePlugin::List &plugins = EngineMan.getPlugins();
- for (EnginePlugin::List::const_iterator iter = plugins.begin(); iter != plugins.end(); ++iter) {
- GameList list = (**iter)->getSupportedGames();
+ const PluginList &plugins = EngineMan.getPlugins();
+ for (PluginList::const_iterator iter = plugins.begin(); iter != plugins.end(); ++iter) {
+ GameList list = (*iter)->get<MetaEngine>().getSupportedGames();
for (GameList::iterator v = list.begin(); v != list.end(); ++v) {
printf("%-20s %s\n", v->gameid().c_str(), v->description().c_str());
}
@@ -741,7 +741,7 @@ static Common::Error listSaves(const char *target) {
gameid.toLowercase(); // Normalize it to lower case
// Find the plugin that will handle the specified gameid
- const EnginePlugin *plugin = 0;
+ const Plugin *plugin = nullptr;
GameDescriptor game = EngineMan.findGame(gameid, &plugin);
if (!plugin) {
@@ -749,13 +749,15 @@ static Common::Error listSaves(const char *target) {
Common::String::format("target '%s', gameid '%s", target, gameid.c_str()));
}
- if (!(*plugin)->hasFeature(MetaEngine::kSupportsListSaves)) {
+ const MetaEngine &metaEngine = plugin->get<MetaEngine>();
+
+ if (!metaEngine.hasFeature(MetaEngine::kSupportsListSaves)) {
// TODO: Include more info about the target (desc, engine name, ...) ???
return Common::Error(Common::kEnginePluginNotSupportSaves,
Common::String::format("target '%s', gameid '%s", target, gameid.c_str()));
} else {
// Query the plugin for a list of saved games
- SaveStateList saveList = (*plugin)->listSaves(target);
+ SaveStateList saveList = metaEngine.listSaves(target);
if (saveList.size() > 0) {
// TODO: Include more info about the target (desc, engine name, ...) ???
@@ -793,13 +795,14 @@ static void listThemes() {
/** Lists all output devices */
static void listAudioDevices() {
- MusicPlugin::List pluginList = MusicMan.getPlugins();
+ PluginList pluginList = MusicMan.getPlugins();
printf("ID Description\n");
printf("------------------------------ ------------------------------------------------\n");
- for (MusicPlugin::List::const_iterator i = pluginList.begin(), iend = pluginList.end(); i != iend; ++i) {
- MusicDevices deviceList = (**i)->getDevices();
+ for (PluginList::const_iterator i = pluginList.begin(), iend = pluginList.end(); i != iend; ++i) {
+ const MusicPluginObject &musicObject = (*i)->get<MusicPluginObject>();
+ MusicDevices deviceList = musicObject.getDevices();
for (MusicDevices::iterator j = deviceList.begin(), jend = deviceList.end(); j != jend; ++j) {
printf("%-30s %s\n", Common::String::format("\"%s\"", j->getCompleteId().c_str()).c_str(), j->getCompleteName().c_str());
}
diff --git a/base/main.cpp b/base/main.cpp
index 4251c2c678..f529f3ec08 100644
--- a/base/main.cpp
+++ b/base/main.cpp
@@ -106,8 +106,8 @@ static bool launcherDialog() {
return (dlg.runModal() != -1);
}
-static const EnginePlugin *detectPlugin() {
- const EnginePlugin *plugin = 0;
+static const Plugin *detectPlugin() {
+ const Plugin *plugin = nullptr;
// Make sure the gameid is set in the config manager, and that it is lowercase.
Common::String gameid(ConfMan.getActiveDomainName());
@@ -141,7 +141,7 @@ static const EnginePlugin *detectPlugin() {
}
// TODO: specify the possible return values here
-static Common::Error runGame(const EnginePlugin *plugin, OSystem &system, const Common::String &edebuglevels) {
+static Common::Error runGame(const Plugin *plugin, OSystem &system, const Common::String &edebuglevels) {
// Determine the game data path, for validation and error messages
Common::FSNode dir(ConfMan.get("path"));
Common::Error err = Common::kNoError;
@@ -169,15 +169,16 @@ static Common::Error runGame(const EnginePlugin *plugin, OSystem &system, const
// Create the game engine
if (err.getCode() == Common::kNoError) {
+ const MetaEngine &metaEngine = plugin->get<MetaEngine>();
// Set default values for all of the custom engine options
// Appareantly some engines query them in their constructor, thus we
// need to set this up before instance creation.
- const ExtraGuiOptions engineOptions = (*plugin)->getExtraGuiOptions(Common::String());
+ const ExtraGuiOptions engineOptions = metaEngine.getExtraGuiOptions(Common::String());
for (uint i = 0; i < engineOptions.size(); i++) {
ConfMan.registerDefault(engineOptions[i].configOption, engineOptions[i].defaultState);
}
- err = (*plugin)->createInstance(&system, &engine);
+ err = metaEngine.createInstance(&system, &engine);
}
// Check for errors
@@ -504,7 +505,7 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) {
// cleanly, so this is now enabled to encourage people to fix bits :)
while (0 != ConfMan.getActiveDomain()) {
// Try to find a plugin which feels responsible for the specified game.
- const EnginePlugin *plugin = detectPlugin();
+ const Plugin *plugin = detectPlugin();
if (plugin) {
// Unload all plugins not needed for this game,
// to save memory
diff --git a/base/plugins.cpp b/base/plugins.cpp
index 39aaf2f73e..18755003b4 100644
--- a/base/plugins.cpp
+++ b/base/plugins.cpp
@@ -457,7 +457,7 @@ DECLARE_SINGLETON(EngineManager);
* For the uncached version, we first try to find the plugin using the gameId
* and only if we can't find it there, we loop through the plugins.
**/
-GameDescriptor EngineManager::findGame(const Common::String &gameName, const EnginePlugin **plugin) const {
+GameDescriptor EngineManager::findGame(const Common::String &gameName, const Plugin **plugin) const {
GameDescriptor result;
// First look for the game using the plugins in memory. This is critical
@@ -493,18 +493,18 @@ GameDescriptor EngineManager::findGame(const Common::String &gameName, const Eng
/**
* Find the game within the plugins loaded in memory
**/
-GameDescriptor EngineManager::findGameInLoadedPlugins(const Common::String &gameName, const EnginePlugin **plugin) const {
+GameDescriptor EngineManager::findGameInLoadedPlugins(const Common::String &gameName, const Plugin **plugin) const {
// Find the GameDescriptor for this target
- const EnginePlugin::List &plugins = getPlugins();
+ const PluginList &plugins = getPlugins();
GameDescriptor result;
if (plugin)
*plugin = 0;
- EnginePlugin::List::const_iterator iter;
+ PluginList::const_iterator iter;
for (iter = plugins.begin(); iter != plugins.end(); ++iter) {
- result = (**iter)->findGame(gameName.c_str());
+ result = (*iter)->get<MetaEngine>().findGame(gameName.c_str());
if (!result.gameid().empty()) {
if (plugin)
*plugin = *iter;
@@ -516,22 +516,22 @@ GameDescriptor EngineManager::findGameInLoadedPlugins(const Common::String &game
GameList EngineManager::detectGames(const Common::FSList &fslist) const {
GameList candidates;
- EnginePlugin::List plugins;
- EnginePlugin::List::const_iterator iter;
+ PluginList plugins;
+ PluginList::const_iterator iter;
PluginManager::instance().loadFirstPlugin();
do {
plugins = getPlugins();
// Iterate over all known games and for each check if it might be
// the game in the presented directory.
for (iter = plugins.begin(); iter != plugins.end(); ++iter) {
- candidates.push_back((**iter)->detectGames(fslist));
+ candidates.push_back((*iter)->get<MetaEngine>().detectGames(fslist));
}
} while (PluginManager::instance().loadNextPlugin());
return candidates;
}
-const EnginePlugin::List &EngineManager::getPlugins() const {
- return (const EnginePlugin::List &)PluginManager::instance().getPlugins(PLUGIN_TYPE_ENGINE);
+const PluginList &EngineManager::getPlugins() const {
+ return PluginManager::instance().getPlugins(PLUGIN_TYPE_ENGINE);
}
@@ -543,6 +543,6 @@ namespace Common {
DECLARE_SINGLETON(MusicManager);
}
-const MusicPlugin::List &MusicManager::getPlugins() const {
- return (const MusicPlugin::List &)PluginManager::instance().getPlugins(PLUGIN_TYPE_MUSIC);
+const PluginList &MusicManager::getPlugins() const {
+ return PluginManager::instance().getPlugins(PLUGIN_TYPE_MUSIC);
}
diff --git a/base/plugins.h b/base/plugins.h
index 2793ff3ffd..ce45f7102a 100644
--- a/base/plugins.h
+++ b/base/plugins.h
@@ -190,6 +190,15 @@ public:
PluginType getType() const;
const char *getName() const;
+ template <class T>
+ T &get() const {
+ T *pluginObject = dynamic_cast<T *>(_pluginObject);
+ if (!pluginObject) {
+ error("Invalid cast of plugin %s", getName());
+ }
+ return *pluginObject;
+ }
+
/**
* The getFileName() function gets the name of the plugin file for those
* plugins that have files (ie. not static). It doesn't require the plugin
@@ -202,25 +211,6 @@ public:
typedef Common::Array<Plugin *> PluginList;
/**
- * Convenience template to make it easier defining normal Plugin
- * subclasses. Namely, the PluginSubclass will manage PluginObjects
- * of a type specified via the PO_t template parameter.
- */
-template<class PO_t>
-class PluginSubclass : public Plugin {
-public:
- PO_t &operator*() const {
- return *(PO_t *)_pluginObject;
- }
-
- PO_t *operator->() const {
- return (PO_t *)_pluginObject;
- }
-
- typedef Common::Array<PluginSubclass *> List;
-};
-
-/**
* Abstract base class for Plugin factories. Subclasses of this
* are responsible for creating plugin objects, e.g. by loading
* loadable modules from storage media; by creating "fake" plugins