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 | 76 | <Unit filename="src/classlib/class.mak.in" /> |
| 77 | 77 | <Unit filename="src/classlib/exception.cc" /> |
| 78 | 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 | 83 | <Unit filename="src/classlib/remote.cc" /> |
| 80 | 84 | <Unit filename="src/classlib/session.cc" /> |
| 81 | 85 | <Unit filename="src/classlib/testprogram.cc" /> | ... | ... |
src/classlib/class.mak.in
| ... | ... | @@ -27,7 +27,7 @@ |
| 27 | 27 | CLASS_CFLAGS=@CFLAGS@ @DLL_CFLAGS@ @DBUS_CFLAGS@ |
| 28 | 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 | 32 | CLASS_DEBUG_OBJECTS=$(foreach SRC, $(basename $(CLASS_SRC)), $(OBJDBG)/classlib/$(SRC)@OBJEXT@) |
| 33 | 33 | CLASS_RELEASE_OBJECTS=$(foreach SRC, $(basename $(CLASS_SRC)), $(OBJRLS)/classlib/$(SRC)@OBJEXT@) | ... | ... |
src/classlib/local.cc
| ... | ... | @@ -114,166 +114,11 @@ |
| 114 | 114 | namespace PW3270_NAMESPACE |
| 115 | 115 | { |
| 116 | 116 | |
| 117 | - class local : public session | |
| 117 | + class local : public session, private module | |
| 118 | 118 | { |
| 119 | 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 | 123 | // Lib3270 entry points |
| 279 | 124 | const char * (*_get_version)(void); |
| ... | ... | @@ -313,7 +158,7 @@ |
| 313 | 158 | |
| 314 | 159 | public: |
| 315 | 160 | |
| 316 | - local() | |
| 161 | + local() throw(std::exception) : module("lib3270",PACKAGE_VERSION) | |
| 317 | 162 | { |
| 318 | 163 | H3270 * (*lib3270_new)(const char *); |
| 319 | 164 | void (*set_log_handler)(void (*loghandler)(H3270 *, const char *, int, const char *, va_list)); |
| ... | ... | @@ -367,17 +212,11 @@ |
| 367 | 212 | |
| 368 | 213 | }; |
| 369 | 214 | |
| 370 | - | |
| 371 | - if(load3270()) | |
| 372 | - return; | |
| 373 | - | |
| 374 | - trace("hModule=%p",hModule); | |
| 375 | - | |
| 376 | 215 | for(unsigned int f = 0; f < (sizeof (call) / sizeof ((call)[0]));f++) |
| 377 | 216 | { |
| 378 | 217 | *call[f].entry = (void *) get_symbol(call[f].name); |
| 379 | 218 | if(!*call[f].entry) |
| 380 | - return; | |
| 219 | + throw exception("Can't find symbol %s",call[f].name); | |
| 381 | 220 | } |
| 382 | 221 | |
| 383 | 222 | // Get Session handle, setup base callbacks |
| ... | ... | @@ -400,12 +239,6 @@ |
| 400 | 239 | } |
| 401 | 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 | 244 | bool is_connected(void) |
| ... | ... | @@ -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 | 437 | return new local(); |
| 605 | 438 | } | ... | ... |
| ... | ... | @@ -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 | 398 | } |
| 399 | 399 | #endif // HAVE_DBUS |
| 400 | 400 | |
| 401 | - remote(const char *session) | |
| 401 | + remote(const char *session) throw (std::exception) | |
| 402 | 402 | { |
| 403 | 403 | #if defined(WIN32) |
| 404 | 404 | static DWORD dwMode = PIPE_READMODE_MESSAGE; |
| ... | ... | @@ -499,27 +499,6 @@ |
| 499 | 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 | 503 | if(hPipe == INVALID_HANDLE_VALUE) |
| 525 | 504 | { |
| ... | ... | @@ -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 | 1361 | return new remote(session); |
| 1383 | 1362 | } | ... | ... |
src/classlib/session.cc
src/include/pw3270/class.h
| ... | ... | @@ -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 | 119 | #if defined (HAVE_GNUC_VISIBILITY) |
| 94 | 120 | class __attribute__((visibility("default"))) session |
| ... | ... | @@ -104,7 +130,7 @@ |
| 104 | 130 | |
| 105 | 131 | // Factory methods and settings |
| 106 | 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 | 134 | static session * get_default(void); |
| 109 | 135 | static void set_plugin(session * (*factory)(const char *name)); |
| 110 | 136 | |
| ... | ... | @@ -221,8 +247,8 @@ |
| 221 | 247 | |
| 222 | 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 | 253 | #ifdef HAVE_ICONV |
| 228 | 254 | iconv_t conv2Local; | ... | ... |