1 module java.nonstandard.SharedLib;
2 
3 import java.lang.all;
4 version(Tango){
5     static import tango.sys.SharedLib;
6     static import tango.stdc.stringz;
7 } else { // Phobos
8     static import std..string;
9 
10     private alias void* HXModule;
11 
12     version(Windows){
13         import core.sys.windows.windows;
14         import std.utf;
15 
16         private HXModule ExeModule_Load(string name) {
17             return LoadLibraryW(toUTFz!(wchar*)(name));
18         }
19 
20         private void* ExeModule_GetSymbol(HXModule lib, string name) {
21             return GetProcAddress(lib, std..string.toStringz(name));
22         }
23 
24         private bool ExeModule_Release(ref HXModule lib) {
25             if (FreeLibrary(lib)) {
26                 lib = null;
27                 return true;
28             } else {
29                 return false;
30             }
31         }
32     } else { // Posix
33         import core.sys.posix.dlfcn;
34 
35         private HXModule ExeModule_Load(string name) {
36             return dlopen(std..string.toStringz(name), RTLD_NOW);
37         }
38 
39         private void* ExeModule_GetSymbol(HXModule lib, string name) {
40             return dlsym(lib, std..string.toStringz(name));
41         }
42 
43         private bool ExeModule_Release(ref HXModule lib) {
44             if (0 == dlclose(lib)) {
45                 lib = null;
46                 return true;
47             } else {
48                 return false;
49             }
50         }
51     }
52 }
53 
54 struct Symbol {
55     String name;
56     void** symbol;
57 }
58 
59 struct SymbolVersioned2 {
60     String name;
61     void** symbol;
62     int major;
63     int minor;
64 }
65 
66 struct SharedLib {
67     static void loadLibSymbols( SymbolVersioned2[] symbols, String libname, int major, int minor ){
68         version(Tango){
69             if (auto lib = tango.sys.SharedLib.SharedLib.load(libname)) {
70                 foreach( ref s; symbols ){
71                     if( s.major > major ) continue;
72                     if( s.major == major && s.minor > minor ) continue;
73                     *s.symbol = lib.getSymbol( tango.stdc.stringz.toStringz(s.name ) );
74                     if( s.symbol is null ){
75                         getDwtLogger.error(  __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name );
76                     }
77                 }
78             } else {
79                 getDwtLogger.error(  __FILE__, __LINE__, "Could not load the library {}", libname );
80             }
81         } else { // Phobos
82             if (auto lib = ExeModule_Load(libname)) {
83                 foreach( ref s; symbols ){
84                     if( s.major > major ) continue;
85                     if( s.major == major && s.minor > minor ) continue;
86                     *s.symbol = ExeModule_GetSymbol( lib, s.name );
87                     if( s.symbol is null ){
88                         getDwtLogger.error(  __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name );
89                     }
90                 }
91             } else {
92                 getDwtLogger.error(  __FILE__, __LINE__, "Could not load the library {}", libname );
93             }
94         }
95     }
96     static void loadLibSymbols( Symbol[] symbols, String libname ){
97         version(Tango){
98             if (auto lib = tango.sys.SharedLib.SharedLib.loadNoThrow(libname)) {
99                 foreach( ref s; symbols ){
100                     *s.symbol = lib.getSymbolNoThrow( tango.stdc.stringz.toStringz(s.name ) );
101                     if( *s.symbol is null ){
102                         //getDwtLogger.error(  __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name );
103                     }
104                 }
105             } else {
106                 getDwtLogger.error(  __FILE__, __LINE__, "Could not load the library {}", libname );
107             }
108         } else { // Phobos
109             if (auto lib = ExeModule_Load(libname)) {
110                 foreach( ref s; symbols ){
111                     *s.symbol = ExeModule_GetSymbol( lib, s.name );
112                     if( *s.symbol is null ){
113                         //getDwtLogger.error(  __FILE__, __LINE__, "{}: Symbol '{}' not found", libname, s.name );
114                     }
115                 }
116             } else {
117                 getDwtLogger.error(  __FILE__, __LINE__, "Could not load the library {}", libname );
118             }
119         }
120     }
121     static bool tryUseSymbol( String symbolname, String libname, void delegate( void*) dg  ){
122         bool result = false;
123         version(Tango){
124             if (auto lib = tango.sys.SharedLib.SharedLib.load( libname ) ) {
125                 void* ptr = lib.getSymbol( tango.stdc.stringz.toStringz(symbolname));
126                 if (ptr !is null){
127                     dg(ptr);
128                     result = true;
129                 }
130                 lib.unload();
131             }
132         } else { // Phobos
133             if (auto lib = ExeModule_Load( libname ) ) {
134                 void* ptr = ExeModule_GetSymbol( lib, symbolname );
135                 if (ptr !is null){
136                     dg(ptr);
137                     result = true;
138                 }
139                 ExeModule_Release( lib );
140             }
141         }
142         return result;
143     }
144 }
145 
146