BASE: Load engine plugins by name. Fixes bug

This is a degradation from the split of detection plugins. All the
caching code which was present was left with detection plugins which
now make no sense: we always load all detection plugins as a whole.

This commit moves the caching logic over to the Engine plugins.

This opens a question now whether we should move all to UNCACHED_PLUGINS
This commit is contained in:
Eugene Sandulenko 2021-08-16 20:29:49 +02:00
parent 95ec5b6f70
commit 436e47292e
No known key found for this signature in database
GPG Key ID: 014D387312D34F08
3 changed files with 25 additions and 28 deletions

@ -289,30 +289,15 @@ void PluginManager::addPluginProvider(PluginProvider *pp) {
_providers.push_back(pp); _providers.push_back(pp);
} }
Plugin *PluginManager::getEngineFromMetaEngine(const Plugin *plugin) { const Plugin *PluginManager::getEngineFromMetaEngine(const Plugin *plugin) {
assert(plugin->getType() == PLUGIN_TYPE_ENGINE_DETECTION); assert(plugin->getType() == PLUGIN_TYPE_ENGINE_DETECTION);
Plugin *enginePlugin = nullptr; const Plugin *enginePlugin = nullptr;
bool found = false;
// Use the engineID from MetaEngine for comparasion. // Use the engineID from MetaEngine for comparison.
Common::String metaEnginePluginName = plugin->getEngineId(); Common::String metaEnginePluginName = plugin->getEngineId();
PluginMan.loadFirstPlugin();
do {
PluginList pl = PluginMan.getPlugins(PLUGIN_TYPE_ENGINE);
// Iterate over all engine plugins.
for (PluginList::const_iterator itr = pl.begin(); itr != pl.end(); itr++) {
// The getName() provides a name which is similiar to getEngineId.
// Because engines are engines themselves, this function is simply named getName.
Common::String enginePluginName((*itr)->getName());
if (metaEnginePluginName.equalsIgnoreCase(enginePluginName)) { enginePlugin = PluginMan.findEnginePlugin(metaEnginePluginName);
enginePlugin = (*itr);
found = true;
break;
}
}
} while (!found && PluginMan.loadNextPlugin());
if (enginePlugin) { if (enginePlugin) {
debug(9, "MetaEngine: %s \t matched to \t Engine: %s", plugin->getName(), enginePlugin->getFileName()); debug(9, "MetaEngine: %s \t matched to \t Engine: %s", plugin->getName(), enginePlugin->getFileName());
@ -323,10 +308,10 @@ Plugin *PluginManager::getEngineFromMetaEngine(const Plugin *plugin) {
return nullptr; return nullptr;
} }
Plugin *PluginManager::getMetaEngineFromEngine(const Plugin *plugin) { const Plugin *PluginManager::getMetaEngineFromEngine(const Plugin *plugin) {
assert(plugin->getType() == PLUGIN_TYPE_ENGINE); assert(plugin->getType() == PLUGIN_TYPE_ENGINE);
Plugin *metaEngine = nullptr; const Plugin *metaEngine = nullptr;
PluginList pl = PluginMan.getPlugins(PLUGIN_TYPE_ENGINE_DETECTION); PluginList pl = PluginMan.getPlugins(PLUGIN_TYPE_ENGINE_DETECTION);
@ -810,7 +795,7 @@ Common::String EngineManager::createTargetForGame(const DetectedGame &game) {
return domain; return domain;
} }
const Plugin *EngineManager::findLoadedPlugin(const Common::String &engineId) const { const Plugin *EngineManager::findPlugin(const Common::String &engineId) const {
const PluginList &plugins = getPlugins(); const PluginList &plugins = getPlugins();
for (PluginList::const_iterator iter = plugins.begin(); iter != plugins.end(); iter++) for (PluginList::const_iterator iter = plugins.begin(); iter != plugins.end(); iter++)
@ -820,7 +805,17 @@ const Plugin *EngineManager::findLoadedPlugin(const Common::String &engineId) co
return 0; return 0;
} }
const Plugin *EngineManager::findPlugin(const Common::String &engineId) const { const Plugin *PluginManager::findLoadedPlugin(const Common::String &engineId) {
const PluginList &plugins = getPlugins(PLUGIN_TYPE_ENGINE);
for (PluginList::const_iterator iter = plugins.begin(); iter != plugins.end(); iter++)
if (engineId == (*iter)->get<MetaEngine>().getName())
return *iter;
return 0;
}
const Plugin *PluginManager::findEnginePlugin(const Common::String &engineId) {
// First look for the game using the plugins in memory. This is critical // First look for the game using the plugins in memory. This is critical
// for calls coming from inside games // for calls coming from inside games
const Plugin *plugin = findLoadedPlugin(engineId); const Plugin *plugin = findLoadedPlugin(engineId);
@ -829,7 +824,7 @@ const Plugin *EngineManager::findPlugin(const Common::String &engineId) const {
// Now look for the plugin using the engine ID. This is much faster than scanning plugin // Now look for the plugin using the engine ID. This is much faster than scanning plugin
// by plugin // by plugin
if (PluginMan.loadPluginFromEngineId(engineId)) { if (loadPluginFromEngineId(engineId)) {
plugin = findLoadedPlugin(engineId); plugin = findLoadedPlugin(engineId);
if (plugin) if (plugin)
return plugin; return plugin;

@ -305,6 +305,8 @@ protected:
bool tryLoadPlugin(Plugin *plugin); bool tryLoadPlugin(Plugin *plugin);
void addToPluginsInMemList(Plugin *plugin); void addToPluginsInMemList(Plugin *plugin);
const Plugin *findEnginePlugin(const Common::String &engineId);
const Plugin *findLoadedPlugin(const Common::String &engineId);
static PluginManager *_instance; static PluginManager *_instance;
PluginManager(); PluginManager();
@ -323,11 +325,11 @@ public:
* It uses the Engine plugin's getName method, which is an identifier, * It uses the Engine plugin's getName method, which is an identifier,
* and then tries to matches it with each plugin present in memory. * and then tries to matches it with each plugin present in memory.
* *
* @param A plugin of type ENGINE. * @param plugin A plugin of type ENGINE.
* *
* @return A plugin of type METAENGINE. * @return A plugin of type METAENGINE.
*/ */
Plugin *getMetaEngineFromEngine(const Plugin *plugin); const Plugin *getMetaEngineFromEngine(const Plugin *plugin);
/** /**
* A method which takes in a plugin of type METAENGINE, * A method which takes in a plugin of type METAENGINE,
@ -339,7 +341,7 @@ public:
* *
* @return A plugin of type ENGINE. * @return A plugin of type ENGINE.
*/ */
Plugin *getEngineFromMetaEngine(const Plugin *plugin); const Plugin *getEngineFromMetaEngine(const Plugin *plugin);
// Functions used by the uncached PluginManager // Functions used by the uncached PluginManager
virtual void init() {} virtual void init() {}

@ -771,7 +771,7 @@ void AdvancedMetaEngineDetection::initSubSystems(const ADGameDescription *gameDe
Common::Error AdvancedMetaEngine::createInstance(OSystem *syst, Engine **engine) const { Common::Error AdvancedMetaEngine::createInstance(OSystem *syst, Engine **engine) const {
PluginList pl = PluginMan.getPlugins(PLUGIN_TYPE_ENGINE); PluginList pl = PluginMan.getPlugins(PLUGIN_TYPE_ENGINE);
if (pl.size() == 1) { if (pl.size() == 1) {
Plugin *metaEnginePlugin = PluginMan.getMetaEngineFromEngine(pl[0]); const Plugin *metaEnginePlugin = PluginMan.getMetaEngineFromEngine(pl[0]);
if (metaEnginePlugin) { if (metaEnginePlugin) {
return metaEnginePlugin->get<AdvancedMetaEngineDetection>().createInstance(syst, engine); return metaEnginePlugin->get<AdvancedMetaEngineDetection>().createInstance(syst, engine);
} }