changeset 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 d5dd1c5b90a9
children 65761bc28ab2
files base/src/java/nonstandard/SharedLib.d org.eclipse.swt.win32.win32.x86/src/org/eclipse/swt/internal/gdip/native.d org.eclipse.swt.win32.win32.x86/src/org/eclipse/swt/internal/win32/OS.d
diffstat 3 files changed, 94 insertions(+), 104 deletions(-) [+]
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;
+    }
+}
+
+
--- a/org.eclipse.swt.win32.win32.x86/src/org/eclipse/swt/internal/gdip/native.d	Wed Mar 25 18:52:36 2009 +0100
+++ b/org.eclipse.swt.win32.win32.x86/src/org/eclipse/swt/internal/gdip/native.d	Fri Mar 27 11:10:45 2009 +0100
@@ -15,11 +15,6 @@
 import org.eclipse.swt.internal.win32.WINTYPES;
 import java.lang.all;
 
-version(Tango){
-    static import tango.sys.SharedLib;
-} else { // Phobos
-}
-
 extern(Windows):
 
 /******************************************************************************
@@ -732,6 +727,7 @@
 
 }
 else{ // version(!STATIC_GDIPLUS)
+import java.nonstandard.SharedLib;
 Status function( uint* token, GdiplusStartupInput* input, GdiplusStartupOutput* output) GdiplusStartup;
 void   function(uint token) GdiplusShutdown;
 Status function(Handle hdc, out Handle graphics) GdipCreateFromHDC;
@@ -1202,11 +1198,6 @@
 Status function(Handle format, int hotkeyPrefix) GdipSetStringFormatHotkeyPrefix;
 Status function( Handle format, float firstTabOffset, int count, float* tabStops) GdipSetStringFormatTabStops;
 
-struct Symbol {
-    String name;
-    void** symbol;
-}
-
 Symbol[] symbols = [
     { "GdiplusStartup", cast(void**)& GdiplusStartup },
     { "GdiplusShutdown", cast(void**)& GdiplusShutdown },
@@ -1681,20 +1672,7 @@
 
 
 void loadLib_Gdip(){
-    version(Tango){
-        if (auto lib = tango.sys.SharedLib.SharedLib.load(`gdiplus.dll`)) {
-            foreach( inout s; symbols ){
-                *s.symbol = lib.getSymbol( s.name.ptr );
-                if( s.symbol is null ){
-                    getDwtLogger.error( __FILE__, __LINE__, "gdiplus.dll: Symbol '{}' not found", s.name );
-                }
-            }
-        } else {
-            getDwtLogger.error( __FILE__, __LINE__, "Could not load the library gdiplus.dll");
-        }
-    } else { // Phobos
-        implMissing( __FILE__, __LINE__ );
-    }
+    SharedLib.loadLibSymbols( symbols, "gdiplus.dll" );
 }
 
 }
--- a/org.eclipse.swt.win32.win32.x86/src/org/eclipse/swt/internal/win32/OS.d	Wed Mar 25 18:52:36 2009 +0100
+++ b/org.eclipse.swt.win32.win32.x86/src/org/eclipse/swt/internal/win32/OS.d	Fri Mar 27 11:10:45 2009 +0100
@@ -18,9 +18,9 @@
 import org.eclipse.swt.internal.C;
 import org.eclipse.swt.internal.Library;
 import java.lang.all;
+import java.nonstandard.SharedLib;
 
 version(Tango){
-static import tango.sys.SharedLib;
 static import tango.sys.Common;
 
 static import tango.stdc.stdlib;
@@ -82,31 +82,6 @@
 
 public class OS : C {
 
-    struct Symbol {
-        String name;
-        void** symbol;
-        int major;
-        int minor;
-    }
-    static void loadLib( Symbol[] symbols, String libname ){
-        version(Tango){
-            if (auto lib = tango.sys.SharedLib.SharedLib.load(libname)) {
-                foreach( inout s; symbols ){
-                    if( OS.WIN32_VERSION >= OS.VERSION( s.major, s.minor )){
-                        *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__ );
-        }
-    }
-
     public static HINSTANCE GetLibraryHandle(){
         //PORTING_FIXME: GetLibraryHandle
         // is the hInstance of the DLL or null, if not a DLL.
@@ -307,7 +282,7 @@
         WIN32_VERSION = VERSION (WIN32_MAJOR, WIN32_MINOR);
 
         if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 0)) {
-            loadLib( Symbols_Kernel32, `Kernel32.dll` );
+            SharedLib.loadLibSymbols( Symbols_Kernel32, `Kernel32.dll`, WIN32_MAJOR, WIN32_MINOR );
         }
 
         //PORTING_CHANGE: made by version
@@ -320,16 +295,16 @@
 
         // when to load uxtheme
         if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 1)) {
-            loadLib( Symbols_UxTheme, `UxTheme.dll` );
+            SharedLib.loadLibSymbols( Symbols_UxTheme, `UxTheme.dll`, WIN32_MAJOR, WIN32_MINOR );
         }
         if (OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 1)) {
-            loadLib( Symbols_CoreImm, `Coreimm.dll` );
+            SharedLib.loadLibSymbols( Symbols_CoreImm, `Coreimm.dll`, WIN32_MAJOR, WIN32_MINOR );
         }
         if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 0)) {
-            loadLib( Symbols_User32, `User32.dll` );
+            SharedLib.loadLibSymbols( Symbols_User32, `User32.dll`, WIN32_MAJOR, WIN32_MINOR );
         }
         if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (4, 0)) {
-            loadLib( Symbols_Imm32, `Imm32.dll` );
+            SharedLib.loadLibSymbols( Symbols_Imm32, `Imm32.dll`, WIN32_MAJOR, WIN32_MINOR );
         }
 
         /* Make the process DPI aware for Windows Vista */
@@ -372,20 +347,11 @@
         //PORTING_CHANGE: comctl is loaded automatically
         //TCHAR lpLibFileName = new TCHAR (0, "comctl32.dll", true); //$NON-NLS-1$
         //int /*long*/ hModule = OS.LoadLibrary (lpLibFileName);
-        version(Tango){
-            if (auto lib = tango.sys.SharedLib.SharedLib.load( `comctl32.dll`) ) {
-                char[] name = "DllGetVersion\0"; //$NON-NLS-1$
-                void* DllGetVersion = lib.getSymbol(name.ptr);
-                if (DllGetVersion !is null){
-                    alias extern(Windows) void function(DLLVERSIONINFO*) TDllVersion;
-                    TDllVersion f = cast( TDllVersion )DllGetVersion;
-                    f(&dvi);
-                }
-                lib.unload();
-            }
-        } else { // Phobos
-            implMissing( __FILE__, __LINE__ );
-        }
+        SharedLib.tryUseSymbol( "DllGetVersion", "comctl32.dll", (void* ptr){
+            alias extern(Windows) void function(DLLVERSIONINFO*) TDllGetVersion;
+            auto func = cast( TDllGetVersion ) ptr;
+            func(&dvi);
+        });
         COMCTL32_MAJOR = dvi.dwMajorVersion;
         COMCTL32_MINOR = dvi.dwMinorVersion;
         COMCTL32_VERSION = VERSION (COMCTL32_MAJOR, COMCTL32_MINOR);
@@ -396,20 +362,11 @@
         dvi.dwMajorVersion = 4;
         //TCHAR lpLibFileName = new TCHAR (0, "Shell32.dll", true); //$NON-NLS-1$
         //int /*long*/ hModule = OS.LoadLibrary (lpLibFileName);
-        version(Tango){
-            if ( auto lib = tango.sys.SharedLib.SharedLib.load( `Shell32.dll`)) {
-                char[] name = "DllGetVersion\0"; //$NON-NLS-1$
-                void* DllGetVersion = lib.getSymbol(name.ptr);
-                if (DllGetVersion !is null){
-                    alias extern(Windows) void function(DLLVERSIONINFO*) TDllVersion;
-                    TDllVersion f = cast( TDllVersion )DllGetVersion;
-                    f(&dvi);
-                }
-                lib.unload();
-            }
-        } else { // Phobos
-            implMissing( __FILE__, __LINE__ );
-        }
+        SharedLib.tryUseSymbol( "DllGetVersion", "Shell32.dll", (void* ptr){
+            alias extern(Windows) void function(DLLVERSIONINFO*) TDllGetVersion;
+            auto func = cast( TDllGetVersion ) ptr;
+            func(&dvi);
+        });
         SHELL32_MAJOR = dvi.dwMajorVersion;
         SHELL32_MINOR = dvi.dwMinorVersion;
         SHELL32_VERSION = VERSION (SHELL32_MAJOR, SHELL32_MINOR);
@@ -2712,7 +2669,7 @@
 
 } // public static
 
-static Symbol[] Symbols_UxTheme = [
+static SymbolVersioned2[] Symbols_UxTheme = [
     { "IsAppThemed", cast(void**)& IsAppThemed, 5, 1 },
     { "DrawThemeBackground", cast(void**)& DrawThemeBackground, 5, 1 },
     { "DrawThemeEdge", cast(void**)& DrawThemeEdge, 5, 1 },
@@ -2730,22 +2687,7 @@
 ];
 
 static void loadLib_UxTheme(){
-    version(Tango){
-        if (auto lib = tango.sys.SharedLib.SharedLib.load(`uxtheme.dll`)) {
-            foreach( inout s; Symbols_UxTheme ){
-                if( OS.WIN32_VERSION >= OS.VERSION( s.major, s.minor )){
-                    *s.symbol = lib.getSymbol( s.name.ptr );
-                    if( *s.symbol is null ){
-                        getDwtLogger.error( __FILE__, __LINE__, "UxTheme.dll: Symbol '{}' not found", s.name );
-                    }
-                }
-            }
-        } else {
-            getDwtLogger.error( __FILE__, __LINE__, "Could not load the library UxTheme.dll");
-        }
-    } else { // Phobos
-        implMissing( __FILE__, __LINE__ );
-    }
+    SharedLib.loadLibSymbols( Symbols_UxTheme, "uxtheme.dll", WIN32_MAJOR, WIN32_MINOR );
 }
 //----------------------------------------------------------------------
 // Coreimm.lib (WinCE)
@@ -2775,7 +2717,7 @@
 } // public static extern(Windows)
 
 
-static Symbol[] Symbols_CoreImm = [
+static SymbolVersioned2[] Symbols_CoreImm = [
 ];
 
 // user32.dll vista
@@ -2784,7 +2726,7 @@
     BOOL function( HWND hWnd )IsHungAppWindow;
 }
 
-static Symbol[] Symbols_User32 = [
+static SymbolVersioned2[] Symbols_User32 = [
     { "SetProcessDPIAware", cast(void**)& SetProcessDPIAware, 6, 0 },
     { "GetLayeredWindowAttributes", cast(void**)& GetLayeredWindowAttributes, 5, 1 },
     { "SetLayeredWindowAttributes", cast(void**)& SetLayeredWindowAttributes, 5, 0 },
@@ -2845,7 +2787,7 @@
 
 }
 
-static Symbol[] Symbols_Imm32 = [
+static SymbolVersioned2[] Symbols_Imm32 = [
     { "ImmAssociateContext", cast(void**)& ImmAssociateContext, 5, 1 },
     { "ImmCreateContext", cast(void**)& ImmCreateContext, 5, 1 },
     { "ImmDestroyContext", cast(void**)& ImmDestroyContext, 5, 1 },
@@ -2869,7 +2811,7 @@
 
 version(ANSI){
 }else{
-static Symbol[] Symbols_Kernel32 = [
+static SymbolVersioned2[] Symbols_Kernel32 = [
     { "CreateActCtxW", cast(void**)& CreateActCtx, 5, 1 },
     { "ActivateActCtx", cast(void**)& ActivateActCtx, 5, 1 },
     { "GetSystemDefaultUILanguage", cast(void**)& GetSystemDefaultUILanguage, 5, 0 },