aboutsummaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
authorJordi Vilalta Prat2008-05-02 14:30:06 +0000
committerJordi Vilalta Prat2008-05-02 14:30:06 +0000
commit3f44977885d33ea694df399a83cf198dd85b5fed (patch)
treec081843c9cd64d3e077482fbc7f43bbf3b39d087 /base
parent6a98108eac1203eaf1058fa24ad9c80fc9ba45a8 (diff)
downloadscummvm-rg350-3f44977885d33ea694df399a83cf198dd85b5fed.tar.gz
scummvm-rg350-3f44977885d33ea694df399a83cf198dd85b5fed.tar.bz2
scummvm-rg350-3f44977885d33ea694df399a83cf198dd85b5fed.zip
Added support to load plugins from different directories and the ability to specify the default directory from configure.
svn-id: r31816
Diffstat (limited to 'base')
-rw-r--r--base/plugins.cpp59
-rw-r--r--base/plugins.h13
2 files changed, 72 insertions, 0 deletions
diff --git a/base/plugins.cpp b/base/plugins.cpp
index 188eb10475..c62d1a00b9 100644
--- a/base/plugins.cpp
+++ b/base/plugins.cpp
@@ -162,6 +162,65 @@ public:
}
};
+#else
+
+PluginList FilePluginProvider::getPlugins() {
+ PluginList pl;
+
+ // Prepare the list of directories to search
+ Common::StringList pluginDirs;
+ // TODO: Add the user specified directory (via config file)
+ pluginDirs.push_back(".");
+ pluginDirs.push_back("plugins");
+
+ // Add the provider's custom directories
+ addCustomDirectories(pluginDirs);
+
+ Common::StringList::const_iterator d;
+ for (d = pluginDirs.begin(); d != pluginDirs.end(); d++) {
+ // Load all plugins.
+ // Scan for all plugins in this directory
+ FilesystemNode dir(*d);
+ FSList files;
+ if (!dir.getChildren(files, FilesystemNode::kListFilesOnly)) {
+ debug(1, "Couldn't open plugin directory '%s'", d->c_str());
+ continue;
+ } else {
+ debug(1, "Reading plugins from plugin directory '%s'", d->c_str());
+ }
+
+ for (FSList::const_iterator i = files.begin(); i != files.end(); ++i) {
+ Common::String name(i->getName());
+ if (name.hasPrefix(getPrefix()) && name.hasSuffix(getSuffix())) {
+ pl.push_back(createPlugin(i->getPath()));
+ }
+ }
+ }
+
+ return pl;
+}
+
+const char* FilePluginProvider::getPrefix() const {
+#ifdef PLUGIN_PREFIX
+ return PLUGIN_PREFIX;
+#else
+ return "";
+#endif
+}
+
+const char* FilePluginProvider::getSuffix() const {
+#ifdef PLUGIN_SUFFIX
+ return PLUGIN_SUFFIX;
+#else
+ return "";
+#endif
+}
+
+void FilePluginProvider::addCustomDirectories(Common::StringList &dirs) const {
+#ifdef PLUGIN_DIRECTORY
+ dirs.push_back(PLUGIN_DIRECTORY);
+#endif
+}
#endif
diff --git a/base/plugins.h b/base/plugins.h
index da48a7c22a..f317a533ae 100644
--- a/base/plugins.h
+++ b/base/plugins.h
@@ -147,6 +147,19 @@ public:
virtual PluginList getPlugins() = 0;
};
+class FilePluginProvider : public PluginProvider {
+public:
+ virtual PluginList getPlugins();
+
+protected:
+ virtual Plugin* createPlugin(const Common::String &filename) const = 0;
+
+ virtual const char* getPrefix() const;
+ virtual const char* getSuffix() const;
+
+ virtual void addCustomDirectories(Common::StringList &dirs) const;
+};
+
/**
* Instances of this class manage all plugins, including loading them,
* making wrapper objects of class Plugin available, and unloading them.