abstracted an ELF plugin provider

svn-id: r51400
This commit is contained in:
Tony Puccinelli 2010-07-28 02:05:17 +00:00
parent 749d47ba26
commit ff78cf6771
7 changed files with 20 additions and 172 deletions

View File

@ -30,14 +30,13 @@ MODULE_OBJS := \
midi/timidity.o \
midi/dmedia.o \
midi/windows.o \
plugins/elf-provider.o \
plugins/dc/dc-provider.o \
plugins/posix/posix-provider.o \
plugins/sdl/sdl-provider.o \
plugins/win32/win32-provider.o \
plugins/psp/psp-provider.o \
plugins/ps2/ps2-provider.o \
plugins/gp2xwiz/gp2xwiz-provider.o \
plugins/ds/ds-provider.o \
saves/savefile.o \
saves/default/default-saves.o \
saves/posix/posix-saves.o \

View File

@ -111,7 +111,7 @@
#include "engine.h"
#include "backends/plugins/ds/ds-provider.h"
#include "backends/plugins/elf-provider.h"
#include "backends/fs/ds/ds-fs.h"
#include "base/version.h"
@ -3304,7 +3304,7 @@ int main(void) {
#endif
#ifdef DYNAMIC_MODULES
PluginManager::instance().addPluginProvider(new DSPluginProvider());
PluginManager::instance().addPluginProvider(new ELFPluginProvider());
#endif
while (1) {

View File

@ -59,7 +59,7 @@
#include "backends/platform/ps2/ps2debug.h"
#include "backends/fs/ps2/ps2-fs-factory.h"
#include "backends/plugins/ps2/ps2-provider.h"
#include "backends/plugins/elf-provider.h"
#include "backends/saves/default/default-saves.h"
#include "common/config-manager.h"
@ -132,7 +132,7 @@ extern "C" int main(int argc, char *argv[]) {
g_system = g_systemPs2 = new OSystem_PS2(argv[0]);
#ifdef DYNAMIC_MODULES
PluginManager::instance().addPluginProvider(new PS2PluginProvider());
PluginManager::instance().addPluginProvider(new ELFPluginProvider());
#endif
g_systemPs2->init();

View File

@ -23,16 +23,16 @@
*
*/
#if defined(DYNAMIC_MODULES) && defined(__DS__)
#if defined(DYNAMIC_MODULES) //TODO: && defined(ELF loader target)
#include "backends/plugins/ds/ds-provider.h"
#include "backends/plugins/elf-provider.h"
#include "backends/plugins/dynamic-plugin.h"
#include "common/fs.h"
#include "backends/plugins/elf-loader.h"
class DSPlugin : public DynamicPlugin {
class ELFPlugin : public DynamicPlugin {
protected:
void *_dlHandle;
Common::String _filename;
@ -53,10 +53,10 @@ protected:
}
public:
DSPlugin(const Common::String &filename)
ELFPlugin(const Common::String &filename)
: _dlHandle(0), _filename(filename) {}
~DSPlugin() {
~ELFPlugin() {
if (_dlHandle) unloadPlugin();
}
@ -88,11 +88,11 @@ public:
};
Plugin* DSPluginProvider::createPlugin(const Common::FSNode &node) const {
return new DSPlugin(node.getPath());
Plugin* ELFPluginProvider::createPlugin(const Common::FSNode &node) const {
return new ELFPlugin(node.getPath());
}
bool DSPluginProvider::isPluginFilename(const Common::FSNode &node) const {
bool ELFPluginProvider::isPluginFilename(const Common::FSNode &node) const {
// Check the plugin suffix
Common::String filename = node.getName();
printf("Testing name %s", filename.c_str());
@ -105,4 +105,4 @@ bool DSPluginProvider::isPluginFilename(const Common::FSNode &node) const {
return true;
}
#endif // defined(DYNAMIC_MODULES) && defined(__DS__)
#endif // defined(DYNAMIC_MODULES)

View File

@ -23,14 +23,14 @@
*
*/
#ifndef BACKENDS_PLUGINS_DS_DS_PROVIDER_H
#define BACKENDS_PLUGINS_DS_DS_PROVIDER_H
#ifndef BACKENDS_PLUGINS_ELF_PROVIDER_H
#define BACKENDS_PLUGINS_ELF_PROVIDER_H
#include "base/plugins.h"
#if defined(DYNAMIC_MODULES) && defined(__DS__)
#if defined(DYNAMIC_MODULES) // TODO: && defined(ELF-loader target)
class DSPluginProvider : public FilePluginProvider {
class ELFPluginProvider : public FilePluginProvider {
protected:
Plugin* createPlugin(const Common::FSNode &node) const;
@ -38,6 +38,6 @@ protected:
};
#endif // defined(DYNAMIC_MODULES) && defined(__DS__)
#endif // defined(DYNAMIC_MODULES)
#endif /* BACKENDS_PLUGINS_DS_DS_PROVIDER_H */
#endif /* BACKENDS_PLUGINS_ELF_PROVIDER_H */

View File

@ -1,108 +0,0 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* $URL$
* $Id$
*
*/
#if defined(DYNAMIC_MODULES) && defined(__PLAYSTATION2__)
#include "backends/plugins/ps2/ps2-provider.h"
#include "backends/plugins/dynamic-plugin.h"
#include "common/fs.h"
#include "backends/plugins/elf-loader.h"
class PS2Plugin : public DynamicPlugin {
protected:
void *_dlHandle;
Common::String _filename;
virtual VoidFunc findSymbol(const char *symbol) {
void *func = dlsym(_dlHandle, symbol);
if (!func)
warning("Failed loading symbol '%s' from plugin '%s' (%s)", symbol, _filename.c_str(), dlerror());
// FIXME HACK: This is a HACK to circumvent a clash between the ISO C++
// standard and POSIX: ISO C++ disallows casting between function pointers
// and data pointers, but dlsym always returns a void pointer. For details,
// see e.g. <http://www.trilithium.com/johan/2004/12/problem-with-dlsym/>.
assert(sizeof(VoidFunc) == sizeof(func));
VoidFunc tmp;
memcpy(&tmp, &func, sizeof(VoidFunc));
return tmp;
}
public:
PS2Plugin(const Common::String &filename)
: _dlHandle(0), _filename(filename) {}
~PS2Plugin() {
if (_dlHandle) unloadPlugin();
}
bool loadPlugin() {
assert(!_dlHandle);
_dlHandle = dlopen(_filename.c_str(), RTLD_LAZY);
if (!_dlHandle) {
warning("Failed loading plugin '%s' (%s)", _filename.c_str(), dlerror());
return false;
}
bool ret = DynamicPlugin::loadPlugin();
if (ret)
dlforgetsyms(_dlHandle);
return ret;
}
void unloadPlugin() {
DynamicPlugin::unloadPlugin();
if (_dlHandle) {
if (dlclose(_dlHandle) != 0)
warning("Failed unloading plugin '%s' (%s)", _filename.c_str(), dlerror());
_dlHandle = 0;
}
}
};
Plugin* PS2PluginProvider::createPlugin(const Common::FSNode &node) const {
return new PS2Plugin(node.getPath());
}
bool PS2PluginProvider::isPluginFilename(const Common::FSNode &node) const {
// Check the plugin suffix
Common::String filename = node.getName();
fprintf(stderr, "Testing name %s", filename.c_str());
if (!filename.hasSuffix(".PLG") && !filename.hasSuffix(".plg")) {
fprintf(stderr," fail.\n");
return false;
}
fprintf(stderr," success!\n");
return true;
}
#endif // defined(DYNAMIC_MODULES) && defined(__PLAYSTATION2__)

View File

@ -1,43 +0,0 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* $URL$
* $Id$
*
*/
#ifndef BACKENDS_PLUGINS_PS2_PS2_PROVIDER_H
#define BACKENDS_PLUGINS_PS2_PS2_PROVIDER_H
#include "base/plugins.h"
#if defined(DYNAMIC_MODULES) && defined(__PLAYSTATION2__)
class PS2PluginProvider : public FilePluginProvider {
protected:
Plugin* createPlugin(const Common::FSNode &node) const;
bool isPluginFilename(const Common::FSNode &node) const;
};
#endif // defined(DYNAMIC_MODULES) && defined(__PLAYSTATION2__)
#endif /* BACKENDS_PLUGINS_PS2_PS2_PROVIDER_H */