diff base/src/java/nonstandard/SharedLib.d @ 46:17310ba3c1bc

Moved all load lib functionality into own module
author Frank Benoit <benoit@tionex.de>
date Fri, 27 Mar 2009 11:10:45 +0100
parents
children 65761bc28ab2
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/base/src/java/nonstandard/SharedLib.d	Fri Mar 27 11:10:45 2009 +0100
@@ -0,0 +1,70 @@
+module java.nonstandard.SharedLib;
+
+import java.lang.all;
+
+struct Symbol {
+    String name;
+    void** symbol;
+}
+
+struct SymbolVersioned2 {
+    String name;
+    void** symbol;
+    int major;
+    int minor;
+}
+
+struct SharedLib {
+    static void loadLibSymbols( SymbolVersioned2[] symbols, String libname, int major, int minor ){
+        version(Tango){
+            if (auto lib = tango.sys.SharedLib.SharedLib.load(libname)) {
+                foreach( inout s; symbols ){
+                    if( s.major < major ) continue;
+                    if( s.major == major && s.minor > minor ) continue;
+                    *s.symbol = lib.getSymbol( s.name.ptr );
+                    if( s.symbol is null ){
+                        getDwtLogger.error(  __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name );
+                    }
+                }
+            } else {
+                getDwtLogger.error(  __FILE__, __LINE__, "Could not load the library {}", libname );
+            }
+        } else { // Phobos
+            implMissing( __FILE__, __LINE__ );
+        }
+    }
+    static void loadLibSymbols( Symbol[] symbols, String libname ){
+        version(Tango){
+            if (auto lib = tango.sys.SharedLib.SharedLib.load(libname)) {
+                foreach( inout s; symbols ){
+                    *s.symbol = lib.getSymbol( s.name.ptr );
+                    if( s.symbol is null ){
+                        getDwtLogger.error(  __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name );
+                    }
+                }
+            } else {
+                getDwtLogger.error(  __FILE__, __LINE__, "Could not load the library {}", libname );
+            }
+        } else { // Phobos
+            implMissing( __FILE__, __LINE__ );
+        }
+    }
+    static bool tryUseSymbol( String symbolname, String libname, void delegate( void*) dg  ){
+        bool result = false;
+        version(Tango){
+            if (auto lib = tango.sys.SharedLib.SharedLib.load( libname ) ) {
+                void* ptr = lib.getSymbol(symbolname);
+                if (ptr !is null){
+                    dg(ptr);
+                    result = true;
+                }
+                lib.unload();
+            }
+        } else { // Phobos
+            implMissing( __FILE__, __LINE__ );
+        }
+        return result;
+    }
+}
+
+