[Scummvm-cvs-logs] SF.net SVN: scummvm:[51767] scummvm/branches/gsoc2010-plugins/backends/ plugins

toneman1138 at users.sourceforge.net toneman1138 at users.sourceforge.net
Thu Aug 5 23:48:16 CEST 2010


Revision: 51767
          http://scummvm.svn.sourceforge.net/scummvm/?rev=51767&view=rev
Author:   toneman1138
Date:     2010-08-05 21:48:15 +0000 (Thu, 05 Aug 2010)

Log Message:
-----------
Moved ELFPlugin class definition into elf-provider.h

Modified Paths:
--------------
    scummvm/branches/gsoc2010-plugins/backends/plugins/elf-provider.cpp
    scummvm/branches/gsoc2010-plugins/backends/plugins/elf-provider.h

Modified: scummvm/branches/gsoc2010-plugins/backends/plugins/elf-provider.cpp
===================================================================
--- scummvm/branches/gsoc2010-plugins/backends/plugins/elf-provider.cpp	2010-08-05 21:36:17 UTC (rev 51766)
+++ scummvm/branches/gsoc2010-plugins/backends/plugins/elf-provider.cpp	2010-08-05 21:48:15 UTC (rev 51767)
@@ -23,92 +23,50 @@
  *
  */
 
-#if defined(DYNAMIC_MODULES) && defined(ELF_LOADER_TARGET)
-
 #include "backends/plugins/elf-provider.h"
 #include "backends/plugins/dynamic-plugin.h"
 #include "common/fs.h"
 
 #include "backends/plugins/elf-loader.h"
 
-class ELFPlugin : public DynamicPlugin {
-protected:
-	DLObject *_dlHandle;
-	Common::String _filename;
+#if defined(DYNAMIC_MODULES) && defined(ELF_LOADER_TARGET)
 
-	virtual VoidFunc findSymbol(const char *symbol) {
-		void *func;
-		bool handleNull;
-		if (_dlHandle == NULL) {
-			func = NULL;
-			handleNull = true;
-		} else {
-			func = _dlHandle->symbol(symbol);
-		}
-		if (!func) {
-			if (handleNull) {
-				warning("Failed loading symbol '%s' from plugin '%s' (Handle is NULL)", symbol, _filename.c_str());
-			} else {
-				warning("Failed loading symbol '%s' from plugin '%s'", symbol, _filename.c_str());
-			}
-		}
+bool ELFPlugin::loadPlugin() {
+	assert(!_dlHandle);
+	DLObject *obj = new DLObject(NULL);
+	if (obj->open(_filename.c_str())) {
+		_dlHandle = obj;
+	} else {
+		delete obj;
+		_dlHandle = NULL;
+	}
 
-		// 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;
+	if (!_dlHandle) {
+		warning("Failed loading plugin '%s'", _filename.c_str());
+		return false;
 	}
 
-public:
-	ELFPlugin(const Common::String &filename)
-		: _dlHandle(0), _filename(filename) {}
+	bool ret = DynamicPlugin::loadPlugin();
 
-	~ELFPlugin() {
-		if (_dlHandle)
-			unloadPlugin();
+	if (ret && _dlHandle) {
+		_dlHandle->discard_symtab();
 	}
 
-	bool loadPlugin() {
-		assert(!_dlHandle);
-		DLObject *obj = new DLObject(NULL);
-		if (obj->open(_filename.c_str())) {
-			_dlHandle = obj;
-		} else {
-			delete obj;
-			_dlHandle = NULL;
-		}
+	return ret;
+}
 
-		if (!_dlHandle) {
-			warning("Failed loading plugin '%s'", _filename.c_str());
-			return false;
+void ELFPlugin::unloadPlugin() {
+	DynamicPlugin::unloadPlugin();
+	if (_dlHandle) {
+		delete _dlHandle;
+		if (!_dlHandle->close()) {
+			warning("Failed unloading plugin '%s'", _filename.c_str());
 		}
-
-		bool ret = DynamicPlugin::loadPlugin();
-
-		if (ret && _dlHandle) {
-			_dlHandle->discard_symtab();
-		}
-
-		return ret;
+		_dlHandle = 0;
 	}
+}
 
-	void unloadPlugin() {
-		DynamicPlugin::unloadPlugin();
-		if (_dlHandle) {
-			delete _dlHandle;
-			if (!_dlHandle->close()) {
-				warning("Failed unloading plugin '%s'", _filename.c_str());
-			}
-			_dlHandle = 0;
-		}
-	}
-};
 
-
 Plugin* ELFPluginProvider::createPlugin(const Common::FSNode &node) const {
 	return new ELFPlugin(node.getPath());
 }

Modified: scummvm/branches/gsoc2010-plugins/backends/plugins/elf-provider.h
===================================================================
--- scummvm/branches/gsoc2010-plugins/backends/plugins/elf-provider.h	2010-08-05 21:36:17 UTC (rev 51766)
+++ scummvm/branches/gsoc2010-plugins/backends/plugins/elf-provider.h	2010-08-05 21:48:15 UTC (rev 51767)
@@ -27,9 +27,61 @@
 #define BACKENDS_PLUGINS_ELF_PROVIDER_H
 
 #include "base/plugins.h"
+#include "backends/plugins/dynamic-plugin.h"
+#include "common/fs.h"
 
+#include "backends/plugins/elf-loader.h"
+
 #if defined(DYNAMIC_MODULES) && defined(ELF_LOADER_TARGET)
 
+class ELFPlugin : public DynamicPlugin {
+protected:
+	DLObject *_dlHandle;
+	Common::String _filename;
+
+	//FIXME: The code for this method should be in elf-provider.cpp,
+	//		 but VoidFunc isn't recognized if we do that as is.
+	virtual VoidFunc findSymbol(const char *symbol) {
+		void *func;
+			bool handleNull;
+			if (_dlHandle == NULL) {
+				func = NULL;
+				handleNull = true;
+			} else {
+				func = _dlHandle->symbol(symbol);
+			}
+			if (!func) {
+				if (handleNull) {
+					warning("Failed loading symbol '%s' from plugin '%s' (Handle is NULL)", symbol, _filename.c_str());
+				} else {
+					warning("Failed loading symbol '%s' from plugin '%s'", symbol, _filename.c_str());
+				}
+			}
+
+			// 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:
+	ELFPlugin(const Common::String &filename)
+		: _dlHandle(0), _filename(filename) {}
+
+	~ELFPlugin() {
+		if (_dlHandle)
+			unloadPlugin();
+	}
+
+	bool loadPlugin();
+	void unloadPlugin();
+
+};
+
 class ELFPluginProvider : public FilePluginProvider {
 protected:
 	Plugin* createPlugin(const Common::FSNode &node) const;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list