KWStyle - itkDynamicLoader.cxx
 
Matrix View
Description

1 /*=========================================================================
2
3   Program:   Insight Segmentation & Registration Toolkit
4   Module:    $RCSfile: itkDynamicLoader.cxx.html,v $
5   Language:  C++
6   Date:      $Date: 2006/01/17 19:15:35 $
7   Version:   $Revision: 1.4 $
8
9   Copyright (c) Insight Software Consortium. All rights reserved.
10   See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
11
12      This software is distributed WITHOUT ANY WARRANTY; without even 
13      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
14      PURPOSE.  See the above copyright notices for more information.
15
16 DEF =========================================================================*/
17 #include "itkDynamicLoader.h"
18
19 // This file is actually 3 different implementations.
20 // 1. HP machines which uses shl_load
21 // 2. Power PC MAC which uses GetSharedLibrary
22 // 3. Windows which uses LoadLibrary
23 // 4. Most unix systems which use dlopen (default )
24 // Each part of the ifdef contains a complete implementation for
25 // the static methods of DynamicLoader.  
26
27 namespace itk
28 {
29
30 DynamicLoader::DynamicLoader()
31 {
32 }
33
34 DynamicLoader::~DynamicLoader()
35 {
36 }
37
38 }
39
40 // ---------------------------------------------------------------
41 // 1. Implementation for HPUX  machines
42 #ifdef __hpux
43 #define ITKDYNAMICLOADER_DEFINED 1
44 #include <dl.h>
45
46 namespace itk
47 {
48
49 //----------------------------------------------------------------------------
50 LibHandle 
51 DynamicLoader
52 ::OpenLibrary(const char* libname )
53 {
54   return shl_load(libname, BIND_DEFERRED | DYNAMIC_PATH, 0L);
55 }
56
57 int 
58 DynamicLoader::
59 CloseLibrary(LibHandle lib)
60 {
61   return 0;
62 }
63
64 //----------------------------------------------------------------------------
65 void* 
66 DynamicLoader
67 ::GetSymbolAddress(LibHandle lib, const char* sym)
68
69   void* addr;
70   int status;
71   
72   status = shl_findsym (&lib, sym, TYPE_PROCEDURE, &addr);
73   return (status < 0) ? (void*)0 : addr;
74 }
75
76 //----------------------------------------------------------------------------
77 const char* 
78 DynamicLoader
79 ::LibPrefix()
80
81   return "lib";
82 }
83
84 //----------------------------------------------------------------------------
85 const char* 
86 DynamicLoader
87 ::LibExtension()
88 {
89   return ".sl";
90 }
91
92 //----------------------------------------------------------------------------
93 const char* 
94 DynamicLoader
95 ::LastError()
96 {
97   return 0;
98 }
99
100 // end namespace itk
101
102 #endif
103
104
105 // ---------------------------------------------------------------
106 // 2. Implementation for the Power PC (MAC)
107 #ifdef __APPLE__
108 #define ITKDYNAMICLOADER_DEFINED 
109 #include <mach-o/dyld.h>
110
111 namespace itk
112 {
113
114 //----------------------------------------------------------------------------
115 LibHandle 
116 DynamicLoader
117 ::OpenLibrary(const char* libname )
118 {
119   NSObjectFileImageReturnCode rc;
120   NSObjectFileImage image;
121   
122   rc = NSCreateObjectFileImageFromFile(libname, &image);
123   return NSLinkModule(image, libname, TRUE);
124 }
125
126 //----------------------------------------------------------------------------
127 int 
128 DynamicLoader
129 ::CloseLibrary( LibHandle ) // argument expected (LibHandle lib)
130 {
131   return 0;
132 }
133
134 //----------------------------------------------------------------------------
135 void* 
136 DynamicLoader
137 ::GetSymbolAddress(LibHandle , const char* sym) // (LibHandle lib)
138
139   void *result=0;
140   if(NSIsSymbolNameDefined(sym))
141     {
142     NSSymbol symbol= NSLookupAndBindSymbol(sym);
143     if(symbol)
144       {
145       result = NSAddressOfSymbol(symbol);
146       }
147     }
148   return result;
149 }
150
151 //----------------------------------------------------------------------------
152 const char* 
153 DynamicLoader
154 ::LibPrefix()
155
156   return "";
157 }
158
159 //----------------------------------------------------------------------------
160 const char* 
161 DynamicLoader
162 ::LibExtension()
163 {
164   return ".dylib";
165 }
166
167 //----------------------------------------------------------------------------
168 const char* 
169 DynamicLoader
170 ::LastError()
171 {
172   return 0;
173 }
174
175 // end namespace itk
176
177 #endif
178
179 // ---------------------------------------------------------------
180 // 3. Implementation for Windows win32 code
181 #ifdef _WIN32
182 #include "itkWindows.h"
183 #define ITKDYNAMICLOADER_DEFINED 1
184
185 namespace itk
186 {
187   
188 //----------------------------------------------------------------------------
189 LibHandle 
190 DynamicLoader
191 ::OpenLibrary(const char* libname )
192 {
193   return LoadLibrary(libname);
194 }
195
196 //----------------------------------------------------------------------------
197 int 
198 DynamicLoader
199 ::CloseLibrary(LibHandle lib)
200 {
201   return (int)FreeLibrary(lib);
202 }
203
204 //----------------------------------------------------------------------------
205 void* 
206 DynamicLoader
207 ::GetSymbolAddress(LibHandle lib, const char* sym)
208
209   return (void *)GetProcAddress(lib, sym);
210 }
211
212 //----------------------------------------------------------------------------
213 const char* 
214 DynamicLoader
215 ::LibPrefix()
216
217   return "";
218 }
219
220 //----------------------------------------------------------------------------
221 const char* 
222 DynamicLoader
223 ::LibExtension()
224 {
225   return ".dll";
226 }
227
228 //----------------------------------------------------------------------------
229 const char* 
230 DynamicLoader
231 ::LastError()
232 {
233   LPVOID lpMsgBuf;
234
235   FormatMessage( 
236     FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
237     NULL,
238     GetLastError(),
239 IND ****MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
240 IND ****(LPTSTR) &lpMsgBuf,
241 IND ****0,
242 IND ****NULL 
243 IND ****);
244   
245   static char* str = 0;
246   delete [] str;
247   str = strcpy(new char[strlen((char*)lpMsgBuf)+1], (char*)lpMsgBuf);
248   // Free the buffer.
249   LocalFree( lpMsgBuf );
250   return str;
251 }
252
253 // end namespace itk
254
255 #endif
256
257 // ---------------------------------------------------------------
258 // 4. Implementation for default UNIX machines.
259 // if nothing has been defined then use this
260 #ifndef ITKDYNAMICLOADER_DEFINED
261 #define ITKDYNAMICLOADER_DEFINED
262 // Setup for most unix machines
263 #include <dlfcn.h>
264
265 namespace itk
266 {
267   
268 //----------------------------------------------------------------------------
269 LibHandle 
270 DynamicLoader
271 ::OpenLibrary(const char* libname )
272 {
273   return dlopen(libname, RTLD_LAZY);
274 }
275
276 //----------------------------------------------------------------------------
277 int 
278 DynamicLoader
279 ::CloseLibrary(LibHandle lib)
280 {
281   if (lib)
282     {
283     return (int)dlclose(lib);
284     }
285   else
286     {
287     return 0;
288     }
289 }
290
291 //----------------------------------------------------------------------------
292 void* 
293 DynamicLoader
294 ::GetSymbolAddress(LibHandle lib, const char* sym)
295
296   return dlsym(lib, sym);
297 }
298
299 //----------------------------------------------------------------------------
300 const char* 
301 DynamicLoader
302 ::LibPrefix()
303
304   return "lib";
305 }
306
307 //----------------------------------------------------------------------------
308 const char* 
309 DynamicLoader
310 ::LibExtension()
311 {
312   return ".so";
313 }
314
315 //----------------------------------------------------------------------------
316 const char* 
317 DynamicLoader
318 ::LastError()
319 {
320   return dlerror(); 
321 }
322
323 // end namespace itk
324
325 #endif
326

Generated by KWStyle 1.0b on Tuesday January,17 at 02:14:06PM
© Kitware Inc.