diff --git a/client/Makefile.in b/client/Makefile.in index 157643f..6dc4451 100644 --- a/client/Makefile.in +++ b/client/Makefile.in @@ -39,6 +39,9 @@ MAIN_SOURCES= \ $(wildcard src/session/remote/*.cc) \ $(wildcard src/session/remote/@OSNAME@/*.cc) +DYNAMIC_SOURCES= \ + $(wildcard src/core/@OSNAME@/dynamic/*.cc) + TEST_SOURCES= \ $(wildcard src/testprogram/*.cc) @@ -191,7 +194,8 @@ Release: \ $(BINRLS)/lib$(MODULE_NAME).static.a $(BINRLS)/lib$(MODULE_NAME)@LIBEXT@: \ - $(foreach SRC, $(basename $(MAIN_SOURCES)), $(OBJRLS)/$(SRC).o) + $(foreach SRC, $(basename $(MAIN_SOURCES)), $(OBJRLS)/$(SRC).o) \ + $(foreach SRC, $(basename $(DYNAMIC_SOURCES)), $(OBJRLS)/$(SRC).o) @$(MKDIR) $(@D) @echo $< ... @@ -308,7 +312,8 @@ $(BINDBG)/$(MODULE_NAME)-client@EXEEXT@: \ $(BINDBG)/lib$(MODULE_NAME)@LIBEXT@: \ - $(foreach SRC, $(basename $(MAIN_SOURCES)), $(OBJDBG)/$(SRC).o) + $(foreach SRC, $(basename $(MAIN_SOURCES)), $(OBJDBG)/$(SRC).o) \ + $(foreach SRC, $(basename $(DYNAMIC_SOURCES)), $(OBJDBG)/$(SRC).o) @$(MKDIR) $(@D) @echo $< ... diff --git a/client/ipcclient.cbp b/client/ipcclient.cbp index cdad57c..eb6d38d 100644 --- a/client/ipcclient.cbp +++ b/client/ipcclient.cbp @@ -49,6 +49,7 @@ + diff --git a/client/src/core/windows/attribute.cc b/client/src/core/windows/attribute.cc new file mode 100644 index 0000000..3754aef --- /dev/null +++ b/client/src/core/windows/attribute.cc @@ -0,0 +1,74 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + +/** + * @file src/os/linux/attribute.cc + * + * @brief Implements methods for static attribute management. + * + * @author perry.werneck@gmail.com + * + */ + + #include + #include + #include + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + + std::vector TN3270::getAttributes() noexcept { + + std::vector attributes; + + for(auto prop = lib3270_get_int_properties_list(); prop->name; prop++) { + attributes.push_back((const LIB3270_PROPERTY *) prop); + } + + for(auto prop = lib3270_get_unsigned_properties_list(); prop->name; prop++) { + attributes.push_back((const LIB3270_PROPERTY *) prop); + } + + for(auto prop = lib3270_get_string_properties_list(); prop->name; prop++) { + attributes.push_back((const LIB3270_PROPERTY *) prop); + } + + for(auto prop = lib3270_get_toggle_list(); prop->name; prop++) { + attributes.push_back((const LIB3270_PROPERTY *) prop); + } + + for(auto prop = lib3270_get_boolean_properties_list(); prop->name; prop++) { + attributes.push_back((const LIB3270_PROPERTY *) prop); + } + + return attributes; + + } + + + diff --git a/client/src/core/windows/dynamic/init.cc b/client/src/core/windows/dynamic/init.cc new file mode 100644 index 0000000..e2324fa --- /dev/null +++ b/client/src/core/windows/dynamic/init.cc @@ -0,0 +1,194 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + +/** + * @file + * + * @brief Win32 delayed loading support methods. + * + * @author perry.werneck@gmail.com + * + */ + + #include + #include + #include + + extern "C" { + + extern __declspec (dllexport) PfnDliHook __pfnDliNotifyHook2; + extern __declspec (dllexport) PfnDliHook __pfnDliFailureHook2; + + FARPROC WINAPI IPC3270_DelayLoadHook(unsigned reason, DelayLoadInfo * info); + + } + + using std::string; + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + + // https://docs.microsoft.com/en-us/cpp/build/reference/loading-all-imports-for-a-delay-loaded-dll?view=vs-2019 + + PfnDliHook __pfnDliNotifyHook2 = IPC3270_DelayLoadHook; + PfnDliHook __pfnDliFailureHook2 = IPC3270_DelayLoadHook; + + static HANDLE hModule = 0; + static HANDLE hEventLog = 0; + + BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwcallpurpose, LPVOID lpvResvd) { + switch(dwcallpurpose) { + case DLL_PROCESS_ATTACH: + hModule = hInstance; + hEventLog = RegisterEventSource(NULL, LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME)); + break; + + case DLL_PROCESS_DETACH: + hModule = 0; + DeregisterEventSource(hEventLog); + hEventLog = 0; + break; + + } + + return TRUE; + } + + static void eventlog(const char *msg) { + + std::string username = TN3270::getUserName(); + + const char *outMsg[] = { + username.c_str(), + PACKAGE_NAME, + msg + }; + + debug("username"," ",msg); + + ReportEvent( + hEventLog, + EVENTLOG_ERROR_TYPE, + 1, + 0, + NULL, + 3, + 0, + outMsg, + NULL + ); + + } + + static void dummyProc() { + debug(__FUNCTION__," was called"); + throw std::runtime_error("Operation not supported"); + } + + FARPROC WINAPI IPC3270_DelayLoadHook(unsigned reason, DelayLoadInfo * info) { + + static string savedpath; + + // https://docs.microsoft.com/en-us/cpp/build/reference/structure-and-constant-definitions?view=vs-2019 + + debug(__FUNCTION__," ",(const char *) info->szDll); + + switch (reason) { + case dliNoteStartProcessing: + debug(__FUNCTION__,"::dliNoteStartProcessing") + { + string installLocation = TN3270::getInstallLocation(); + + if(!installLocation.empty()) { + + char curdir[4096]; + memset(curdir,0,sizeof(curdir)); + + if(GetCurrentDirectory(sizeof(curdir)-1,curdir)) { + savedpath = curdir; + debug("Saved path: \"",savedpath,"\""); + } else { + savedpath.clear(); + } + + SetCurrentDirectory(installLocation.c_str()); + + debug("Current path changed to \"",installLocation,"\""); + } + } + break; + + case dliNoteEndProcessing: + debug(__FUNCTION__,"::dliNoteEndProcessing") + + if(!savedpath.empty()) { + debug("Restoring current path to \"",savedpath,"\""); + SetCurrentDirectory(savedpath.c_str()); + savedpath.clear(); + + } + + break; + + case dliNotePreLoadLibrary: + debug(__FUNCTION__,"::dliNotePreLoadLibrary"); + break; + + case dliNotePreGetProcAddress: + debug(__FUNCTION__,"::dliNotePreGetProcAddress") + break; + + case dliFailLoadLib: + debug(__FUNCTION__,"::dliFailLoadLib") + { + string msg = "Can't load "; + msg += (const char *) info->szDll; + eventlog(msg.c_str()); + } + return (FARPROC) hModule; + + case dliFailGetProc: + debug(__FUNCTION__,"::dliFailGetProc"); + { + string msg = "Can't find method on "; + msg += (const char *) info->szDll; + eventlog(msg.c_str()); + } + return (FARPROC) dummyProc; + + default: + debug(__FUNCTION__,"::default") + + } + + // Returning NULL causes the delay load machinery to perform default + // processing for this notification. + return NULL; + + } + diff --git a/client/src/core/windows/tools.cc b/client/src/core/windows/tools.cc index 783c5a4..108a265 100644 --- a/client/src/core/windows/tools.cc +++ b/client/src/core/windows/tools.cc @@ -45,79 +45,6 @@ /*---[ Implement ]----------------------------------------------------------------------------------*/ - // https://docs.microsoft.com/en-us/cpp/build/reference/loading-all-imports-for-a-delay-loaded-dll?view=vs-2019 - - PfnDliHook __pfnDliNotifyHook2 = IPC3270_DelayLoadHook; - PfnDliHook __pfnDliFailureHook2 = IPC3270_DelayLoadHook; - - FARPROC WINAPI IPC3270_DelayLoadHook(unsigned reason, DelayLoadInfo * info) { - - // https://docs.microsoft.com/en-us/cpp/build/reference/structure-and-constant-definitions?view=vs-2019 - - debug(__FUNCTION__," ",(const char *) info->szDll); - - switch (reason) { - case dliNoteStartProcessing: - debug(__FUNCTION__,"::dliNoteStartProcessing") - /* - { - string installLocation = TN3270::getInstallLocation(); - if(!installLocation.empty()) { - SetCurrentDirectory(installLocation.c_str()); - } - } - */ - break; - - case dliNoteEndProcessing: - debug(__FUNCTION__,"::dliNoteEndProcessing") - break; - - case dliNotePreLoadLibrary: - debug(__FUNCTION__,"::dliNotePreLoadLibrary"); - - /* - { - // http://otb.manusoft.com/2013/01/using-delayload-to-specify-dependent-dll-path.htm - - string myPath = TN3270::getInstallLocation(); - - myPath += "\\"; - myPath += (const char *) info->szDll; - - debug("Checking ",myPath,"=",access(myPath.c_str(), R_OK)); - - if(access(myPath.c_str(), R_OK) == 0) { - return (FARPROC) LoadLibrary(myPath.c_str()); - } - - } - */ - break; - - case dliNotePreGetProcAddress: - debug(__FUNCTION__,"::dliNotePreGetProcAddress") - break; - - case dliFailLoadLib: - debug(__FUNCTION__,"::dliFailLoadLib") - break; - - case dliFailGetProc: - debug(__FUNCTION__,"::dliFailGetProc") - break; - - default: - debug(__FUNCTION__,"::default") - - } - - // Returning NULL causes the delay load machinery to perform default - // processing for this notification. - return NULL; - - } - namespace TN3270 { std::string getUserName() { diff --git a/client/src/include/lib3270/ipc.h b/client/src/include/lib3270/ipc.h index 1ea31ca..b167008 100644 --- a/client/src/include/lib3270/ipc.h +++ b/client/src/include/lib3270/ipc.h @@ -65,19 +65,6 @@ #include -#ifdef _WIN32 - - extern "C" { - - extern __declspec (dllexport) PfnDliHook __pfnDliNotifyHook2; - extern __declspec (dllexport) PfnDliHook __pfnDliFailureHook2; - - FARPROC WINAPI IPC3270_DelayLoadHook(unsigned reason, DelayLoadInfo * info); - - } - -#endif // _WIN32 - namespace TN3270 { class Host; diff --git a/client/src/session/local/init.cc b/client/src/session/local/init.cc index 3338238..b2a8f0d 100644 --- a/client/src/session/local/init.cc +++ b/client/src/session/local/init.cc @@ -75,8 +75,6 @@ cbk->update_connect = connectHandler; - throw std::runtime_error("Testando pre-load"); - } Local::Session::~Session() { -- libgit2 0.21.2