Mercurial > projects > dwt2
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 },