diff options
| author | Tony Puccinelli | 2010-05-26 23:22:45 +0000 | 
|---|---|---|
| committer | Tony Puccinelli | 2010-05-26 23:22:45 +0000 | 
| commit | fab28cb74b1c5416ceb481e2351044cbe54d119c (patch) | |
| tree | 3041f3c3ae3c79087a3098bedc099bb6bf8c7b0d /backends/plugins/ps2/ps2-provider.cpp | |
| parent | ad42fa0b2d613a879250cd601a4c0756bfe699cd (diff) | |
| download | scummvm-rg350-fab28cb74b1c5416ceb481e2351044cbe54d119c.tar.gz scummvm-rg350-fab28cb74b1c5416ceb481e2351044cbe54d119c.tar.bz2 scummvm-rg350-fab28cb74b1c5416ceb481e2351044cbe54d119c.zip | |
minor initial commit for ps2 plugins. Added ps2-provider code
svn-id: r49253
Diffstat (limited to 'backends/plugins/ps2/ps2-provider.cpp')
| -rw-r--r-- | backends/plugins/ps2/ps2-provider.cpp | 83 | 
1 files changed, 83 insertions, 0 deletions
| diff --git a/backends/plugins/ps2/ps2-provider.cpp b/backends/plugins/ps2/ps2-provider.cpp new file mode 100644 index 0000000000..bba282557d --- /dev/null +++ b/backends/plugins/ps2/ps2-provider.cpp @@ -0,0 +1,83 @@ +#if defined(DYNAMIC_MODULES) && defined(__PS2__) + +#include "backends/plugins/ps2/ps2-provider.h" +#include "backends/plugins/dynamic-plugin.h" +#include "common/fs.h" + +#include "backends/platform/ps2/ps2loader.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(__PS2__) | 
