aboutsummaryrefslogtreecommitdiff
path: root/base/plugins.cpp
diff options
context:
space:
mode:
authorMax Horn2003-09-17 22:41:01 +0000
committerMax Horn2003-09-17 22:41:01 +0000
commitc1a678afeb5100a99030bb51782e5de98d771997 (patch)
treebae1b38145179bae284a14c983c9541db7644f8c /base/plugins.cpp
parent0b16afb067a7b3f09a97507675eaa4872a59df38 (diff)
downloadscummvm-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.cpp118
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();
+}