diff options
-rw-r--r-- | base/plugins.cpp | 30 | ||||
-rw-r--r-- | base/plugins.h | 7 |
2 files changed, 23 insertions, 14 deletions
diff --git a/base/plugins.cpp b/base/plugins.cpp index 7dae94e006..ac8e498469 100644 --- a/base/plugins.cpp +++ b/base/plugins.cpp @@ -317,16 +317,26 @@ bool PluginManager::tryLoadPlugin(Plugin *plugin) { assert(plugin); // Try to load the plugin if (plugin->loadPlugin()) { - // If successful, add it to the list of known plugins and return. - _plugins[plugin->getType()].push_back(plugin); - - // TODO/FIXME: We should perform some additional checks here: - // * Check for some kind of "API version" (possibly derived from the - // SVN tree revision?) - // * If two plugins provide the same engine, we should only load one. - // To detect this situation, we could just compare the plugin name. - // To handle it, simply prefer modules loaded earlier to those coming. - // Or vice versa... to be determined... :-) + // The plugin is valid, see if it provides the same module as an + // already loaded one and should replace it. + bool found = false; + + PluginList::iterator pl = _plugins[plugin->getType()].begin(); + while (!found && pl != _plugins[plugin->getType()].end()) { + if (!strcmp(plugin->getName(), (*pl)->getName())) { + // Found a duplicated module. Replace the old one. + found = true; + delete *pl; + *pl = plugin; + debug(1, "Replaced the duplicated plugin: '%s'", plugin->getName()); + } + pl++; + } + + if (!found) { + // If it provides a new module, just add it to the list of known plugins. + _plugins[plugin->getType()].push_back(plugin); + } return true; } else { diff --git a/base/plugins.h b/base/plugins.h index b64334074c..d03a240922 100644 --- a/base/plugins.h +++ b/base/plugins.h @@ -27,9 +27,8 @@ #define BASE_PLUGINS_H #include "common/error.h" -#include "common/list.h" #include "common/singleton.h" -#include "base/game.h" +#include "common/util.h" #ifdef DYNAMIC_MODULES #include "common/fs.h" @@ -69,7 +68,7 @@ enum PluginType { }; // TODO: Make the engine API version depend on ScummVM's version -// because of the backlinking +// because of the backlinking (posibly from the SVN revision) #define PLUGIN_TYPE_ENGINE_VERSION 1 #define PLUGIN_TYPE_MIDI_VERSION 1 @@ -274,7 +273,7 @@ protected: * managing all Plugin class instances, and unloading them. */ class PluginManager : public Common::Singleton<PluginManager> { - typedef Common::List<PluginProvider *> ProviderList; + typedef Common::Array<PluginProvider *> ProviderList; private: PluginList _plugins[PLUGIN_TYPE_MAX]; ProviderList _providers; |