diff options
author | Max Horn | 2003-09-17 22:41:01 +0000 |
---|---|---|
committer | Max Horn | 2003-09-17 22:41:01 +0000 |
commit | c1a678afeb5100a99030bb51782e5de98d771997 (patch) | |
tree | bae1b38145179bae284a14c983c9541db7644f8c /base/plugins.cpp | |
parent | 0b16afb067a7b3f09a97507675eaa4872a59df38 (diff) | |
download | scummvm-rg350-c1a678afeb5100a99030bb51782e5de98d771997.tar.gz scummvm-rg350-c1a678afeb5100a99030bb51782e5de98d771997.tar.bz2 scummvm-rg350-c1a678afeb5100a99030bb51782e5de98d771997.zip |
new module 'base'; moved gameDetector.*, main.cpp and base/plugins.* there (this removes the need for an ugly hack in the build system, and is also conceptionally cleaner)
svn-id: r10282
Diffstat (limited to 'base/plugins.cpp')
-rw-r--r-- | base/plugins.cpp | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/base/plugins.cpp b/base/plugins.cpp new file mode 100644 index 0000000000..174a097b4d --- /dev/null +++ b/base/plugins.cpp @@ -0,0 +1,118 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * Copyright (C) 2001-2003 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + * + */ + +#include "base/gameDetector.h" +#include "base/plugins.h" +#include "common/engine.h" + + +PluginManager *g_pluginManager = 0; + + +#pragma mark - + + +int Plugin::countTargets() const { + const TargetSettings *target = getTargets(); + int count; + for (count = 0; target->targetName; target++, count++) + ; + return count; +} + +const TargetSettings *Plugin::findTarget(const char *targetName) const { + // Find the TargetSettings for this target + const TargetSettings *target = getTargets(); + assert(targetName); + while (target->targetName) { + if (!scumm_stricmp(target->targetName, targetName)) { + return target; + } + target++; + } + return 0; +} + + +#pragma mark - + + +class StaticPlugin : public Plugin { + const char *_name; + const TargetSettings *_targets; + int _targetCount; + EngineFactory _ef; +public: + StaticPlugin(const char *name, const TargetSettings *targets, EngineFactory ef) + : _name(name), _targets(targets), _ef(ef) { + _targetCount = Plugin::countTargets(); + } + + const char *getName() const { return _name; } + int getVersion() const { return 0; } + + int countTargets() const { return _targetCount; } + const TargetSettings *getTargets() const { return _targets; } + + Engine *createInstance(GameDetector *detector, OSystem *syst) const { + return (*_ef)(detector, syst); + } +}; + + +#pragma mark - + + +PluginManager::PluginManager() { +} + +PluginManager::~PluginManager() { + // Explicitly unload all loaded plugins + unloadPlugins(); +} + +void PluginManager::loadPlugins() { +#ifndef DISABLE_SCUMM + _plugins.push_back(new StaticPlugin("scumm", Engine_SCUMM_targetList(), Engine_SCUMM_create)); +#endif + +#ifndef DISABLE_SIMON + _plugins.push_back(new StaticPlugin("simon", Engine_SIMON_targetList(), Engine_SIMON_create)); +#endif + +#ifndef DISABLE_SKY + _plugins.push_back(new StaticPlugin("sky", Engine_SKY_targetList(), Engine_SKY_create)); +#endif + +#ifndef DISABLE_SWORD2 + _plugins.push_back(new StaticPlugin("sword2", Engine_SWORD2_targetList(), Engine_SWORD2_create)); +#endif +} + +void PluginManager::unloadPlugins() { + int i; + for (i = 0; i < _plugins.size(); i++) { + _plugins[i]->unloadPlugin(); + delete _plugins[i]; + } + _plugins.clear(); +} |