From 1e2ce022add512cb4e261c68fc66853e96207ea6 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Wed, 3 Jul 2019 14:39:47 -0300 Subject: [PATCH] Reorganizing client library sources. --- client/lib3270++.cbp | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ client/lib3270++.pc.in | 16 ++++++++++++++++ client/lib3270++static.pc.in | 15 +++++++++++++++ client/src/Makefile.in | 391 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ client/src/core/abstract.cc | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ client/src/core/events.cc | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ client/src/core/host.cc | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ client/src/core/linux/request.cc | 267 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ client/src/core/linux/session.cc | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ client/src/core/session.cc | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ client/src/core/windows/request.cc | 191 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ client/src/core/windows/resources.rc.in | 29 +++++++++++++++++++++++++++++ client/src/core/windows/session.cc | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ client/src/include/ipc-client-internals.h | 385 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ client/src/session/local/events.cc | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ client/src/session/local/session.cc | 389 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ client/src/session/remote/session.cc | 365 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ client/src/testprogram/testprogram.cc | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ client/valgrind.suppression | 0 common/src/include/config.h.in | 7 +++++-- configure.ac | 9 +++++++-- src/client/lib3270++.cbp | 70 ---------------------------------------------------------------------- src/client/lib3270++.pc.in | 16 ---------------- src/client/lib3270++static.pc.in | 15 --------------- src/client/private.h | 385 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/client/src/Makefile.in | 391 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/client/src/core/abstract.cc | 153 --------------------------------------------------------------------------------------------------------------------------------------------------------- src/client/src/core/events.cc | 56 -------------------------------------------------------- src/client/src/core/host.cc | 180 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ src/client/src/core/session.cc | 78 ------------------------------------------------------------------------------ src/client/src/os/linux/request.cc | 267 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/client/src/os/linux/session.cc | 98 -------------------------------------------------------------------------------------------------- src/client/src/os/windows/request.cc | 191 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/client/src/os/windows/resources.rc.in | 29 ----------------------------- src/client/src/os/windows/session.cc | 142 ---------------------------------------------------------------------------------------------------------------------------------------------- src/client/src/session/local/events.cc | 175 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/client/src/session/local/session.cc | 389 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/client/src/session/remote/session.cc | 365 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/client/src/testprogram/testprogram.cc | 103 ------------------------------------------------------------------------------------------------------- src/client/valgrind.suppression | 0 40 files changed, 3117 insertions(+), 3107 deletions(-) create mode 100644 client/lib3270++.cbp create mode 100644 client/lib3270++.pc.in create mode 100644 client/lib3270++static.pc.in create mode 100644 client/src/Makefile.in create mode 100644 client/src/core/abstract.cc create mode 100644 client/src/core/events.cc create mode 100644 client/src/core/host.cc create mode 100644 client/src/core/linux/request.cc create mode 100644 client/src/core/linux/session.cc create mode 100644 client/src/core/session.cc create mode 100644 client/src/core/windows/request.cc create mode 100644 client/src/core/windows/resources.rc.in create mode 100644 client/src/core/windows/session.cc create mode 100644 client/src/include/ipc-client-internals.h create mode 100644 client/src/session/local/events.cc create mode 100644 client/src/session/local/session.cc create mode 100644 client/src/session/remote/session.cc create mode 100644 client/src/testprogram/testprogram.cc create mode 100644 client/valgrind.suppression delete mode 100644 src/client/lib3270++.cbp delete mode 100644 src/client/lib3270++.pc.in delete mode 100644 src/client/lib3270++static.pc.in delete mode 100644 src/client/private.h delete mode 100644 src/client/src/Makefile.in delete mode 100644 src/client/src/core/abstract.cc delete mode 100644 src/client/src/core/events.cc delete mode 100644 src/client/src/core/host.cc delete mode 100644 src/client/src/core/session.cc delete mode 100644 src/client/src/os/linux/request.cc delete mode 100644 src/client/src/os/linux/session.cc delete mode 100644 src/client/src/os/windows/request.cc delete mode 100644 src/client/src/os/windows/resources.rc.in delete mode 100644 src/client/src/os/windows/session.cc delete mode 100644 src/client/src/session/local/events.cc delete mode 100644 src/client/src/session/local/session.cc delete mode 100644 src/client/src/session/remote/session.cc delete mode 100644 src/client/src/testprogram/testprogram.cc delete mode 100644 src/client/valgrind.suppression diff --git a/client/lib3270++.cbp b/client/lib3270++.cbp new file mode 100644 index 0000000..3c0d65b --- /dev/null +++ b/client/lib3270++.cbp @@ -0,0 +1,71 @@ + + + + + + diff --git a/client/lib3270++.pc.in b/client/lib3270++.pc.in new file mode 100644 index 0000000..41fcd0e --- /dev/null +++ b/client/lib3270++.pc.in @@ -0,0 +1,16 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +version_major=@PACKAGE_MAJOR_VERSION@ +version_minor=@PACKAGE_MINOR_VERSION@ +sdk_version=@LIB3270_SDK_VERSION@ + +Name: @PACKAGE_NAME@ +Description: @PACKAGE_DESCRIPTION@ +Version: @PACKAGE_VERSION@ +Libs: -L\@libdir@ -l3270++ +Libs.private: @LIBSSL_LIBS@ @LIBICONV@ @INTL_LIBS@ -l@LIB3270_NAME@ +Cflags: -I@includedir@ + diff --git a/client/lib3270++static.pc.in b/client/lib3270++static.pc.in new file mode 100644 index 0000000..245f92a --- /dev/null +++ b/client/lib3270++static.pc.in @@ -0,0 +1,15 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +version_major=@PACKAGE_MAJOR_VERSION@ +version_minor=@PACKAGE_MINOR_VERSION@ +sdk_version=@LIB3270_SDK_VERSION@ + +Name: @PACKAGE_NAME@ +Description: @PACKAGE_DESCRIPTION@ +Version: @PACKAGE_VERSION@ +Libs: -L\@libdir@ -l@LIB3270_NAME@++static @LIBSSL_LIBS@ @LIBICONV@ @INTL_LIBS@ +Cflags: -I@includedir@ + diff --git a/client/src/Makefile.in b/client/src/Makefile.in new file mode 100644 index 0000000..b87c8bd --- /dev/null +++ b/client/src/Makefile.in @@ -0,0 +1,391 @@ +# +# "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., 59 Temple +# Place, Suite 330, Boston, MA, 02111-1307, USA +# +# Contatos: +# +# perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) +# erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça) +# + +#---[ Library configuration ]------------------------------------------------------------ + +LIBNAME=lib@LIB3270_NAME@++ + +SOURCES= \ + $(wildcard *.cc) \ + $(wildcard local/*.cc) \ + $(wildcard ipc/*.cc) \ + $(wildcard @OSNAME@/*.cc) \ + $(wildcard @OSNAME@/*.rc) + +TEST_SOURCES= \ + $(wildcard testprogram/*.cc) + +#---[ Tools ]---------------------------------------------------------------------------- + +CXX=@CXX@ +HOST_CC=@HOST_CC@ +LD=@CXX@ +LN_S=@LN_S@ +MKDIR=@MKDIR_P@ +INSTALL=@INSTALL@ +INSTALL_DATA=@INSTALL_DATA@ +INSTALL_PROGRAM=@INSTALL_PROGRAM@ +XGETTEXT=@XGETTEXT@ +MSGCAT=@MSGCAT@ +WINDRES=@WINDRES@ +AR=@AR@ +VALGRIND=@VALGRIND@ + +#---[ Paths ]---------------------------------------------------------------------------- + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +bindir=@bindir@ +sbindir=@sbindir@ +libdir=@libdir@ +includedir=@includedir@ +datarootdir=@datarootdir@ +localedir=@localedir@ +docdir=@docdir@ +sysconfdir=@sysconfdir@ + +BASEDIR=@BASEDIR@ + +POTDIR=$(BASEDIR)/.pot + +OBJDIR=$(BASEDIR)/.obj/$(LIBNAME) +OBJDBG=$(OBJDIR)/Debug +OBJRLS=$(OBJDIR)/Release + +BINDIR=$(BASEDIR)/.bin +BINDBG=$(BINDIR)/Debug +BINRLS=$(BINDIR)/Release + +#---[ Rules ]---------------------------------------------------------------------------- + +DEPENDS= \ + Makefile \ + ../include/*.h \ + ../include/lib3270/*.h \ + ../lib3270/*.h + + +CFLAGS= \ + @CFLAGS@ \ + @CPPFLAGS@ \ + -g \ + -I../include \ + -DBUILD_DATE=`date +%Y%m%d` \ + @DBUS_CFLAGS@ + +LIBS= \ + @LIBS@ \ + @LIBSSL_LIBS@ \ + @LIBICONV@ \ + @INTL_LIBS@ \ + @DBUS_LIBS@ + + +#---[ Debug Rules ]---------------------------------------------------------------------- + +$(OBJDBG)/%.o: \ + %.cc \ + $(DEPENDS) + + @echo $< ... + @$(MKDIR) `dirname $@` + @$(CXX) \ + $(CFLAGS) \ + -Wall -Wextra -fstack-check \ + -DDEBUG=1 \ + -o $@ -c $< + +$(OBJDBG)/%.o: \ + %.rc + + @echo $< ... + @$(MKDIR) `dirname $@` + @$(WINDRES) $< -O coff -o $@ + +#---[ Release Rules ]-------------------------------------------------------------------- + +$(OBJRLS)/%.o: \ + %.cc \ + $(DEPENDS) + + @echo $< ... + @$(MKDIR) `dirname $@` + @$(CXX) \ + $(CFLAGS) \ + -DNDEBUG=1 \ + -o $@ -c $< + +$(OBJRLS)/%.o: \ + %.rc + + @echo $< ... + @$(MKDIR) `dirname $@` + @$(WINDRES) $< -O coff -o $@ + +#---[ Misc Rules ]----------------------------------------------------------------------- + +$(POTDIR)/$(LIBNAME)/%.pot: \ + %.cc + + @echo $(notdir $@) ... + @$(MKDIR) `dirname $@` + @$(XGETTEXT) \ + --language=C \ + --keyword=_ \ + --keyword=N_ \ + --keyword=MSG_:2 \ + --output=$@ \ + $< + @touch $@ + +$(POTDIR)/$(LIBNAME)/%.pot: \ + %.rc + + @echo $< ... + @$(MKDIR) `dirname $@` + @touch $@ + +#---[ Release Targets ]------------------------------------------------------------------ + +all: \ + $(BINRLS)/$(LIBNAME)@DLLEXT@ \ + $(BINRLS)/static/$(LIBNAME).a \ + $(POTDIR)/$(LIBNAME).pot + + +Release: \ + $(BINRLS)/$(LIBNAME)@DLLEXT@ \ + $(BINRLS)/static/$(LIBNAME).a + + +$(BINRLS)/$(LIBNAME)@DLLEXT@: \ + $(BINRLS)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@ + + @echo $< ... + @rm -f $@ + @$(LN_S) \ + $^ \ + $@ + +$(BINRLS)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@: \ + $(BINRLS)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@ + + @rm -f $@ + @$(LN_S) \ + $^ \ + $@ + +$(BINRLS)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@: \ + $(foreach SRC, $(basename $(SOURCES)), $(OBJRLS)/$(SRC).o) + + @$(MKDIR) $(@D) + @echo $< ... + + @$(LD) \ + @DLL_LDFLAGS@ \ + -o $@ \ + $(LDFLAGS) \ + $(foreach SRC, $(basename $(SOURCES)), $(OBJRLS)/$(SRC).o) \ + -L$(BINRLS) \ + $(LIBS) \ + -l@LIB3270_NAME@ + +$(BINRLS)/static/$(LIBNAME).a: \ + $(foreach SRC, $(basename $(SOURCES)), $(OBJRLS)/$(SRC).o) + + @echo $@ ... + @$(MKDIR) `dirname $@` + @$(AR) rcs $@ $^ + + +#---[ Install Targets ]------------------------------------------------------------------ + +install: \ + install-shared \ + install-static \ + install-dev + +install-shared: \ + $(BINRLS)/$(LIBNAME)@DLLEXT@ + + # Install library + @mkdir -p $(DESTDIR)$(libdir) + + @$(INSTALL_PROGRAM) \ + $(BINRLS)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@ \ + $(DESTDIR)$(libdir) + + + @$(LN_S) \ + $(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@ \ + $(DESTDIR)$(libdir)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@ + + @$(LN_S) \ + $(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@ \ + $(DESTDIR)$(libdir)/$(LIBNAME)@DLLEXT@ + +install-static: \ + $(BINRLS)/static/$(LIBNAME).a + + # Install static library + @mkdir -p $(DESTDIR)$(libdir) + @$(INSTALL_DATA) \ + $(BINRLS)/static/$(LIBNAME).a \ + $(DESTDIR)$(libdir)/$(LIBNAME)static.a + + # Install static PKG-CONFIG files + @mkdir -p $(DESTDIR)$(libdir)/pkgconfig + @$(INSTALL_DATA) \ + lib3270++static.pc \ + $(DESTDIR)$(libdir)/pkgconfig/lib3270++static.pc + +install-dev: + + # Install SDK + @$(INSTALL_DATA) \ + ../include/lib3270++.h \ + $(DESTDIR)$(includedir)/lib3270++.h + + # Install PKG-CONFIG files + @mkdir -p $(DESTDIR)$(libdir)/pkgconfig + @$(INSTALL_DATA) \ + lib3270++.pc \ + $(DESTDIR)$(libdir)/pkgconfig/lib3270++.pc + + +#---[ Misc Targets ]--------------------------------------------------------------------- + +$(POTDIR)/$(LIBNAME).pot: \ + $(foreach SRC, $(basename $(SOURCES)), $(POTDIR)/$(LIBNAME)/$(SRC).pot) + + @rm -f $@ + @mkdir -p `dirname $@` + @$(MSGCAT) --sort-output $^ > $@ + +locale: \ + $(POTDIR)/$(LIBNAME).pot + + +#---[ Debug Targets ]-------------------------------------------------------------------- + +Debug: \ + $(BINDBG)/$(LIBNAME)@EXEEXT@ + +$(BINDBG)/$(LIBNAME)@EXEEXT@: \ + $(foreach SRC, $(basename $(TEST_SOURCES)), $(OBJDBG)/$(SRC).o) \ + $(BINDBG)/$(LIBNAME)@DLLEXT@ + + @$(MKDIR) `dirname $@` + @echo $< ... + @$(LD) \ + -Wl,--rpath,$(BINDBG) \ + -o $@ \ + $^ \ + $(LDFLAGS) \ + $(LIBS) + +run: \ + $(BINDBG)/$(LIBNAME)@EXEEXT@ + +ifeq ($(VALGRIND),no) + + @LD_LIBRARY_PATH=$(BINDBG) \ + $(BINDBG)/$(LIBNAME)@EXEEXT@ + +else + @touch valgrind.suppression + + @LD_LIBRARY_PATH=$(BINDBG) \ + $(VALGRIND) --leak-check=full --track-origins=yes --gen-suppressions=all --suppressions=valgrind.suppression \ + $(BINDBG)/$(LIBNAME)@EXEEXT@ +endif + + +$(BINDBG)/$(LIBNAME)@DLLEXT@: \ + $(BINDBG)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@ + + @echo $< ... + @rm -f $@ + @$(LN_S) \ + $^ \ + $@ + +$(BINDBG)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@: \ + $(BINDBG)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@ + + @rm -f $@ + @$(LN_S) \ + $^ \ + $@ + +$(BINDBG)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@: \ + $(foreach SRC, $(basename $(SOURCES)), $(OBJDBG)/$(SRC).o) + + @$(MKDIR) `dirname $@` + @echo $< ... + @$(LD) \ + -shared \ + -Wl,-soname,$(@F) \ + -Wl,--rpath,$(BINDBG) \ + -o $@ \ + $(LDFLAGS) \ + $(foreach SRC, $(basename $(SOURCES)), $(OBJDBG)/$(SRC).o) \ + -L$(BINDBG) \ + $(LIBS) \ + -l@LIB3270_NAME@ + +#---[ Clean Targets ]-------------------------------------------------------------------- + +clean: \ + cleanDebug \ + cleanRelease + + @rm -fr $(BASEDIR)/.tmp/$(LIBNAME) + @rm -fr $(POTDIR)/$(LIBNAME) + +cleanDebug: + + @rm -fr $(OBJDBG) + @rm -f $(BINDBG)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@ + @rm -f $(BINDBG)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@ + @rm -f $(BINDBG)/$(LIBNAME)@DLLEXT@ + +cleanRelease: + + @rm -fr $(OBJRLS) + + @rm -f $(BINRLS)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@ + @rm -f $(BINRLS)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@ + @rm -f $(BINRLS)/$(LIBNAME)@DLLEXT@ + + @rm -fr $(POTDIR) + @rm -f lib$(LIBNAME).pot + +clean: \ + cleanDebug \ + cleanRelease + + diff --git a/client/src/core/abstract.cc b/client/src/core/abstract.cc new file mode 100644 index 0000000..ab252bd --- /dev/null +++ b/client/src/core/abstract.cc @@ -0,0 +1,153 @@ +/* + * "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/core/abstract.cc + * + * @brief Implements abstract session object. + * + * @author perry.werneck@gmail.com + * + */ + + #include + #include + + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + + namespace TN3270 { + + Abstract::Session::Session() { + +#ifdef HAVE_ICONV + this->converter.local = (iconv_t) (-1); + this->converter.host = (iconv_t) (-1); +#endif + + this->baddr = 0; + + } + + Abstract::Session::~Session() { + +#ifdef HAVE_ICONV + + if(this->converter.local != (iconv_t) (-1)) + iconv_close(this->converter.local); + + if(this->converter.host != (iconv_t) (-1)) + iconv_close(this->converter.host); + +#endif + + } + + /// @brief Setup charsets + void Abstract::Session::setCharSet(const char *remote, const char *local) { + +#ifdef HAVE_ICONV + + if(this->converter.local != (iconv_t) (-1)) + iconv_close(converter.local); + + if(this->converter.host != (iconv_t) (-1)) + iconv_close(converter.host); + + if(strcmp(local,remote)) { + + // Local and remote charsets aren't the same, setup conversion + converter.local = iconv_open(local, remote); + converter.host = iconv_open(remote,local); + + } else { + // Same charset, doesn't convert + converter.local = converter.host = (iconv_t)(-1); + } + +#else + + throw std::runtime_error("No ICONV Support"); + +#endif + + + } + + /// @brief Converte charset. + std::string Abstract::Session::convertCharset(iconv_t &converter, const char *str) { + + std::string rc; + +#ifdef HAVE_ICONV + size_t in = strlen(str); + + if(in && converter != (iconv_t)(-1)) { + + size_t out = (in << 1); + char * ptr; + char * outBuffer = (char *) malloc(out); + ICONV_CONST char * inBuffer = (ICONV_CONST char *) str; + + memset(ptr=outBuffer,0,out); + + iconv(converter,NULL,NULL,NULL,NULL); // Reset state + + if(iconv(converter,&inBuffer,&in,&ptr,&out) != ((size_t) -1)) + rc.assign(outBuffer); + + free(outBuffer); + + } + +#else + + rc = str; + +#endif // HAVE_ICONV + + return rc; + } + + /// @brief Converte string recebida do host para o charset atual. + std::string Abstract::Session::convertFromHost(const char *str) const { + return convertCharset(const_cast(this)->converter.local,str); + } + + /// @brief Converte string do charset atual para o charset do host. + std::string Abstract::Session::convertToHost(const char *str) const { + return convertCharset(const_cast(this)->converter.host,str); + } + + + } + + + + diff --git a/client/src/core/events.cc b/client/src/core/events.cc new file mode 100644 index 0000000..ee9b1ac --- /dev/null +++ b/client/src/core/events.cc @@ -0,0 +1,56 @@ +/* + * "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/core/events.cc + * + * @brief Implements event object. + * + * @author perry.werneck@gmail.com + * + */ + + #include + + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + + namespace TN3270 { + + Event::Event(enum Event::Type type) { + this->type = type; + } + + Event::~Event() { + } + + } + + + diff --git a/client/src/core/host.cc b/client/src/core/host.cc new file mode 100644 index 0000000..6e6b89b --- /dev/null +++ b/client/src/core/host.cc @@ -0,0 +1,179 @@ +/* + * "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/core/host.cc + * + * @brief Implements host object. + * + * @author perry.werneck@gmail.com + * + */ + + #include + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + + namespace TN3270 { + + Host::Host(const char *id, const char *url, time_t timeout) { + this->timeout = timeout; + this->session = Session::create(id); + if(url) { + this->connect(url); + } + } + + Host::~Host() { + delete this->session; + this->session = nullptr; + } + + void Host::connect(const char *url, bool sync) { + this->session->connect(url); + if(sync) { + this->sync(); + } + } + + + /// @brief Writes characters to the associated file from the put area + int Host::sync() { + this->session->waitForReady(this->timeout); + return 0; + } + + /// @brief Writes characters to the associated output sequence from the put area. + int Host::overflow(int c) { + + if (c != EOF) { + char str[] = { static_cast(c), 0 }; + this->session->push((const char *) str); + } else { + sync(); + } + + return c; + + } + + Host & Host::push(const Action action) { + session->push(action); + sync(); + return *this; + } + + bool Host::isReady() const { + this->session->waitForReady(this->timeout); + return getProgramMessage() == MESSAGE_NONE; + } + + bool Host::isConnected() const { + this->session->waitForReady(this->timeout); + return getConnectionState() == CONNECTED_TN3270E; + } + + std::string Host::toString() const { + + this->session->waitForReady(this->timeout); + + if(this->session->getConnectionState() == TN3270::DISCONNECTED) { + throw std::system_error(ENOTCONN, std::system_category()); + } + + return this->session->toString(); + } + + std::string Host::toString(int baddr, size_t len, char lf) const { + + this->session->waitForReady(this->timeout); + + if(this->session->getConnectionState() == TN3270::DISCONNECTED) { + throw std::system_error(ENOTCONN, std::system_category()); + } + + return this->session->toString(baddr,len,lf); + + } + + std::string Host::toString(int row, int col, size_t sz, char lf) const { + + this->session->waitForReady(this->timeout); + + if(this->session->getConnectionState() == TN3270::DISCONNECTED) { + throw std::system_error(ENOTCONN, std::system_category()); + } + + return this->session->toString(row,col,sz,lf); + + + } + + Host & Host::pop(int baddr, std::string &text) { + + this->session->waitForReady(this->timeout); + + if(this->session->getConnectionState() == TN3270::DISCONNECTED) { + throw std::system_error(ENOTCONN, std::system_category()); + } + + session->pop(baddr, text); + + return *this; + } + + Host & Host::pop(int row, int col, std::string &text) { + + this->session->waitForReady(this->timeout); + + if(this->session->getConnectionState() == TN3270::DISCONNECTED) { + throw std::system_error(ENOTCONN, std::system_category()); + } + + session->pop(row,col,text); + + return *this; + } + + Host & Host::pop(std::string &text) { + + this->session->waitForReady(this->timeout); + + if(this->session->getConnectionState() == TN3270::DISCONNECTED) { + throw std::system_error(ENOTCONN, std::system_category()); + } + + session->pop(text); + + return *this; + } + + + } + diff --git a/client/src/core/linux/request.cc b/client/src/core/linux/request.cc new file mode 100644 index 0000000..c4c917e --- /dev/null +++ b/client/src/core/linux/request.cc @@ -0,0 +1,267 @@ +/* + * "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/request.cc + * + * @brief Implements linux request methods for remote session. + * + * @author perry.werneck@gmail.com + * + */ + + #include + + using std::string; + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + + namespace TN3270 { + + IPC::Request::Request(const Session &session) { + this->conn = session.conn; + this->msg.in = nullptr; + this->msg.out = nullptr; + } + + IPC::Request::Request(const Session &session, const char *method) : Request(session) { + + this->msg.out = dbus_message_new_method_call( + session.name.c_str(), // Destination + session.path.c_str(), // Path + session.interface.c_str(), // Interface + method // Method + ); + + if(!msg.out) { + throw std::runtime_error("Can't create D-Bus Method Call"); + } + + } + + IPC::Request::Request(const Session &session, bool isSet, const char *property) : Request(session) { + +/* + dbus-send \ + --session \ + --dest=br.com.bb.pw3270.a\ + --print-reply \ + "/br/com/bb/tn3270/session" \ + "org.freedesktop.DBus.Properties.Get" \ + string:br.com.bb.tn3270.session \ + string:${1} +*/ + this->msg.out = dbus_message_new_method_call( + session.name.c_str(), // Destination + session.path.c_str(), // Path + "org.freedesktop.DBus.Properties", // Interface + (isSet ? "Set" : "Get") + ); + + if(!msg.out) { + throw std::runtime_error("Can't create D-Bus Property Call"); + } + + // + // https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-properties + // org.freedesktop.DBus.Properties.Get (in STRING interface_name, + // in STRING property_name, + // out VARIANT value); + // org.freedesktop.DBus.Properties.Set (in STRING interface_name, + // in STRING property_name, + // + const char *interface_name = session.interface.c_str(); + + dbus_message_append_args( + this->msg.out, + DBUS_TYPE_STRING,&interface_name, + DBUS_TYPE_STRING,&property, + DBUS_TYPE_INVALID + ); + + } + + IPC::Request::~Request() { + if(msg.out) { + dbus_message_unref(msg.out); + } + if(msg.in) { + dbus_message_unref(msg.in); + } + } + + IPC::Request & IPC::Request::call() { + + if(msg.in) { + dbus_message_unref(msg.in); + msg.in = nullptr; + } + + DBusError error; + dbus_error_init(&error); + this->msg.in = dbus_connection_send_with_reply_and_block(this->conn,this->msg.out,10000,&error); + + if(!this->msg.in) { + string message = error.message; + dbus_error_free(&error); + throw std::runtime_error(message.c_str()); + } + + dbus_message_iter_init(msg.in, &msg.iter); + + debug(__FUNCTION__," got a valid response"); + + return *this; + + } + + IPC::Request & IPC::Request::push(const char *arg) { + dbus_message_append_args(this->msg.out,DBUS_TYPE_STRING,&arg,DBUS_TYPE_INVALID); + return *this; + } + + IPC::Request & IPC::Request::push(const bool arg) { + dbus_message_append_args(this->msg.out,DBUS_TYPE_BOOLEAN,&arg,DBUS_TYPE_INVALID); + return *this; + } + + IPC::Request & IPC::Request::push(const uint8_t arg) { + dbus_message_append_args(this->msg.out,DBUS_TYPE_BYTE,&arg,DBUS_TYPE_INVALID); + return *this; + } + + IPC::Request & IPC::Request::push(const int32_t arg) { + dbus_message_append_args(this->msg.out,DBUS_TYPE_INT32,&arg,DBUS_TYPE_INVALID); + return *this; + } + + IPC::Request & IPC::Request::push(const uint32_t arg) { + dbus_message_append_args(this->msg.out,DBUS_TYPE_UINT32,&arg,DBUS_TYPE_INVALID); + return *this; + } + + + IPC::Request & IPC::Request::pop(std::string &value) { + + const char * str = ""; + + if(dbus_message_iter_get_arg_type(&msg.iter) == DBUS_TYPE_STRING) { + + dbus_message_iter_get_basic(&msg.iter, &str); + + } else if(dbus_message_iter_get_arg_type(&msg.iter) == DBUS_TYPE_VARIANT) { + + DBusMessageIter sub; + int current_type; + + dbus_message_iter_recurse(&msg.iter, &sub); + + while ((current_type = dbus_message_iter_get_arg_type(&sub)) != DBUS_TYPE_INVALID) { + + if (current_type == DBUS_TYPE_STRING) { + dbus_message_iter_get_basic(&sub, &str); + break; + } + dbus_message_iter_next(&sub); + } + + } else { + + debug("Argument type is ", ((char) dbus_message_iter_get_arg_type(&msg.iter)) ); + throw std::runtime_error("Expected an string data type"); + + } + + dbus_message_iter_next(&msg.iter); + + value.assign(str); + + debug(__FUNCTION__,"= \"",str,"\""); + + return *this; + } + + static int getIntValue(DBusMessageIter &iter) { + + if(dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_INT32) { + + dbus_int32_t rc = 0; + dbus_message_iter_get_basic(&iter, &rc); + return (int) rc; + + } else if(dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_INT16) { + + dbus_int16_t rc = 0; + dbus_message_iter_get_basic(&iter, &rc); + return (int) rc; + + } else if(dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_VARIANT) { + + DBusMessageIter sub; + int current_type; + + dbus_message_iter_recurse(&iter, &sub); + + while ((current_type = dbus_message_iter_get_arg_type(&sub)) != DBUS_TYPE_INVALID) { + + if (current_type == DBUS_TYPE_INT32) { + + dbus_int32_t rc = 0; + dbus_message_iter_get_basic(&sub, &rc); + return (int) rc; + + } else if (current_type == DBUS_TYPE_INT16) { + dbus_int16_t rc = 0; + dbus_message_iter_get_basic(&sub, &rc); + return (int) rc; + + } + dbus_message_iter_next(&sub); + } + + } + + debug("Argument type is ", ((char) dbus_message_iter_get_arg_type(&iter)) ); + throw std::runtime_error("Expected an integer data type"); + + } + + IPC::Request & IPC::Request::Request::pop(int &value) { + + value = getIntValue(msg.iter); + dbus_message_iter_next(&msg.iter); + debug(__FUNCTION__,"= \"",value,"\""); + + return *this; + + } + + } + + diff --git a/client/src/core/linux/session.cc b/client/src/core/linux/session.cc new file mode 100644 index 0000000..5b93c64 --- /dev/null +++ b/client/src/core/linux/session.cc @@ -0,0 +1,98 @@ +/* + * "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/linux/session.cc + * + * @brief Implements Linux session methods. + * + * @author perry.werneck@gmail.com + * + */ + + #include + #include + #include + + using std::string; + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + + static void throws_if_error(DBusError &err) { + + if(dbus_error_is_set(&err)) { + string message = err.message; + dbus_error_free(&err); + throw std::runtime_error(message.c_str()); + } + + return; + + } + + namespace TN3270 { + + IPC::Session::Session(const char *id) : Abstract::Session() { + + // Create D-Bus session. + DBusError err; + + dbus_error_init(&err); + this->conn = dbus_bus_get(DBUS_BUS_SESSION, &err); + + debug("dbus_bus_get conn=",conn); + + throws_if_error(err); + + if(!conn) + throw std::runtime_error("DBUS Connection failed"); + + auto sep = strchr(id,':'); + if(!sep) { + throw std::system_error(EINVAL, std::system_category()); + } + + this->name = "br.com.bb."; + this->name += string(id,(sep - id)); + this->name += "."; + this->name += (sep+1); + this->path = "/br/com/bb/tn3270/session"; + this->interface = "br.com.bb.tn3270.session"; + + debug("D-Bus Object name=\"",this->name,"\" D-Bus Object path=\"",this->path,"\""); + + } + + IPC::Session::~Session() { + + } + + } + + diff --git a/client/src/core/session.cc b/client/src/core/session.cc new file mode 100644 index 0000000..6651155 --- /dev/null +++ b/client/src/core/session.cc @@ -0,0 +1,78 @@ +/* + * "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/core/session.cc + * + * @brief Implements common session object. + * + * @author perry.werneck@gmail.com + * + */ + + #include + + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + + namespace TN3270 { + + /// @brief Create a tn3270 session. + Session * Session::create(const char *id) { + + if(!id) { + return new Local::Session(); + } + + return new IPC::Session(id); + + } + + + Session::Session() { + + } + + Session::~Session() { + + } + + void Session::insert(Event::Type type, std::function listener) { + } + + /// @brief Fire event. + void Session::fire(const Event &event) { + + + } + + } + + + diff --git a/client/src/core/windows/request.cc b/client/src/core/windows/request.cc new file mode 100644 index 0000000..f5f3bae --- /dev/null +++ b/client/src/core/windows/request.cc @@ -0,0 +1,191 @@ +/* + * "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/windows/request.cc + * + * @brief Implements WIN32 request methods. + * + * @author perry.werneck@gmail.com + * + */ + + #include "../private.h" + + using std::string; + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + + namespace TN3270 { + + #define PIPE_BUFFER_LENGTH 8192 + + IPC::Request::Request(const Session &session) { + + this->hPipe = session.hPipe; + + in.length = PIPE_BUFFER_LENGTH; + in.used = 0; + in.block = new uint8_t[in.length]; + + out.length = PIPE_BUFFER_LENGTH; + out.used = 0; + out.block = new uint8_t[out.length]; + + } + + IPC::Request::Request(const Session &session, const char *method) : Request(session) { + + // Add name + strcpy((char *) out.block, method); + out.used += strlen((char *) method) + 1; + + // Add ID + *((uint16_t *) (out.block + out.used)) = (uint16_t) 3; + out.used += sizeof(uint16_t); + + } + + IPC::Request::Request(const Session &session, bool isSet, const char *property) : Request(session) { + + // Add name + strcpy((char *) out.block, property); + out.used += strlen((char *) property) + 1; + + // Add ID (SetProperty = 2, getProperty = 1) + *((uint16_t *) (out.block + out.used)) = (uint16_t) (isSet ? 2 : 1); + out.used += sizeof(uint16_t); + + } + + IPC::Request::~Request() { + + delete[] ((uint8_t *) in.block); + delete[] ((uint8_t *) out.block); + + } + + /// @brief Store value on data block. + IPC::Request::DataBlock * IPC::Request::pushBlock(const void *ptr, size_t length) { + + if((out.used + length + sizeof(IPC::Request::DataBlock)) >= out.length) { + throw std::runtime_error("Too big"); + } + + IPC::Request::DataBlock * rc = (IPC::Request::DataBlock *) (out.block + out.used); + memcpy(((uint8_t *) (rc+1)), ((uint8_t *) ptr), length); + + out.used += (sizeof(IPC::Request::DataBlock) + length); + + return rc; + + } + + /// @brief Get next argument. + IPC::Request::DataBlock * IPC::Request::getNextBlock() const { + + if((in.current + sizeof(IPC::Request::DataBlock)) >= in.used) { + throw std::runtime_error("Out of range"); + } + + return (IPC::Request::DataBlock *) (in.block + in.current); + + } + + IPC::Request & IPC::Request::push(const char *arg) { + pushBlock(arg, strlen(arg)+1)->type = IPC::Request::String; + return *this; + } + + IPC::Request & IPC::Request::push(const bool arg) { + uint8_t value = (uint8_t) (arg ? 0xff : 0); + pushBlock(&value, sizeof(value))->type = IPC::Request::Boolean; + return *this; + } + + IPC::Request & IPC::Request::push(const uint8_t arg) { + pushBlock(&arg, sizeof(arg))->type = IPC::Request::Uchar; + return *this; + } + + IPC::Request & IPC::Request::push(const int32_t arg) { + pushBlock(&arg, sizeof(arg))->type = IPC::Request::Int32; + return *this; + } + + IPC::Request & IPC::Request::push(const uint32_t arg) { + pushBlock(&arg, sizeof(arg))->type = IPC::Request::Uint32; + return *this; + } + + IPC::Request & IPC::Request::pop(std::string &value) { + DataBlock * block = getNextBlock(); + + if(block->type != IPC::Request::String) + throw std::runtime_error("Invalid format"); + + const char *ptr = (const char *) (block+1); + + in.current += (strlen(ptr)+1+sizeof(DataBlock)); + + value.assign(ptr); + + return *this; + } + + IPC::Request & IPC::Request::Request::pop(int &value) { + + DataBlock * block = getNextBlock(); + + switch(block->type) { + case IPC::Request::Int16: + value = * ((int16_t *) (block+1)); + in.current += sizeof(int16_t) + sizeof(DataBlock); + break; + + case IPC::Request::Int32: + value = * ((int32_t *) (block+1)); + in.current += sizeof(int32_t) + sizeof(DataBlock); + break; + + case IPC::Request::Int64: + value = * ((int64_t *) (block+1)); + in.current += sizeof(int64_t) + sizeof(DataBlock); + break; + + default: + throw std::runtime_error("Invalid format"); + } + + return *this; + } + + } + + diff --git a/client/src/core/windows/resources.rc.in b/client/src/core/windows/resources.rc.in new file mode 100644 index 0000000..eac7424 --- /dev/null +++ b/client/src/core/windows/resources.rc.in @@ -0,0 +1,29 @@ +#include + +VS_VERSION_INFO VERSIONINFO +FILEVERSION @PACKAGE_MAJOR_VERSION@,@PACKAGE_MINOR_VERSION@,@PACKAGE_MAJOR_RELEASE@,0 +PRODUCTVERSION @PACKAGE_MAJOR_VERSION@,@PACKAGE_MINOR_VERSION@,@PACKAGE_MAJOR_RELEASE@,0 + +BEGIN + + BLOCK "StringFileInfo" + BEGIN + BLOCK "080904E4" + BEGIN + VALUE "FileDescription", "3270 C++ Access Library\0" + VALUE "CompanyName", "Banco do Brasil S/A.\0" + VALUE "FileVersion", "@WIN32_VERSION@\0" + VALUE "LegalCopyright", "(C) 2017 Banco do Brasil S/A. All Rights Reserved\0" + VALUE "OriginalFilename", "@PACKAGE_TARNAME@@DLLEXT@\0" + VALUE "ProductName", "@PACKAGE_NAME@\0" + VALUE "ProductVersion", "@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@.@PACKAGE_MAJOR_RELEASE@.0\0" + END + END + + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x809, 0x04E4 + END + +END + diff --git a/client/src/core/windows/session.cc b/client/src/core/windows/session.cc new file mode 100644 index 0000000..a35ab24 --- /dev/null +++ b/client/src/core/windows/session.cc @@ -0,0 +1,142 @@ +/* + * "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/windows/session.cc + * + * @brief Implements WIN32 remote session methods. + * + * @author perry.werneck@gmail.com + * + */ + + #include "../private.h" + #include + #include + #include + + using std::string; + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + + namespace TN3270 { + + IPC::Session::Session(const char *id) : Abstract::Session() { + + char *ptr = strchr(id,':'); + + if(!ptr) + throw std::system_error(EINVAL, std::system_category()); + + string pipename{"\\\\.\\pipe\\"}; + + pipename += string(id,ptr - id); + pipename += "\\"; + pipename += (ptr+1); + + std::transform(pipename.begin(), pipename.end(), pipename.begin(), ::tolower); + + debug("pipename: \"%s\"",pipename.c_str()); + + this->hPipe = CreateFile( + TEXT(pipename.c_str()), // pipe name + GENERIC_READ | // read and write access + GENERIC_WRITE, + 0, // no sharing + NULL, // default security attributes + OPEN_EXISTING, // opens existing pipe + 0, // default attributes + NULL // no template file + ); + + if (hPipe == INVALID_HANDLE_VALUE) { + throw std::runtime_error("Can't open IPC Channel"); + } + + // The pipe connected; change to message-read mode. + DWORD dwMode = PIPE_READMODE_MESSAGE; + if(!SetNamedPipeHandleState(hPipe,&dwMode,NULL,NULL)) { + throw std::runtime_error("Can't set IPC Channel mode"); + } + + } + + IPC::Session::~Session() { + CloseHandle(this->hPipe); + } + + + IPC::Request & IPC::Request::call() { + +#ifdef DEBUG + // lib3270_trace_data(NULL,"Request block",(const char *) this->out.block, this->out.used); +#endif // DEBUG + + in.current = 0; + + if(!TransactNamedPipe( + this->hPipe, + this->out.block, + this->out.used, + this->in.block, + this->in.length, + &this->in.used, + NULL) + ) { + + throw std::runtime_error("Can't transact on IPC Channel"); + + } + + debug("Received response \"", in.block, "\" with ", in.used, " bytes"); +#ifdef DEBUG + // lib3270_trace_data(NULL,"Response block",(const char *) this->in.block, this->in.used); +#endif // DEBUG + + // Extract response name + in.current = strlen((const char *) in.block)+1; + + // Extract return code + uint16_t rc = *((uint16_t *) (in.block + in.current)); + in.current += sizeof(uint16_t); + + // Extract argc + uint16_t argc = *((uint16_t *) (in.block + in.current)); + in.current += sizeof(uint16_t); + + debug("Received response \"", ((const char *) in.block), "\" with rc=", rc, " and ", argc, " arguments"); + + return *this; + } + + + + } + + diff --git a/client/src/include/ipc-client-internals.h b/client/src/include/ipc-client-internals.h new file mode 100644 index 0000000..2670abb --- /dev/null +++ b/client/src/include/ipc-client-internals.h @@ -0,0 +1,385 @@ +/* + * "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/lib3270++/private.h + * + * @brief + * + * @author perry.werneck@gmail.com + * + */ + +#ifndef PRIVATE_H_INCLUDED + + #define PRIVATE_H_INCLUDED + + #include + + #ifdef _WIN32 + #include + #include + #include + #else + #include + #endif // WIN32 + + #include + #include + #include + #include + #include + #include + +#ifdef HAVE_LIBINTL + #include + #define _( x ) gettext(x) + #define N_( x ) x +#else + #define _( x ) x + #define N_( x ) x +#endif // HAVE_LIBINTL + +#ifdef HAVE_ICONV + #include +#endif // HAVE_ICONV + +#ifdef WIN32 + #define SYSTEM_CHARSET "CP1252" +#else + #define SYSTEM_CHARSET "UTF-8" +#endif // WIN32 + +#ifdef DEBUG + + inline void console(std::ostream &out) { + out << std::endl; + } + + template + void console(std::ostream &out, T value, Targs... Fargs) { + out << value; + console(out, Fargs...); + } + + template + void log(T value, Targs... Fargs) { + console(std::clog,value,Fargs...); + } + + #define debug(...) log(__FILE__, "(", __LINE__, ") ", __VA_ARGS__); + +#else + + #define debug(...) /* __VA_ARGS__ */ + +#endif + + namespace TN3270 { + + namespace Abstract { + + class TN3270_PRIVATE Session : public TN3270::Session { + private: + +#ifdef HAVE_ICONV + struct { + + /// @brief Convert strings from host codepage to local codepage. + iconv_t local; + + /// @brief Convert string from local codepage to host codepage. + iconv_t host; + + } converter; +#endif + + /// @brief Converte charset. + static std::string convertCharset(iconv_t &converter, const char *str); + + protected: + + /// @brief Current in/out position. + int baddr; + + Session(); + virtual ~Session(); + + /// @brief Setup charsets + void setCharSet(const char *remote, const char *local = SYSTEM_CHARSET); + + /// @brief Converte string recebida do host para o charset atual. + std::string convertFromHost(const char *str) const; + + /// @brief Converte string do charset atual para o charset do host. + std::string convertToHost(const char *str) const; + + }; + + } + + /// @brief lib3270 direct access objects (no IPC); + namespace Local { + + class TN3270_PRIVATE Session : public TN3270::Abstract::Session { + private: + + /// @brief Handle of the related instance of lib3270 + H3270 * hSession; + + /// @brief Mutex to serialize access to lib3270 + std::mutex sync; + + /// @brief Popup Handler. + static void popupHandler(H3270 *session, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list arg); + + /// @brief Connect Handler. + static void connectHandler(H3270 *session, unsigned char connected); + + /// @brief Wait for network events + void wait(time_t timeout = 5); + + public: + Session(); + virtual ~Session(); + + // Connect/disconnect + void connect(const char *url) override; + void disconnect() override; + + // Wait for session state. + void waitForReady(time_t timeout = 5) throw() override; + + // Get properties. + void getProperty(const char *name, int &value) const override; + void getProperty(const char *name, std::string &value) const override; + void getProperty(const char *name, bool &value) const override; + + std::string getVersion() const override; + std::string getRevision() const override; + + // Gets + std::string toString(int baddr, size_t len, char lf) const override; + std::string toString(int row, int col, size_t sz, char lf) const override; + + ProgramMessage getProgramMessage() const override; + + ConnectionState getConnectionState() const override; + + TN3270::Session & setCursorPosition(unsigned short addr) override; + TN3270::Session & setCursorPosition(unsigned short row, unsigned short col) override; + + /// @brief Set field at current posicion, jumps to next writable field. + TN3270::Session & push(const char *text) override; + + TN3270::Session & push(int baddr, const std::string &text) override; + TN3270::Session & push(int row, int col, const std::string &text) override; + TN3270::Session & push(const PFKey key) override; + TN3270::Session & push(const PAKey key) override; + TN3270::Session & push(const Action action) override; + + // Get contents. + TN3270::Session & pop(int baddr, std::string &text) override; + TN3270::Session & pop(int row, int col, std::string &text) override; + TN3270::Session & pop(std::string &text) override; + + /// @brief Execute action by name. + TN3270::Session & action(const char *action_name) override; + + }; + + } + + /// @brief IPC Based acess (Access and active instance of pw3270 or pw3270d) + namespace IPC { + + class Session; + + /// @brief PW3270 IPC Request/Response. + class Request { + private: + +#ifdef _WIN32 + /// @brief Pipe Handle. + HANDLE hPipe; + + /// @brief IPC Data type. + enum Type : uint8_t { + String = 's', + Boolean = 'b', + Uchar = 'y', + Int16 = 'n', + Uint16 = 'q', + Int32 = 'i', + Int32x = 'h', + Uint32 = 'u', + Int64 = 'x', + Uint64 = 't' + }; + + struct { + DWORD length; ///< @brief Length of input buffer. + DWORD used; ///< @brief Length of used block. + DWORD current; ///< @brief Offset of the current argument. + uint8_t * block; + } in; + + struct { + DWORD length; + DWORD used; + uint8_t * block; + } out; + + struct DataBlock { + Type type; + }; + + /// @brief Store value on data block. + DataBlock * pushBlock(const void *ptr, size_t len); + + /// @brief Get next argument. + DataBlock * getNextBlock() const; + +#else + struct { + DBusMessage * in; + DBusMessage * out; + DBusMessageIter iter; + + } msg; + DBusConnection * conn; + +#endif // _WIN32 + + Request(const Session &session); + + public: + + /// @brief Create a method call. + Request(const Session &session, const char *method); + + /// @brief Create a get/set property call. + /// + /// @param session Session object. + /// @param isSet true if this is a setProperty call. + /// @param property Property name. + // + Request(const Session &session, bool isSet, const char *property); + + ~Request(); + + Request & call(); + + // Push values + Request & push(const char *arg); + Request & push(const bool arg); + Request & push(const int32_t arg); + Request & push(const uint32_t arg); + Request & push(const uint8_t arg); + + // Pop values + Request & pop(std::string &value); + Request & pop(int &value); + + }; + + class TN3270_PRIVATE Session : public TN3270::Abstract::Session { + private: + + friend class Request; + +#ifdef _WIN32 + /// @brief Pipe Handle. + HANDLE hPipe; +#else + + DBusConnection * conn; + std::string name; ///< @brief D-Bus Object name. + std::string path; ///< @brief D-Bus Object path. + std::string interface; ///< @brief D-Bus interface. + +#endif // _WIN32 + + void call(Request &request); + + public: + + Session(const char *id); + virtual ~Session(); + + // Connect/disconnect + void connect(const char *url) override; + void disconnect() override; + + // Wait for session state. + void waitForReady(time_t timeout = 5) override; + + // Get properties. + void getProperty(const char *name, int &value) const override; + void getProperty(const char *name, std::string &value) const override; + void getProperty(const char *name, bool &value) const override; + + std::string getVersion() const override; + std::string getRevision() const override; + + // Gets + std::string toString(int baddr, size_t len, char lf) const override; + std::string toString(int row, int col, size_t sz, char lf) const override; + + ProgramMessage getProgramMessage() const override; + + ConnectionState getConnectionState() const override; + + TN3270::Session & setCursorPosition(unsigned short addr) override; + TN3270::Session & setCursorPosition(unsigned short row, unsigned short col) override; + + /// @brief Set field at current posicion, jumps to next writable field. + TN3270::Session & push(const char *text) override; + + TN3270::Session & push(int baddr, const std::string &text) override; + TN3270::Session & push(int row, int col, const std::string &text) override; + TN3270::Session & push(const PFKey key) override; + TN3270::Session & push(const PAKey key) override; + TN3270::Session & push(const Action action) override; + + // Get contents. + TN3270::Session & pop(int baddr, std::string &text) override; + TN3270::Session & pop(int row, int col, std::string &text) override; + TN3270::Session & pop(std::string &text) override; + + /// @brief Execute action by name. + TN3270::Session & action(const char *action_name) override; + + }; + + } + + } + +#endif // PRIVATE_H_INCLUDED diff --git a/client/src/session/local/events.cc b/client/src/session/local/events.cc new file mode 100644 index 0000000..6c3ff54 --- /dev/null +++ b/client/src/session/local/events.cc @@ -0,0 +1,177 @@ +/* + * "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/session/local/events.cc + * + * @brief Implement lib3270 direct access events. + * + * @author perry.werneck@gmail.com + * + */ + + #include + #include + #include + #include + + extern "C" { + #include + #include + } + + using std::string; + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + +#ifndef HAVE_VASPRINTF + int vasprintf(char **strp, const char *fmt, va_list ap) { + char buf[1024]; + + int nc = vsnprintf(buf, sizeof(buf), fmt, ap); + + if(nc < 0) { + + *strp = strdup(_("Error in vasprintf")); + + } else if (nc < sizeof(buf)) { + + *strp = (char *) malloc(nc+1); + strcpy(*strp, buf); + + } else { + + *strp = (char *) malloc(nc + 1); + if(vsnprintf(*strp, nc, fmt, ap) < 0) { + free(*strp); + *strp = strdup( _( "Out of memory in vasprintf" ) ); + } + + } + + return nc; + } +#endif // !HAVE_VASPRINTF + + namespace TN3270 { + + /// @brief Popup Handler. + void Local::Session::popupHandler(H3270 *h3270, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list arg) { + + Local::Session * session = (Local::Session *) lib3270_get_user_data(h3270); + + if(!session) { + throw std::runtime_error(_( "Invalid session handler" )); + } + + class PopupEvent : public TN3270::Event { + private: + LIB3270_NOTIFY type; + string title; + string msg; + string description; + + public: + PopupEvent(LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list arg) : Event(Event::Popup) { + + this->type = type; + this->title = title; + this->msg = msg; + + char * buffer = NULL; + if(vasprintf(&buffer,fmt,arg) != -1) { + this->description = buffer; + free(buffer); + } + +#ifdef DEBUG + std::cerr << "Popup:" << std::endl + << "\t" << title << std::endl + << "\t" << msg << std::endl + << "\t" << description << std::endl; +#endif // DEBUG + + } + + virtual ~PopupEvent() { + } + + /// @brief Get event description. + std::string toString() const override { + return msg; + } + + + }; + + session->fire(PopupEvent(type,title,msg,fmt,arg)); + + } + + /// @brief Connect Handler. + void Local::Session::connectHandler(H3270 *h3270, unsigned char connected) { + + Local::Session * session = (Local::Session *) lib3270_get_user_data(h3270); + + if(!session) { + throw std::runtime_error(_("Invalid session handler")); + } + + class ConnectionEvent : public TN3270::Event { + private: + bool connected; + + public: + ConnectionEvent(unsigned char connected) : Event(Event::Connection) { + this->connected = (connected != 0); + +#ifdef DEBUG + std::cerr << "Session is " << this->toString().c_str() << std::endl; +#endif // DEBUG + + } + + virtual ~ConnectionEvent() { + } + + /// @brief Get event description. + std::string toString() const override { + return this->connected ? _("connected") : _("disconnected"); + } + + }; + + session->fire(ConnectionEvent(connected)); + + } + + + } + + diff --git a/client/src/session/local/session.cc b/client/src/session/local/session.cc new file mode 100644 index 0000000..3b12810 --- /dev/null +++ b/client/src/session/local/session.cc @@ -0,0 +1,389 @@ +/* + * "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/session/local/session.cc + * + * @brief Implement lib3270 direct access layout (NO IPC). + * + * @author perry.werneck@gmail.com + * + */ + + #include + #include + #include + #include + + extern "C" { + #include + } + + using std::string; + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + + namespace TN3270 { + + Local::Session::Session() : Abstract::Session() { + + std::lock_guard lock(sync); + + this->hSession = lib3270_session_new(""); + lib3270_set_user_data(this->hSession,(void *) this); + setCharSet(lib3270_get_display_charset(this->hSession)); + + lib3270_set_popup_handler(this->hSession, popupHandler); + + // Setup callbacks + struct lib3270_session_callbacks *cbk; + + cbk = lib3270_get_session_callbacks(this->hSession,sizeof(struct lib3270_session_callbacks)); + if(!cbk) { + throw std::runtime_error( _("Invalid callback table, possible version mismatch in lib3270") ); + } + + cbk->update_connect = connectHandler; + + + } + + Local::Session::~Session() { + + std::lock_guard lock(sync); + + lib3270_session_free(this->hSession); + this->hSession = nullptr; + } + + void Local::Session::wait(time_t timeout) { + + std::lock_guard lock(sync); + + int rc = lib3270_wait_for_ready(this->hSession, timeout); + + if(rc) { + throw std::system_error(rc, std::system_category()); + } + + } + + void Local::Session::connect(const char *url) { + std::lock_guard lock(sync); + int rc = lib3270_connect_url(hSession,url,0); + + if(rc) { + throw std::system_error(rc, std::system_category()); + } + + } + + void Local::Session::disconnect() { + std::lock_guard lock(sync); + lib3270_disconnect(hSession); + } + + // Wait for session state. + void Local::Session::waitForReady(time_t timeout) throw() { + this->wait(timeout); + } + + std::string Local::Session::toString(int baddr, size_t len, char lf) const { + + std::lock_guard lock(const_cast(this)->sync); + + char * text = lib3270_get_string_at_address(hSession, baddr, len, lf); + + if(!text) { + throw std::runtime_error( _("Can't get screen contents") ); + } + + string rc = convertFromHost(text); + + lib3270_free(text); + + return rc; + + } + + std::string Local::Session::toString(int row, int col, size_t sz, char lf) const { + + std::lock_guard lock(const_cast(this)->sync); + + char * text = lib3270_get_string_at(hSession, row, col, sz, lf); + + if(!text) { + throw std::runtime_error( _("Can't get screen contents") ); + } + + string rc = convertFromHost(text); + + lib3270_free(text); + + return rc; + } + + void Local::Session::getProperty(const char *name, int &value) const { + + const LIB3270_INT_PROPERTY * intprop = lib3270_get_int_properties_list(); + for(size_t ix = 0; intprop[ix].name; ix++) { + + if(!strcasecmp(name,intprop[ix].name)) { + + std::lock_guard lock(const_cast(this)->sync); + + value = intprop[ix].get(hSession); + + if(value < 0 && errno != 0) { + throw std::system_error(errno, std::system_category()); + } + + + } + + } + + throw std::system_error(ENOENT, std::system_category()); + + } + + void Local::Session::getProperty(const char *name, std::string &value) const { + + const LIB3270_STRING_PROPERTY * strprop = lib3270_get_string_properties_list(); + + for(size_t ix = 0; strprop[ix].name; ix++) { + + if(!strcasecmp(name,strprop[ix].name)) { + + std::lock_guard lock(const_cast(this)->sync); + + // Found it! + const char * str = strprop[ix].get(hSession); + + if(str) { + value.assign(str); + return; + } + + throw std::system_error(errno, std::system_category()); + + } + + } + + throw std::system_error(ENOENT, std::system_category()); + } + + void Local::Session::getProperty(const char *name, bool &value) const { + + LIB3270_TOGGLE toggle = lib3270_get_toggle_id(name); + if(toggle != (LIB3270_TOGGLE) -1) { + + // Is a Tn3270 toggle, get it! + std::lock_guard lock(const_cast(this)->sync); + value = lib3270_get_toggle(hSession,toggle); + + } + + throw std::system_error(ENOENT, std::system_category()); + } + + ProgramMessage Local::Session::getProgramMessage() const { + std::lock_guard lock(const_cast(this)->sync); + return (ProgramMessage) lib3270_get_program_message(this->hSession); + } + + ConnectionState Local::Session::getConnectionState() const { + std::lock_guard lock(const_cast(this)->sync); + return (ConnectionState) lib3270_get_connection_state(this->hSession); + } + + /// @brief Set field at current position, jumps to next writable field. + TN3270::Session & Local::Session::push(const char *text) { + std::lock_guard lock(sync); + return *this; + } + + TN3270::Session & Local::Session::push(int baddr, const std::string &text) { + std::lock_guard lock(sync); + return *this; + } + + TN3270::Session & Local::Session::push(int row, int col, const std::string &text) { + std::lock_guard lock(sync); + return *this; + } + + TN3270::Session & Local::Session::push(const PFKey key) { + std::lock_guard lock(sync); + lib3270_pfkey(hSession,(int) key); + return *this; + } + + TN3270::Session & Local::Session::push(const PAKey key) { + std::lock_guard lock(sync); + lib3270_pakey(hSession,(int) key); + return *this; + } + + TN3270::Session & Local::Session::push(const Action action) { + + typedef int (*ActionCallback)(H3270 *); + + static const ActionCallback actions[] = { + lib3270_enter, + lib3270_erase, + lib3270_eraseeof, + lib3270_eraseeol, + lib3270_eraseinput + }; + + if( ((size_t) action) > (sizeof(actions)/sizeof(actions[0]))) { + throw std::system_error(EINVAL, std::system_category()); + } + + std::lock_guard lock(sync); + + int rc = actions[(size_t) action](hSession); + + if(rc) { + throw std::system_error(errno, std::system_category()); + } + + return *this; + } + + TN3270::Session & Local::Session::pop(int baddr, std::string &text) { + + std::lock_guard lock(sync); + + if(!lib3270_is_connected(hSession)) { + throw std::system_error(ENOTCONN, std::system_category()); + } + + char *contents = lib3270_get_field_text_at(hSession, baddr); + + if(!contents) { + throw std::system_error(errno, std::system_category()); + } + + text.assign(convertFromHost(contents).c_str()); + + lib3270_free(contents); + + return *this; + } + + TN3270::Session & Local::Session::pop(int row, int col, std::string &text) { + return this->pop(lib3270_translate_to_address(hSession,row,col),text); + } + + TN3270::Session & Local::Session::pop(std::string &text) { + + std::lock_guard lock(sync); + + if(!lib3270_is_connected(hSession)) { + throw std::system_error(ENOTCONN, std::system_category()); + } + + int baddr = lib3270_get_cursor_address(hSession); + if(baddr < 0) { + throw std::system_error(errno, std::system_category()); + } + + char *contents = lib3270_get_field_text_at(hSession, baddr); + + if(!contents) { + throw std::system_error(errno, std::system_category()); + } + + text.assign(convertFromHost(contents).c_str()); + + lib3270_free(contents); + + baddr = lib3270_get_next_unprotected(hSession,baddr); + if(!baddr) { + baddr = lib3270_get_next_unprotected(hSession,0); + } + + if(lib3270_set_cursor_address(hSession,baddr)) { + throw std::system_error(errno, std::system_category()); + } + + return *this; + } + + /// @brief Set cursor address. + /// + /// @param addr Cursor address. + TN3270::Session & Local::Session::setCursorPosition(unsigned short addr) { + + if(lib3270_set_cursor_address(hSession,addr) < 0) { + throw std::system_error(errno, std::system_category()); + } + + return *this; + } + + /// @brief Set cursor position. + /// + /// @param row New cursor row. + /// @param col New cursor column. + TN3270::Session & Local::Session::setCursorPosition(unsigned short row, unsigned short col) { + + if(lib3270_set_cursor_position(hSession,row,col)) { + throw std::system_error(errno, std::system_category()); + } + + return *this; + + } + + // Get properties. + std::string Local::Session::getVersion() const { + return lib3270_get_version(); + } + + std::string Local::Session::getRevision() const { + return lib3270_get_revision(); + } + + /// @brief Execute action by name. + TN3270::Session & Local::Session::action(const char *action_name) { + + if(lib3270_action(hSession,action_name)) { + throw std::system_error(errno, std::system_category()); + } + + return *this; + } + + } + + diff --git a/client/src/session/remote/session.cc b/client/src/session/remote/session.cc new file mode 100644 index 0000000..458eef1 --- /dev/null +++ b/client/src/session/remote/session.cc @@ -0,0 +1,365 @@ +/* + * "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/session/remote/session.cc + * + * @brief Implements lib3270 access using IPC calls. + * + * @author perry.werneck@gmail.com + * + */ + + #include + #include + + using std::string; + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + + namespace TN3270 { + + void IPC::Session::connect(const char *url) { + Request request(*this,"connect"); + request.push(url).call(); + } + + void IPC::Session::disconnect() { + Request(*this,"disconnect").call(); + } + + // Wait for session state. + void IPC::Session::waitForReady(time_t timeout) { + + int rc; + + time_t end = time(nullptr) + timeout; + + while(time(nullptr) < end) { + + debug("Running waitForReady request..."); + + Request(*this,"waitForReady") + .push((uint32_t) 1) + .call() + .pop(rc); + + debug("Wait for ready returned ",rc); + + if(rc == 0) + return; + + } + + throw std::system_error(ETIMEDOUT, std::system_category()); + } + + std::string IPC::Session::toString(int baddr, size_t len, char lf) const { + + std::string rc; + + Request(*this,"getStringAtAddress") + .push((uint32_t) baddr) + .push((uint32_t) len) + .push((uint8_t) lf) + .call() + .pop(rc); + + return rc; + } + + std::string IPC::Session::toString(int row, int col, size_t sz, char lf) const { + + std::string rc; + + Request(*this,"getStringAt") + .push((uint32_t) row) + .push((uint32_t) col) + .push((uint32_t) sz) + .push((uint8_t) lf) + .call() + .pop(rc); + + return rc; + } + + ProgramMessage IPC::Session::getProgramMessage() const { + + int program_message; + getProperty("program_message",program_message); + return (ProgramMessage) program_message; + + } + + ConnectionState IPC::Session::getConnectionState() const { + + int cstate; + getProperty("cstate",cstate); + return (ConnectionState) cstate; + + } + + /// @brief Set field at current position, jumps to next writable field. + TN3270::Session & IPC::Session::push(const char *text) { + + int rc; + + Request(*this,"setString") + .push(text) + .call() + .pop(rc); + + if(rc) { + throw std::system_error((int) rc, std::system_category()); + } + + return *this; + + } + + TN3270::Session & IPC::Session::push(int baddr, const std::string &text) { + + int rc; + + Request(*this,"setStringAtAddress") + .push((uint32_t) baddr) + .push(text.c_str()) + .call() + .pop(rc); + + if(rc) { + throw std::system_error((int) rc, std::system_category()); + } + + return *this; + + } + + TN3270::Session & IPC::Session::push(int row, int col, const std::string &text) { + + int32_t rc; + + Request(*this,"setStringAt") + .push((uint32_t) row) + .push((uint32_t) col) + .push(text.c_str()) + .call() + .pop(rc); + + if(rc) { + throw std::system_error((int) rc, std::system_category()); + } + + return *this; + + } + + TN3270::Session & IPC::Session::push(const PFKey key) { + + int32_t rc; + + Request(*this,"pfkey") + .push((uint32_t) key) + .call() + .pop(rc); + + if(rc) { + throw std::system_error((int) rc, std::system_category()); + } + + return *this; + + } + + TN3270::Session & IPC::Session::push(const PAKey key) { + + int32_t rc; + + Request(*this,"pakey") + .push((uint32_t) key) + .call() + .pop(rc); + + if(rc) { + throw std::system_error((int) rc, std::system_category()); + } + + return *this; + + } + + TN3270::Session & IPC::Session::push(const Action action) { + + const char * actions[] = { + "enter", + "erase", + "eraseeof", + "eraseeol", + "eraseinput" + }; + + if( ((size_t) action) > (sizeof(actions)/sizeof(actions[0]))) { + throw std::system_error(EINVAL, std::system_category()); + } + + return this->action(actions[action]); + + } + + TN3270::Session & IPC::Session::pop(int baddr, std::string &text) { + + Request(*this,"getFieldAtAddress") + .push((uint32_t) baddr) + .call() + .pop(text); + + return *this; + } + + TN3270::Session & IPC::Session::pop(int row, int col, std::string &text) { + + Request(*this,"getFieldAt") + .push((uint32_t) row) + .push((uint32_t) col) + .call() + .pop(text); + + return *this; + } + + TN3270::Session & IPC::Session::pop(std::string &text) { + + Request(*this,"getFieldAtCursor") + .call() + .pop(text); + + return *this; + + } + + /// @brief Set cursor address. + /// + /// @param addr Cursor address. + TN3270::Session & IPC::Session::setCursorPosition(unsigned short addr) { + + int32_t rc; + + Request(*this,"setCursorAddress") + .push((uint32_t) addr) + .call() + .pop(rc); + + if(rc) { + throw std::system_error((int) rc, std::system_category()); + } + + return *this; + + } + + /// @brief Set cursor position. + /// + /// @param row New cursor row. + /// @param col New cursor column. + TN3270::Session & IPC::Session::setCursorPosition(unsigned short row, unsigned short col) { + + int32_t rc; + + Request(*this,"setCursorPosition") + .push((uint32_t) row) + .push((uint32_t) col) + .call() + .pop(rc); + + if(rc) { + throw std::system_error((int) rc, std::system_category()); + } + + return *this; + + } + + void IPC::Session::getProperty(const char *name, int &value) const { + + Request(*this,false,name) + .call() + .pop(value); + + } + + void IPC::Session::getProperty(const char *name, std::string &value) const { + + Request(*this,false,name) + .call() + .pop(value); + + } + + void IPC::Session::getProperty(const char *name, bool &value) const { + throw std::system_error(ENOENT, std::system_category()); + } + + /// @brief Get lib3270 version. + std::string IPC::Session::getVersion() const { + + string rc; + getProperty("version",rc); + return rc; + + } + + /// @brief Get lib3270 revision. + std::string IPC::Session::getRevision() const { + + string rc; + getProperty("revision",rc); + return rc; + + } + + /// @brief Execute action by name. + TN3270::Session & IPC::Session::action(const char *action_name) { + + int32_t rc; + + Request(*this,"action") + .push(action_name) + .call() + .pop(rc); + + if(rc) { + throw std::system_error((int) rc, std::system_category()); + } + + return *this; + } + + } + + diff --git a/client/src/testprogram/testprogram.cc b/client/src/testprogram/testprogram.cc new file mode 100644 index 0000000..11601fc --- /dev/null +++ b/client/src/testprogram/testprogram.cc @@ -0,0 +1,103 @@ +/* + * "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/lib3270++/testprogram/testprogram.cc + * + * @brief + * + * @author perry.werneck@gmail.com + * + */ + + #include + #include + #include + + using namespace std; + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + + int main(int argc, char **argv) { + + const char * session = "pw3270:a"; + + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" + static struct option options[] = { + { "session", required_argument, 0, 's' }, + { 0, 0, 0, 0} + + }; + #pragma GCC diagnostic pop + + int long_index =0; + int opt; + while((opt = getopt_long(argc, argv, "s:", options, &long_index )) != -1) { + + switch(opt) { + case 's': + session = optarg; + break; + + } + + } + + TN3270::Host host{session}; + + try { + + cout + << "Version: " << host.getVersion() + << "\tRevision: " << host.getRevision() + << std::endl; + + cout + << "Connection state is " << host.getConnectionState() + << "\tProgram message is " << host.getProgramMessage() + << std::endl; + + // host.connect(getenv("LIB3270_DEFAULT_HOST")); + + if(host) { + cout << host << endl; + } + + } catch(const std::exception &e) { + + cerr << std::endl << e.what() << std::endl << std::endl; + + } + + + return 0; + } + + diff --git a/client/valgrind.suppression b/client/valgrind.suppression new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/client/valgrind.suppression diff --git a/common/src/include/config.h.in b/common/src/include/config.h.in index ca153ed..0cf8256 100644 --- a/common/src/include/config.h.in +++ b/common/src/include/config.h.in @@ -35,7 +35,10 @@ #undef PACKAGE_VERSION #undef PACKAGE_RELEASE - #undef HAVE_GNOME - #undef HAVE_GTKMAC + #undef HAVE_ICONV + #undef ICONV_CONST + + #undef HAVE_VASPRINTF + #endif /* LIBV3270_CONFIG_INCLUDED */ diff --git a/configure.ac b/configure.ac index 84c992c..c190e0c 100644 --- a/configure.ac +++ b/configure.ac @@ -50,6 +50,7 @@ AM_ICONV dnl Checks for programs. AC_PROG_CC +AC_PROG_CXX AC_PROG_SED AC_PROG_LN_S @@ -84,8 +85,9 @@ case "$host" in app_win32_revision=$(date +%y.%m.%d.%H) AC_SUBST(WIN32_VERSION,$app_win32_revision) - AC_CONFIG_FILES(src/service/windows/resources.rc) - AC_CONFIG_FILES(src/plugin/windows/resources.rc) + AC_CONFIG_FILES(server/src/plugin/windows/resources.rc) + AC_CONFIG_FILES(server/src/service/windows/resources.rc) + AC_CONFIG_FILES(client/src/core/windows/resources.rc) ;; *) @@ -107,6 +109,8 @@ AC_SUBST(LOGDIR) AC_SUBST(DLLEXT) AC_SUBST(DLLPREFIX) +AC_CHECK_FUNC(vasprintf, AC_DEFINE(HAVE_VASPRINTF) ) + dnl --------------------------------------------------------------------------- dnl Check for other programs dnl --------------------------------------------------------------------------- @@ -285,6 +289,7 @@ dnl Configure which files to generate. dnl --------------------------------------------------------------------------- AC_CONFIG_FILES(server/Makefile) +AC_CONFIG_FILES(client/Makefile) dnl --------------------------------------------------------------------------- dnl Output the generated config.status script. diff --git a/src/client/lib3270++.cbp b/src/client/lib3270++.cbp deleted file mode 100644 index dc30ae1..0000000 --- a/src/client/lib3270++.cbp +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - diff --git a/src/client/lib3270++.pc.in b/src/client/lib3270++.pc.in deleted file mode 100644 index 41fcd0e..0000000 --- a/src/client/lib3270++.pc.in +++ /dev/null @@ -1,16 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -version_major=@PACKAGE_MAJOR_VERSION@ -version_minor=@PACKAGE_MINOR_VERSION@ -sdk_version=@LIB3270_SDK_VERSION@ - -Name: @PACKAGE_NAME@ -Description: @PACKAGE_DESCRIPTION@ -Version: @PACKAGE_VERSION@ -Libs: -L\@libdir@ -l3270++ -Libs.private: @LIBSSL_LIBS@ @LIBICONV@ @INTL_LIBS@ -l@LIB3270_NAME@ -Cflags: -I@includedir@ - diff --git a/src/client/lib3270++static.pc.in b/src/client/lib3270++static.pc.in deleted file mode 100644 index 245f92a..0000000 --- a/src/client/lib3270++static.pc.in +++ /dev/null @@ -1,15 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -version_major=@PACKAGE_MAJOR_VERSION@ -version_minor=@PACKAGE_MINOR_VERSION@ -sdk_version=@LIB3270_SDK_VERSION@ - -Name: @PACKAGE_NAME@ -Description: @PACKAGE_DESCRIPTION@ -Version: @PACKAGE_VERSION@ -Libs: -L\@libdir@ -l@LIB3270_NAME@++static @LIBSSL_LIBS@ @LIBICONV@ @INTL_LIBS@ -Cflags: -I@includedir@ - diff --git a/src/client/private.h b/src/client/private.h deleted file mode 100644 index 2670abb..0000000 --- a/src/client/private.h +++ /dev/null @@ -1,385 +0,0 @@ -/* - * "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/lib3270++/private.h - * - * @brief - * - * @author perry.werneck@gmail.com - * - */ - -#ifndef PRIVATE_H_INCLUDED - - #define PRIVATE_H_INCLUDED - - #include - - #ifdef _WIN32 - #include - #include - #include - #else - #include - #endif // WIN32 - - #include - #include - #include - #include - #include - #include - -#ifdef HAVE_LIBINTL - #include - #define _( x ) gettext(x) - #define N_( x ) x -#else - #define _( x ) x - #define N_( x ) x -#endif // HAVE_LIBINTL - -#ifdef HAVE_ICONV - #include -#endif // HAVE_ICONV - -#ifdef WIN32 - #define SYSTEM_CHARSET "CP1252" -#else - #define SYSTEM_CHARSET "UTF-8" -#endif // WIN32 - -#ifdef DEBUG - - inline void console(std::ostream &out) { - out << std::endl; - } - - template - void console(std::ostream &out, T value, Targs... Fargs) { - out << value; - console(out, Fargs...); - } - - template - void log(T value, Targs... Fargs) { - console(std::clog,value,Fargs...); - } - - #define debug(...) log(__FILE__, "(", __LINE__, ") ", __VA_ARGS__); - -#else - - #define debug(...) /* __VA_ARGS__ */ - -#endif - - namespace TN3270 { - - namespace Abstract { - - class TN3270_PRIVATE Session : public TN3270::Session { - private: - -#ifdef HAVE_ICONV - struct { - - /// @brief Convert strings from host codepage to local codepage. - iconv_t local; - - /// @brief Convert string from local codepage to host codepage. - iconv_t host; - - } converter; -#endif - - /// @brief Converte charset. - static std::string convertCharset(iconv_t &converter, const char *str); - - protected: - - /// @brief Current in/out position. - int baddr; - - Session(); - virtual ~Session(); - - /// @brief Setup charsets - void setCharSet(const char *remote, const char *local = SYSTEM_CHARSET); - - /// @brief Converte string recebida do host para o charset atual. - std::string convertFromHost(const char *str) const; - - /// @brief Converte string do charset atual para o charset do host. - std::string convertToHost(const char *str) const; - - }; - - } - - /// @brief lib3270 direct access objects (no IPC); - namespace Local { - - class TN3270_PRIVATE Session : public TN3270::Abstract::Session { - private: - - /// @brief Handle of the related instance of lib3270 - H3270 * hSession; - - /// @brief Mutex to serialize access to lib3270 - std::mutex sync; - - /// @brief Popup Handler. - static void popupHandler(H3270 *session, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list arg); - - /// @brief Connect Handler. - static void connectHandler(H3270 *session, unsigned char connected); - - /// @brief Wait for network events - void wait(time_t timeout = 5); - - public: - Session(); - virtual ~Session(); - - // Connect/disconnect - void connect(const char *url) override; - void disconnect() override; - - // Wait for session state. - void waitForReady(time_t timeout = 5) throw() override; - - // Get properties. - void getProperty(const char *name, int &value) const override; - void getProperty(const char *name, std::string &value) const override; - void getProperty(const char *name, bool &value) const override; - - std::string getVersion() const override; - std::string getRevision() const override; - - // Gets - std::string toString(int baddr, size_t len, char lf) const override; - std::string toString(int row, int col, size_t sz, char lf) const override; - - ProgramMessage getProgramMessage() const override; - - ConnectionState getConnectionState() const override; - - TN3270::Session & setCursorPosition(unsigned short addr) override; - TN3270::Session & setCursorPosition(unsigned short row, unsigned short col) override; - - /// @brief Set field at current posicion, jumps to next writable field. - TN3270::Session & push(const char *text) override; - - TN3270::Session & push(int baddr, const std::string &text) override; - TN3270::Session & push(int row, int col, const std::string &text) override; - TN3270::Session & push(const PFKey key) override; - TN3270::Session & push(const PAKey key) override; - TN3270::Session & push(const Action action) override; - - // Get contents. - TN3270::Session & pop(int baddr, std::string &text) override; - TN3270::Session & pop(int row, int col, std::string &text) override; - TN3270::Session & pop(std::string &text) override; - - /// @brief Execute action by name. - TN3270::Session & action(const char *action_name) override; - - }; - - } - - /// @brief IPC Based acess (Access and active instance of pw3270 or pw3270d) - namespace IPC { - - class Session; - - /// @brief PW3270 IPC Request/Response. - class Request { - private: - -#ifdef _WIN32 - /// @brief Pipe Handle. - HANDLE hPipe; - - /// @brief IPC Data type. - enum Type : uint8_t { - String = 's', - Boolean = 'b', - Uchar = 'y', - Int16 = 'n', - Uint16 = 'q', - Int32 = 'i', - Int32x = 'h', - Uint32 = 'u', - Int64 = 'x', - Uint64 = 't' - }; - - struct { - DWORD length; ///< @brief Length of input buffer. - DWORD used; ///< @brief Length of used block. - DWORD current; ///< @brief Offset of the current argument. - uint8_t * block; - } in; - - struct { - DWORD length; - DWORD used; - uint8_t * block; - } out; - - struct DataBlock { - Type type; - }; - - /// @brief Store value on data block. - DataBlock * pushBlock(const void *ptr, size_t len); - - /// @brief Get next argument. - DataBlock * getNextBlock() const; - -#else - struct { - DBusMessage * in; - DBusMessage * out; - DBusMessageIter iter; - - } msg; - DBusConnection * conn; - -#endif // _WIN32 - - Request(const Session &session); - - public: - - /// @brief Create a method call. - Request(const Session &session, const char *method); - - /// @brief Create a get/set property call. - /// - /// @param session Session object. - /// @param isSet true if this is a setProperty call. - /// @param property Property name. - // - Request(const Session &session, bool isSet, const char *property); - - ~Request(); - - Request & call(); - - // Push values - Request & push(const char *arg); - Request & push(const bool arg); - Request & push(const int32_t arg); - Request & push(const uint32_t arg); - Request & push(const uint8_t arg); - - // Pop values - Request & pop(std::string &value); - Request & pop(int &value); - - }; - - class TN3270_PRIVATE Session : public TN3270::Abstract::Session { - private: - - friend class Request; - -#ifdef _WIN32 - /// @brief Pipe Handle. - HANDLE hPipe; -#else - - DBusConnection * conn; - std::string name; ///< @brief D-Bus Object name. - std::string path; ///< @brief D-Bus Object path. - std::string interface; ///< @brief D-Bus interface. - -#endif // _WIN32 - - void call(Request &request); - - public: - - Session(const char *id); - virtual ~Session(); - - // Connect/disconnect - void connect(const char *url) override; - void disconnect() override; - - // Wait for session state. - void waitForReady(time_t timeout = 5) override; - - // Get properties. - void getProperty(const char *name, int &value) const override; - void getProperty(const char *name, std::string &value) const override; - void getProperty(const char *name, bool &value) const override; - - std::string getVersion() const override; - std::string getRevision() const override; - - // Gets - std::string toString(int baddr, size_t len, char lf) const override; - std::string toString(int row, int col, size_t sz, char lf) const override; - - ProgramMessage getProgramMessage() const override; - - ConnectionState getConnectionState() const override; - - TN3270::Session & setCursorPosition(unsigned short addr) override; - TN3270::Session & setCursorPosition(unsigned short row, unsigned short col) override; - - /// @brief Set field at current posicion, jumps to next writable field. - TN3270::Session & push(const char *text) override; - - TN3270::Session & push(int baddr, const std::string &text) override; - TN3270::Session & push(int row, int col, const std::string &text) override; - TN3270::Session & push(const PFKey key) override; - TN3270::Session & push(const PAKey key) override; - TN3270::Session & push(const Action action) override; - - // Get contents. - TN3270::Session & pop(int baddr, std::string &text) override; - TN3270::Session & pop(int row, int col, std::string &text) override; - TN3270::Session & pop(std::string &text) override; - - /// @brief Execute action by name. - TN3270::Session & action(const char *action_name) override; - - }; - - } - - } - -#endif // PRIVATE_H_INCLUDED diff --git a/src/client/src/Makefile.in b/src/client/src/Makefile.in deleted file mode 100644 index b87c8bd..0000000 --- a/src/client/src/Makefile.in +++ /dev/null @@ -1,391 +0,0 @@ -# -# "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., 59 Temple -# Place, Suite 330, Boston, MA, 02111-1307, USA -# -# Contatos: -# -# perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) -# erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça) -# - -#---[ Library configuration ]------------------------------------------------------------ - -LIBNAME=lib@LIB3270_NAME@++ - -SOURCES= \ - $(wildcard *.cc) \ - $(wildcard local/*.cc) \ - $(wildcard ipc/*.cc) \ - $(wildcard @OSNAME@/*.cc) \ - $(wildcard @OSNAME@/*.rc) - -TEST_SOURCES= \ - $(wildcard testprogram/*.cc) - -#---[ Tools ]---------------------------------------------------------------------------- - -CXX=@CXX@ -HOST_CC=@HOST_CC@ -LD=@CXX@ -LN_S=@LN_S@ -MKDIR=@MKDIR_P@ -INSTALL=@INSTALL@ -INSTALL_DATA=@INSTALL_DATA@ -INSTALL_PROGRAM=@INSTALL_PROGRAM@ -XGETTEXT=@XGETTEXT@ -MSGCAT=@MSGCAT@ -WINDRES=@WINDRES@ -AR=@AR@ -VALGRIND=@VALGRIND@ - -#---[ Paths ]---------------------------------------------------------------------------- - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -bindir=@bindir@ -sbindir=@sbindir@ -libdir=@libdir@ -includedir=@includedir@ -datarootdir=@datarootdir@ -localedir=@localedir@ -docdir=@docdir@ -sysconfdir=@sysconfdir@ - -BASEDIR=@BASEDIR@ - -POTDIR=$(BASEDIR)/.pot - -OBJDIR=$(BASEDIR)/.obj/$(LIBNAME) -OBJDBG=$(OBJDIR)/Debug -OBJRLS=$(OBJDIR)/Release - -BINDIR=$(BASEDIR)/.bin -BINDBG=$(BINDIR)/Debug -BINRLS=$(BINDIR)/Release - -#---[ Rules ]---------------------------------------------------------------------------- - -DEPENDS= \ - Makefile \ - ../include/*.h \ - ../include/lib3270/*.h \ - ../lib3270/*.h - - -CFLAGS= \ - @CFLAGS@ \ - @CPPFLAGS@ \ - -g \ - -I../include \ - -DBUILD_DATE=`date +%Y%m%d` \ - @DBUS_CFLAGS@ - -LIBS= \ - @LIBS@ \ - @LIBSSL_LIBS@ \ - @LIBICONV@ \ - @INTL_LIBS@ \ - @DBUS_LIBS@ - - -#---[ Debug Rules ]---------------------------------------------------------------------- - -$(OBJDBG)/%.o: \ - %.cc \ - $(DEPENDS) - - @echo $< ... - @$(MKDIR) `dirname $@` - @$(CXX) \ - $(CFLAGS) \ - -Wall -Wextra -fstack-check \ - -DDEBUG=1 \ - -o $@ -c $< - -$(OBJDBG)/%.o: \ - %.rc - - @echo $< ... - @$(MKDIR) `dirname $@` - @$(WINDRES) $< -O coff -o $@ - -#---[ Release Rules ]-------------------------------------------------------------------- - -$(OBJRLS)/%.o: \ - %.cc \ - $(DEPENDS) - - @echo $< ... - @$(MKDIR) `dirname $@` - @$(CXX) \ - $(CFLAGS) \ - -DNDEBUG=1 \ - -o $@ -c $< - -$(OBJRLS)/%.o: \ - %.rc - - @echo $< ... - @$(MKDIR) `dirname $@` - @$(WINDRES) $< -O coff -o $@ - -#---[ Misc Rules ]----------------------------------------------------------------------- - -$(POTDIR)/$(LIBNAME)/%.pot: \ - %.cc - - @echo $(notdir $@) ... - @$(MKDIR) `dirname $@` - @$(XGETTEXT) \ - --language=C \ - --keyword=_ \ - --keyword=N_ \ - --keyword=MSG_:2 \ - --output=$@ \ - $< - @touch $@ - -$(POTDIR)/$(LIBNAME)/%.pot: \ - %.rc - - @echo $< ... - @$(MKDIR) `dirname $@` - @touch $@ - -#---[ Release Targets ]------------------------------------------------------------------ - -all: \ - $(BINRLS)/$(LIBNAME)@DLLEXT@ \ - $(BINRLS)/static/$(LIBNAME).a \ - $(POTDIR)/$(LIBNAME).pot - - -Release: \ - $(BINRLS)/$(LIBNAME)@DLLEXT@ \ - $(BINRLS)/static/$(LIBNAME).a - - -$(BINRLS)/$(LIBNAME)@DLLEXT@: \ - $(BINRLS)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@ - - @echo $< ... - @rm -f $@ - @$(LN_S) \ - $^ \ - $@ - -$(BINRLS)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@: \ - $(BINRLS)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@ - - @rm -f $@ - @$(LN_S) \ - $^ \ - $@ - -$(BINRLS)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@: \ - $(foreach SRC, $(basename $(SOURCES)), $(OBJRLS)/$(SRC).o) - - @$(MKDIR) $(@D) - @echo $< ... - - @$(LD) \ - @DLL_LDFLAGS@ \ - -o $@ \ - $(LDFLAGS) \ - $(foreach SRC, $(basename $(SOURCES)), $(OBJRLS)/$(SRC).o) \ - -L$(BINRLS) \ - $(LIBS) \ - -l@LIB3270_NAME@ - -$(BINRLS)/static/$(LIBNAME).a: \ - $(foreach SRC, $(basename $(SOURCES)), $(OBJRLS)/$(SRC).o) - - @echo $@ ... - @$(MKDIR) `dirname $@` - @$(AR) rcs $@ $^ - - -#---[ Install Targets ]------------------------------------------------------------------ - -install: \ - install-shared \ - install-static \ - install-dev - -install-shared: \ - $(BINRLS)/$(LIBNAME)@DLLEXT@ - - # Install library - @mkdir -p $(DESTDIR)$(libdir) - - @$(INSTALL_PROGRAM) \ - $(BINRLS)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@ \ - $(DESTDIR)$(libdir) - - - @$(LN_S) \ - $(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@ \ - $(DESTDIR)$(libdir)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@ - - @$(LN_S) \ - $(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@ \ - $(DESTDIR)$(libdir)/$(LIBNAME)@DLLEXT@ - -install-static: \ - $(BINRLS)/static/$(LIBNAME).a - - # Install static library - @mkdir -p $(DESTDIR)$(libdir) - @$(INSTALL_DATA) \ - $(BINRLS)/static/$(LIBNAME).a \ - $(DESTDIR)$(libdir)/$(LIBNAME)static.a - - # Install static PKG-CONFIG files - @mkdir -p $(DESTDIR)$(libdir)/pkgconfig - @$(INSTALL_DATA) \ - lib3270++static.pc \ - $(DESTDIR)$(libdir)/pkgconfig/lib3270++static.pc - -install-dev: - - # Install SDK - @$(INSTALL_DATA) \ - ../include/lib3270++.h \ - $(DESTDIR)$(includedir)/lib3270++.h - - # Install PKG-CONFIG files - @mkdir -p $(DESTDIR)$(libdir)/pkgconfig - @$(INSTALL_DATA) \ - lib3270++.pc \ - $(DESTDIR)$(libdir)/pkgconfig/lib3270++.pc - - -#---[ Misc Targets ]--------------------------------------------------------------------- - -$(POTDIR)/$(LIBNAME).pot: \ - $(foreach SRC, $(basename $(SOURCES)), $(POTDIR)/$(LIBNAME)/$(SRC).pot) - - @rm -f $@ - @mkdir -p `dirname $@` - @$(MSGCAT) --sort-output $^ > $@ - -locale: \ - $(POTDIR)/$(LIBNAME).pot - - -#---[ Debug Targets ]-------------------------------------------------------------------- - -Debug: \ - $(BINDBG)/$(LIBNAME)@EXEEXT@ - -$(BINDBG)/$(LIBNAME)@EXEEXT@: \ - $(foreach SRC, $(basename $(TEST_SOURCES)), $(OBJDBG)/$(SRC).o) \ - $(BINDBG)/$(LIBNAME)@DLLEXT@ - - @$(MKDIR) `dirname $@` - @echo $< ... - @$(LD) \ - -Wl,--rpath,$(BINDBG) \ - -o $@ \ - $^ \ - $(LDFLAGS) \ - $(LIBS) - -run: \ - $(BINDBG)/$(LIBNAME)@EXEEXT@ - -ifeq ($(VALGRIND),no) - - @LD_LIBRARY_PATH=$(BINDBG) \ - $(BINDBG)/$(LIBNAME)@EXEEXT@ - -else - @touch valgrind.suppression - - @LD_LIBRARY_PATH=$(BINDBG) \ - $(VALGRIND) --leak-check=full --track-origins=yes --gen-suppressions=all --suppressions=valgrind.suppression \ - $(BINDBG)/$(LIBNAME)@EXEEXT@ -endif - - -$(BINDBG)/$(LIBNAME)@DLLEXT@: \ - $(BINDBG)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@ - - @echo $< ... - @rm -f $@ - @$(LN_S) \ - $^ \ - $@ - -$(BINDBG)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@: \ - $(BINDBG)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@ - - @rm -f $@ - @$(LN_S) \ - $^ \ - $@ - -$(BINDBG)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@: \ - $(foreach SRC, $(basename $(SOURCES)), $(OBJDBG)/$(SRC).o) - - @$(MKDIR) `dirname $@` - @echo $< ... - @$(LD) \ - -shared \ - -Wl,-soname,$(@F) \ - -Wl,--rpath,$(BINDBG) \ - -o $@ \ - $(LDFLAGS) \ - $(foreach SRC, $(basename $(SOURCES)), $(OBJDBG)/$(SRC).o) \ - -L$(BINDBG) \ - $(LIBS) \ - -l@LIB3270_NAME@ - -#---[ Clean Targets ]-------------------------------------------------------------------- - -clean: \ - cleanDebug \ - cleanRelease - - @rm -fr $(BASEDIR)/.tmp/$(LIBNAME) - @rm -fr $(POTDIR)/$(LIBNAME) - -cleanDebug: - - @rm -fr $(OBJDBG) - @rm -f $(BINDBG)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@ - @rm -f $(BINDBG)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@ - @rm -f $(BINDBG)/$(LIBNAME)@DLLEXT@ - -cleanRelease: - - @rm -fr $(OBJRLS) - - @rm -f $(BINRLS)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@ - @rm -f $(BINRLS)/$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@ - @rm -f $(BINRLS)/$(LIBNAME)@DLLEXT@ - - @rm -fr $(POTDIR) - @rm -f lib$(LIBNAME).pot - -clean: \ - cleanDebug \ - cleanRelease - - diff --git a/src/client/src/core/abstract.cc b/src/client/src/core/abstract.cc deleted file mode 100644 index d723870..0000000 --- a/src/client/src/core/abstract.cc +++ /dev/null @@ -1,153 +0,0 @@ -/* - * "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/core/abstract.cc - * - * @brief Implements abstract session object. - * - * @author perry.werneck@gmail.com - * - */ - - #include "private.h" - #include - - -/*---[ Implement ]----------------------------------------------------------------------------------*/ - - namespace TN3270 { - - Abstract::Session::Session() { - -#ifdef HAVE_ICONV - this->converter.local = (iconv_t) (-1); - this->converter.host = (iconv_t) (-1); -#endif - - this->baddr = 0; - - } - - Abstract::Session::~Session() { - -#ifdef HAVE_ICONV - - if(this->converter.local != (iconv_t) (-1)) - iconv_close(this->converter.local); - - if(this->converter.host != (iconv_t) (-1)) - iconv_close(this->converter.host); - -#endif - - } - - /// @brief Setup charsets - void Abstract::Session::setCharSet(const char *remote, const char *local) { - -#ifdef HAVE_ICONV - - if(this->converter.local != (iconv_t) (-1)) - iconv_close(converter.local); - - if(this->converter.host != (iconv_t) (-1)) - iconv_close(converter.host); - - if(strcmp(local,remote)) { - - // Local and remote charsets aren't the same, setup conversion - converter.local = iconv_open(local, remote); - converter.host = iconv_open(remote,local); - - } else { - // Same charset, doesn't convert - converter.local = converter.host = (iconv_t)(-1); - } - -#else - - throw std::runtime_error("No ICONV Support"); - -#endif - - - } - - /// @brief Converte charset. - std::string Abstract::Session::convertCharset(iconv_t &converter, const char *str) { - - std::string rc; - -#ifdef HAVE_ICONV - size_t in = strlen(str); - - if(in && converter != (iconv_t)(-1)) { - - size_t out = (in << 1); - char * ptr; - char * outBuffer = (char *) malloc(out); - ICONV_CONST char * inBuffer = (ICONV_CONST char *) str; - - memset(ptr=outBuffer,0,out); - - iconv(converter,NULL,NULL,NULL,NULL); // Reset state - - if(iconv(converter,&inBuffer,&in,&ptr,&out) != ((size_t) -1)) - rc.assign(outBuffer); - - free(outBuffer); - - } - -#else - - rc = str; - -#endif // HAVE_ICONV - - return rc; - } - - /// @brief Converte string recebida do host para o charset atual. - std::string Abstract::Session::convertFromHost(const char *str) const { - return convertCharset(const_cast(this)->converter.local,str); - } - - /// @brief Converte string do charset atual para o charset do host. - std::string Abstract::Session::convertToHost(const char *str) const { - return convertCharset(const_cast(this)->converter.host,str); - } - - - } - - - - diff --git a/src/client/src/core/events.cc b/src/client/src/core/events.cc deleted file mode 100644 index 6e5d168..0000000 --- a/src/client/src/core/events.cc +++ /dev/null @@ -1,56 +0,0 @@ -/* - * "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/core/events.cc - * - * @brief Implements event object. - * - * @author perry.werneck@gmail.com - * - */ - - #include "private.h" - - -/*---[ Implement ]----------------------------------------------------------------------------------*/ - - namespace TN3270 { - - Event::Event(enum Event::Type type) { - this->type = type; - } - - Event::~Event() { - } - - } - - - diff --git a/src/client/src/core/host.cc b/src/client/src/core/host.cc deleted file mode 100644 index a4a6f6a..0000000 --- a/src/client/src/core/host.cc +++ /dev/null @@ -1,180 +0,0 @@ -/* - * "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/core/host.cc - * - * @brief Implements host object. - * - * @author perry.werneck@gmail.com - * - */ - - #include "private.h" - - -/*---[ Implement ]----------------------------------------------------------------------------------*/ - - namespace TN3270 { - - Host::Host(const char *id, const char *url, time_t timeout) { - this->timeout = timeout; - this->session = Session::create(id); - if(url) { - this->connect(url); - } - } - - Host::~Host() { - delete this->session; - this->session = nullptr; - } - - void Host::connect(const char *url, bool sync) { - this->session->connect(url); - if(sync) { - this->sync(); - } - } - - - /// @brief Writes characters to the associated file from the put area - int Host::sync() { - this->session->waitForReady(this->timeout); - return 0; - } - - /// @brief Writes characters to the associated output sequence from the put area. - int Host::overflow(int c) { - - if (c != EOF) { - char str[] = { static_cast(c), 0 }; - this->session->push((const char *) str); - } else { - sync(); - } - - return c; - - } - - Host & Host::push(const Action action) { - session->push(action); - sync(); - return *this; - } - - bool Host::isReady() const { - this->session->waitForReady(this->timeout); - return getProgramMessage() == MESSAGE_NONE; - } - - bool Host::isConnected() const { - this->session->waitForReady(this->timeout); - return getConnectionState() == CONNECTED_TN3270E; - } - - std::string Host::toString() const { - - this->session->waitForReady(this->timeout); - - if(this->session->getConnectionState() == TN3270::DISCONNECTED) { - throw std::system_error(ENOTCONN, std::system_category()); - } - - return this->session->toString(); - } - - std::string Host::toString(int baddr, size_t len, char lf) const { - - this->session->waitForReady(this->timeout); - - if(this->session->getConnectionState() == TN3270::DISCONNECTED) { - throw std::system_error(ENOTCONN, std::system_category()); - } - - return this->session->toString(baddr,len,lf); - - } - - std::string Host::toString(int row, int col, size_t sz, char lf) const { - - this->session->waitForReady(this->timeout); - - if(this->session->getConnectionState() == TN3270::DISCONNECTED) { - throw std::system_error(ENOTCONN, std::system_category()); - } - - return this->session->toString(row,col,sz,lf); - - - } - - Host & Host::pop(int baddr, std::string &text) { - - this->session->waitForReady(this->timeout); - - if(this->session->getConnectionState() == TN3270::DISCONNECTED) { - throw std::system_error(ENOTCONN, std::system_category()); - } - - session->pop(baddr, text); - - return *this; - } - - Host & Host::pop(int row, int col, std::string &text) { - - this->session->waitForReady(this->timeout); - - if(this->session->getConnectionState() == TN3270::DISCONNECTED) { - throw std::system_error(ENOTCONN, std::system_category()); - } - - session->pop(row,col,text); - - return *this; - } - - Host & Host::pop(std::string &text) { - - this->session->waitForReady(this->timeout); - - if(this->session->getConnectionState() == TN3270::DISCONNECTED) { - throw std::system_error(ENOTCONN, std::system_category()); - } - - session->pop(text); - - return *this; - } - - - } - diff --git a/src/client/src/core/session.cc b/src/client/src/core/session.cc deleted file mode 100644 index 240ad04..0000000 --- a/src/client/src/core/session.cc +++ /dev/null @@ -1,78 +0,0 @@ -/* - * "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/core/session.cc - * - * @brief Implements common session object. - * - * @author perry.werneck@gmail.com - * - */ - - #include "private.h" - - -/*---[ Implement ]----------------------------------------------------------------------------------*/ - - namespace TN3270 { - - /// @brief Create a tn3270 session. - Session * Session::create(const char *id) { - - if(!id) { - return new Local::Session(); - } - - return new IPC::Session(id); - - } - - - Session::Session() { - - } - - Session::~Session() { - - } - - void Session::insert(Event::Type type, std::function listener) { - } - - /// @brief Fire event. - void Session::fire(const Event &event) { - - - } - - } - - - diff --git a/src/client/src/os/linux/request.cc b/src/client/src/os/linux/request.cc deleted file mode 100644 index 522f102..0000000 --- a/src/client/src/os/linux/request.cc +++ /dev/null @@ -1,267 +0,0 @@ -/* - * "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/request.cc - * - * @brief Implements linux request methods for remote session. - * - * @author perry.werneck@gmail.com - * - */ - - #include "../private.h" - - using std::string; - -/*---[ Implement ]----------------------------------------------------------------------------------*/ - - namespace TN3270 { - - IPC::Request::Request(const Session &session) { - this->conn = session.conn; - this->msg.in = nullptr; - this->msg.out = nullptr; - } - - IPC::Request::Request(const Session &session, const char *method) : Request(session) { - - this->msg.out = dbus_message_new_method_call( - session.name.c_str(), // Destination - session.path.c_str(), // Path - session.interface.c_str(), // Interface - method // Method - ); - - if(!msg.out) { - throw std::runtime_error("Can't create D-Bus Method Call"); - } - - } - - IPC::Request::Request(const Session &session, bool isSet, const char *property) : Request(session) { - -/* - dbus-send \ - --session \ - --dest=br.com.bb.pw3270.a\ - --print-reply \ - "/br/com/bb/tn3270/session" \ - "org.freedesktop.DBus.Properties.Get" \ - string:br.com.bb.tn3270.session \ - string:${1} -*/ - this->msg.out = dbus_message_new_method_call( - session.name.c_str(), // Destination - session.path.c_str(), // Path - "org.freedesktop.DBus.Properties", // Interface - (isSet ? "Set" : "Get") - ); - - if(!msg.out) { - throw std::runtime_error("Can't create D-Bus Property Call"); - } - - // - // https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-properties - // org.freedesktop.DBus.Properties.Get (in STRING interface_name, - // in STRING property_name, - // out VARIANT value); - // org.freedesktop.DBus.Properties.Set (in STRING interface_name, - // in STRING property_name, - // - const char *interface_name = session.interface.c_str(); - - dbus_message_append_args( - this->msg.out, - DBUS_TYPE_STRING,&interface_name, - DBUS_TYPE_STRING,&property, - DBUS_TYPE_INVALID - ); - - } - - IPC::Request::~Request() { - if(msg.out) { - dbus_message_unref(msg.out); - } - if(msg.in) { - dbus_message_unref(msg.in); - } - } - - IPC::Request & IPC::Request::call() { - - if(msg.in) { - dbus_message_unref(msg.in); - msg.in = nullptr; - } - - DBusError error; - dbus_error_init(&error); - this->msg.in = dbus_connection_send_with_reply_and_block(this->conn,this->msg.out,10000,&error); - - if(!this->msg.in) { - string message = error.message; - dbus_error_free(&error); - throw std::runtime_error(message.c_str()); - } - - dbus_message_iter_init(msg.in, &msg.iter); - - debug(__FUNCTION__," got a valid response"); - - return *this; - - } - - IPC::Request & IPC::Request::push(const char *arg) { - dbus_message_append_args(this->msg.out,DBUS_TYPE_STRING,&arg,DBUS_TYPE_INVALID); - return *this; - } - - IPC::Request & IPC::Request::push(const bool arg) { - dbus_message_append_args(this->msg.out,DBUS_TYPE_BOOLEAN,&arg,DBUS_TYPE_INVALID); - return *this; - } - - IPC::Request & IPC::Request::push(const uint8_t arg) { - dbus_message_append_args(this->msg.out,DBUS_TYPE_BYTE,&arg,DBUS_TYPE_INVALID); - return *this; - } - - IPC::Request & IPC::Request::push(const int32_t arg) { - dbus_message_append_args(this->msg.out,DBUS_TYPE_INT32,&arg,DBUS_TYPE_INVALID); - return *this; - } - - IPC::Request & IPC::Request::push(const uint32_t arg) { - dbus_message_append_args(this->msg.out,DBUS_TYPE_UINT32,&arg,DBUS_TYPE_INVALID); - return *this; - } - - - IPC::Request & IPC::Request::pop(std::string &value) { - - const char * str = ""; - - if(dbus_message_iter_get_arg_type(&msg.iter) == DBUS_TYPE_STRING) { - - dbus_message_iter_get_basic(&msg.iter, &str); - - } else if(dbus_message_iter_get_arg_type(&msg.iter) == DBUS_TYPE_VARIANT) { - - DBusMessageIter sub; - int current_type; - - dbus_message_iter_recurse(&msg.iter, &sub); - - while ((current_type = dbus_message_iter_get_arg_type(&sub)) != DBUS_TYPE_INVALID) { - - if (current_type == DBUS_TYPE_STRING) { - dbus_message_iter_get_basic(&sub, &str); - break; - } - dbus_message_iter_next(&sub); - } - - } else { - - debug("Argument type is ", ((char) dbus_message_iter_get_arg_type(&msg.iter)) ); - throw std::runtime_error("Expected an string data type"); - - } - - dbus_message_iter_next(&msg.iter); - - value.assign(str); - - debug(__FUNCTION__,"= \"",str,"\""); - - return *this; - } - - static int getIntValue(DBusMessageIter &iter) { - - if(dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_INT32) { - - dbus_int32_t rc = 0; - dbus_message_iter_get_basic(&iter, &rc); - return (int) rc; - - } else if(dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_INT16) { - - dbus_int16_t rc = 0; - dbus_message_iter_get_basic(&iter, &rc); - return (int) rc; - - } else if(dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_VARIANT) { - - DBusMessageIter sub; - int current_type; - - dbus_message_iter_recurse(&iter, &sub); - - while ((current_type = dbus_message_iter_get_arg_type(&sub)) != DBUS_TYPE_INVALID) { - - if (current_type == DBUS_TYPE_INT32) { - - dbus_int32_t rc = 0; - dbus_message_iter_get_basic(&sub, &rc); - return (int) rc; - - } else if (current_type == DBUS_TYPE_INT16) { - dbus_int16_t rc = 0; - dbus_message_iter_get_basic(&sub, &rc); - return (int) rc; - - } - dbus_message_iter_next(&sub); - } - - } - - debug("Argument type is ", ((char) dbus_message_iter_get_arg_type(&iter)) ); - throw std::runtime_error("Expected an integer data type"); - - } - - IPC::Request & IPC::Request::Request::pop(int &value) { - - value = getIntValue(msg.iter); - dbus_message_iter_next(&msg.iter); - debug(__FUNCTION__,"= \"",value,"\""); - - return *this; - - } - - } - - diff --git a/src/client/src/os/linux/session.cc b/src/client/src/os/linux/session.cc deleted file mode 100644 index 7a931cd..0000000 --- a/src/client/src/os/linux/session.cc +++ /dev/null @@ -1,98 +0,0 @@ -/* - * "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/linux/session.cc - * - * @brief Implements Linux session methods. - * - * @author perry.werneck@gmail.com - * - */ - - #include "../private.h" - #include - #include - - using std::string; - -/*---[ Implement ]----------------------------------------------------------------------------------*/ - - static void throws_if_error(DBusError &err) { - - if(dbus_error_is_set(&err)) { - string message = err.message; - dbus_error_free(&err); - throw std::runtime_error(message.c_str()); - } - - return; - - } - - namespace TN3270 { - - IPC::Session::Session(const char *id) : Abstract::Session() { - - // Create D-Bus session. - DBusError err; - - dbus_error_init(&err); - this->conn = dbus_bus_get(DBUS_BUS_SESSION, &err); - - debug("dbus_bus_get conn=",conn); - - throws_if_error(err); - - if(!conn) - throw std::runtime_error("DBUS Connection failed"); - - auto sep = strchr(id,':'); - if(!sep) { - throw std::system_error(EINVAL, std::system_category()); - } - - this->name = "br.com.bb."; - this->name += string(id,(sep - id)); - this->name += "."; - this->name += (sep+1); - this->path = "/br/com/bb/tn3270/session"; - this->interface = "br.com.bb.tn3270.session"; - - debug("D-Bus Object name=\"",this->name,"\" D-Bus Object path=\"",this->path,"\""); - - } - - IPC::Session::~Session() { - - } - - } - - diff --git a/src/client/src/os/windows/request.cc b/src/client/src/os/windows/request.cc deleted file mode 100644 index f5f3bae..0000000 --- a/src/client/src/os/windows/request.cc +++ /dev/null @@ -1,191 +0,0 @@ -/* - * "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/windows/request.cc - * - * @brief Implements WIN32 request methods. - * - * @author perry.werneck@gmail.com - * - */ - - #include "../private.h" - - using std::string; - -/*---[ Implement ]----------------------------------------------------------------------------------*/ - - namespace TN3270 { - - #define PIPE_BUFFER_LENGTH 8192 - - IPC::Request::Request(const Session &session) { - - this->hPipe = session.hPipe; - - in.length = PIPE_BUFFER_LENGTH; - in.used = 0; - in.block = new uint8_t[in.length]; - - out.length = PIPE_BUFFER_LENGTH; - out.used = 0; - out.block = new uint8_t[out.length]; - - } - - IPC::Request::Request(const Session &session, const char *method) : Request(session) { - - // Add name - strcpy((char *) out.block, method); - out.used += strlen((char *) method) + 1; - - // Add ID - *((uint16_t *) (out.block + out.used)) = (uint16_t) 3; - out.used += sizeof(uint16_t); - - } - - IPC::Request::Request(const Session &session, bool isSet, const char *property) : Request(session) { - - // Add name - strcpy((char *) out.block, property); - out.used += strlen((char *) property) + 1; - - // Add ID (SetProperty = 2, getProperty = 1) - *((uint16_t *) (out.block + out.used)) = (uint16_t) (isSet ? 2 : 1); - out.used += sizeof(uint16_t); - - } - - IPC::Request::~Request() { - - delete[] ((uint8_t *) in.block); - delete[] ((uint8_t *) out.block); - - } - - /// @brief Store value on data block. - IPC::Request::DataBlock * IPC::Request::pushBlock(const void *ptr, size_t length) { - - if((out.used + length + sizeof(IPC::Request::DataBlock)) >= out.length) { - throw std::runtime_error("Too big"); - } - - IPC::Request::DataBlock * rc = (IPC::Request::DataBlock *) (out.block + out.used); - memcpy(((uint8_t *) (rc+1)), ((uint8_t *) ptr), length); - - out.used += (sizeof(IPC::Request::DataBlock) + length); - - return rc; - - } - - /// @brief Get next argument. - IPC::Request::DataBlock * IPC::Request::getNextBlock() const { - - if((in.current + sizeof(IPC::Request::DataBlock)) >= in.used) { - throw std::runtime_error("Out of range"); - } - - return (IPC::Request::DataBlock *) (in.block + in.current); - - } - - IPC::Request & IPC::Request::push(const char *arg) { - pushBlock(arg, strlen(arg)+1)->type = IPC::Request::String; - return *this; - } - - IPC::Request & IPC::Request::push(const bool arg) { - uint8_t value = (uint8_t) (arg ? 0xff : 0); - pushBlock(&value, sizeof(value))->type = IPC::Request::Boolean; - return *this; - } - - IPC::Request & IPC::Request::push(const uint8_t arg) { - pushBlock(&arg, sizeof(arg))->type = IPC::Request::Uchar; - return *this; - } - - IPC::Request & IPC::Request::push(const int32_t arg) { - pushBlock(&arg, sizeof(arg))->type = IPC::Request::Int32; - return *this; - } - - IPC::Request & IPC::Request::push(const uint32_t arg) { - pushBlock(&arg, sizeof(arg))->type = IPC::Request::Uint32; - return *this; - } - - IPC::Request & IPC::Request::pop(std::string &value) { - DataBlock * block = getNextBlock(); - - if(block->type != IPC::Request::String) - throw std::runtime_error("Invalid format"); - - const char *ptr = (const char *) (block+1); - - in.current += (strlen(ptr)+1+sizeof(DataBlock)); - - value.assign(ptr); - - return *this; - } - - IPC::Request & IPC::Request::Request::pop(int &value) { - - DataBlock * block = getNextBlock(); - - switch(block->type) { - case IPC::Request::Int16: - value = * ((int16_t *) (block+1)); - in.current += sizeof(int16_t) + sizeof(DataBlock); - break; - - case IPC::Request::Int32: - value = * ((int32_t *) (block+1)); - in.current += sizeof(int32_t) + sizeof(DataBlock); - break; - - case IPC::Request::Int64: - value = * ((int64_t *) (block+1)); - in.current += sizeof(int64_t) + sizeof(DataBlock); - break; - - default: - throw std::runtime_error("Invalid format"); - } - - return *this; - } - - } - - diff --git a/src/client/src/os/windows/resources.rc.in b/src/client/src/os/windows/resources.rc.in deleted file mode 100644 index eac7424..0000000 --- a/src/client/src/os/windows/resources.rc.in +++ /dev/null @@ -1,29 +0,0 @@ -#include - -VS_VERSION_INFO VERSIONINFO -FILEVERSION @PACKAGE_MAJOR_VERSION@,@PACKAGE_MINOR_VERSION@,@PACKAGE_MAJOR_RELEASE@,0 -PRODUCTVERSION @PACKAGE_MAJOR_VERSION@,@PACKAGE_MINOR_VERSION@,@PACKAGE_MAJOR_RELEASE@,0 - -BEGIN - - BLOCK "StringFileInfo" - BEGIN - BLOCK "080904E4" - BEGIN - VALUE "FileDescription", "3270 C++ Access Library\0" - VALUE "CompanyName", "Banco do Brasil S/A.\0" - VALUE "FileVersion", "@WIN32_VERSION@\0" - VALUE "LegalCopyright", "(C) 2017 Banco do Brasil S/A. All Rights Reserved\0" - VALUE "OriginalFilename", "@PACKAGE_TARNAME@@DLLEXT@\0" - VALUE "ProductName", "@PACKAGE_NAME@\0" - VALUE "ProductVersion", "@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@.@PACKAGE_MAJOR_RELEASE@.0\0" - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x809, 0x04E4 - END - -END - diff --git a/src/client/src/os/windows/session.cc b/src/client/src/os/windows/session.cc deleted file mode 100644 index a35ab24..0000000 --- a/src/client/src/os/windows/session.cc +++ /dev/null @@ -1,142 +0,0 @@ -/* - * "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/windows/session.cc - * - * @brief Implements WIN32 remote session methods. - * - * @author perry.werneck@gmail.com - * - */ - - #include "../private.h" - #include - #include - #include - - using std::string; - -/*---[ Implement ]----------------------------------------------------------------------------------*/ - - namespace TN3270 { - - IPC::Session::Session(const char *id) : Abstract::Session() { - - char *ptr = strchr(id,':'); - - if(!ptr) - throw std::system_error(EINVAL, std::system_category()); - - string pipename{"\\\\.\\pipe\\"}; - - pipename += string(id,ptr - id); - pipename += "\\"; - pipename += (ptr+1); - - std::transform(pipename.begin(), pipename.end(), pipename.begin(), ::tolower); - - debug("pipename: \"%s\"",pipename.c_str()); - - this->hPipe = CreateFile( - TEXT(pipename.c_str()), // pipe name - GENERIC_READ | // read and write access - GENERIC_WRITE, - 0, // no sharing - NULL, // default security attributes - OPEN_EXISTING, // opens existing pipe - 0, // default attributes - NULL // no template file - ); - - if (hPipe == INVALID_HANDLE_VALUE) { - throw std::runtime_error("Can't open IPC Channel"); - } - - // The pipe connected; change to message-read mode. - DWORD dwMode = PIPE_READMODE_MESSAGE; - if(!SetNamedPipeHandleState(hPipe,&dwMode,NULL,NULL)) { - throw std::runtime_error("Can't set IPC Channel mode"); - } - - } - - IPC::Session::~Session() { - CloseHandle(this->hPipe); - } - - - IPC::Request & IPC::Request::call() { - -#ifdef DEBUG - // lib3270_trace_data(NULL,"Request block",(const char *) this->out.block, this->out.used); -#endif // DEBUG - - in.current = 0; - - if(!TransactNamedPipe( - this->hPipe, - this->out.block, - this->out.used, - this->in.block, - this->in.length, - &this->in.used, - NULL) - ) { - - throw std::runtime_error("Can't transact on IPC Channel"); - - } - - debug("Received response \"", in.block, "\" with ", in.used, " bytes"); -#ifdef DEBUG - // lib3270_trace_data(NULL,"Response block",(const char *) this->in.block, this->in.used); -#endif // DEBUG - - // Extract response name - in.current = strlen((const char *) in.block)+1; - - // Extract return code - uint16_t rc = *((uint16_t *) (in.block + in.current)); - in.current += sizeof(uint16_t); - - // Extract argc - uint16_t argc = *((uint16_t *) (in.block + in.current)); - in.current += sizeof(uint16_t); - - debug("Received response \"", ((const char *) in.block), "\" with rc=", rc, " and ", argc, " arguments"); - - return *this; - } - - - - } - - diff --git a/src/client/src/session/local/events.cc b/src/client/src/session/local/events.cc deleted file mode 100644 index 647a3cd..0000000 --- a/src/client/src/session/local/events.cc +++ /dev/null @@ -1,175 +0,0 @@ -/* - * "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/session/local/events.cc - * - * @brief Implement lib3270 direct access events. - * - * @author perry.werneck@gmail.com - * - */ - - #include "../private.h" - #include - - extern "C" { - #include - #include - } - - using std::string; - -/*---[ Implement ]----------------------------------------------------------------------------------*/ - -#ifndef HAVE_VASPRINTF - int vasprintf(char **strp, const char *fmt, va_list ap) { - char buf[1024]; - - int nc = vsnprintf(buf, sizeof(buf), fmt, args); - - if(nc < 0) { - - *strp = strdup(_("Error in vasprintf")); - - } else if (nc < sizeof(buf)) { - - *strp = malloc(nc+1); - strcpy(*strp, buf); - - } else { - - *strp = malloc(nc + 1); - if(vsnprintf(*strp, nc, fmt, args) < 0) { - free(*strp); - *strp = strdup(NULL,_( "Out of memory in vasprintf" ) ); - } - - } - - return nc; - } -#endif // !HAVE_VASPRINTF - - namespace TN3270 { - - /// @brief Popup Handler. - void Local::Session::popupHandler(H3270 *h3270, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list arg) { - - Local::Session * session = (Local::Session *) lib3270_get_user_data(h3270); - - if(!session) { - throw std::runtime_error(_( "Invalid session handler" )); - } - - class PopupEvent : public TN3270::Event { - private: - LIB3270_NOTIFY type; - string title; - string msg; - string description; - - public: - PopupEvent(LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list arg) : Event(Event::Popup) { - - this->type = type; - this->title = title; - this->msg = msg; - - char * buffer = NULL; - if(vasprintf(&buffer,fmt,arg) != -1) { - this->description = buffer; - free(buffer); - } - -#ifdef DEBUG - std::cerr << "Popup:" << std::endl - << "\t" << title << std::endl - << "\t" << msg << std::endl - << "\t" << description << std::endl; -#endif // DEBUG - - } - - virtual ~PopupEvent() { - } - - /// @brief Get event description. - std::string toString() const override { - return msg; - } - - - }; - - session->fire(PopupEvent(type,title,msg,fmt,arg)); - - } - - /// @brief Connect Handler. - void Local::Session::connectHandler(H3270 *h3270, unsigned char connected) { - - Local::Session * session = (Local::Session *) lib3270_get_user_data(h3270); - - if(!session) { - throw std::runtime_error(_("Invalid session handler")); - } - - class ConnectionEvent : public TN3270::Event { - private: - bool connected; - - public: - ConnectionEvent(unsigned char connected) : Event(Event::Connection) { - this->connected = (connected != 0); - -#ifdef DEBUG - std::cerr << "Session is " << this->toString().c_str() << std::endl; -#endif // DEBUG - - } - - virtual ~ConnectionEvent() { - } - - /// @brief Get event description. - std::string toString() const override { - return this->connected ? _("connected") : _("disconnected"); - } - - }; - - session->fire(ConnectionEvent(connected)); - - } - - - } - - diff --git a/src/client/src/session/local/session.cc b/src/client/src/session/local/session.cc deleted file mode 100644 index 5816200..0000000 --- a/src/client/src/session/local/session.cc +++ /dev/null @@ -1,389 +0,0 @@ -/* - * "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/session/local/session.cc - * - * @brief Implement lib3270 direct access layout (NO IPC). - * - * @author perry.werneck@gmail.com - * - */ - - #include "../private.h" - #include - #include - #include - - extern "C" { - #include - } - - using std::string; - -/*---[ Implement ]----------------------------------------------------------------------------------*/ - - namespace TN3270 { - - Local::Session::Session() : Abstract::Session() { - - std::lock_guard lock(sync); - - this->hSession = lib3270_session_new(""); - lib3270_set_user_data(this->hSession,(void *) this); - setCharSet(lib3270_get_display_charset(this->hSession)); - - lib3270_set_popup_handler(this->hSession, popupHandler); - - // Setup callbacks - struct lib3270_session_callbacks *cbk; - - cbk = lib3270_get_session_callbacks(this->hSession,sizeof(struct lib3270_session_callbacks)); - if(!cbk) { - throw std::runtime_error( _("Invalid callback table, possible version mismatch in lib3270") ); - } - - cbk->update_connect = connectHandler; - - - } - - Local::Session::~Session() { - - std::lock_guard lock(sync); - - lib3270_session_free(this->hSession); - this->hSession = nullptr; - } - - void Local::Session::wait(time_t timeout) { - - std::lock_guard lock(sync); - - int rc = lib3270_wait_for_ready(this->hSession, timeout); - - if(rc) { - throw std::system_error(rc, std::system_category()); - } - - } - - void Local::Session::connect(const char *url) { - std::lock_guard lock(sync); - int rc = lib3270_connect_url(hSession,url,0); - - if(rc) { - throw std::system_error(rc, std::system_category()); - } - - } - - void Local::Session::disconnect() { - std::lock_guard lock(sync); - lib3270_disconnect(hSession); - } - - // Wait for session state. - void Local::Session::waitForReady(time_t timeout) throw() { - this->wait(timeout); - } - - std::string Local::Session::toString(int baddr, size_t len, char lf) const { - - std::lock_guard lock(const_cast(this)->sync); - - char * text = lib3270_get_string_at_address(hSession, baddr, len, lf); - - if(!text) { - throw std::runtime_error( _("Can't get screen contents") ); - } - - string rc = convertFromHost(text); - - lib3270_free(text); - - return rc; - - } - - std::string Local::Session::toString(int row, int col, size_t sz, char lf) const { - - std::lock_guard lock(const_cast(this)->sync); - - char * text = lib3270_get_string_at(hSession, row, col, sz, lf); - - if(!text) { - throw std::runtime_error( _("Can't get screen contents") ); - } - - string rc = convertFromHost(text); - - lib3270_free(text); - - return rc; - } - - void Local::Session::getProperty(const char *name, int &value) const { - - const LIB3270_INT_PROPERTY * intprop = lib3270_get_int_properties_list(); - for(size_t ix = 0; intprop[ix].name; ix++) { - - if(!strcasecmp(name,intprop[ix].name)) { - - std::lock_guard lock(const_cast(this)->sync); - - value = intprop[ix].get(hSession); - - if(value < 0 && errno != 0) { - throw std::system_error(errno, std::system_category()); - } - - - } - - } - - throw std::system_error(ENOENT, std::system_category()); - - } - - void Local::Session::getProperty(const char *name, std::string &value) const { - - const LIB3270_STRING_PROPERTY * strprop = lib3270_get_string_properties_list(); - - for(size_t ix = 0; strprop[ix].name; ix++) { - - if(!strcasecmp(name,strprop[ix].name)) { - - std::lock_guard lock(const_cast(this)->sync); - - // Found it! - const char * str = strprop[ix].get(hSession); - - if(str) { - value.assign(str); - return; - } - - throw std::system_error(errno, std::system_category()); - - } - - } - - throw std::system_error(ENOENT, std::system_category()); - } - - void Local::Session::getProperty(const char *name, bool &value) const { - - LIB3270_TOGGLE toggle = lib3270_get_toggle_id(name); - if(toggle != (LIB3270_TOGGLE) -1) { - - // Is a Tn3270 toggle, get it! - std::lock_guard lock(const_cast(this)->sync); - value = lib3270_get_toggle(hSession,toggle); - - } - - throw std::system_error(ENOENT, std::system_category()); - } - - ProgramMessage Local::Session::getProgramMessage() const { - std::lock_guard lock(const_cast(this)->sync); - return (ProgramMessage) lib3270_get_program_message(this->hSession); - } - - ConnectionState Local::Session::getConnectionState() const { - std::lock_guard lock(const_cast(this)->sync); - return (ConnectionState) lib3270_get_connection_state(this->hSession); - } - - /// @brief Set field at current position, jumps to next writable field. - TN3270::Session & Local::Session::push(const char *text) { - std::lock_guard lock(sync); - return *this; - } - - TN3270::Session & Local::Session::push(int baddr, const std::string &text) { - std::lock_guard lock(sync); - return *this; - } - - TN3270::Session & Local::Session::push(int row, int col, const std::string &text) { - std::lock_guard lock(sync); - return *this; - } - - TN3270::Session & Local::Session::push(const PFKey key) { - std::lock_guard lock(sync); - lib3270_pfkey(hSession,(int) key); - return *this; - } - - TN3270::Session & Local::Session::push(const PAKey key) { - std::lock_guard lock(sync); - lib3270_pakey(hSession,(int) key); - return *this; - } - - TN3270::Session & Local::Session::push(const Action action) { - - typedef int (*ActionCallback)(H3270 *); - - static const ActionCallback actions[] = { - lib3270_enter, - lib3270_erase, - lib3270_eraseeof, - lib3270_eraseeol, - lib3270_eraseinput - }; - - if( ((size_t) action) > (sizeof(actions)/sizeof(actions[0]))) { - throw std::system_error(EINVAL, std::system_category()); - } - - std::lock_guard lock(sync); - - int rc = actions[(size_t) action](hSession); - - if(rc) { - throw std::system_error(errno, std::system_category()); - } - - return *this; - } - - TN3270::Session & Local::Session::pop(int baddr, std::string &text) { - - std::lock_guard lock(sync); - - if(!lib3270_is_connected(hSession)) { - throw std::system_error(ENOTCONN, std::system_category()); - } - - char *contents = lib3270_get_field_text_at(hSession, baddr); - - if(!contents) { - throw std::system_error(errno, std::system_category()); - } - - text.assign(convertFromHost(contents).c_str()); - - lib3270_free(contents); - - return *this; - } - - TN3270::Session & Local::Session::pop(int row, int col, std::string &text) { - return this->pop(lib3270_translate_to_address(hSession,row,col),text); - } - - TN3270::Session & Local::Session::pop(std::string &text) { - - std::lock_guard lock(sync); - - if(!lib3270_is_connected(hSession)) { - throw std::system_error(ENOTCONN, std::system_category()); - } - - int baddr = lib3270_get_cursor_address(hSession); - if(baddr < 0) { - throw std::system_error(errno, std::system_category()); - } - - char *contents = lib3270_get_field_text_at(hSession, baddr); - - if(!contents) { - throw std::system_error(errno, std::system_category()); - } - - text.assign(convertFromHost(contents).c_str()); - - lib3270_free(contents); - - baddr = lib3270_get_next_unprotected(hSession,baddr); - if(!baddr) { - baddr = lib3270_get_next_unprotected(hSession,0); - } - - if(lib3270_set_cursor_address(hSession,baddr)) { - throw std::system_error(errno, std::system_category()); - } - - return *this; - } - - /// @brief Set cursor address. - /// - /// @param addr Cursor address. - TN3270::Session & Local::Session::setCursorPosition(unsigned short addr) { - - if(lib3270_set_cursor_address(hSession,addr) < 0) { - throw std::system_error(errno, std::system_category()); - } - - return *this; - } - - /// @brief Set cursor position. - /// - /// @param row New cursor row. - /// @param col New cursor column. - TN3270::Session & Local::Session::setCursorPosition(unsigned short row, unsigned short col) { - - if(lib3270_set_cursor_position(hSession,row,col)) { - throw std::system_error(errno, std::system_category()); - } - - return *this; - - } - - // Get properties. - std::string Local::Session::getVersion() const { - return lib3270_get_version(); - } - - std::string Local::Session::getRevision() const { - return lib3270_get_revision(); - } - - /// @brief Execute action by name. - TN3270::Session & Local::Session::action(const char *action_name) { - - if(lib3270_action(hSession,action_name)) { - throw std::system_error(errno, std::system_category()); - } - - return *this; - } - - } - - diff --git a/src/client/src/session/remote/session.cc b/src/client/src/session/remote/session.cc deleted file mode 100644 index 65e2d9a..0000000 --- a/src/client/src/session/remote/session.cc +++ /dev/null @@ -1,365 +0,0 @@ -/* - * "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/session/remote/session.cc - * - * @brief Implements lib3270 access using IPC calls. - * - * @author perry.werneck@gmail.com - * - */ - - #include "../private.h" - #include - - using std::string; - -/*---[ Implement ]----------------------------------------------------------------------------------*/ - - namespace TN3270 { - - void IPC::Session::connect(const char *url) { - Request request(*this,"connect"); - request.push(url).call(); - } - - void IPC::Session::disconnect() { - Request(*this,"disconnect").call(); - } - - // Wait for session state. - void IPC::Session::waitForReady(time_t timeout) { - - int rc; - - time_t end = time(nullptr) + timeout; - - while(time(nullptr) < end) { - - debug("Running waitForReady request..."); - - Request(*this,"waitForReady") - .push((uint32_t) 1) - .call() - .pop(rc); - - debug("Wait for ready returned ",rc); - - if(rc == 0) - return; - - } - - throw std::system_error(ETIMEDOUT, std::system_category()); - } - - std::string IPC::Session::toString(int baddr, size_t len, char lf) const { - - std::string rc; - - Request(*this,"getStringAtAddress") - .push((uint32_t) baddr) - .push((uint32_t) len) - .push((uint8_t) lf) - .call() - .pop(rc); - - return rc; - } - - std::string IPC::Session::toString(int row, int col, size_t sz, char lf) const { - - std::string rc; - - Request(*this,"getStringAt") - .push((uint32_t) row) - .push((uint32_t) col) - .push((uint32_t) sz) - .push((uint8_t) lf) - .call() - .pop(rc); - - return rc; - } - - ProgramMessage IPC::Session::getProgramMessage() const { - - int program_message; - getProperty("program_message",program_message); - return (ProgramMessage) program_message; - - } - - ConnectionState IPC::Session::getConnectionState() const { - - int cstate; - getProperty("cstate",cstate); - return (ConnectionState) cstate; - - } - - /// @brief Set field at current position, jumps to next writable field. - TN3270::Session & IPC::Session::push(const char *text) { - - int rc; - - Request(*this,"setString") - .push(text) - .call() - .pop(rc); - - if(rc) { - throw std::system_error((int) rc, std::system_category()); - } - - return *this; - - } - - TN3270::Session & IPC::Session::push(int baddr, const std::string &text) { - - int rc; - - Request(*this,"setStringAtAddress") - .push((uint32_t) baddr) - .push(text.c_str()) - .call() - .pop(rc); - - if(rc) { - throw std::system_error((int) rc, std::system_category()); - } - - return *this; - - } - - TN3270::Session & IPC::Session::push(int row, int col, const std::string &text) { - - int32_t rc; - - Request(*this,"setStringAt") - .push((uint32_t) row) - .push((uint32_t) col) - .push(text.c_str()) - .call() - .pop(rc); - - if(rc) { - throw std::system_error((int) rc, std::system_category()); - } - - return *this; - - } - - TN3270::Session & IPC::Session::push(const PFKey key) { - - int32_t rc; - - Request(*this,"pfkey") - .push((uint32_t) key) - .call() - .pop(rc); - - if(rc) { - throw std::system_error((int) rc, std::system_category()); - } - - return *this; - - } - - TN3270::Session & IPC::Session::push(const PAKey key) { - - int32_t rc; - - Request(*this,"pakey") - .push((uint32_t) key) - .call() - .pop(rc); - - if(rc) { - throw std::system_error((int) rc, std::system_category()); - } - - return *this; - - } - - TN3270::Session & IPC::Session::push(const Action action) { - - const char * actions[] = { - "enter", - "erase", - "eraseeof", - "eraseeol", - "eraseinput" - }; - - if( ((size_t) action) > (sizeof(actions)/sizeof(actions[0]))) { - throw std::system_error(EINVAL, std::system_category()); - } - - return this->action(actions[action]); - - } - - TN3270::Session & IPC::Session::pop(int baddr, std::string &text) { - - Request(*this,"getFieldAtAddress") - .push((uint32_t) baddr) - .call() - .pop(text); - - return *this; - } - - TN3270::Session & IPC::Session::pop(int row, int col, std::string &text) { - - Request(*this,"getFieldAt") - .push((uint32_t) row) - .push((uint32_t) col) - .call() - .pop(text); - - return *this; - } - - TN3270::Session & IPC::Session::pop(std::string &text) { - - Request(*this,"getFieldAtCursor") - .call() - .pop(text); - - return *this; - - } - - /// @brief Set cursor address. - /// - /// @param addr Cursor address. - TN3270::Session & IPC::Session::setCursorPosition(unsigned short addr) { - - int32_t rc; - - Request(*this,"setCursorAddress") - .push((uint32_t) addr) - .call() - .pop(rc); - - if(rc) { - throw std::system_error((int) rc, std::system_category()); - } - - return *this; - - } - - /// @brief Set cursor position. - /// - /// @param row New cursor row. - /// @param col New cursor column. - TN3270::Session & IPC::Session::setCursorPosition(unsigned short row, unsigned short col) { - - int32_t rc; - - Request(*this,"setCursorPosition") - .push((uint32_t) row) - .push((uint32_t) col) - .call() - .pop(rc); - - if(rc) { - throw std::system_error((int) rc, std::system_category()); - } - - return *this; - - } - - void IPC::Session::getProperty(const char *name, int &value) const { - - Request(*this,false,name) - .call() - .pop(value); - - } - - void IPC::Session::getProperty(const char *name, std::string &value) const { - - Request(*this,false,name) - .call() - .pop(value); - - } - - void IPC::Session::getProperty(const char *name, bool &value) const { - throw std::system_error(ENOENT, std::system_category()); - } - - /// @brief Get lib3270 version. - std::string IPC::Session::getVersion() const { - - string rc; - getProperty("version",rc); - return rc; - - } - - /// @brief Get lib3270 revision. - std::string IPC::Session::getRevision() const { - - string rc; - getProperty("revision",rc); - return rc; - - } - - /// @brief Execute action by name. - TN3270::Session & IPC::Session::action(const char *action_name) { - - int32_t rc; - - Request(*this,"action") - .push(action_name) - .call() - .pop(rc); - - if(rc) { - throw std::system_error((int) rc, std::system_category()); - } - - return *this; - } - - } - - diff --git a/src/client/src/testprogram/testprogram.cc b/src/client/src/testprogram/testprogram.cc deleted file mode 100644 index 11601fc..0000000 --- a/src/client/src/testprogram/testprogram.cc +++ /dev/null @@ -1,103 +0,0 @@ -/* - * "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/lib3270++/testprogram/testprogram.cc - * - * @brief - * - * @author perry.werneck@gmail.com - * - */ - - #include - #include - #include - - using namespace std; - -/*---[ Implement ]----------------------------------------------------------------------------------*/ - - int main(int argc, char **argv) { - - const char * session = "pw3270:a"; - - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" - static struct option options[] = { - { "session", required_argument, 0, 's' }, - { 0, 0, 0, 0} - - }; - #pragma GCC diagnostic pop - - int long_index =0; - int opt; - while((opt = getopt_long(argc, argv, "s:", options, &long_index )) != -1) { - - switch(opt) { - case 's': - session = optarg; - break; - - } - - } - - TN3270::Host host{session}; - - try { - - cout - << "Version: " << host.getVersion() - << "\tRevision: " << host.getRevision() - << std::endl; - - cout - << "Connection state is " << host.getConnectionState() - << "\tProgram message is " << host.getProgramMessage() - << std::endl; - - // host.connect(getenv("LIB3270_DEFAULT_HOST")); - - if(host) { - cout << host << endl; - } - - } catch(const std::exception &e) { - - cerr << std::endl << e.what() << std::endl << std::endl; - - } - - - return 0; - } - - diff --git a/src/client/valgrind.suppression b/src/client/valgrind.suppression deleted file mode 100644 index e69de29..0000000 --- a/src/client/valgrind.suppression +++ /dev/null -- libgit2 0.21.2