Commit 31726505bb0642617967d879814dcfd35d080169
1 parent
2452cbb5
Exists in
master
and in
5 other branches
Iniciando implementação de carga dinâmica da jvm
Showing
7 changed files
with
257 additions
and
200 deletions
Show diff stats
pw3270.cbp
| @@ -76,6 +76,10 @@ | @@ -76,6 +76,10 @@ | ||
| 76 | <Unit filename="src/classlib/class.mak.in" /> | 76 | <Unit filename="src/classlib/class.mak.in" /> |
| 77 | <Unit filename="src/classlib/exception.cc" /> | 77 | <Unit filename="src/classlib/exception.cc" /> |
| 78 | <Unit filename="src/classlib/local.cc" /> | 78 | <Unit filename="src/classlib/local.cc" /> |
| 79 | + <Unit filename="src/classlib/module.cc"> | ||
| 80 | + <Option target="Debug" /> | ||
| 81 | + <Option target="Release" /> | ||
| 82 | + </Unit> | ||
| 79 | <Unit filename="src/classlib/remote.cc" /> | 83 | <Unit filename="src/classlib/remote.cc" /> |
| 80 | <Unit filename="src/classlib/session.cc" /> | 84 | <Unit filename="src/classlib/session.cc" /> |
| 81 | <Unit filename="src/classlib/testprogram.cc" /> | 85 | <Unit filename="src/classlib/testprogram.cc" /> |
src/classlib/class.mak.in
| @@ -27,7 +27,7 @@ | @@ -27,7 +27,7 @@ | ||
| 27 | CLASS_CFLAGS=@CFLAGS@ @DLL_CFLAGS@ @DBUS_CFLAGS@ | 27 | CLASS_CFLAGS=@CFLAGS@ @DLL_CFLAGS@ @DBUS_CFLAGS@ |
| 28 | CLASS_LIBS=@LIBICONV@ @DBUS_LIBS@ | 28 | CLASS_LIBS=@LIBICONV@ @DBUS_LIBS@ |
| 29 | 29 | ||
| 30 | -CLASS_SRC=session.cc exception.cc local.cc remote.cc | 30 | +CLASS_SRC=session.cc exception.cc local.cc remote.cc module.cc |
| 31 | 31 | ||
| 32 | CLASS_DEBUG_OBJECTS=$(foreach SRC, $(basename $(CLASS_SRC)), $(OBJDBG)/classlib/$(SRC)@OBJEXT@) | 32 | CLASS_DEBUG_OBJECTS=$(foreach SRC, $(basename $(CLASS_SRC)), $(OBJDBG)/classlib/$(SRC)@OBJEXT@) |
| 33 | CLASS_RELEASE_OBJECTS=$(foreach SRC, $(basename $(CLASS_SRC)), $(OBJRLS)/classlib/$(SRC)@OBJEXT@) | 33 | CLASS_RELEASE_OBJECTS=$(foreach SRC, $(basename $(CLASS_SRC)), $(OBJRLS)/classlib/$(SRC)@OBJEXT@) |
src/classlib/local.cc
| @@ -114,166 +114,11 @@ | @@ -114,166 +114,11 @@ | ||
| 114 | namespace PW3270_NAMESPACE | 114 | namespace PW3270_NAMESPACE |
| 115 | { | 115 | { |
| 116 | 116 | ||
| 117 | - class local : public session | 117 | + class local : public session, private module |
| 118 | { | 118 | { |
| 119 | private: | 119 | private: |
| 120 | 120 | ||
| 121 | - H3270 * hSession; | ||
| 122 | - | ||
| 123 | - #ifdef WIN32 | ||
| 124 | - | ||
| 125 | - HMODULE hModule; | ||
| 126 | - | ||
| 127 | - int get_datadir(LPSTR datadir) | ||
| 128 | - { | ||
| 129 | - HKEY hKey = 0; | ||
| 130 | - unsigned long datalen = strlen(datadir); | ||
| 131 | - | ||
| 132 | - *datadir = 0; | ||
| 133 | - | ||
| 134 | - if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\pw3270",0,KEY_QUERY_VALUE,&hKey) == ERROR_SUCCESS) | ||
| 135 | - { | ||
| 136 | - unsigned long datatype; // #defined in winnt.h (predefined types 0-11) | ||
| 137 | - if(RegQueryValueExA(hKey,"datadir",NULL,&datatype,(LPBYTE) datadir,&datalen) != ERROR_SUCCESS) | ||
| 138 | - *datadir = 0; | ||
| 139 | - RegCloseKey(hKey); | ||
| 140 | - } | ||
| 141 | - | ||
| 142 | - return *datadir; | ||
| 143 | - } | ||
| 144 | - #else | ||
| 145 | - | ||
| 146 | - void * hModule; | ||
| 147 | - | ||
| 148 | - #endif // WIN32 | ||
| 149 | - | ||
| 150 | - /** | ||
| 151 | - * Dynamically load lib3270 | ||
| 152 | - * | ||
| 153 | - * @return 0 if the library was loaded, -1 on error. | ||
| 154 | - * | ||
| 155 | - */ | ||
| 156 | - int load3270(void) | ||
| 157 | - { | ||
| 158 | - #ifdef WIN32 | ||
| 159 | - static const char *dllname = "lib3270.dll." PACKAGE_VERSION; | ||
| 160 | - | ||
| 161 | - HMODULE kernel; | ||
| 162 | - HANDLE cookie = NULL; | ||
| 163 | - DWORD rc; | ||
| 164 | - HANDLE WINAPI (*AddDllDirectory)(PCWSTR NewDirectory); | ||
| 165 | - BOOL WINAPI (*RemoveDllDirectory)(HANDLE Cookie); | ||
| 166 | - UINT errorMode; | ||
| 167 | - char datadir[4096]; | ||
| 168 | - char buffer[4096]; | ||
| 169 | - | ||
| 170 | - kernel = LoadLibrary("kernel32.dll"); | ||
| 171 | - AddDllDirectory = (HANDLE WINAPI (*)(PCWSTR)) GetProcAddress(kernel,"AddDllDirectory"); | ||
| 172 | - RemoveDllDirectory = (BOOL WINAPI (*)(HANDLE)) GetProcAddress(kernel,"RemoveDllDirectory"); | ||
| 173 | - | ||
| 174 | - // Notify user in case of error loading protocol DLL | ||
| 175 | - // http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621(v=vs.85).aspx | ||
| 176 | - errorMode = SetErrorMode(1); | ||
| 177 | - | ||
| 178 | - memset(datadir,' ',4095); | ||
| 179 | - datadir[4095] = 0; | ||
| 180 | - | ||
| 181 | - if(get_datadir(datadir)) | ||
| 182 | - { | ||
| 183 | - trace("Datadir=[%s] AddDllDirectory=%p RemoveDllDirectory=%p\n",datadir,AddDllDirectory,RemoveDllDirectory); | ||
| 184 | - | ||
| 185 | - if(AddDllDirectory) | ||
| 186 | - { | ||
| 187 | - wchar_t *path = (wchar_t *) malloc(4096*sizeof(wchar_t)); | ||
| 188 | - mbstowcs(path, datadir, 4095); | ||
| 189 | - cookie = AddDllDirectory(path); | ||
| 190 | - free(path); | ||
| 191 | - } | ||
| 192 | - | ||
| 193 | - #ifdef DEBUG | ||
| 194 | - snprintf(buffer,4096,"%s\\.bin\\Debug\\%s",datadir,dllname); | ||
| 195 | - #else | ||
| 196 | - snprintf(buffer,4096,"%s\\%s",datadir,dllname); | ||
| 197 | - #endif // DEBUG | ||
| 198 | - | ||
| 199 | - trace("Loading [%s] [%s]",buffer,datadir); | ||
| 200 | - hModule = LoadLibrary(buffer); | ||
| 201 | - | ||
| 202 | - trace("Module=%p rc=%d",hModule,(int) GetLastError()); | ||
| 203 | - | ||
| 204 | - if(hModule == NULL) | ||
| 205 | - { | ||
| 206 | - // Enable DLL error popup and try again with full path | ||
| 207 | - SetErrorMode(0); | ||
| 208 | - hModule = LoadLibraryEx(buffer,NULL,LOAD_LIBRARY_SEARCH_DEFAULT_DIRS|LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR); | ||
| 209 | - } | ||
| 210 | - | ||
| 211 | - rc = GetLastError(); | ||
| 212 | - | ||
| 213 | - trace("%s hModule=%p rc=%d",buffer,hModule,(int) rc); | ||
| 214 | - } | ||
| 215 | - else | ||
| 216 | - { | ||
| 217 | - hModule = LoadLibrary(dllname); | ||
| 218 | - rc = GetLastError(); | ||
| 219 | - } | ||
| 220 | - | ||
| 221 | - SetErrorMode(errorMode); | ||
| 222 | - | ||
| 223 | - trace("%s hModule=%p rc=%d",dllname,hModule,(int) rc); | ||
| 224 | - | ||
| 225 | - if(cookie && RemoveDllDirectory) | ||
| 226 | - RemoveDllDirectory(cookie); | ||
| 227 | - | ||
| 228 | - if(kernel) | ||
| 229 | - FreeLibrary(kernel); | ||
| 230 | - | ||
| 231 | - if(hModule) | ||
| 232 | - return 0; | ||
| 233 | - | ||
| 234 | - throw exception("Can't load %s",dllname); | ||
| 235 | - | ||
| 236 | - #else | ||
| 237 | - dlerror(); | ||
| 238 | - | ||
| 239 | - hModule = dlopen("lib3270.so." PACKAGE_VERSION, RTLD_NOW); | ||
| 240 | - if(hModule) | ||
| 241 | - return 0; | ||
| 242 | - | ||
| 243 | - throw exception("Can't load lib3270: %s",dlerror()); | ||
| 244 | - | ||
| 245 | - #endif // WIN32 | ||
| 246 | - | ||
| 247 | - return -1; | ||
| 248 | - | ||
| 249 | - } | ||
| 250 | - | ||
| 251 | - void * get_symbol(const char *name) | ||
| 252 | - { | ||
| 253 | -#ifdef WIN32 | ||
| 254 | - void *symbol = (void *) GetProcAddress(hModule,name); | ||
| 255 | - | ||
| 256 | - if(symbol) | ||
| 257 | - return symbol; | ||
| 258 | - | ||
| 259 | - throw exception("Can't load symbol lib3270::%s",name); | ||
| 260 | - | ||
| 261 | -#else | ||
| 262 | - void *symbol; | ||
| 263 | - | ||
| 264 | - symbol = dlsym(hModule,name); | ||
| 265 | - | ||
| 266 | - if(symbol) | ||
| 267 | - return symbol; | ||
| 268 | - | ||
| 269 | - throw exception("Can't load symbol lib3270::%s dlerror was \"%s\"",name,dlerror()); | ||
| 270 | - | ||
| 271 | -#endif // WIN32 | ||
| 272 | - | ||
| 273 | - return NULL; | ||
| 274 | - | ||
| 275 | - } | ||
| 276 | - | 121 | + H3270 * hSession; |
| 277 | 122 | ||
| 278 | // Lib3270 entry points | 123 | // Lib3270 entry points |
| 279 | const char * (*_get_version)(void); | 124 | const char * (*_get_version)(void); |
| @@ -313,7 +158,7 @@ | @@ -313,7 +158,7 @@ | ||
| 313 | 158 | ||
| 314 | public: | 159 | public: |
| 315 | 160 | ||
| 316 | - local() | 161 | + local() throw(std::exception) : module("lib3270",PACKAGE_VERSION) |
| 317 | { | 162 | { |
| 318 | H3270 * (*lib3270_new)(const char *); | 163 | H3270 * (*lib3270_new)(const char *); |
| 319 | void (*set_log_handler)(void (*loghandler)(H3270 *, const char *, int, const char *, va_list)); | 164 | void (*set_log_handler)(void (*loghandler)(H3270 *, const char *, int, const char *, va_list)); |
| @@ -367,17 +212,11 @@ | @@ -367,17 +212,11 @@ | ||
| 367 | 212 | ||
| 368 | }; | 213 | }; |
| 369 | 214 | ||
| 370 | - | ||
| 371 | - if(load3270()) | ||
| 372 | - return; | ||
| 373 | - | ||
| 374 | - trace("hModule=%p",hModule); | ||
| 375 | - | ||
| 376 | for(unsigned int f = 0; f < (sizeof (call) / sizeof ((call)[0]));f++) | 215 | for(unsigned int f = 0; f < (sizeof (call) / sizeof ((call)[0]));f++) |
| 377 | { | 216 | { |
| 378 | *call[f].entry = (void *) get_symbol(call[f].name); | 217 | *call[f].entry = (void *) get_symbol(call[f].name); |
| 379 | if(!*call[f].entry) | 218 | if(!*call[f].entry) |
| 380 | - return; | 219 | + throw exception("Can't find symbol %s",call[f].name); |
| 381 | } | 220 | } |
| 382 | 221 | ||
| 383 | // Get Session handle, setup base callbacks | 222 | // Get Session handle, setup base callbacks |
| @@ -400,12 +239,6 @@ | @@ -400,12 +239,6 @@ | ||
| 400 | } | 239 | } |
| 401 | catch(exception e) { } | 240 | catch(exception e) { } |
| 402 | 241 | ||
| 403 | - #ifdef WIN32 | ||
| 404 | - FreeLibrary(hModule); | ||
| 405 | - #else | ||
| 406 | - dlclose(hModule); | ||
| 407 | - #endif // WIN32 | ||
| 408 | - | ||
| 409 | } | 242 | } |
| 410 | 243 | ||
| 411 | bool is_connected(void) | 244 | bool is_connected(void) |
| @@ -599,7 +432,7 @@ | @@ -599,7 +432,7 @@ | ||
| 599 | 432 | ||
| 600 | }; | 433 | }; |
| 601 | 434 | ||
| 602 | - session * session::create_local(void) | 435 | + session * session::create_local(void) throw (std::exception) |
| 603 | { | 436 | { |
| 604 | return new local(); | 437 | return new local(); |
| 605 | } | 438 | } |
| @@ -0,0 +1,215 @@ | @@ -0,0 +1,215 @@ | ||
| 1 | +/* | ||
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
| 5 | + * | ||
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
| 7 | + * | ||
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
| 10 | + * Free Software Foundation. | ||
| 11 | + * | ||
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
| 15 | + * obter mais detalhes. | ||
| 16 | + * | ||
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | + * | ||
| 21 | + * Este programa está nomeado como module.cc e possui - linhas de código. | ||
| 22 | + * | ||
| 23 | + * Contatos: | ||
| 24 | + * | ||
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
| 27 | + * | ||
| 28 | + */ | ||
| 29 | + | ||
| 30 | +#if defined WIN32 | ||
| 31 | + | ||
| 32 | + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx | ||
| 33 | + #ifndef LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | ||
| 34 | + #define LOAD_LIBRARY_SEARCH_DEFAULT_DIRS 0x00001000 | ||
| 35 | + #endif // LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | ||
| 36 | + | ||
| 37 | + #ifndef LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | ||
| 38 | + #define LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR 0x00000100 | ||
| 39 | + #endif // LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | ||
| 40 | + | ||
| 41 | + #include <windows.h> | ||
| 42 | + | ||
| 43 | +#else | ||
| 44 | + | ||
| 45 | + #include <dlfcn.h> | ||
| 46 | + | ||
| 47 | +#endif | ||
| 48 | + | ||
| 49 | +#include <pw3270/class.h> | ||
| 50 | + | ||
| 51 | +/*---[ Implement ]----------------------------------------------------------------------------------*/ | ||
| 52 | + | ||
| 53 | + | ||
| 54 | +namespace PW3270_NAMESPACE | ||
| 55 | +{ | ||
| 56 | + | ||
| 57 | +#ifdef WIN32 | ||
| 58 | + int module::get_datadir(LPSTR datadir) | ||
| 59 | + { | ||
| 60 | + HKEY hKey = 0; | ||
| 61 | + unsigned long datalen = strlen(datadir); | ||
| 62 | + | ||
| 63 | + *datadir = 0; | ||
| 64 | + | ||
| 65 | + if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\pw3270",0,KEY_QUERY_VALUE,&hKey) == ERROR_SUCCESS) | ||
| 66 | + { | ||
| 67 | + unsigned long datatype; // #defined in winnt.h (predefined types 0-11) | ||
| 68 | + if(RegQueryValueExA(hKey,"datadir",NULL,&datatype,(LPBYTE) datadir,&datalen) != ERROR_SUCCESS) | ||
| 69 | + *datadir = 0; | ||
| 70 | + RegCloseKey(hKey); | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + return *datadir; | ||
| 74 | + } | ||
| 75 | +#endif // WIN32 | ||
| 76 | + | ||
| 77 | + module::module(const char *name, const char *version) throw (std::exception) | ||
| 78 | + { | ||
| 79 | + string dllname = name; | ||
| 80 | + | ||
| 81 | +#ifdef WIN32 | ||
| 82 | + | ||
| 83 | + dllname += ".dll"; | ||
| 84 | + if(version) | ||
| 85 | + { | ||
| 86 | + dllname += "."; | ||
| 87 | + dllname += version; | ||
| 88 | + } | ||
| 89 | + | ||
| 90 | + HMODULE kernel; | ||
| 91 | + HANDLE cookie = NULL; | ||
| 92 | + DWORD rc; | ||
| 93 | + HANDLE WINAPI (*AddDllDirectory)(PCWSTR NewDirectory); | ||
| 94 | + BOOL WINAPI (*RemoveDllDirectory)(HANDLE Cookie); | ||
| 95 | + UINT errorMode; | ||
| 96 | + char datadir[4096]; | ||
| 97 | + char buffer[4096]; | ||
| 98 | + | ||
| 99 | + kernel = LoadLibrary("kernel32.dll"); | ||
| 100 | + AddDllDirectory = (HANDLE WINAPI (*)(PCWSTR)) GetProcAddress(kernel,"AddDllDirectory"); | ||
| 101 | + RemoveDllDirectory = (BOOL WINAPI (*)(HANDLE)) GetProcAddress(kernel,"RemoveDllDirectory"); | ||
| 102 | + | ||
| 103 | + // Notify user in case of error loading protocol DLL | ||
| 104 | + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621(v=vs.85).aspx | ||
| 105 | + errorMode = SetErrorMode(1); | ||
| 106 | + | ||
| 107 | + memset(datadir,' ',4095); | ||
| 108 | + datadir[4095] = 0; | ||
| 109 | + | ||
| 110 | + if(get_datadir(datadir)) | ||
| 111 | + { | ||
| 112 | + trace("Datadir=[%s] AddDllDirectory=%p RemoveDllDirectory=%p\n",datadir,AddDllDirectory,RemoveDllDirectory); | ||
| 113 | + | ||
| 114 | + if(AddDllDirectory) | ||
| 115 | + { | ||
| 116 | + wchar_t *path = (wchar_t *) malloc(4096*sizeof(wchar_t)); | ||
| 117 | + mbstowcs(path, datadir, 4095); | ||
| 118 | + cookie = AddDllDirectory(path); | ||
| 119 | + free(path); | ||
| 120 | + } | ||
| 121 | + | ||
| 122 | +#ifdef DEBUG | ||
| 123 | + snprintf(buffer,4096,"%s\\.bin\\Debug\\%s",datadir,dllname.c_str()); | ||
| 124 | +#else | ||
| 125 | + snprintf(buffer,4096,"%s\\%s",datadir,dllname.c_str()); | ||
| 126 | +#endif // DEBUG | ||
| 127 | + | ||
| 128 | + trace("Loading [%s] [%s]",buffer,datadir); | ||
| 129 | + hModule = LoadLibrary(buffer); | ||
| 130 | + | ||
| 131 | + trace("Module=%p rc=%d",hModule,(int) GetLastError()); | ||
| 132 | + | ||
| 133 | + if(hModule == NULL) | ||
| 134 | + { | ||
| 135 | + // Enable DLL error popup and try again with full path | ||
| 136 | + SetErrorMode(0); | ||
| 137 | + hModule = LoadLibraryEx(buffer,NULL,LOAD_LIBRARY_SEARCH_DEFAULT_DIRS|LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR); | ||
| 138 | + } | ||
| 139 | + | ||
| 140 | + rc = GetLastError(); | ||
| 141 | + | ||
| 142 | + trace("%s hModule=%p rc=%d",buffer,hModule,(int) rc); | ||
| 143 | + } | ||
| 144 | + else | ||
| 145 | + { | ||
| 146 | + hModule = LoadLibrary(dllname); | ||
| 147 | + rc = GetLastError(); | ||
| 148 | + } | ||
| 149 | + | ||
| 150 | + SetErrorMode(errorMode); | ||
| 151 | + | ||
| 152 | + trace("%s hModule=%p rc=%d",dllname,hModule,(int) rc); | ||
| 153 | + | ||
| 154 | + if(cookie && RemoveDllDirectory) | ||
| 155 | + RemoveDllDirectory(cookie); | ||
| 156 | + | ||
| 157 | + if(kernel) | ||
| 158 | + FreeLibrary(kernel); | ||
| 159 | + | ||
| 160 | + if(!hModule) | ||
| 161 | + throw exception("Can't load %s",dllname.c_str()); | ||
| 162 | + | ||
| 163 | +#else | ||
| 164 | + dllname += ".so"; | ||
| 165 | + if(version) | ||
| 166 | + { | ||
| 167 | + dllname += "."; | ||
| 168 | + dllname += version; | ||
| 169 | + } | ||
| 170 | + | ||
| 171 | + dlerror(); | ||
| 172 | + | ||
| 173 | + hModule = dlopen(dllname.c_str(), RTLD_NOW); | ||
| 174 | + if(!hModule) | ||
| 175 | + throw exception("Can't load lib3270: %s",dllname.c_str()); | ||
| 176 | + | ||
| 177 | +#endif // WIN32 | ||
| 178 | + | ||
| 179 | + | ||
| 180 | + } | ||
| 181 | + | ||
| 182 | + module::~module() | ||
| 183 | + { | ||
| 184 | +#ifdef WIN32 | ||
| 185 | + FreeLibrary(hModule); | ||
| 186 | +#else | ||
| 187 | + dlclose(hModule); | ||
| 188 | +#endif // WIN32 | ||
| 189 | + } | ||
| 190 | + | ||
| 191 | + | ||
| 192 | + void * module::get_symbol(const char *name) | ||
| 193 | + { | ||
| 194 | + void *symbol; | ||
| 195 | + | ||
| 196 | +#ifdef WIN32 | ||
| 197 | + | ||
| 198 | + symbol = (void *) GetProcAddress(hModule,name); | ||
| 199 | + | ||
| 200 | + if(!symbol) | ||
| 201 | + throw exception("Can't load symbol %s",name); | ||
| 202 | + | ||
| 203 | +#else | ||
| 204 | + symbol = dlsym(hModule,name); | ||
| 205 | + | ||
| 206 | + if(!symbol) | ||
| 207 | + throw exception("Can't load symbol %s dlerror was \"%s\"",name,dlerror()); | ||
| 208 | + | ||
| 209 | +#endif // WIN32 | ||
| 210 | + | ||
| 211 | + return symbol; | ||
| 212 | + } | ||
| 213 | + | ||
| 214 | +} | ||
| 215 | + |
src/classlib/remote.cc
| @@ -398,7 +398,7 @@ | @@ -398,7 +398,7 @@ | ||
| 398 | } | 398 | } |
| 399 | #endif // HAVE_DBUS | 399 | #endif // HAVE_DBUS |
| 400 | 400 | ||
| 401 | - remote(const char *session) | 401 | + remote(const char *session) throw (std::exception) |
| 402 | { | 402 | { |
| 403 | #if defined(WIN32) | 403 | #if defined(WIN32) |
| 404 | static DWORD dwMode = PIPE_READMODE_MESSAGE; | 404 | static DWORD dwMode = PIPE_READMODE_MESSAGE; |
| @@ -499,27 +499,6 @@ | @@ -499,27 +499,6 @@ | ||
| 499 | Sleep(10); | 499 | Sleep(10); |
| 500 | } | 500 | } |
| 501 | } | 501 | } |
| 502 | - /* | ||
| 503 | - WIN32_FIND_DATA FindFileData; | ||
| 504 | - | ||
| 505 | - timer = time(0)+20; | ||
| 506 | - while(hPipe == INVALID_HANDLE_VALUE && time(0) < timer) | ||
| 507 | - { | ||
| 508 | - hPipe = FindFirstFile(buffer, &FindFileData); | ||
| 509 | - Sleep(10); | ||
| 510 | - } | ||
| 511 | - | ||
| 512 | - if(hPipe != INVALID_HANDLE_VALUE) | ||
| 513 | - { | ||
| 514 | - CloseHandle(hPipe); | ||
| 515 | - hPipe = CreateFile(buffer,GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); | ||
| 516 | - } | ||
| 517 | - else | ||
| 518 | - { | ||
| 519 | - throw exception(GetLastError(),"Timeout waiting for %s instance",PACKAGE_NAME); | ||
| 520 | - return; | ||
| 521 | - } | ||
| 522 | - */ | ||
| 523 | 502 | ||
| 524 | if(hPipe == INVALID_HANDLE_VALUE) | 503 | if(hPipe == INVALID_HANDLE_VALUE) |
| 525 | { | 504 | { |
| @@ -1377,7 +1356,7 @@ | @@ -1377,7 +1356,7 @@ | ||
| 1377 | 1356 | ||
| 1378 | }; | 1357 | }; |
| 1379 | 1358 | ||
| 1380 | - session * session::create_remote(const char *session) | 1359 | + session * session::create_remote(const char *session) throw (std::exception) |
| 1381 | { | 1360 | { |
| 1382 | return new remote(session); | 1361 | return new remote(session); |
| 1383 | } | 1362 | } |
src/classlib/session.cc
| @@ -96,7 +96,7 @@ | @@ -96,7 +96,7 @@ | ||
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | // Factory methods and settings | 98 | // Factory methods and settings |
| 99 | - session * session::create(const char *name) | 99 | + session * session::create(const char *name) throw (std::exception) |
| 100 | { | 100 | { |
| 101 | if(factory) | 101 | if(factory) |
| 102 | return factory(name); | 102 | return factory(name); |
src/include/pw3270/class.h
| @@ -89,6 +89,32 @@ | @@ -89,6 +89,32 @@ | ||
| 89 | 89 | ||
| 90 | }; | 90 | }; |
| 91 | 91 | ||
| 92 | +#if defined (HAVE_GNUC_VISIBILITY) | ||
| 93 | + class __attribute__((visibility("default"))) module | ||
| 94 | +#elif defined(WIN32) | ||
| 95 | + class __declspec (dllexport) module | ||
| 96 | +#else | ||
| 97 | + class module | ||
| 98 | +#endif | ||
| 99 | + { | ||
| 100 | + private: | ||
| 101 | +#ifdef WIN32 | ||
| 102 | + HMODULE hModule; | ||
| 103 | + int get_datadir(LPSTR datadir); | ||
| 104 | +#else | ||
| 105 | + void * hModule; | ||
| 106 | + | ||
| 107 | +#endif // WIN32 | ||
| 108 | + | ||
| 109 | + public: | ||
| 110 | + module(const char *name, const char *version = NULL) throw (std::exception); | ||
| 111 | + ~module(); | ||
| 112 | + | ||
| 113 | + void * get_symbol(const char *name); | ||
| 114 | + | ||
| 115 | + }; | ||
| 116 | + | ||
| 117 | + | ||
| 92 | 118 | ||
| 93 | #if defined (HAVE_GNUC_VISIBILITY) | 119 | #if defined (HAVE_GNUC_VISIBILITY) |
| 94 | class __attribute__((visibility("default"))) session | 120 | class __attribute__((visibility("default"))) session |
| @@ -104,7 +130,7 @@ | @@ -104,7 +130,7 @@ | ||
| 104 | 130 | ||
| 105 | // Factory methods and settings | 131 | // Factory methods and settings |
| 106 | static session * start(const char *name = 0); | 132 | static session * start(const char *name = 0); |
| 107 | - static session * create(const char *name = 0); | 133 | + static session * create(const char *name = 0) throw (std::exception); |
| 108 | static session * get_default(void); | 134 | static session * get_default(void); |
| 109 | static void set_plugin(session * (*factory)(const char *name)); | 135 | static void set_plugin(session * (*factory)(const char *name)); |
| 110 | 136 | ||
| @@ -221,8 +247,8 @@ | @@ -221,8 +247,8 @@ | ||
| 221 | 247 | ||
| 222 | static session * (*factory)(const char *name); | 248 | static session * (*factory)(const char *name); |
| 223 | 249 | ||
| 224 | - static session * create_remote(const char *name); | ||
| 225 | - static session * create_local(void); | 250 | + static session * create_remote(const char *name) throw (std::exception); |
| 251 | + static session * create_local(void) throw (std::exception); | ||
| 226 | 252 | ||
| 227 | #ifdef HAVE_ICONV | 253 | #ifdef HAVE_ICONV |
| 228 | iconv_t conv2Local; | 254 | iconv_t conv2Local; |