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