Mercurial > projects > dwt2
annotate base/src/java/nonstandard/SharedLib.d @ 125:c43718956f21 default tip
Updated the snippets status.
author | Jacob Carlborg <doob@me.com> |
---|---|
date | Thu, 11 Aug 2011 19:55:14 +0200 |
parents | fb3aa8075988 |
children |
rev | line source |
---|---|
46
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1 module java.nonstandard.SharedLib; |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2 |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3 import java.lang.all; |
47
65761bc28ab2
swt linux again compilable for d1.
Frank Benoit <benoit@tionex.de>
parents:
46
diff
changeset
|
4 version(Tango){ |
65761bc28ab2
swt linux again compilable for d1.
Frank Benoit <benoit@tionex.de>
parents:
46
diff
changeset
|
5 static import tango.sys.SharedLib; |
65761bc28ab2
swt linux again compilable for d1.
Frank Benoit <benoit@tionex.de>
parents:
46
diff
changeset
|
6 static import tango.stdc.stringz; |
112 | 7 } else { // Phobos |
8 import std.loader; | |
47
65761bc28ab2
swt linux again compilable for d1.
Frank Benoit <benoit@tionex.de>
parents:
46
diff
changeset
|
9 } |
46
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
10 |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
11 struct Symbol { |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
12 String name; |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
13 void** symbol; |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
14 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
15 |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
16 struct SymbolVersioned2 { |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
17 String name; |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
18 void** symbol; |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
19 int major; |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
20 int minor; |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
21 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
22 |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
23 struct SharedLib { |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
24 static void loadLibSymbols( SymbolVersioned2[] symbols, String libname, int major, int minor ){ |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
25 version(Tango){ |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
26 if (auto lib = tango.sys.SharedLib.SharedLib.load(libname)) { |
112 | 27 foreach( ref s; symbols ){ |
58
8a5386b204bb
[swt win] fix dll symbol loading
Frank Benoit <benoit@tionex.de>
parents:
47
diff
changeset
|
28 if( s.major > major ) continue; |
46
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
29 if( s.major == major && s.minor > minor ) continue; |
47
65761bc28ab2
swt linux again compilable for d1.
Frank Benoit <benoit@tionex.de>
parents:
46
diff
changeset
|
30 *s.symbol = lib.getSymbol( tango.stdc.stringz.toStringz(s.name ) ); |
46
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
31 if( s.symbol is null ){ |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
32 getDwtLogger.error( __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name ); |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
33 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
34 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
35 } else { |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
36 getDwtLogger.error( __FILE__, __LINE__, "Could not load the library {}", libname ); |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
37 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
38 } else { // Phobos |
112 | 39 if (auto lib = ExeModule_Load(libname)) { |
40 foreach( ref s; symbols ){ | |
41 if( s.major > major ) continue; | |
42 if( s.major == major && s.minor > minor ) continue; | |
43 *s.symbol = ExeModule_GetSymbol( lib, s.name ); | |
44 if( s.symbol is null ){ | |
45 getDwtLogger.error( __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name ); | |
46 } | |
47 } | |
48 } else { | |
49 getDwtLogger.error( __FILE__, __LINE__, "Could not load the library {}", libname ); | |
50 } | |
46
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
51 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
52 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
53 static void loadLibSymbols( Symbol[] symbols, String libname ){ |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
54 version(Tango){ |
113
fb3aa8075988
D2 support for the linux port.
Jacob Carlborg <doob@me.com>
parents:
112
diff
changeset
|
55 if (auto lib = tango.sys.SharedLib.SharedLib.loadNoThrow(libname)) { |
112 | 56 foreach( ref s; symbols ){ |
113
fb3aa8075988
D2 support for the linux port.
Jacob Carlborg <doob@me.com>
parents:
112
diff
changeset
|
57 *s.symbol = lib.getSymbolNoThrow( tango.stdc.stringz.toStringz(s.name ) ); |
fb3aa8075988
D2 support for the linux port.
Jacob Carlborg <doob@me.com>
parents:
112
diff
changeset
|
58 if( *s.symbol is null ){ |
fb3aa8075988
D2 support for the linux port.
Jacob Carlborg <doob@me.com>
parents:
112
diff
changeset
|
59 //getDwtLogger.error( __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name ); |
46
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
60 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
61 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
62 } else { |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
63 getDwtLogger.error( __FILE__, __LINE__, "Could not load the library {}", libname ); |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
64 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
65 } else { // Phobos |
112 | 66 if (auto lib = ExeModule_Load(libname)) { |
67 foreach( ref s; symbols ){ | |
68 *s.symbol = ExeModule_GetSymbol( lib, s.name ); | |
113
fb3aa8075988
D2 support for the linux port.
Jacob Carlborg <doob@me.com>
parents:
112
diff
changeset
|
69 if( *s.symbol is null ){ |
fb3aa8075988
D2 support for the linux port.
Jacob Carlborg <doob@me.com>
parents:
112
diff
changeset
|
70 //getDwtLogger.error( __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name ); |
112 | 71 } |
72 } | |
73 } else { | |
74 getDwtLogger.error( __FILE__, __LINE__, "Could not load the library {}", libname ); | |
75 } | |
46
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
76 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
77 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
78 static bool tryUseSymbol( String symbolname, String libname, void delegate( void*) dg ){ |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
79 bool result = false; |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
80 version(Tango){ |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
81 if (auto lib = tango.sys.SharedLib.SharedLib.load( libname ) ) { |
47
65761bc28ab2
swt linux again compilable for d1.
Frank Benoit <benoit@tionex.de>
parents:
46
diff
changeset
|
82 void* ptr = lib.getSymbol( tango.stdc.stringz.toStringz(symbolname)); |
46
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
83 if (ptr !is null){ |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
84 dg(ptr); |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
85 result = true; |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
86 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
87 lib.unload(); |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
88 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
89 } else { // Phobos |
112 | 90 if (auto lib = ExeModule_Load( libname ) ) { |
91 void* ptr = ExeModule_GetSymbol( lib, symbolname ); | |
92 if (ptr !is null){ | |
93 dg(ptr); | |
94 result = true; | |
95 } | |
96 ExeModule_Release( lib ); | |
97 } | |
46
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
98 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
99 return result; |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
100 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
101 } |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
102 |
17310ba3c1bc
Moved all load lib functionality into own module
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
103 |