Commit b44182376011d616f819ae3d500845641155eec8
1 parent
eafd36f1
Exists in
master
and in
1 other branch
Reorganizing modules.
Showing
35 changed files
with
2040 additions
and
1955 deletions
Show diff stats
.gitignore
Makefile.in
| ... | ... | @@ -30,16 +30,16 @@ MODULE_NAME=ipc3270 |
| 30 | 30 | PACKAGE_NAME=@PACKAGE_NAME@ |
| 31 | 31 | |
| 32 | 32 | CORE_SOURCES= \ |
| 33 | - $(wildcard src/*.c) \ | |
| 34 | - $(wildcard src/@OSNAME@/*.c) | |
| 33 | + $(wildcard src/core/*.c) \ | |
| 34 | + $(wildcard src/core/@OSNAME@/*.c) | |
| 35 | 35 | |
| 36 | 36 | PLUGIN_SOURCES= \ |
| 37 | 37 | $(wildcard src/plugin/*.c) \ |
| 38 | - $(wildcard src/@OSNAME@/*.rc) | |
| 38 | + $(wildcard src/plugin/@OSNAME@/*.rc) | |
| 39 | 39 | |
| 40 | 40 | SERVICE_SOURCES= \ |
| 41 | 41 | $(wildcard src/service/*.c) \ |
| 42 | - $(wildcard src/@OSNAME@/*.rc) | |
| 42 | + $(wildcard src/service/@OSNAME@/*.rc) | |
| 43 | 43 | |
| 44 | 44 | TEST_SOURCES= \ |
| 45 | 45 | $(wildcard src/testprogram/*.c) |
| ... | ... | @@ -88,8 +88,7 @@ BINRLS=$(BINDIR)/Release |
| 88 | 88 | DEPENDS= \ |
| 89 | 89 | Makefile \ |
| 90 | 90 | src/include/*.h \ |
| 91 | - src/include/lib3270/*.h \ | |
| 92 | - src/linux/*.h | |
| 91 | + src/include/lib3270/*.h | |
| 93 | 92 | |
| 94 | 93 | CFLAGS= \ |
| 95 | 94 | @CFLAGS@ \ |
| ... | ... | @@ -195,7 +194,7 @@ $(BINRLS)/lib$(MODULE_NAME).a: \ |
| 195 | 194 | |
| 196 | 195 | $(BINRLS)/$(MODULE_NAME)@DLLEXT@: \ |
| 197 | 196 | $(foreach SRC, $(basename $(PLUGIN_SOURCES)), $(OBJRLS)/$(SRC).o) \ |
| 198 | - $(foreach SRC, $(basename $(CORE_SOURCES)), $(OBJRLS)/$(SRC).o) | |
| 197 | + $(BINRLS)/lib$(MODULE_NAME).a | |
| 199 | 198 | |
| 200 | 199 | @$(MKDIR) `dirname $@` |
| 201 | 200 | @echo $< ... |
| ... | ... | @@ -204,8 +203,8 @@ $(BINRLS)/$(MODULE_NAME)@DLLEXT@: \ |
| 204 | 203 | -o $@ \ |
| 205 | 204 | $(LDFLAGS) \ |
| 206 | 205 | $(foreach SRC, $(basename $(PLUGIN_SOURCES)), $(OBJRLS)/$(SRC).o) \ |
| 207 | - $(foreach SRC, $(basename $(CORE_SOURCES)), $(OBJRLS)/$(SRC).o) \ | |
| 208 | - $(LIBS) | |
| 206 | + $(LIBS) \ | |
| 207 | + -L$(BINRLS) -l$(MODULE_NAME) | |
| 209 | 208 | |
| 210 | 209 | #---[ Install Targets ]------------------------------------------------------------------ |
| 211 | 210 | |
| ... | ... | @@ -247,6 +246,9 @@ Debug-plugin: \ |
| 247 | 246 | Debug-service: \ |
| 248 | 247 | $(BINDBG)/$(PACKAGE_NAME)d@EXEEXT@ |
| 249 | 248 | |
| 249 | +x: | |
| 250 | + @echo $(foreach SRC, $(basename $(CORE_SOURCES)), $(OBJDBG)/$(SRC).o) | |
| 251 | + | |
| 250 | 252 | $(BINDBG)/lib$(MODULE_NAME).a: \ |
| 251 | 253 | $(foreach SRC, $(basename $(CORE_SOURCES)), $(OBJDBG)/$(SRC).o) |
| 252 | 254 | |
| ... | ... | @@ -309,12 +311,9 @@ $(BINDBG)/@DLLPREFIX@$(MODULE_NAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@: \ |
| 309 | 311 | @DLLPREFIX@$(MODULE_NAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@ \ |
| 310 | 312 | $@ |
| 311 | 313 | |
| 312 | -x: \ | |
| 313 | - $(BINDBG)/@DLLPREFIX@$(MODULE_NAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@ | |
| 314 | - | |
| 315 | 314 | $(BINDBG)/@DLLPREFIX@$(MODULE_NAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@: \ |
| 316 | 315 | $(foreach SRC, $(basename $(PLUGIN_SOURCES)), $(OBJDBG)/$(SRC).o) \ |
| 317 | - $(foreach SRC, $(basename $(CORE_SOURCES)), $(OBJDBG)/$(SRC).o) | |
| 316 | + $(BINDBG)/lib$(MODULE_NAME).a | |
| 318 | 317 | |
| 319 | 318 | @$(MKDIR) `dirname $@` |
| 320 | 319 | @echo $< ... |
| ... | ... | @@ -323,8 +322,8 @@ $(BINDBG)/@DLLPREFIX@$(MODULE_NAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MIN |
| 323 | 322 | -o $@ \ |
| 324 | 323 | $(LDFLAGS) \ |
| 325 | 324 | $(foreach SRC, $(basename $(PLUGIN_SOURCES)), $(OBJDBG)/$(SRC).o) \ |
| 326 | - $(foreach SRC, $(basename $(CORE_SOURCES)), $(OBJDBG)/$(SRC).o) \ | |
| 327 | - $(LIBS) | |
| 325 | + $(LIBS) \ | |
| 326 | + -L$(BINDBG) -l$(MODULE_NAME) | |
| 328 | 327 | |
| 329 | 328 | #---[ Clean Targets ]-------------------------------------------------------------------- |
| 330 | 329 | ... | ... |
configure.ac
| ... | ... | @@ -84,7 +84,8 @@ case "$host" in |
| 84 | 84 | |
| 85 | 85 | app_win32_revision=$(date +%y.%m.%d.%H) |
| 86 | 86 | AC_SUBST(WIN32_VERSION,$app_win32_revision) |
| 87 | - AC_CONFIG_FILES(src/windows/resources.rc) | |
| 87 | + AC_CONFIG_FILES(src/core/windows/resources.rc) | |
| 88 | + AC_CONFIG_FILES(src/plugin/windows/resources.rc) | |
| 88 | 89 | ;; |
| 89 | 90 | |
| 90 | 91 | s390x-*) | ... | ... |
pw3270-plugin-ipc.cbp
| ... | ... | @@ -69,6 +69,9 @@ |
| 69 | 69 | </Unit> |
| 70 | 70 | <Unit filename="src/include/config.h.in" /> |
| 71 | 71 | <Unit filename="src/include/lib3270/ipc.h" /> |
| 72 | + <Unit filename="src/inout.c"> | |
| 73 | + <Option compilerVar="CC" /> | |
| 74 | + </Unit> | |
| 72 | 75 | <Unit filename="src/linux/gobject.c"> |
| 73 | 76 | <Option compilerVar="CC" /> |
| 74 | 77 | </Unit> | ... | ... |
src/constants.c
| ... | ... | @@ -1,51 +0,0 @@ |
| 1 | -/* | |
| 2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | - * | |
| 6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | - * | |
| 8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | - * Free Software Foundation. | |
| 11 | - * | |
| 12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | - * obter mais detalhes. | |
| 16 | - * | |
| 17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | - * | |
| 21 | - * Este programa está nomeado como main.c e possui - linhas de código. | |
| 22 | - * | |
| 23 | - * Referências: | |
| 24 | - * | |
| 25 | - * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c | |
| 26 | - * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c | |
| 27 | - * | |
| 28 | - * Contatos: | |
| 29 | - * | |
| 30 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 31 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 32 | - * | |
| 33 | - */ | |
| 34 | - | |
| 35 | -#include <lib3270.h> | |
| 36 | -#include <lib3270/actions.h> | |
| 37 | -#include <lib3270/ipc.h> | |
| 38 | - | |
| 39 | -const IPC_METHOD_INT_ARG * ipc3270_get_int_arg_methods() { | |
| 40 | - | |
| 41 | - static const IPC_METHOD_INT_ARG int_arg_methods[] = { | |
| 42 | - { "pfkey", lib3270_pfkey }, | |
| 43 | - { "pakey", lib3270_pakey }, | |
| 44 | - { NULL, NULL } | |
| 45 | - }; | |
| 46 | - | |
| 47 | - return int_arg_methods; | |
| 48 | - | |
| 49 | -} | |
| 50 | - | |
| 51 | - |
src/convert.c
| ... | ... | @@ -1,59 +0,0 @@ |
| 1 | -/* | |
| 2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | - * | |
| 6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | - * | |
| 8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | - * Free Software Foundation. | |
| 11 | - * | |
| 12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | - * obter mais detalhes. | |
| 16 | - * | |
| 17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | - * | |
| 21 | - * Este programa está nomeado como main.c e possui - linhas de código. | |
| 22 | - * | |
| 23 | - * Referências: | |
| 24 | - * | |
| 25 | - * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c | |
| 26 | - * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c | |
| 27 | - * | |
| 28 | - * Contatos: | |
| 29 | - * | |
| 30 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 31 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 32 | - * | |
| 33 | - */ | |
| 34 | - | |
| 35 | -#include <lib3270.h> | |
| 36 | -#include <lib3270/actions.h> | |
| 37 | -#include <lib3270/ipc.h> | |
| 38 | - | |
| 39 | -gchar * ipc3270_convert_output_string(GObject *object, const gchar *string, GError **error) { | |
| 40 | - return g_convert_with_fallback(string,-1,ipc3270_get_display_charset(object),"UTF-8","?",NULL,NULL,error); | |
| 41 | -} | |
| 42 | - | |
| 43 | -gchar * ipc3270_convert_input_string(GObject *object, const gchar *string, GError **error) { | |
| 44 | - return g_convert_with_fallback(string,-1,"UTF-8",ipc3270_get_display_charset(object),"?",NULL,NULL,error); | |
| 45 | -} | |
| 46 | - | |
| 47 | -GVariant * ipc3270_GVariant_from_input_string(GObject *object, char *string, GError **error) { | |
| 48 | - | |
| 49 | - if(string) { | |
| 50 | - g_autofree gchar * utfstring = ipc3270_convert_input_string(object,string,error); | |
| 51 | - lib3270_free(string); | |
| 52 | - return g_variant_new("(s)", utfstring); | |
| 53 | - } | |
| 54 | - | |
| 55 | - ipc3270_set_error(object,errno,error); | |
| 56 | - return g_variant_new("(s)", ""); | |
| 57 | -} | |
| 58 | - | |
| 59 | - |
| ... | ... | @@ -0,0 +1,51 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | + * | |
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | + * | |
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | + * Free Software Foundation. | |
| 11 | + * | |
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | + * obter mais detalhes. | |
| 16 | + * | |
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | + * | |
| 21 | + * Este programa está nomeado como main.c e possui - linhas de código. | |
| 22 | + * | |
| 23 | + * Referências: | |
| 24 | + * | |
| 25 | + * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c | |
| 26 | + * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c | |
| 27 | + * | |
| 28 | + * Contatos: | |
| 29 | + * | |
| 30 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 31 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 32 | + * | |
| 33 | + */ | |
| 34 | + | |
| 35 | +#include <lib3270.h> | |
| 36 | +#include <lib3270/actions.h> | |
| 37 | +#include <lib3270/ipc.h> | |
| 38 | + | |
| 39 | +const IPC_METHOD_INT_ARG * ipc3270_get_int_arg_methods() { | |
| 40 | + | |
| 41 | + static const IPC_METHOD_INT_ARG int_arg_methods[] = { | |
| 42 | + { "pfkey", lib3270_pfkey }, | |
| 43 | + { "pakey", lib3270_pakey }, | |
| 44 | + { NULL, NULL } | |
| 45 | + }; | |
| 46 | + | |
| 47 | + return int_arg_methods; | |
| 48 | + | |
| 49 | +} | |
| 50 | + | |
| 51 | + | ... | ... |
| ... | ... | @@ -0,0 +1,59 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | + * | |
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | + * | |
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | + * Free Software Foundation. | |
| 11 | + * | |
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | + * obter mais detalhes. | |
| 16 | + * | |
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | + * | |
| 21 | + * Este programa está nomeado como main.c e possui - linhas de código. | |
| 22 | + * | |
| 23 | + * Referências: | |
| 24 | + * | |
| 25 | + * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c | |
| 26 | + * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c | |
| 27 | + * | |
| 28 | + * Contatos: | |
| 29 | + * | |
| 30 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 31 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 32 | + * | |
| 33 | + */ | |
| 34 | + | |
| 35 | +#include <lib3270.h> | |
| 36 | +#include <lib3270/actions.h> | |
| 37 | +#include <lib3270/ipc.h> | |
| 38 | + | |
| 39 | +gchar * ipc3270_convert_output_string(GObject *object, const gchar *string, GError **error) { | |
| 40 | + return g_convert_with_fallback(string,-1,ipc3270_get_display_charset(object),"UTF-8","?",NULL,NULL,error); | |
| 41 | +} | |
| 42 | + | |
| 43 | +gchar * ipc3270_convert_input_string(GObject *object, const gchar *string, GError **error) { | |
| 44 | + return g_convert_with_fallback(string,-1,"UTF-8",ipc3270_get_display_charset(object),"?",NULL,NULL,error); | |
| 45 | +} | |
| 46 | + | |
| 47 | +GVariant * ipc3270_GVariant_from_input_string(GObject *object, char *string, GError **error) { | |
| 48 | + | |
| 49 | + if(string) { | |
| 50 | + g_autofree gchar * utfstring = ipc3270_convert_input_string(object,string,error); | |
| 51 | + lib3270_free(string); | |
| 52 | + return g_variant_new("(s)", utfstring); | |
| 53 | + } | |
| 54 | + | |
| 55 | + ipc3270_set_error(object,errno,error); | |
| 56 | + return g_variant_new("(s)", ""); | |
| 57 | +} | |
| 58 | + | |
| 59 | + | ... | ... |
| ... | ... | @@ -0,0 +1,128 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | + * | |
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | + * | |
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | + * Free Software Foundation. | |
| 11 | + * | |
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | + * obter mais detalhes. | |
| 16 | + * | |
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | + * | |
| 21 | + * Este programa está nomeado como main.c e possui - linhas de código. | |
| 22 | + * | |
| 23 | + * Referências: | |
| 24 | + * | |
| 25 | + * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c | |
| 26 | + * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c | |
| 27 | + * | |
| 28 | + * Contatos: | |
| 29 | + * | |
| 30 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 31 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 32 | + * | |
| 33 | + */ | |
| 34 | + | |
| 35 | +#include <config.h> | |
| 36 | +#include <lib3270/ipc.h> | |
| 37 | +#include <lib3270.h> | |
| 38 | +#include <lib3270/properties.h> | |
| 39 | + | |
| 40 | +// #include <dbus/dbus-glib.h> | |
| 41 | +// #include <dbus/dbus-glib-bindings.h> | |
| 42 | + | |
| 43 | +GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GError **error) { | |
| 44 | + | |
| 45 | + size_t ix; | |
| 46 | + errno = 0; // Just in case. | |
| 47 | + | |
| 48 | + // Boolean properties | |
| 49 | + const LIB3270_INT_PROPERTY * boolprop = lib3270_get_boolean_properties_list(); | |
| 50 | + for(ix = 0; boolprop[ix].name; ix++) { | |
| 51 | + | |
| 52 | + if(boolprop[ix].get && !g_ascii_strcasecmp(boolprop[ix].name, property_name)) { | |
| 53 | + | |
| 54 | + // Found it! | |
| 55 | + int value = boolprop[ix].get(ipc3270_get_session(object)); | |
| 56 | + | |
| 57 | + debug("%s=%d",property_name,value); | |
| 58 | + | |
| 59 | + if(value > 0 || errno == 0) { | |
| 60 | + return g_variant_new_boolean(value != 0); | |
| 61 | + } | |
| 62 | + | |
| 63 | + // Erro! | |
| 64 | + ipc3270_set_error(object,ENOENT,error); | |
| 65 | + return NULL; | |
| 66 | + | |
| 67 | + } | |
| 68 | + | |
| 69 | + } | |
| 70 | + | |
| 71 | + // int properties | |
| 72 | + const LIB3270_INT_PROPERTY * intprop = lib3270_get_int_properties_list(); | |
| 73 | + for(ix = 0; intprop[ix].name; ix++) { | |
| 74 | + | |
| 75 | + if(intprop[ix].get && !g_ascii_strcasecmp(intprop[ix].name, property_name)) { | |
| 76 | + | |
| 77 | + // Found it! | |
| 78 | + int value = intprop[ix].get(ipc3270_get_session(object)); | |
| 79 | + | |
| 80 | + debug("%s=%d",property_name,value); | |
| 81 | + | |
| 82 | + if(value > 0 || errno == 0) { | |
| 83 | + return g_variant_new_int16((gint16) value); | |
| 84 | + } | |
| 85 | + | |
| 86 | + // Erro! | |
| 87 | + ipc3270_set_error(object,errno,error); | |
| 88 | + return NULL; | |
| 89 | + | |
| 90 | + } | |
| 91 | + | |
| 92 | + } | |
| 93 | + | |
| 94 | + // String properties | |
| 95 | + const LIB3270_STRING_PROPERTY * strprop = lib3270_get_string_properties_list(); | |
| 96 | + for(ix = 0; strprop[ix].name; ix++) { | |
| 97 | + | |
| 98 | + if(strprop[ix].get && !g_ascii_strcasecmp(strprop[ix].name, property_name)) { | |
| 99 | + | |
| 100 | + // Found it! | |
| 101 | + const char * value = strprop[ix].get(ipc3270_get_session(object)); | |
| 102 | + | |
| 103 | + if(value) { | |
| 104 | + debug("%s=%s",property_name,value); | |
| 105 | + return g_variant_new_string(value); | |
| 106 | + } | |
| 107 | + | |
| 108 | + // Erro! | |
| 109 | + ipc3270_set_error(object,errno,error); | |
| 110 | + return NULL; | |
| 111 | + | |
| 112 | + } | |
| 113 | + | |
| 114 | + } | |
| 115 | + | |
| 116 | + // Check for toggle | |
| 117 | + LIB3270_TOGGLE toggle = lib3270_get_toggle_id(property_name); | |
| 118 | + if(toggle != (LIB3270_TOGGLE) -1) { | |
| 119 | + | |
| 120 | + // Is a Tn3270 toggle, get it! | |
| 121 | + return g_variant_new_boolean(lib3270_get_toggle( (ipc3270_get_session(object)), toggle) != 0); | |
| 122 | + | |
| 123 | + } | |
| 124 | + | |
| 125 | + return NULL; | |
| 126 | + | |
| 127 | +} | |
| 128 | + | ... | ... |
| ... | ... | @@ -0,0 +1,9 @@ |
| 1 | +<?xml version="1.0" encoding="UTF-8" ?> | |
| 2 | +<node name="/br/com/bb/pw3270"> | |
| 3 | + <interface name="br.com.bb.pw3270"> | |
| 4 | + <method name="getRevision"> | |
| 5 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | |
| 6 | + <arg type="s" name="revision" direction="out" /> | |
| 7 | + </method> | |
| 8 | + </interface> | |
| 9 | +</node> | ... | ... |
| ... | ... | @@ -0,0 +1,351 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | + * | |
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | + * | |
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | + * Free Software Foundation. | |
| 11 | + * | |
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | + * obter mais detalhes. | |
| 16 | + * | |
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | + * | |
| 21 | + * Este programa está nomeado como main.c e possui - linhas de código. | |
| 22 | + * | |
| 23 | + * Referências: | |
| 24 | + * | |
| 25 | + * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c | |
| 26 | + * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c | |
| 27 | + * | |
| 28 | + * Contatos: | |
| 29 | + * | |
| 30 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 31 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 32 | + * | |
| 33 | + */ | |
| 34 | + | |
| 35 | +#include "gobject.h" | |
| 36 | +#include <lib3270.h> | |
| 37 | +#include <lib3270/actions.h> | |
| 38 | +#include <lib3270/properties.h> | |
| 39 | + | |
| 40 | +#include <dbus/dbus-glib.h> | |
| 41 | +#include <dbus/dbus-glib-bindings.h> | |
| 42 | + | |
| 43 | +G_DEFINE_TYPE(ipc3270, ipc3270, G_TYPE_OBJECT) | |
| 44 | + | |
| 45 | +static void ipc3270_finalize(GObject *object) { | |
| 46 | + | |
| 47 | + ipc3270 * ipc = IPC3270(object); | |
| 48 | + | |
| 49 | + debug("%s",__FUNCTION__); | |
| 50 | + if(ipc->id) { | |
| 51 | + g_dbus_connection_unregister_object(ipc->connection,ipc->id); | |
| 52 | + } | |
| 53 | + | |
| 54 | + G_OBJECT_CLASS(ipc3270_parent_class)->finalize(object); | |
| 55 | +} | |
| 56 | + | |
| 57 | + | |
| 58 | +static void ipc3270_class_init(ipc3270Class *klass) { | |
| 59 | + | |
| 60 | + debug("%s",__FUNCTION__); | |
| 61 | + | |
| 62 | + GObjectClass *object_class; | |
| 63 | + object_class = G_OBJECT_CLASS (klass); | |
| 64 | + object_class->finalize = ipc3270_finalize; | |
| 65 | + | |
| 66 | +} | |
| 67 | + | |
| 68 | +static void ipc3270_init(ipc3270 *object) { | |
| 69 | + | |
| 70 | + debug("%s",__FUNCTION__); | |
| 71 | + object->error_domain = g_quark_from_static_string(PACKAGE_NAME); | |
| 72 | + | |
| 73 | +} | |
| 74 | + | |
| 75 | +GObject * ipc3270_new() { | |
| 76 | + return g_object_new(GLIB_TYPE_IPC3270, NULL); | |
| 77 | +} | |
| 78 | + | |
| 79 | +static void | |
| 80 | + method_call ( | |
| 81 | + G_GNUC_UNUSED GDBusConnection *connection, | |
| 82 | + G_GNUC_UNUSED const gchar *sender, | |
| 83 | + G_GNUC_UNUSED const gchar *object_path, | |
| 84 | + G_GNUC_UNUSED const gchar *interface_name, | |
| 85 | + const gchar *method_name, | |
| 86 | + GVariant *parameters, | |
| 87 | + GDBusMethodInvocation *invocation, | |
| 88 | + gpointer user_data) { | |
| 89 | + | |
| 90 | + g_autoptr (GError) error = NULL; | |
| 91 | + | |
| 92 | + GVariant * rc = ipc3270_method_call(G_OBJECT(user_data), method_name, parameters, &error); | |
| 93 | + | |
| 94 | + if(error) { | |
| 95 | + | |
| 96 | + if(rc) { | |
| 97 | + g_variant_unref(rc); | |
| 98 | + } | |
| 99 | + | |
| 100 | + g_dbus_method_invocation_return_gerror(invocation, error); | |
| 101 | + | |
| 102 | + } else if(rc) { | |
| 103 | + | |
| 104 | + g_dbus_method_invocation_return_value(invocation, rc); | |
| 105 | + | |
| 106 | + } else { | |
| 107 | + | |
| 108 | + g_dbus_method_invocation_return_error(invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Invalid or unexpected method call"); | |
| 109 | + | |
| 110 | + } | |
| 111 | + | |
| 112 | + | |
| 113 | +} | |
| 114 | + | |
| 115 | +static GVariant * | |
| 116 | + get_property ( | |
| 117 | + G_GNUC_UNUSED GDBusConnection *connection, | |
| 118 | + G_GNUC_UNUSED const gchar *sender, | |
| 119 | + G_GNUC_UNUSED const gchar *object_path, | |
| 120 | + G_GNUC_UNUSED const gchar *interface_name, | |
| 121 | + const gchar *property_name, | |
| 122 | + GError **error, | |
| 123 | + gpointer user_data) | |
| 124 | +{ | |
| 125 | + | |
| 126 | + return ipc3270_get_property(G_OBJECT(user_data), property_name, error); | |
| 127 | + | |
| 128 | +} | |
| 129 | + | |
| 130 | +static gboolean | |
| 131 | + set_property ( | |
| 132 | + G_GNUC_UNUSED GDBusConnection *connection, | |
| 133 | + G_GNUC_UNUSED const gchar *sender, | |
| 134 | + G_GNUC_UNUSED const gchar *object_path, | |
| 135 | + G_GNUC_UNUSED const gchar *interface_name, | |
| 136 | + const gchar *property_name, | |
| 137 | + GVariant *value, | |
| 138 | + GError **error, | |
| 139 | + gpointer user_data) | |
| 140 | +{ | |
| 141 | + | |
| 142 | + return ipc3270_set_property(G_OBJECT(user_data), property_name, value, error); | |
| 143 | + | |
| 144 | +} | |
| 145 | + | |
| 146 | + | |
| 147 | +void ipc3270_set_session(GObject *object, H3270 *hSession, const char *name, GError **error) { | |
| 148 | + | |
| 149 | + char id; | |
| 150 | + int ix; | |
| 151 | + | |
| 152 | + static const GDBusInterfaceVTable interface_vtable = { | |
| 153 | + method_call, | |
| 154 | + get_property, | |
| 155 | + set_property | |
| 156 | + }; | |
| 157 | + | |
| 158 | + ipc3270 * ipc = IPC3270(object); | |
| 159 | + ipc->hSession = hSession; | |
| 160 | + | |
| 161 | + ipc->connection = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, error); | |
| 162 | + if(*error) { | |
| 163 | + g_message("Can't get session bus: %s",(*error)->message); | |
| 164 | + return; | |
| 165 | + } | |
| 166 | + | |
| 167 | + g_dbus_connection_set_exit_on_close(ipc->connection,FALSE); | |
| 168 | + | |
| 169 | + for(id='a'; id < 'z' && !ipc->id && !*error; id++) { | |
| 170 | + | |
| 171 | + gchar *object_name = g_strdup_printf("br.com.bb.%s.%c",name,id); | |
| 172 | + | |
| 173 | + debug("Requesting \"%s\"",object_name); | |
| 174 | + | |
| 175 | + // https://dbus.freedesktop.org/doc/dbus-specification.html | |
| 176 | + GError *err = NULL; | |
| 177 | + | |
| 178 | + GVariant * response = | |
| 179 | + g_dbus_connection_call_sync ( | |
| 180 | + ipc->connection, | |
| 181 | + DBUS_SERVICE_DBUS, | |
| 182 | + DBUS_PATH_DBUS, | |
| 183 | + DBUS_INTERFACE_DBUS, | |
| 184 | + "RequestName", | |
| 185 | + g_variant_new ("(su)", object_name, DBUS_NAME_FLAG_DO_NOT_QUEUE), | |
| 186 | + NULL, | |
| 187 | + G_DBUS_CALL_FLAGS_NONE, | |
| 188 | + -1, | |
| 189 | + NULL, | |
| 190 | + &err | |
| 191 | + ); | |
| 192 | + | |
| 193 | + if(err) { | |
| 194 | + g_message("Can't request \"%s\": %s",object_name,err->message); | |
| 195 | + g_error_free(err); | |
| 196 | + err = NULL; | |
| 197 | + } | |
| 198 | + | |
| 199 | + if(response) { | |
| 200 | + | |
| 201 | + guint32 reply = 0; | |
| 202 | + g_variant_get(response, "(u)", &reply); | |
| 203 | + g_variant_unref(response); | |
| 204 | + | |
| 205 | + if(reply == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { | |
| 206 | + | |
| 207 | + g_message("Got %s", object_name); | |
| 208 | + | |
| 209 | + lib3270_set_session_id(ipc->hSession, id); | |
| 210 | + | |
| 211 | + // Introspection data for the service we are exporting | |
| 212 | + GString * introspection = g_string_new( | |
| 213 | + "<node>\n" | |
| 214 | + " <interface name='br.com.bb.tn3270'>" | |
| 215 | + " <method name='connect'>" | |
| 216 | + " <arg type='s' name='url' direction='in'/>" | |
| 217 | + " <arg type='i' name='result' direction='out' />" \ | |
| 218 | + " </method>" | |
| 219 | + " <method name='pfkey'>" \ | |
| 220 | + " <arg type='i' name='keycode' direction='in'/>" \ | |
| 221 | + " <arg type='i' name='result' direction='out' />" \ | |
| 222 | + " </method>" | |
| 223 | + " <method name='pakey'>" \ | |
| 224 | + " <arg type='i' name='keycode' direction='in'/>" \ | |
| 225 | + " <arg type='i' name='result' direction='out' />" \ | |
| 226 | + " </method>" | |
| 227 | + " <method name='getString'>" \ | |
| 228 | + " <arg type='s' name='text' direction='out' />" \ | |
| 229 | + " </method>" \ | |
| 230 | + " <method name='setString'>" \ | |
| 231 | + " <arg type='s' name='text' direction='in' />" \ | |
| 232 | + " <arg type='i' name='result' direction='out' />" \ | |
| 233 | + " </method>" \ | |
| 234 | + " <method name='setStringAt'>" \ | |
| 235 | + " <arg type='i' name='row' direction='in' />" \ | |
| 236 | + " <arg type='i' name='col' direction='in' />" \ | |
| 237 | + " <arg type='s' name='text' direction='in' />" \ | |
| 238 | + " <arg type='i' name='result' direction='out' />" \ | |
| 239 | + " </method>" \ | |
| 240 | + " <method name= 'getStringAt'>" \ | |
| 241 | + " <arg type='i' name='row' direction='in' />" \ | |
| 242 | + " <arg type='i' name='col' direction='in' />" \ | |
| 243 | + " <arg type='i' name='len' direction='in' />" \ | |
| 244 | + " <arg type='y' name='lf' direction='in' />" \ | |
| 245 | + " <arg type='s' name='text' direction='out' />" \ | |
| 246 | + " </method>" \ | |
| 247 | + " <method name='setStringAtAddress'>" \ | |
| 248 | + " <arg type='i' name='addr' direction='in' />" \ | |
| 249 | + " <arg type='s' name='text' direction='in' />" \ | |
| 250 | + " <arg type='i' name='result' direction='out' />" \ | |
| 251 | + " </method>" \ | |
| 252 | + " <method name= 'getStringAtAddress'>" \ | |
| 253 | + " <arg type='i' name='addr' direction='in' />" \ | |
| 254 | + " <arg type='i' name='len' direction='in' />" \ | |
| 255 | + " <arg type='y' name='lf' direction='in' />" \ | |
| 256 | + " <arg type='s' name='text' direction='out' />" \ | |
| 257 | + " </method>" | |
| 258 | + | |
| 259 | + ); | |
| 260 | + | |
| 261 | + // Constrói métodos usando a tabela de controle | |
| 262 | + const LIB3270_ACTION_ENTRY * actions = lib3270_get_action_table(); | |
| 263 | + for(ix = 0; actions[ix].name; ix++) | |
| 264 | + { | |
| 265 | + g_string_append_printf( | |
| 266 | + introspection, \ | |
| 267 | + " <method name='%s'>" \ | |
| 268 | + " </method>", actions[ix].name | |
| 269 | + ); | |
| 270 | + } | |
| 271 | + | |
| 272 | + // Toggle properties | |
| 273 | + for(ix = 0; ix < (int) LIB3270_TOGGLE_COUNT; ix++) { | |
| 274 | + g_string_append_printf(introspection, " <property type='i' name='%s' access='readwrite'/>", lib3270_get_toggle_name((LIB3270_TOGGLE) ix)); | |
| 275 | + } | |
| 276 | + | |
| 277 | + // Boolean properties | |
| 278 | + const LIB3270_INT_PROPERTY * bol_props = lib3270_get_boolean_properties_list(); | |
| 279 | + for(ix = 0; bol_props[ix].name; ix++) { | |
| 280 | + debug("Boolean(%s)",bol_props[ix].name); | |
| 281 | + g_string_append_printf(introspection, " <property type='b' name='%s' access='%s'/>", | |
| 282 | + bol_props[ix].name, | |
| 283 | + ((bol_props[ix].set == NULL) ? "read" : "readwrite") | |
| 284 | + ); | |
| 285 | + } | |
| 286 | + | |
| 287 | + // Integer properties | |
| 288 | + const LIB3270_INT_PROPERTY * int_props = lib3270_get_int_properties_list(); | |
| 289 | + for(ix = 0; int_props[ix].name; ix++) { | |
| 290 | + g_string_append_printf(introspection, " <property type='i' name='%s' access='%s'/>", | |
| 291 | + int_props[ix].name, | |
| 292 | + ((int_props[ix].set == NULL) ? "read" : "readwrite") | |
| 293 | + ); | |
| 294 | + } | |
| 295 | + | |
| 296 | + // String properties | |
| 297 | + const LIB3270_STRING_PROPERTY * str_props = lib3270_get_string_properties_list(); | |
| 298 | + for(ix = 0; str_props[ix].name; ix++) { | |
| 299 | + g_string_append_printf(introspection, " <property type='s' name='%s' access='%s'/>", | |
| 300 | + str_props[ix].name, | |
| 301 | + ((str_props[ix].set == NULL) ? "read" : "readwrite") | |
| 302 | + ); | |
| 303 | + } | |
| 304 | + | |
| 305 | + g_string_append(introspection, | |
| 306 | + " </interface>" | |
| 307 | + "</node>" | |
| 308 | + ); | |
| 309 | + | |
| 310 | + gchar * introspection_xml = g_string_free(introspection,FALSE); | |
| 311 | + | |
| 312 | + debug("\n%s\n",introspection_xml); | |
| 313 | + | |
| 314 | + GDBusNodeInfo * introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL); | |
| 315 | + | |
| 316 | + // Register object-id | |
| 317 | + ipc->id = g_dbus_connection_register_object ( | |
| 318 | + ipc->connection, | |
| 319 | + "/br/com/bb/tn3270", | |
| 320 | + introspection_data->interfaces[0], | |
| 321 | + &interface_vtable, | |
| 322 | + ipc, | |
| 323 | + NULL, | |
| 324 | + error | |
| 325 | + ); | |
| 326 | + | |
| 327 | + g_dbus_node_info_unref(introspection_data); | |
| 328 | + g_free(introspection_xml); | |
| 329 | + | |
| 330 | + break; | |
| 331 | + } | |
| 332 | + | |
| 333 | + } | |
| 334 | + | |
| 335 | + g_free(object_name); | |
| 336 | + | |
| 337 | + } | |
| 338 | + | |
| 339 | +} | |
| 340 | + | |
| 341 | +const gchar * ipc3270_get_display_charset(GObject *object) { | |
| 342 | + return lib3270_get_display_charset(IPC3270(object)->hSession); | |
| 343 | +} | |
| 344 | + | |
| 345 | +H3270 * ipc3270_get_session(GObject *object) { | |
| 346 | + return IPC3270(object)->hSession; | |
| 347 | +} | |
| 348 | + | |
| 349 | +void ipc3270_set_error(GObject *object, int errcode, GError **error) { | |
| 350 | + g_set_error(error,IPC3270(object)->error_domain,errcode,"%s",strerror(errcode)); | |
| 351 | +} | ... | ... |
| ... | ... | @@ -0,0 +1,77 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob | |
| 5 | + * o nome G3270. | |
| 6 | + * | |
| 7 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 8 | + * | |
| 9 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 10 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 11 | + * Free Software Foundation. | |
| 12 | + * | |
| 13 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 14 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 15 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 16 | + * obter mais detalhes. | |
| 17 | + * | |
| 18 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 19 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 20 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 21 | + * | |
| 22 | + * Este programa está nomeado como - e possui - linhas de código. | |
| 23 | + * | |
| 24 | + * Contatos: | |
| 25 | + * | |
| 26 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 27 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 28 | + * | |
| 29 | + */ | |
| 30 | + | |
| 31 | + /** | |
| 32 | + * @brief Private definitions for pw3270 IPC linux module. | |
| 33 | + * | |
| 34 | + */ | |
| 35 | + | |
| 36 | +#ifndef LINUX_GOBJECT_H_INCLUDED | |
| 37 | + | |
| 38 | + #define LINUX_GOBJECT_H_INCLUDED | |
| 39 | + | |
| 40 | + #include <config.h> | |
| 41 | + | |
| 42 | + #define ENABLE_NLS | |
| 43 | + #define GETTEXT_PACKAGE PACKAGE_NAME | |
| 44 | + | |
| 45 | + #include <libintl.h> | |
| 46 | + #include <glib/gi18n.h> | |
| 47 | + #include <gio/gio.h> | |
| 48 | + | |
| 49 | + #include <lib3270.h> | |
| 50 | + #include <lib3270/ipc.h> | |
| 51 | + | |
| 52 | + G_BEGIN_DECLS | |
| 53 | + | |
| 54 | + typedef struct _ipc3270 ipc3270; | |
| 55 | + typedef struct _ipc3270Class ipc3270Class; | |
| 56 | + | |
| 57 | + struct _ipc3270 { | |
| 58 | + GObject parent; | |
| 59 | + GDBusConnection * connection; | |
| 60 | + guint id; | |
| 61 | + H3270 * hSession; | |
| 62 | + GQuark error_domain; | |
| 63 | + }; | |
| 64 | + | |
| 65 | + struct _ipc3270Class { | |
| 66 | + GObjectClass parent; | |
| 67 | + }; | |
| 68 | + | |
| 69 | + /* | |
| 70 | + G_GNUC_INTERNAL void ipc3270_method_call (GDBusConnection *connection, const gchar *sender, const gchar *object_path, const gchar *interface_name, const gchar *method_name, GVariant *parameters, GDBusMethodInvocation *invocation, gpointer user_data); | |
| 71 | + G_GNUC_INTERNAL gboolean ipc3270_set_property(GDBusConnection *connection, const gchar *sender, const gchar *object_path, const gchar *interface_name, const gchar *property_name, GVariant *value, GError **error, gpointer user_data); | |
| 72 | + G_GNUC_INTERNAL GVariant * ipc3270_get_property (GDBusConnection *connection, const gchar *sender, const gchar *object_path, const gchar *interface_name, const gchar *property_name, GError **error, gpointer user_data); | |
| 73 | + */ | |
| 74 | + | |
| 75 | + G_END_DECLS | |
| 76 | + | |
| 77 | +#endif // LINUX_GOBJECT_H_INCLUDED | ... | ... |
| ... | ... | @@ -0,0 +1,191 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob | |
| 5 | + * o nome G3270. | |
| 6 | + * | |
| 7 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 8 | + * | |
| 9 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 10 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 11 | + * Free Software Foundation. | |
| 12 | + * | |
| 13 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 14 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 15 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 16 | + * obter mais detalhes. | |
| 17 | + * | |
| 18 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 19 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 20 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 21 | + * | |
| 22 | + * Este programa está nomeado como testprogram.c e possui - linhas de código. | |
| 23 | + * | |
| 24 | + * Contatos: | |
| 25 | + * | |
| 26 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 27 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 28 | + * | |
| 29 | + */ | |
| 30 | + | |
| 31 | + | |
| 32 | + /** | |
| 33 | + * @brief Plugin startup/stop for linux. | |
| 34 | + * | |
| 35 | + */ | |
| 36 | + | |
| 37 | + #include "private.h" | |
| 38 | + | |
| 39 | + #include <dbus/dbus-glib.h> | |
| 40 | + #include <dbus/dbus-glib-bindings.h> | |
| 41 | + | |
| 42 | + static void pw3270_dbus_cleanup(struct DBusSession * dBus) { | |
| 43 | + | |
| 44 | + if(dBus->proxy) { | |
| 45 | + g_object_unref(dBus); | |
| 46 | + } | |
| 47 | + | |
| 48 | + } | |
| 49 | + | |
| 50 | + int pw3270_plugin_start(GtkWidget *window, GtkWidget *terminal) { | |
| 51 | + | |
| 52 | + struct DBusSession * dBus = g_new0(struct DBusSession,1); | |
| 53 | + GError * error = NULL; | |
| 54 | + int id; | |
| 55 | + | |
| 56 | + g_object_set_data_full(G_OBJECT(terminal), "dbus-session-info", dBus, (GDestroyNotify) pw3270_dbus_cleanup); | |
| 57 | + | |
| 58 | + dBus->connection = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error); | |
| 59 | + | |
| 60 | + if(error) { | |
| 61 | + GtkWidget *dialog = gtk_message_dialog_new( | |
| 62 | + GTK_WINDOW(window), | |
| 63 | + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 64 | + GTK_MESSAGE_ERROR, | |
| 65 | + GTK_BUTTONS_OK, | |
| 66 | + _( "Can't get D-Bus connection" )); | |
| 67 | + | |
| 68 | + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message); | |
| 69 | + g_error_free(error); | |
| 70 | + | |
| 71 | + gtk_dialog_run(GTK_DIALOG(dialog)); | |
| 72 | + gtk_widget_destroy(dialog); | |
| 73 | + | |
| 74 | + return -1; | |
| 75 | + } | |
| 76 | + | |
| 77 | + g_dbus_connection_set_exit_on_close(dBus->connection,FALSE); | |
| 78 | + | |
| 79 | + /* | |
| 80 | + dBus->proxy = g_dbus_proxy_new_sync( | |
| 81 | + dBus->connection, | |
| 82 | + G_DBUS_PROXY_FLAGS_NONE, | |
| 83 | + NULL, // GDBusInterfaceInfo | |
| 84 | + "br.com.bb." PACKAGE_NAME, // name | |
| 85 | + "/br/com/bb/" PACKAGE_NAME "/terminal", // object path | |
| 86 | + "br.com.bb." PACKAGE_NAME ".terminal", // interface | |
| 87 | + NULL, // GCancellable | |
| 88 | + &error ); | |
| 89 | + | |
| 90 | + if(error) { | |
| 91 | + | |
| 92 | + GtkWidget *dialog = gtk_message_dialog_new( | |
| 93 | + GTK_WINDOW(window), | |
| 94 | + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 95 | + GTK_MESSAGE_ERROR, | |
| 96 | + GTK_BUTTONS_OK, | |
| 97 | + _( "Can't get D-Bus proxy object" )); | |
| 98 | + | |
| 99 | + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message); | |
| 100 | + g_error_free(error); | |
| 101 | + | |
| 102 | + gtk_dialog_run(GTK_DIALOG(dialog)); | |
| 103 | + gtk_widget_destroy(dialog); | |
| 104 | + | |
| 105 | + return -1; | |
| 106 | + } | |
| 107 | + */ | |
| 108 | + | |
| 109 | + for(id='a'; id < 'z' && !error && !dBus->proxy; id++) { | |
| 110 | + | |
| 111 | + gchar *name = g_strdup_printf("br.com.bb.%s.%c",gtk_widget_get_name(window),id); | |
| 112 | + | |
| 113 | + debug("Requesting \"%s\"",name); | |
| 114 | + | |
| 115 | + // https://dbus.freedesktop.org/doc/dbus-specification.html | |
| 116 | + GVariant * response = | |
| 117 | + g_dbus_connection_call_sync ( | |
| 118 | + dBus->connection, | |
| 119 | + DBUS_SERVICE_DBUS, | |
| 120 | + DBUS_PATH_DBUS, | |
| 121 | + DBUS_INTERFACE_DBUS, | |
| 122 | + "RequestName", | |
| 123 | + g_variant_new ("(su)", name, DBUS_NAME_FLAG_DO_NOT_QUEUE), | |
| 124 | + NULL, | |
| 125 | + G_DBUS_CALL_FLAGS_NONE, | |
| 126 | + -1, | |
| 127 | + NULL, | |
| 128 | + &error | |
| 129 | + ); | |
| 130 | + | |
| 131 | + if(error) { | |
| 132 | + g_message("Can't request \"%s\": %s",name,error->message); | |
| 133 | + g_error_free(error); | |
| 134 | + error = NULL; | |
| 135 | + } | |
| 136 | + | |
| 137 | + if(response) { | |
| 138 | + | |
| 139 | + guint32 reply = 0; | |
| 140 | + g_variant_get(response, "(u)", &reply); | |
| 141 | + g_variant_unref(response); | |
| 142 | + | |
| 143 | + if(reply == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { | |
| 144 | + | |
| 145 | + dBus->proxy = g_dbus_proxy_new_sync( | |
| 146 | + dBus->connection, | |
| 147 | + G_DBUS_PROXY_FLAGS_NONE, | |
| 148 | + NULL, // GDBusInterfaceInfo | |
| 149 | + name, // name | |
| 150 | + "/br/com/bb/" PACKAGE_NAME "/terminal", // object path | |
| 151 | + "br.com.bb." PACKAGE_NAME ".terminal", // interface | |
| 152 | + NULL, // GCancellable | |
| 153 | + &error ); | |
| 154 | + | |
| 155 | + gchar * widget_name = g_strdup_printf("%s:%c",gtk_widget_get_name(window),id); | |
| 156 | + v3270_set_session_name(terminal, widget_name); | |
| 157 | + g_free(widget_name); | |
| 158 | + | |
| 159 | + g_message("Got %s - %s", name, v3270_get_session_name(terminal)); | |
| 160 | + | |
| 161 | + } | |
| 162 | + | |
| 163 | + } | |
| 164 | + | |
| 165 | + g_free(name); | |
| 166 | + | |
| 167 | + } | |
| 168 | + | |
| 169 | + if(!dBus->proxy) { | |
| 170 | + GtkWidget *dialog = gtk_message_dialog_new( | |
| 171 | + GTK_WINDOW(window), | |
| 172 | + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 173 | + GTK_MESSAGE_ERROR, | |
| 174 | + GTK_BUTTONS_OK, | |
| 175 | + _( "Can't get DBUS object name" )); | |
| 176 | + | |
| 177 | + gtk_dialog_run(GTK_DIALOG(dialog)); | |
| 178 | + gtk_widget_destroy(dialog); | |
| 179 | + | |
| 180 | + return -1; | |
| 181 | + } | |
| 182 | + | |
| 183 | + // Got D-Bus name, register object. | |
| 184 | + | |
| 185 | + return 0; | |
| 186 | + | |
| 187 | + } | |
| 188 | + | |
| 189 | + #endif // !_WIN32 | |
| 190 | + | |
| 191 | + | ... | ... |
| ... | ... | @@ -0,0 +1,172 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | + * | |
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | + * | |
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | + * Free Software Foundation. | |
| 11 | + * | |
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | + * obter mais detalhes. | |
| 16 | + * | |
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | + * | |
| 21 | + * Este programa está nomeado como main.c e possui - linhas de código. | |
| 22 | + * | |
| 23 | + * Referências: | |
| 24 | + * | |
| 25 | + * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c | |
| 26 | + * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c | |
| 27 | + * | |
| 28 | + * Contatos: | |
| 29 | + * | |
| 30 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 31 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 32 | + * | |
| 33 | + */ | |
| 34 | + | |
| 35 | +#include <config.h> | |
| 36 | +#include <string.h> | |
| 37 | +#include <lib3270/ipc.h> | |
| 38 | +#include <lib3270.h> | |
| 39 | +#include <lib3270/actions.h> | |
| 40 | + | |
| 41 | +// #include <dbus/dbus-glib.h> | |
| 42 | +// #include <dbus/dbus-glib-bindings.h> | |
| 43 | + | |
| 44 | +GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *parameters, GError **error) { | |
| 45 | + | |
| 46 | + size_t ix; | |
| 47 | + | |
| 48 | + debug("%s(%s)",__FUNCTION__,method_name); | |
| 49 | + | |
| 50 | + if(!g_ascii_strcasecmp(method_name,"getString")) | |
| 51 | + { | |
| 52 | + return ipc3270_GVariant_from_input_string(object, lib3270_get_string_at_address(ipc3270_get_session(object),0,-1,'\n'), error); | |
| 53 | + } | |
| 54 | + else if(!g_ascii_strcasecmp(method_name,"setString")) | |
| 55 | + { | |
| 56 | + gchar *text = NULL; | |
| 57 | + g_variant_get(parameters, "(&s)", &text); | |
| 58 | + | |
| 59 | + g_autofree gchar * converted = ipc3270_convert_output_string(object, text, error); | |
| 60 | + if(lib3270_input_string(ipc3270_get_session(object),(const unsigned char *) converted) < 0) | |
| 61 | + { | |
| 62 | + // Failed! | |
| 63 | + ipc3270_set_error(object,errno,error); | |
| 64 | + return NULL; | |
| 65 | + } | |
| 66 | + | |
| 67 | + // Suceeded | |
| 68 | + return g_variant_new_int16((gint16) 0); | |
| 69 | + | |
| 70 | + } | |
| 71 | + else if(!g_ascii_strcasecmp(method_name,"setStringAt")) | |
| 72 | + { | |
| 73 | + gint row,col; | |
| 74 | + gchar *text = NULL; | |
| 75 | + g_variant_get(parameters, "(ii&s)", &row, &col, &text); | |
| 76 | + | |
| 77 | + g_autofree gchar * converted = ipc3270_convert_output_string(object, text, error); | |
| 78 | + if(lib3270_set_string_at(ipc3270_get_session(object),row,col,(const unsigned char *) converted) < 0) | |
| 79 | + { | |
| 80 | + // Failed! | |
| 81 | + ipc3270_set_error(object,errno,error); | |
| 82 | + return NULL; | |
| 83 | + } | |
| 84 | + | |
| 85 | + // Suceeded | |
| 86 | + return g_variant_new_int16((gint16) 0); | |
| 87 | + | |
| 88 | + } | |
| 89 | + else if(!g_ascii_strcasecmp(method_name,"getStringAt")) | |
| 90 | + { | |
| 91 | + gint row,col,len; | |
| 92 | + guchar lf; | |
| 93 | + g_variant_get(parameters, "(iiy)", &row, &col, &len,&lf); | |
| 94 | + | |
| 95 | + return ipc3270_GVariant_from_input_string(object,lib3270_get_string_at(ipc3270_get_session(object), row, col, len, lf),error); | |
| 96 | + | |
| 97 | + } | |
| 98 | + else if(!g_ascii_strcasecmp(method_name,"setStringAtAddress")) | |
| 99 | + { | |
| 100 | + gint addr; | |
| 101 | + gchar *text = NULL; | |
| 102 | + g_variant_get(parameters, "(i&s)", &addr, &text); | |
| 103 | + | |
| 104 | + g_autofree gchar * converted = ipc3270_convert_output_string(object, text, error); | |
| 105 | + if(lib3270_set_string_at_address(ipc3270_get_session(object),addr,(unsigned char *) converted) < 0) | |
| 106 | + { | |
| 107 | + // Failed! | |
| 108 | + ipc3270_set_error(object,errno,error); | |
| 109 | + return NULL; | |
| 110 | + } | |
| 111 | + | |
| 112 | + // Suceeded | |
| 113 | + return g_variant_new_int16((gint16) 0); | |
| 114 | + | |
| 115 | + } | |
| 116 | + else if(!g_ascii_strcasecmp(method_name,"getStringAtAddress")) | |
| 117 | + { | |
| 118 | + gint addr,len; | |
| 119 | + guchar lf; | |
| 120 | + g_variant_get(parameters, "(iiy)", &addr, &len, &lf); | |
| 121 | + | |
| 122 | + return ipc3270_GVariant_from_input_string(object,lib3270_get_string_at_address(ipc3270_get_session(object), addr, len, lf),error); | |
| 123 | + | |
| 124 | + } | |
| 125 | + // Check action table. | |
| 126 | + const LIB3270_ACTION_ENTRY * actions = lib3270_get_action_table(); | |
| 127 | + for(ix = 0; actions[ix].name; ix++) | |
| 128 | + { | |
| 129 | + if(!g_ascii_strcasecmp(actions[ix].name,method_name)) { | |
| 130 | + | |
| 131 | + int rc = actions[ix].call(ipc3270_get_session(object)); | |
| 132 | + if(rc) | |
| 133 | + { | |
| 134 | + // Failed | |
| 135 | + ipc3270_set_error(object,errno,error); | |
| 136 | + return NULL; | |
| 137 | + } | |
| 138 | + | |
| 139 | + // Suceeded | |
| 140 | + return g_variant_new_int16((gint16) 0); | |
| 141 | + | |
| 142 | + } | |
| 143 | + } | |
| 144 | + | |
| 145 | + // Check int methods | |
| 146 | + const IPC_METHOD_INT_ARG * int_methods = ipc3270_get_int_arg_methods(); | |
| 147 | + | |
| 148 | + for(ix = 0; int_methods[ix].name; ix++) | |
| 149 | + { | |
| 150 | + if(!g_ascii_strcasecmp(int_methods[ix].name,method_name)) { | |
| 151 | + | |
| 152 | + gint value; | |
| 153 | + g_variant_get(parameters, "(i)", &value); | |
| 154 | + | |
| 155 | + int rc = int_methods[ix].call(ipc3270_get_session(object), value); | |
| 156 | + if(rc) | |
| 157 | + { | |
| 158 | + // Failed | |
| 159 | + ipc3270_set_error(object,errno,error); | |
| 160 | + return NULL; | |
| 161 | + } | |
| 162 | + | |
| 163 | + // Suceeded | |
| 164 | + return g_variant_new_int16((gint16) 0); | |
| 165 | + | |
| 166 | + } | |
| 167 | + | |
| 168 | + } | |
| 169 | + | |
| 170 | + return NULL; | |
| 171 | + | |
| 172 | +} | ... | ... |
| ... | ... | @@ -0,0 +1,151 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | + * | |
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | + * | |
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | + * Free Software Foundation. | |
| 11 | + * | |
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | + * obter mais detalhes. | |
| 16 | + * | |
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | + * | |
| 21 | + * Este programa está nomeado como main.c e possui - linhas de código. | |
| 22 | + * | |
| 23 | + * Referências: | |
| 24 | + * | |
| 25 | + * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c | |
| 26 | + * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c | |
| 27 | + * | |
| 28 | + * Contatos: | |
| 29 | + * | |
| 30 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 31 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 32 | + * | |
| 33 | + */ | |
| 34 | + | |
| 35 | +#include <config.h> | |
| 36 | +#include <lib3270/ipc.h> | |
| 37 | +#include <lib3270.h> | |
| 38 | +#include <lib3270/properties.h> | |
| 39 | + | |
| 40 | +// #include <dbus/dbus-glib.h> | |
| 41 | +// #include <dbus/dbus-glib-bindings.h> | |
| 42 | + | |
| 43 | +gboolean ipc3270_set_property(GObject *object, const gchar *property_name, GVariant *value, GError **error) { | |
| 44 | + | |
| 45 | + // Check for property | |
| 46 | + size_t ix; | |
| 47 | + | |
| 48 | + // Boolean properties | |
| 49 | + const LIB3270_INT_PROPERTY * boolprop = lib3270_get_boolean_properties_list(); | |
| 50 | + for(ix = 0; boolprop[ix].name; ix++) { | |
| 51 | + | |
| 52 | + if(boolprop[ix].set && !g_ascii_strcasecmp(boolprop[ix].name, property_name)) { | |
| 53 | + | |
| 54 | + // Found it! | |
| 55 | + if(boolprop[ix].set(ipc3270_get_session(object), (int) (g_variant_get_boolean(value) ? 1 : 0))) { | |
| 56 | + | |
| 57 | + // Erro! | |
| 58 | + g_set_error (error, | |
| 59 | + G_IO_ERROR, | |
| 60 | + G_IO_ERROR_FAILED, | |
| 61 | + g_strerror(errno) | |
| 62 | + ); | |
| 63 | + | |
| 64 | + return FALSE; | |
| 65 | + } | |
| 66 | + | |
| 67 | + return TRUE; | |
| 68 | + | |
| 69 | + } | |
| 70 | + | |
| 71 | + } | |
| 72 | + | |
| 73 | + // Integer properties | |
| 74 | + const LIB3270_INT_PROPERTY * intprop = lib3270_get_int_properties_list(); | |
| 75 | + for(ix = 0; intprop[ix].name; ix++) { | |
| 76 | + | |
| 77 | + if(intprop[ix].set && !g_ascii_strcasecmp(intprop[ix].name, property_name)) { | |
| 78 | + | |
| 79 | + // Found it! | |
| 80 | + if(intprop[ix].set(ipc3270_get_session(object), (int) (g_variant_get_boolean(value) ? 1 : 0))) { | |
| 81 | + | |
| 82 | + // Erro! | |
| 83 | + g_set_error (error, | |
| 84 | + G_IO_ERROR, | |
| 85 | + G_IO_ERROR_FAILED, | |
| 86 | + g_strerror(errno) | |
| 87 | + ); | |
| 88 | + | |
| 89 | + return FALSE; | |
| 90 | + } | |
| 91 | + | |
| 92 | + return TRUE; | |
| 93 | + | |
| 94 | + } | |
| 95 | + | |
| 96 | + } | |
| 97 | + | |
| 98 | + // String properties | |
| 99 | + const LIB3270_STRING_PROPERTY * strprop = lib3270_get_string_properties_list(); | |
| 100 | + for(ix = 0; strprop[ix].name; ix++) { | |
| 101 | + | |
| 102 | + if(strprop[ix].set && !g_ascii_strcasecmp(strprop[ix].name, property_name)) { | |
| 103 | + | |
| 104 | + // Found it! | |
| 105 | + if(strprop[ix].set(ipc3270_get_session(object), g_variant_get_string(value,NULL))) { | |
| 106 | + | |
| 107 | + // Erro! | |
| 108 | + g_set_error (error, | |
| 109 | + G_IO_ERROR, | |
| 110 | + G_IO_ERROR_FAILED, | |
| 111 | + g_strerror(errno) | |
| 112 | + ); | |
| 113 | + | |
| 114 | + return FALSE; | |
| 115 | + } | |
| 116 | + | |
| 117 | + return TRUE; | |
| 118 | + | |
| 119 | + } | |
| 120 | + | |
| 121 | + } | |
| 122 | + | |
| 123 | + // Check for toggle | |
| 124 | + LIB3270_TOGGLE toggle = lib3270_get_toggle_id(property_name); | |
| 125 | + if(toggle != (LIB3270_TOGGLE) -1) { | |
| 126 | + | |
| 127 | + // Is a Tn3270 toggle, get it! | |
| 128 | + if(lib3270_set_toggle(ipc3270_get_session(object),toggle,(int) g_variant_get_int32(value))) { | |
| 129 | + | |
| 130 | + // Erro! | |
| 131 | + g_set_error (error, | |
| 132 | + G_IO_ERROR, | |
| 133 | + G_IO_ERROR_FAILED, | |
| 134 | + g_strerror(errno) | |
| 135 | + ); | |
| 136 | + | |
| 137 | + return FALSE; | |
| 138 | + | |
| 139 | + } | |
| 140 | + | |
| 141 | + return TRUE; | |
| 142 | + } | |
| 143 | + | |
| 144 | + g_set_error (error, | |
| 145 | + G_IO_ERROR, | |
| 146 | + G_IO_ERROR_NOT_FOUND, | |
| 147 | + "Can't find any property named %s", property_name | |
| 148 | + ); | |
| 149 | + | |
| 150 | + return FALSE; | |
| 151 | +} | ... | ... |
| ... | ... | @@ -0,0 +1,132 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | + * | |
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | + * | |
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | + * Free Software Foundation. | |
| 11 | + * | |
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | + * obter mais detalhes. | |
| 16 | + * | |
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | + * | |
| 21 | + * Este programa está nomeado como gobject.c e possui - linhas de código. | |
| 22 | + * | |
| 23 | + * Contatos: | |
| 24 | + * | |
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 27 | + * | |
| 28 | + */ | |
| 29 | + | |
| 30 | +#include "gobject.h" | |
| 31 | +#include <lib3270.h> | |
| 32 | +#include <lib3270/actions.h> | |
| 33 | +#include <lib3270/properties.h> | |
| 34 | + | |
| 35 | +G_DEFINE_TYPE(ipc3270, ipc3270, G_TYPE_OBJECT) | |
| 36 | + | |
| 37 | +static void ipc3270_finalize(GObject *object) { | |
| 38 | + | |
| 39 | + ipc3270 * ipc = IPC3270(object); | |
| 40 | + | |
| 41 | + | |
| 42 | + G_OBJECT_CLASS(ipc3270_parent_class)->finalize(object); | |
| 43 | +} | |
| 44 | + | |
| 45 | + | |
| 46 | +static void ipc3270_class_init(ipc3270Class *klass) { | |
| 47 | + | |
| 48 | + debug("%s",__FUNCTION__); | |
| 49 | + | |
| 50 | + GObjectClass *object_class; | |
| 51 | + object_class = G_OBJECT_CLASS (klass); | |
| 52 | + object_class->finalize = ipc3270_finalize; | |
| 53 | + | |
| 54 | +} | |
| 55 | + | |
| 56 | +static void ipc3270_init(ipc3270 *object) { | |
| 57 | + | |
| 58 | + debug("%s",__FUNCTION__); | |
| 59 | + object->error_domain = g_quark_from_static_string(PACKAGE_NAME); | |
| 60 | + | |
| 61 | +} | |
| 62 | + | |
| 63 | +GObject * ipc3270_new() { | |
| 64 | + return g_object_new(GLIB_TYPE_IPC3270, NULL); | |
| 65 | +} | |
| 66 | + | |
| 67 | +void ipc3270_set_session(GObject *object, H3270 *hSession, const char *name, GError **error) { | |
| 68 | + | |
| 69 | + char id; | |
| 70 | + | |
| 71 | + ipc3270 * ipc = IPC3270(object); | |
| 72 | + ipc->hSession = hSession; | |
| 73 | + | |
| 74 | + for(id='A';id < 'Z';id++) { | |
| 75 | + | |
| 76 | + gchar * pipename = g_strdup_printf("\\\\.\\pipe\\%s\\%c",name,id); | |
| 77 | + gchar * ptr; | |
| 78 | + HANDLE hPipe; | |
| 79 | + | |
| 80 | + for(ptr=pipename;*ptr;ptr++) | |
| 81 | + *ptr = g_ascii_tolower(*ptr); | |
| 82 | + | |
| 83 | + hPipe = CreateNamedPipe( TEXT(pipename), // pipe name | |
| 84 | + PIPE_ACCESS_DUPLEX | // read/write access | |
| 85 | + FILE_FLAG_OVERLAPPED, // overlapped mode | |
| 86 | + PIPE_TYPE_MESSAGE | // pipe type | |
| 87 | + PIPE_READMODE_MESSAGE | // pipe mode | |
| 88 | + PIPE_WAIT, // blocking mode | |
| 89 | + 1, // number of instances | |
| 90 | + PIPE_BUFFER_LENGTH, // output buffer size | |
| 91 | + PIPE_BUFFER_LENGTH, // input buffer size | |
| 92 | + NMPWAIT_USE_DEFAULT_WAIT, // client time-out | |
| 93 | + NULL); // default security attributes | |
| 94 | + | |
| 95 | + debug("%s = %p",pipename,hPipe); | |
| 96 | + g_free(pipename); | |
| 97 | + | |
| 98 | + if(hPipe != INVALID_HANDLE_VALUE) { | |
| 99 | + | |
| 100 | + ipc->source = (IPC3270_PIPE_SOURCE *) g_source_new(&ipc3270_source_funcs,sizeof(IPC3270_PIPE_SOURCE)); | |
| 101 | + | |
| 102 | + lib3270_set_session_id(ipc->hSession, id); | |
| 103 | + | |
| 104 | + ipc->source->hPipe = hPipe; | |
| 105 | + ipc->source->state = PIPE_STATE_WAITING; | |
| 106 | + ipc->source->overlap.hEvent = CreateEvent( NULL,TRUE,TRUE,NULL); | |
| 107 | + | |
| 108 | + g_source_attach((GSource *) ipc->source,NULL); | |
| 109 | + | |
| 110 | + // IO_accept(source); | |
| 111 | + ipc3270_wait_for_client(ipc->source); | |
| 112 | + | |
| 113 | + break; | |
| 114 | + } | |
| 115 | + | |
| 116 | + } | |
| 117 | + | |
| 118 | + | |
| 119 | +} | |
| 120 | + | |
| 121 | +const gchar * ipc3270_get_display_charset(GObject *object) { | |
| 122 | + return lib3270_get_display_charset(IPC3270(object)->hSession); | |
| 123 | +} | |
| 124 | + | |
| 125 | +H3270 * ipc3270_get_session(GObject *object) { | |
| 126 | + return IPC3270(object)->hSession; | |
| 127 | +} | |
| 128 | + | |
| 129 | +void ipc3270_set_error(GObject *object, int errcode, GError **error) { | |
| 130 | + g_set_error(error,IPC3270(object)->error_domain,errcode,"%s",strerror(errcode)); | |
| 131 | +} | |
| 132 | + | ... | ... |
| ... | ... | @@ -0,0 +1,95 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob | |
| 5 | + * o nome G3270. | |
| 6 | + * | |
| 7 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 8 | + * | |
| 9 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 10 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 11 | + * Free Software Foundation. | |
| 12 | + * | |
| 13 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 14 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 15 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 16 | + * obter mais detalhes. | |
| 17 | + * | |
| 18 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 19 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 20 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 21 | + * | |
| 22 | + * Este programa está nomeado como - e possui - linhas de código. | |
| 23 | + * | |
| 24 | + * Contatos: | |
| 25 | + * | |
| 26 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 27 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 28 | + * | |
| 29 | + */ | |
| 30 | + | |
| 31 | + /** | |
| 32 | + * @brief Private definitions for pw3270 IPC windows module. | |
| 33 | + * | |
| 34 | + */ | |
| 35 | + | |
| 36 | +#ifndef WINDOWS_GOBJECT_H_INCLUDED | |
| 37 | + | |
| 38 | + #define WINDOWS_GOBJECT_H_INCLUDED | |
| 39 | + | |
| 40 | + #include <windows.h> | |
| 41 | + #include <config.h> | |
| 42 | + | |
| 43 | + #define ENABLE_NLS | |
| 44 | + #define GETTEXT_PACKAGE PACKAGE_NAME | |
| 45 | + | |
| 46 | + #include <libintl.h> | |
| 47 | + #include <glib/gi18n.h> | |
| 48 | + #include <gio/gio.h> | |
| 49 | + | |
| 50 | + #include <lib3270.h> | |
| 51 | + #include <lib3270/ipc.h> | |
| 52 | + | |
| 53 | + #define PIPE_BUFFER_LENGTH 8192 | |
| 54 | + | |
| 55 | + G_BEGIN_DECLS | |
| 56 | + | |
| 57 | + typedef struct _ipc3270 ipc3270; | |
| 58 | + typedef struct _ipc3270Class ipc3270Class; | |
| 59 | + typedef struct _ipc3270Request ipc3270Request; | |
| 60 | + | |
| 61 | + typedef enum _ipc3270_pipe_state { | |
| 62 | + PIPE_STATE_WAITING, | |
| 63 | + PIPE_STATE_READ, | |
| 64 | + PIPE_STATE_PENDING_READ, | |
| 65 | + PIPE_STATE_UNDEFINED | |
| 66 | + } IPC3270_PIPE_STATE; | |
| 67 | + | |
| 68 | + typedef struct _ipc3270_pipe_source { | |
| 69 | + GSource gsrc; | |
| 70 | + HANDLE hPipe; | |
| 71 | + | |
| 72 | + IPC3270_PIPE_STATE state; | |
| 73 | + | |
| 74 | + OVERLAPPED overlap; | |
| 75 | + unsigned char buffer[PIPE_BUFFER_LENGTH+1]; | |
| 76 | + | |
| 77 | + } IPC3270_PIPE_SOURCE; | |
| 78 | + | |
| 79 | + struct _ipc3270 { | |
| 80 | + H3270 * hSession; | |
| 81 | + IPC3270_PIPE_SOURCE * source; | |
| 82 | + GQuark error_domain; | |
| 83 | + }; | |
| 84 | + | |
| 85 | + struct _ipc3270Class { | |
| 86 | + GObjectClass parent; | |
| 87 | + }; | |
| 88 | + | |
| 89 | + G_GNUC_INTERNAL GSourceFuncs ipc3270_source_funcs; | |
| 90 | + | |
| 91 | + G_GNUC_INTERNAL void ipc3270_wait_for_client(IPC3270_PIPE_SOURCE *source); | |
| 92 | + | |
| 93 | + G_END_DECLS | |
| 94 | + | |
| 95 | +#endif // WINDOWS_GOBJECT_H_INCLUDED | ... | ... |
| ... | ... | @@ -0,0 +1,295 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob | |
| 5 | + * o nome G3270. | |
| 6 | + * | |
| 7 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 8 | + * | |
| 9 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 10 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 11 | + * Free Software Foundation. | |
| 12 | + * | |
| 13 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 14 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 15 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 16 | + * obter mais detalhes. | |
| 17 | + * | |
| 18 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 19 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 20 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 21 | + * | |
| 22 | + * Este programa está nomeado como inout.c e possui - linhas de código. | |
| 23 | + * | |
| 24 | + * Contatos: | |
| 25 | + * | |
| 26 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 27 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 28 | + * | |
| 29 | + */ | |
| 30 | + | |
| 31 | + | |
| 32 | + /** | |
| 33 | + * @brief Pack/Unpack IPC data block. | |
| 34 | + * | |
| 35 | + */ | |
| 36 | + | |
| 37 | + #include <config.h> | |
| 38 | + #include <lib3270/ipc.h> | |
| 39 | + #include <string.h> | |
| 40 | + #include <stdlib.h> | |
| 41 | + | |
| 42 | +/*---[ Implement ]----------------------------------------------------------------------------------*/ | |
| 43 | + | |
| 44 | +unsigned char * ipc3270_pack(const gchar * name, int id, GVariant *values, size_t * szPacket) { | |
| 45 | + | |
| 46 | + GVariantIter iter; | |
| 47 | + gsize count = g_variant_iter_init(&iter, values); | |
| 48 | + g_autofree char * types = g_new0(char, count); | |
| 49 | + GVariant * child; | |
| 50 | + size_t ix = 0; | |
| 51 | + | |
| 52 | + // Init packet size; | |
| 53 | + *szPacket = strlen(name) + 1 + (sizeof(guint16) * 2) ; | |
| 54 | + | |
| 55 | + g_print("Packaging %u itens for \"%s\"\n", (unsigned int) count, name); | |
| 56 | + while ((child = g_variant_iter_next_value (&iter))) { | |
| 57 | + | |
| 58 | + // g_print("type='%s' size=%u\n", g_variant_get_type_string(child), (unsigned int) g_variant_get_size(child)); | |
| 59 | + | |
| 60 | + types[ix] = g_variant_get_type_string(child)[0]; | |
| 61 | + *szPacket += (1+g_variant_get_size(child)); | |
| 62 | + | |
| 63 | + g_variant_unref(child); | |
| 64 | + ix++; | |
| 65 | + } | |
| 66 | + | |
| 67 | + // Allocate buffer | |
| 68 | + unsigned char * outputBuffer = g_malloc0(*szPacket); | |
| 69 | + unsigned char * txtptr = outputBuffer; | |
| 70 | + | |
| 71 | + // Add name | |
| 72 | + strcpy((char *) txtptr,name); | |
| 73 | + txtptr += strlen((char *) txtptr) + 1; | |
| 74 | + | |
| 75 | + // Add ID | |
| 76 | + *((guint16 *) txtptr) = (guint16) id; | |
| 77 | + txtptr += sizeof(guint16); | |
| 78 | + | |
| 79 | + // Update ptr; | |
| 80 | + *((guint16 *) txtptr) = (guint16) count; | |
| 81 | + txtptr += sizeof(guint16); | |
| 82 | + | |
| 83 | + ix = 0; | |
| 84 | + g_variant_iter_init(&iter, values); | |
| 85 | + while ((child = g_variant_iter_next_value (&iter))) { | |
| 86 | + | |
| 87 | + debug("type='%s' size=%u index=%u", g_variant_get_type_string(child), (unsigned int) g_variant_get_size(child), (unsigned int) (txtptr - outputBuffer)); | |
| 88 | + | |
| 89 | + *(txtptr++) = types[ix]; | |
| 90 | + | |
| 91 | + switch(types[ix]) { | |
| 92 | + | |
| 93 | + // https://developer.gnome.org/glib/stable/gvariant-format-strings.html | |
| 94 | + | |
| 95 | + case 's': | |
| 96 | + strcpy((char *) txtptr,g_variant_get_string(child,NULL)); | |
| 97 | + txtptr += (strlen((char *) txtptr)+1); | |
| 98 | + break; | |
| 99 | + | |
| 100 | + case 'b': // gboolean | |
| 101 | + *(txtptr++) = g_variant_get_boolean(child) ? 1 : 0; | |
| 102 | + break; | |
| 103 | + | |
| 104 | + case 'y': // guchar | |
| 105 | + *(txtptr++) = g_variant_get_byte(child); | |
| 106 | + break; | |
| 107 | + | |
| 108 | + case 'n': // gint16 | |
| 109 | + *((gint16 *) txtptr) = g_variant_get_int16(child); | |
| 110 | + txtptr += sizeof(gint16); | |
| 111 | + break; | |
| 112 | + | |
| 113 | + case 'q': // guint16 | |
| 114 | + *((guint16 *) txtptr) = g_variant_get_uint16(child); | |
| 115 | + txtptr += sizeof(guint16); | |
| 116 | + break; | |
| 117 | + | |
| 118 | + case 'i': // gint32 | |
| 119 | + case 'h': // gint32 | |
| 120 | + *((gint32 *) txtptr) = g_variant_get_int32(child); | |
| 121 | + txtptr += sizeof(gint32); | |
| 122 | + break; | |
| 123 | + | |
| 124 | + case 'u': // guint32 | |
| 125 | + *((guint32 *) txtptr) = g_variant_get_uint32(child); | |
| 126 | + txtptr += sizeof(guint32); | |
| 127 | + break; | |
| 128 | + | |
| 129 | + case 'x': // gint64 | |
| 130 | + *((gint64 *) txtptr) = g_variant_get_int64(child); | |
| 131 | + txtptr += sizeof(gint64); | |
| 132 | + break; | |
| 133 | + | |
| 134 | + case 't': // guint64 | |
| 135 | + *((guint64 *) txtptr) = g_variant_get_uint64(child); | |
| 136 | + txtptr += sizeof(guint64); | |
| 137 | + break; | |
| 138 | + | |
| 139 | + default: | |
| 140 | + errno = EINVAL; | |
| 141 | + g_free(outputBuffer); | |
| 142 | + return NULL; | |
| 143 | + } | |
| 144 | + | |
| 145 | + g_variant_unref(child); | |
| 146 | + ix++; | |
| 147 | + } | |
| 148 | + | |
| 149 | + return outputBuffer; | |
| 150 | +} | |
| 151 | + | |
| 152 | +GVariant * ipc3270_unpack(const unsigned char *packet, int *id) { | |
| 153 | + | |
| 154 | + const unsigned char *txtptr; | |
| 155 | + size_t ix; | |
| 156 | + | |
| 157 | + // Skip packet name. | |
| 158 | + packet += strlen((const char *) packet)+1; | |
| 159 | + | |
| 160 | + // Get Packet ID or error code. | |
| 161 | + if(id) { | |
| 162 | + *id = (int) *((guint16 *) packet); | |
| 163 | + } | |
| 164 | + packet += sizeof(guint16); | |
| 165 | + | |
| 166 | + // Get argument count. | |
| 167 | + size_t arguments = (size_t) * ((guint16 *) packet); | |
| 168 | + packet += sizeof(guint16); | |
| 169 | + | |
| 170 | + debug("Unpacking package with %u itens", (unsigned int) arguments); | |
| 171 | + | |
| 172 | + // Scan for argument types. | |
| 173 | + g_autofree gchar * descrs = g_malloc0(arguments+3); | |
| 174 | + descrs[0] = '('; | |
| 175 | + descrs[arguments+1] = ')'; | |
| 176 | + | |
| 177 | + txtptr = packet; | |
| 178 | + for(ix = 0; ix < arguments; ix++) { | |
| 179 | + | |
| 180 | + debug("Format(%u): %c",(unsigned int) ix, *txtptr); | |
| 181 | + | |
| 182 | + descrs[ix+1] = *(txtptr++); | |
| 183 | + | |
| 184 | + switch(descrs[ix+1]) { | |
| 185 | + case 's': | |
| 186 | + txtptr += strlen((char *) txtptr)+1; | |
| 187 | + break; | |
| 188 | + | |
| 189 | + case 'b': // gboolean | |
| 190 | + case 'y': // guchar | |
| 191 | + txtptr++; | |
| 192 | + break; | |
| 193 | + | |
| 194 | + case 'n': // gint16 | |
| 195 | + txtptr += sizeof(gint16); | |
| 196 | + break; | |
| 197 | + | |
| 198 | + case 'q': // guint16 | |
| 199 | + txtptr += sizeof(guint16); | |
| 200 | + break; | |
| 201 | + | |
| 202 | + case 'i': // gint32 | |
| 203 | + case 'h': // gint32 | |
| 204 | + txtptr += sizeof(gint32); | |
| 205 | + break; | |
| 206 | + | |
| 207 | + case 'u': // guint32 | |
| 208 | + txtptr += sizeof(guint32); | |
| 209 | + break; | |
| 210 | + | |
| 211 | + case 'x': // gint64 | |
| 212 | + txtptr += sizeof(gint64); | |
| 213 | + break; | |
| 214 | + | |
| 215 | + case 't': // guint64 | |
| 216 | + txtptr += sizeof(guint64); | |
| 217 | + break; | |
| 218 | + | |
| 219 | + default: | |
| 220 | + errno = EINVAL; | |
| 221 | + return NULL; | |
| 222 | + } | |
| 223 | + } | |
| 224 | + | |
| 225 | + debug("Format: \"%s\"\n",descrs); | |
| 226 | + | |
| 227 | + GVariantBuilder builder; | |
| 228 | + g_variant_builder_init(&builder,G_VARIANT_TYPE(descrs)); | |
| 229 | + | |
| 230 | + txtptr = packet; | |
| 231 | + for(ix = 0; ix < arguments; ix++) { | |
| 232 | + | |
| 233 | + debug("Format(%u): %c",(unsigned int) ix, *txtptr); | |
| 234 | + txtptr++; | |
| 235 | + | |
| 236 | + switch(descrs[ix+1]) { | |
| 237 | + case 's': | |
| 238 | + g_variant_builder_add(&builder, "s", txtptr); | |
| 239 | + txtptr += strlen((char *) txtptr)+1; | |
| 240 | + break; | |
| 241 | + | |
| 242 | + case 'b': // gboolean | |
| 243 | + g_variant_builder_add(&builder, "b", *((gboolean *) txtptr)); | |
| 244 | + txtptr++; | |
| 245 | + break; | |
| 246 | + | |
| 247 | + case 'y': // guchar | |
| 248 | + g_variant_builder_add(&builder, "y", *((guchar *) txtptr)); | |
| 249 | + txtptr++; | |
| 250 | + break; | |
| 251 | + | |
| 252 | + case 'n': // gint16 | |
| 253 | + g_variant_builder_add(&builder, "n", *((gint16 *) txtptr)); | |
| 254 | + txtptr += sizeof(gint16); | |
| 255 | + break; | |
| 256 | + | |
| 257 | + case 'q': // guint16 | |
| 258 | + g_variant_builder_add(&builder, "q", *((guint16 *) txtptr)); | |
| 259 | + txtptr += sizeof(guint16); | |
| 260 | + break; | |
| 261 | + | |
| 262 | + case 'i': // gint32 | |
| 263 | + g_variant_builder_add(&builder, "i", *((gint32 *) txtptr)); | |
| 264 | + txtptr += sizeof(gint32); | |
| 265 | + break; | |
| 266 | + | |
| 267 | + case 'h': // gint32 | |
| 268 | + g_variant_builder_add(&builder, "h", *((gint32 *) txtptr)); | |
| 269 | + txtptr += sizeof(gint32); | |
| 270 | + break; | |
| 271 | + | |
| 272 | + case 'u': // guint32 | |
| 273 | + g_variant_builder_add(&builder, "u", *((guint32 *) txtptr)); | |
| 274 | + txtptr += sizeof(guint32); | |
| 275 | + break; | |
| 276 | + | |
| 277 | + case 'x': // gint64 | |
| 278 | + g_variant_builder_add(&builder, "x", *((gint64 *) txtptr)); | |
| 279 | + txtptr += sizeof(gint64); | |
| 280 | + break; | |
| 281 | + | |
| 282 | + case 't': // guint64 | |
| 283 | + g_variant_builder_add(&builder, "t", *((guint64 *) txtptr)); | |
| 284 | + txtptr += sizeof(guint64); | |
| 285 | + break; | |
| 286 | + | |
| 287 | + default: | |
| 288 | + errno = EINVAL; | |
| 289 | + return NULL; | |
| 290 | + } | |
| 291 | + } | |
| 292 | + | |
| 293 | + return g_variant_builder_end(&builder); | |
| 294 | + | |
| 295 | +} | ... | ... |
| ... | ... | @@ -0,0 +1,214 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | + * | |
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | + * | |
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | + * Free Software Foundation. | |
| 11 | + * | |
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | + * obter mais detalhes. | |
| 16 | + * | |
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | + * | |
| 21 | + * Este programa está nomeado como pipesource.c e possui - linhas de código. | |
| 22 | + * | |
| 23 | + * Contatos: | |
| 24 | + * | |
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 27 | + * | |
| 28 | + */ | |
| 29 | + | |
| 30 | +#include "gobject.h" | |
| 31 | + | |
| 32 | +void ipc3270_wait_for_client(IPC3270_PIPE_SOURCE *source) { | |
| 33 | + | |
| 34 | + if(ConnectNamedPipe(source->hPipe,&source->overlap)) { | |
| 35 | + g_message("Error %u in ConnectNamedPipe",(unsigned int) GetLastError()); | |
| 36 | + // popup_lasterror("%s",_( "Error in ConnectNamedPipe" )); | |
| 37 | + return; | |
| 38 | + } | |
| 39 | + | |
| 40 | + switch(GetLastError()) { | |
| 41 | + case ERROR_IO_PENDING: // The overlapped connection in progress. | |
| 42 | + source->state = PIPE_STATE_WAITING; | |
| 43 | + break; | |
| 44 | + | |
| 45 | + | |
| 46 | + case ERROR_PIPE_CONNECTED: // Client is already connected, so signal an event. | |
| 47 | + if(SetEvent(source->overlap.hEvent)) | |
| 48 | + break; | |
| 49 | + | |
| 50 | + default: | |
| 51 | + g_message("Error %u in ConnectNamedPipe",(unsigned int) GetLastError()); | |
| 52 | + // popup_lasterror("%s", _( "ConnectNamedPipe failed" )); | |
| 53 | + } | |
| 54 | + | |
| 55 | +} | |
| 56 | + | |
| 57 | +static gboolean IO_prepare(GSource *source, gint *timeout) { | |
| 58 | + /* | |
| 59 | + * Called before all the file descriptors are polled. | |
| 60 | + * If the source can determine that it is ready here | |
| 61 | + * (without waiting for the results of the poll() call) | |
| 62 | + * it should return TRUE. | |
| 63 | + * | |
| 64 | + * It can also return a timeout_ value which should be the maximum | |
| 65 | + * timeout (in milliseconds) which should be passed to the poll() call. | |
| 66 | + * The actual timeout used will be -1 if all sources returned -1, | |
| 67 | + * or it will be the minimum of all the timeout_ values | |
| 68 | + * returned which were >= 0. | |
| 69 | + * | |
| 70 | + */ | |
| 71 | + if(WaitForSingleObject(((IPC3270_PIPE_SOURCE *) source)->overlap.hEvent,0) == WAIT_OBJECT_0) | |
| 72 | + return TRUE; | |
| 73 | + | |
| 74 | + *timeout = 10; | |
| 75 | + | |
| 76 | + return FALSE; | |
| 77 | + | |
| 78 | +} | |
| 79 | + | |
| 80 | +static gboolean IO_check(GSource *source) { | |
| 81 | + /* | |
| 82 | + * Called after all the file descriptors are polled. | |
| 83 | + * The source should return TRUE if it is ready to be dispatched. | |
| 84 | + * Note that some time may have passed since the previous prepare | |
| 85 | + * function was called, so the source should be checked again here. | |
| 86 | + * | |
| 87 | + */ | |
| 88 | + if(WaitForSingleObject(((IPC3270_PIPE_SOURCE *) source)->overlap.hEvent,0) == WAIT_OBJECT_0) | |
| 89 | + return TRUE; | |
| 90 | + | |
| 91 | + return FALSE; | |
| 92 | +} | |
| 93 | + | |
| 94 | +static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { | |
| 95 | + | |
| 96 | +} | |
| 97 | + | |
| 98 | +static void read_input_pipe(IPC3270_PIPE_SOURCE *source) { | |
| 99 | + | |
| 100 | + DWORD cbRead = 0; | |
| 101 | + | |
| 102 | + if(ReadFile(source->hPipe,source->buffer,PIPE_BUFFER_LENGTH,&cbRead,&source->overlap) && cbRead > 0) | |
| 103 | + process_input(source,cbRead); | |
| 104 | + | |
| 105 | + // The read operation is still pending. | |
| 106 | + switch(GetLastError()) | |
| 107 | + { | |
| 108 | + case 0: | |
| 109 | + break; | |
| 110 | + | |
| 111 | + case ERROR_IO_PENDING: | |
| 112 | + source->state = PIPE_STATE_PENDING_READ; | |
| 113 | + break; | |
| 114 | + | |
| 115 | + case ERROR_PIPE_LISTENING: | |
| 116 | + source->state = PIPE_STATE_READ; | |
| 117 | + break; | |
| 118 | + | |
| 119 | + case ERROR_BROKEN_PIPE: | |
| 120 | + | |
| 121 | + if(!DisconnectNamedPipe(source->hPipe)) { | |
| 122 | + | |
| 123 | + g_message("Error %u on DisconnectNamedPipe", (unsigned int) GetLastError()); | |
| 124 | + | |
| 125 | + } else { | |
| 126 | + | |
| 127 | + ipc3270_wait_for_client(source); | |
| 128 | + | |
| 129 | + } | |
| 130 | + break; | |
| 131 | + | |
| 132 | + case ERROR_PIPE_NOT_CONNECTED: | |
| 133 | + g_message("Cliente was disconnected"); | |
| 134 | + break; | |
| 135 | + | |
| 136 | + default: | |
| 137 | + if(source->hPipe != INVALID_HANDLE_VALUE) { | |
| 138 | + g_message( "Error %u receiving message from pipe", (unsigned int) GetLastError()); | |
| 139 | + } | |
| 140 | + } | |
| 141 | + | |
| 142 | +} | |
| 143 | + | |
| 144 | + | |
| 145 | +static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer data) { | |
| 146 | + /* | |
| 147 | + * Called to dispatch the event source, | |
| 148 | + * after it has returned TRUE in either its prepare or its check function. | |
| 149 | + * The dispatch function is passed in a callback function and data. | |
| 150 | + * The callback function may be NULL if the source was never connected | |
| 151 | + * to a callback using g_source_set_callback(). The dispatch function | |
| 152 | + * should call the callback function with user_data and whatever additional | |
| 153 | + * parameters are needed for this type of event source. | |
| 154 | + */ | |
| 155 | + BOOL fSuccess; | |
| 156 | + DWORD cbRead = 0; | |
| 157 | + | |
| 158 | + fSuccess = GetOverlappedResult(((IPC3270_PIPE_SOURCE *) source)->hPipe,&((IPC3270_PIPE_SOURCE *) source)->overlap,&cbRead,FALSE ); | |
| 159 | + | |
| 160 | + switch(((IPC3270_PIPE_SOURCE *) source)->state) { | |
| 161 | + case PIPE_STATE_WAITING: | |
| 162 | + | |
| 163 | + if(fSuccess) { | |
| 164 | + | |
| 165 | + g_message("Client is connected"); | |
| 166 | + ((IPC3270_PIPE_SOURCE *) source)->state = PIPE_STATE_READ; | |
| 167 | + | |
| 168 | + } else { | |
| 169 | + | |
| 170 | + // popup_lasterror("%s", _( "Pipe connection failed" )); | |
| 171 | + | |
| 172 | + } | |
| 173 | + break; | |
| 174 | + | |
| 175 | + case PIPE_STATE_READ: | |
| 176 | + // trace("Reading pipe (cbRead=%d)",(int) cbRead); | |
| 177 | + read_input_pipe( (IPC3270_PIPE_SOURCE *) source); | |
| 178 | + break; | |
| 179 | + | |
| 180 | + case PIPE_STATE_PENDING_READ: | |
| 181 | + if(fSuccess && cbRead > 0) | |
| 182 | + process_input((IPC3270_PIPE_SOURCE *) source,cbRead); | |
| 183 | + ((IPC3270_PIPE_SOURCE *) source)->state = PIPE_STATE_READ; | |
| 184 | + break; | |
| 185 | + | |
| 186 | + case PIPE_STATE_UNDEFINED: | |
| 187 | + break; | |
| 188 | + | |
| 189 | + } | |
| 190 | + | |
| 191 | + return TRUE; | |
| 192 | +} | |
| 193 | + | |
| 194 | +static gboolean IO_closure(gpointer data) { | |
| 195 | + return 0; | |
| 196 | +} | |
| 197 | + | |
| 198 | +static void IO_finalize(GSource *source) { | |
| 199 | + | |
| 200 | + if( ((IPC3270_PIPE_SOURCE *) source)->hPipe != INVALID_HANDLE_VALUE) { | |
| 201 | + CloseHandle(((IPC3270_PIPE_SOURCE *) source)->hPipe); | |
| 202 | + ((IPC3270_PIPE_SOURCE *) source)->hPipe = INVALID_HANDLE_VALUE; | |
| 203 | + } | |
| 204 | + | |
| 205 | +} | |
| 206 | + | |
| 207 | +GSourceFuncs ipc3270_source_funcs = { | |
| 208 | + IO_prepare, | |
| 209 | + IO_check, | |
| 210 | + IO_dispatch, | |
| 211 | + IO_finalize, | |
| 212 | + IO_closure, | |
| 213 | + NULL | |
| 214 | +}; | ... | ... |
| ... | ... | @@ -0,0 +1,29 @@ |
| 1 | +#include <windows.h> | |
| 2 | + | |
| 3 | +VS_VERSION_INFO VERSIONINFO | |
| 4 | +FILEVERSION @PACKAGE_MAJOR_VERSION@,@PACKAGE_MINOR_VERSION@,@PACKAGE_MAJOR_RELEASE@,0 | |
| 5 | +PRODUCTVERSION @PACKAGE_MAJOR_VERSION@,@PACKAGE_MINOR_VERSION@,@PACKAGE_MAJOR_RELEASE@,0 | |
| 6 | + | |
| 7 | +BEGIN | |
| 8 | + | |
| 9 | + BLOCK "StringFileInfo" | |
| 10 | + BEGIN | |
| 11 | + BLOCK "080904E4" | |
| 12 | + BEGIN | |
| 13 | + VALUE "FileDescription", "@PACKAGE_DESCRIPTION@\0" | |
| 14 | + VALUE "CompanyName", "Banco do Brasil S/A.\0" | |
| 15 | + VALUE "FileVersion", "@WIN32_VERSION@\0" | |
| 16 | + VALUE "LegalCopyright", "(C) 2017 Banco do Brasil S/A. All Rights Reserved\0" | |
| 17 | + VALUE "OriginalFilename", "@PACKAGE_TARNAME@@DLLEXT@\0" | |
| 18 | + VALUE "ProductName", "@PACKAGE_NAME@\0" | |
| 19 | + VALUE "ProductVersion", "@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@.@PACKAGE_MAJOR_RELEASE@.0\0" | |
| 20 | + END | |
| 21 | + END | |
| 22 | + | |
| 23 | + BLOCK "VarFileInfo" | |
| 24 | + BEGIN | |
| 25 | + VALUE "Translation", 0x809, 0x04E4 | |
| 26 | + END | |
| 27 | + | |
| 28 | +END | |
| 29 | + | ... | ... |
src/getproperties.c
| ... | ... | @@ -1,128 +0,0 @@ |
| 1 | -/* | |
| 2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | - * | |
| 6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | - * | |
| 8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | - * Free Software Foundation. | |
| 11 | - * | |
| 12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | - * obter mais detalhes. | |
| 16 | - * | |
| 17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | - * | |
| 21 | - * Este programa está nomeado como main.c e possui - linhas de código. | |
| 22 | - * | |
| 23 | - * Referências: | |
| 24 | - * | |
| 25 | - * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c | |
| 26 | - * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c | |
| 27 | - * | |
| 28 | - * Contatos: | |
| 29 | - * | |
| 30 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 31 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 32 | - * | |
| 33 | - */ | |
| 34 | - | |
| 35 | -#include <config.h> | |
| 36 | -#include <lib3270/ipc.h> | |
| 37 | -#include <lib3270.h> | |
| 38 | -#include <lib3270/properties.h> | |
| 39 | - | |
| 40 | -#include <dbus/dbus-glib.h> | |
| 41 | -#include <dbus/dbus-glib-bindings.h> | |
| 42 | - | |
| 43 | -GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GError **error) { | |
| 44 | - | |
| 45 | - size_t ix; | |
| 46 | - errno = 0; // Just in case. | |
| 47 | - | |
| 48 | - // Boolean properties | |
| 49 | - const LIB3270_INT_PROPERTY * boolprop = lib3270_get_boolean_properties_list(); | |
| 50 | - for(ix = 0; boolprop[ix].name; ix++) { | |
| 51 | - | |
| 52 | - if(boolprop[ix].get && !g_ascii_strcasecmp(boolprop[ix].name, property_name)) { | |
| 53 | - | |
| 54 | - // Found it! | |
| 55 | - int value = boolprop[ix].get(ipc3270_get_session(object)); | |
| 56 | - | |
| 57 | - debug("%s=%d",property_name,value); | |
| 58 | - | |
| 59 | - if(value > 0 || errno == 0) { | |
| 60 | - return g_variant_new_boolean(value != 0); | |
| 61 | - } | |
| 62 | - | |
| 63 | - // Erro! | |
| 64 | - ipc3270_set_error(object,ENOENT,error); | |
| 65 | - return NULL; | |
| 66 | - | |
| 67 | - } | |
| 68 | - | |
| 69 | - } | |
| 70 | - | |
| 71 | - // int properties | |
| 72 | - const LIB3270_INT_PROPERTY * intprop = lib3270_get_int_properties_list(); | |
| 73 | - for(ix = 0; intprop[ix].name; ix++) { | |
| 74 | - | |
| 75 | - if(intprop[ix].get && !g_ascii_strcasecmp(intprop[ix].name, property_name)) { | |
| 76 | - | |
| 77 | - // Found it! | |
| 78 | - int value = intprop[ix].get(ipc3270_get_session(object)); | |
| 79 | - | |
| 80 | - debug("%s=%d",property_name,value); | |
| 81 | - | |
| 82 | - if(value > 0 || errno == 0) { | |
| 83 | - return g_variant_new_int16((gint16) value); | |
| 84 | - } | |
| 85 | - | |
| 86 | - // Erro! | |
| 87 | - ipc3270_set_error(object,errno,error); | |
| 88 | - return NULL; | |
| 89 | - | |
| 90 | - } | |
| 91 | - | |
| 92 | - } | |
| 93 | - | |
| 94 | - // String properties | |
| 95 | - const LIB3270_STRING_PROPERTY * strprop = lib3270_get_string_properties_list(); | |
| 96 | - for(ix = 0; strprop[ix].name; ix++) { | |
| 97 | - | |
| 98 | - if(strprop[ix].get && !g_ascii_strcasecmp(strprop[ix].name, property_name)) { | |
| 99 | - | |
| 100 | - // Found it! | |
| 101 | - const char * value = strprop[ix].get(ipc3270_get_session(object)); | |
| 102 | - | |
| 103 | - if(value) { | |
| 104 | - debug("%s=%s",property_name,value); | |
| 105 | - return g_variant_new_string(value); | |
| 106 | - } | |
| 107 | - | |
| 108 | - // Erro! | |
| 109 | - ipc3270_set_error(object,errno,error); | |
| 110 | - return NULL; | |
| 111 | - | |
| 112 | - } | |
| 113 | - | |
| 114 | - } | |
| 115 | - | |
| 116 | - // Check for toggle | |
| 117 | - LIB3270_TOGGLE toggle = lib3270_get_toggle_id(property_name); | |
| 118 | - if(toggle != (LIB3270_TOGGLE) -1) { | |
| 119 | - | |
| 120 | - // Is a Tn3270 toggle, get it! | |
| 121 | - return g_variant_new_boolean(lib3270_get_toggle( (ipc3270_get_session(object)), toggle) != 0); | |
| 122 | - | |
| 123 | - } | |
| 124 | - | |
| 125 | - return NULL; | |
| 126 | - | |
| 127 | -} | |
| 128 | - |
src/include/lib3270/ipc.h
| ... | ... | @@ -69,6 +69,10 @@ |
| 69 | 69 | gboolean ipc3270_set_property(GObject *object, const gchar *property_name, GVariant *value, GError **error); |
| 70 | 70 | GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GError **error); |
| 71 | 71 | |
| 72 | + // TODO: Move for windows private.h | |
| 73 | + unsigned char * ipc3270_pack(const gchar *name, int id, GVariant *values, size_t * szPacket); | |
| 74 | + GVariant * ipc3270_unpack(const unsigned char *packet, int *id); | |
| 75 | + | |
| 72 | 76 | G_END_DECLS |
| 73 | 77 | |
| 74 | 78 | #ifdef DEBUG | ... | ... |
src/linux/dbus-definition.xml
| ... | ... | @@ -1,9 +0,0 @@ |
| 1 | -<?xml version="1.0" encoding="UTF-8" ?> | |
| 2 | -<node name="/br/com/bb/pw3270"> | |
| 3 | - <interface name="br.com.bb.pw3270"> | |
| 4 | - <method name="getRevision"> | |
| 5 | - <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | |
| 6 | - <arg type="s" name="revision" direction="out" /> | |
| 7 | - </method> | |
| 8 | - </interface> | |
| 9 | -</node> |
src/linux/gobject.c
| ... | ... | @@ -1,351 +0,0 @@ |
| 1 | -/* | |
| 2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | - * | |
| 6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | - * | |
| 8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | - * Free Software Foundation. | |
| 11 | - * | |
| 12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | - * obter mais detalhes. | |
| 16 | - * | |
| 17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | - * | |
| 21 | - * Este programa está nomeado como main.c e possui - linhas de código. | |
| 22 | - * | |
| 23 | - * Referências: | |
| 24 | - * | |
| 25 | - * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c | |
| 26 | - * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c | |
| 27 | - * | |
| 28 | - * Contatos: | |
| 29 | - * | |
| 30 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 31 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 32 | - * | |
| 33 | - */ | |
| 34 | - | |
| 35 | -#include "gobject.h" | |
| 36 | -#include <lib3270.h> | |
| 37 | -#include <lib3270/actions.h> | |
| 38 | -#include <lib3270/properties.h> | |
| 39 | - | |
| 40 | -#include <dbus/dbus-glib.h> | |
| 41 | -#include <dbus/dbus-glib-bindings.h> | |
| 42 | - | |
| 43 | -G_DEFINE_TYPE(ipc3270, ipc3270, G_TYPE_OBJECT) | |
| 44 | - | |
| 45 | -static void ipc3270_finalize(GObject *object) { | |
| 46 | - | |
| 47 | - ipc3270 * ipc = IPC3270(object); | |
| 48 | - | |
| 49 | - debug("%s",__FUNCTION__); | |
| 50 | - if(ipc->id) { | |
| 51 | - g_dbus_connection_unregister_object(ipc->connection,ipc->id); | |
| 52 | - } | |
| 53 | - | |
| 54 | - G_OBJECT_CLASS(ipc3270_parent_class)->finalize(object); | |
| 55 | -} | |
| 56 | - | |
| 57 | - | |
| 58 | -static void ipc3270_class_init(ipc3270Class *klass) { | |
| 59 | - | |
| 60 | - debug("%s",__FUNCTION__); | |
| 61 | - | |
| 62 | - GObjectClass *object_class; | |
| 63 | - object_class = G_OBJECT_CLASS (klass); | |
| 64 | - object_class->finalize = ipc3270_finalize; | |
| 65 | - | |
| 66 | -} | |
| 67 | - | |
| 68 | -static void ipc3270_init(ipc3270 *object) { | |
| 69 | - | |
| 70 | - debug("%s",__FUNCTION__); | |
| 71 | - object->error_domain = g_quark_from_static_string(PACKAGE_NAME); | |
| 72 | - | |
| 73 | -} | |
| 74 | - | |
| 75 | -GObject * ipc3270_new() { | |
| 76 | - return g_object_new(GLIB_TYPE_IPC3270, NULL); | |
| 77 | -} | |
| 78 | - | |
| 79 | -static void | |
| 80 | - method_call ( | |
| 81 | - G_GNUC_UNUSED GDBusConnection *connection, | |
| 82 | - G_GNUC_UNUSED const gchar *sender, | |
| 83 | - G_GNUC_UNUSED const gchar *object_path, | |
| 84 | - G_GNUC_UNUSED const gchar *interface_name, | |
| 85 | - const gchar *method_name, | |
| 86 | - GVariant *parameters, | |
| 87 | - GDBusMethodInvocation *invocation, | |
| 88 | - gpointer user_data) { | |
| 89 | - | |
| 90 | - g_autoptr (GError) error = NULL; | |
| 91 | - | |
| 92 | - GVariant * rc = ipc3270_method_call(G_OBJECT(user_data), method_name, parameters, &error); | |
| 93 | - | |
| 94 | - if(error) { | |
| 95 | - | |
| 96 | - if(rc) { | |
| 97 | - g_variant_unref(rc); | |
| 98 | - } | |
| 99 | - | |
| 100 | - g_dbus_method_invocation_return_gerror(invocation, error); | |
| 101 | - | |
| 102 | - } else if(rc) { | |
| 103 | - | |
| 104 | - g_dbus_method_invocation_return_value(invocation, rc); | |
| 105 | - | |
| 106 | - } else { | |
| 107 | - | |
| 108 | - g_dbus_method_invocation_return_error(invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Invalid or unexpected method call"); | |
| 109 | - | |
| 110 | - } | |
| 111 | - | |
| 112 | - | |
| 113 | -} | |
| 114 | - | |
| 115 | -static GVariant * | |
| 116 | - get_property ( | |
| 117 | - G_GNUC_UNUSED GDBusConnection *connection, | |
| 118 | - G_GNUC_UNUSED const gchar *sender, | |
| 119 | - G_GNUC_UNUSED const gchar *object_path, | |
| 120 | - G_GNUC_UNUSED const gchar *interface_name, | |
| 121 | - const gchar *property_name, | |
| 122 | - GError **error, | |
| 123 | - gpointer user_data) | |
| 124 | -{ | |
| 125 | - | |
| 126 | - return ipc3270_get_property(G_OBJECT(user_data), property_name, error); | |
| 127 | - | |
| 128 | -} | |
| 129 | - | |
| 130 | -static gboolean | |
| 131 | - set_property ( | |
| 132 | - G_GNUC_UNUSED GDBusConnection *connection, | |
| 133 | - G_GNUC_UNUSED const gchar *sender, | |
| 134 | - G_GNUC_UNUSED const gchar *object_path, | |
| 135 | - G_GNUC_UNUSED const gchar *interface_name, | |
| 136 | - const gchar *property_name, | |
| 137 | - GVariant *value, | |
| 138 | - GError **error, | |
| 139 | - gpointer user_data) | |
| 140 | -{ | |
| 141 | - | |
| 142 | - return ipc3270_set_property(G_OBJECT(user_data), property_name, value, error); | |
| 143 | - | |
| 144 | -} | |
| 145 | - | |
| 146 | - | |
| 147 | -void ipc3270_set_session(GObject *object, H3270 *hSession, const char *name, GError **error) { | |
| 148 | - | |
| 149 | - char id; | |
| 150 | - int ix; | |
| 151 | - | |
| 152 | - static const GDBusInterfaceVTable interface_vtable = { | |
| 153 | - method_call, | |
| 154 | - get_property, | |
| 155 | - set_property | |
| 156 | - }; | |
| 157 | - | |
| 158 | - ipc3270 * ipc = IPC3270(object); | |
| 159 | - ipc->hSession = hSession; | |
| 160 | - | |
| 161 | - ipc->connection = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, error); | |
| 162 | - if(*error) { | |
| 163 | - g_message("Can't get session bus: %s",(*error)->message); | |
| 164 | - return; | |
| 165 | - } | |
| 166 | - | |
| 167 | - g_dbus_connection_set_exit_on_close(ipc->connection,FALSE); | |
| 168 | - | |
| 169 | - for(id='a'; id < 'z' && !ipc->id && !*error; id++) { | |
| 170 | - | |
| 171 | - gchar *object_name = g_strdup_printf("br.com.bb.%s.%c",name,id); | |
| 172 | - | |
| 173 | - debug("Requesting \"%s\"",object_name); | |
| 174 | - | |
| 175 | - // https://dbus.freedesktop.org/doc/dbus-specification.html | |
| 176 | - GError *err = NULL; | |
| 177 | - | |
| 178 | - GVariant * response = | |
| 179 | - g_dbus_connection_call_sync ( | |
| 180 | - ipc->connection, | |
| 181 | - DBUS_SERVICE_DBUS, | |
| 182 | - DBUS_PATH_DBUS, | |
| 183 | - DBUS_INTERFACE_DBUS, | |
| 184 | - "RequestName", | |
| 185 | - g_variant_new ("(su)", object_name, DBUS_NAME_FLAG_DO_NOT_QUEUE), | |
| 186 | - NULL, | |
| 187 | - G_DBUS_CALL_FLAGS_NONE, | |
| 188 | - -1, | |
| 189 | - NULL, | |
| 190 | - &err | |
| 191 | - ); | |
| 192 | - | |
| 193 | - if(err) { | |
| 194 | - g_message("Can't request \"%s\": %s",object_name,err->message); | |
| 195 | - g_error_free(err); | |
| 196 | - err = NULL; | |
| 197 | - } | |
| 198 | - | |
| 199 | - if(response) { | |
| 200 | - | |
| 201 | - guint32 reply = 0; | |
| 202 | - g_variant_get(response, "(u)", &reply); | |
| 203 | - g_variant_unref(response); | |
| 204 | - | |
| 205 | - if(reply == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { | |
| 206 | - | |
| 207 | - g_message("Got %s", object_name); | |
| 208 | - | |
| 209 | - lib3270_set_session_id(ipc->hSession, id); | |
| 210 | - | |
| 211 | - // Introspection data for the service we are exporting | |
| 212 | - GString * introspection = g_string_new( | |
| 213 | - "<node>\n" | |
| 214 | - " <interface name='br.com.bb.tn3270'>" | |
| 215 | - " <method name='connect'>" | |
| 216 | - " <arg type='s' name='url' direction='in'/>" | |
| 217 | - " <arg type='i' name='result' direction='out' />" \ | |
| 218 | - " </method>" | |
| 219 | - " <method name='pfkey'>" \ | |
| 220 | - " <arg type='i' name='keycode' direction='in'/>" \ | |
| 221 | - " <arg type='i' name='result' direction='out' />" \ | |
| 222 | - " </method>" | |
| 223 | - " <method name='pakey'>" \ | |
| 224 | - " <arg type='i' name='keycode' direction='in'/>" \ | |
| 225 | - " <arg type='i' name='result' direction='out' />" \ | |
| 226 | - " </method>" | |
| 227 | - " <method name='getString'>" \ | |
| 228 | - " <arg type='s' name='text' direction='out' />" \ | |
| 229 | - " </method>" \ | |
| 230 | - " <method name='setString'>" \ | |
| 231 | - " <arg type='s' name='text' direction='in' />" \ | |
| 232 | - " <arg type='i' name='result' direction='out' />" \ | |
| 233 | - " </method>" \ | |
| 234 | - " <method name='setStringAt'>" \ | |
| 235 | - " <arg type='i' name='row' direction='in' />" \ | |
| 236 | - " <arg type='i' name='col' direction='in' />" \ | |
| 237 | - " <arg type='s' name='text' direction='in' />" \ | |
| 238 | - " <arg type='i' name='result' direction='out' />" \ | |
| 239 | - " </method>" \ | |
| 240 | - " <method name= 'getStringAt'>" \ | |
| 241 | - " <arg type='i' name='row' direction='in' />" \ | |
| 242 | - " <arg type='i' name='col' direction='in' />" \ | |
| 243 | - " <arg type='i' name='len' direction='in' />" \ | |
| 244 | - " <arg type='y' name='lf' direction='in' />" \ | |
| 245 | - " <arg type='s' name='text' direction='out' />" \ | |
| 246 | - " </method>" \ | |
| 247 | - " <method name='setStringAtAddress'>" \ | |
| 248 | - " <arg type='i' name='addr' direction='in' />" \ | |
| 249 | - " <arg type='s' name='text' direction='in' />" \ | |
| 250 | - " <arg type='i' name='result' direction='out' />" \ | |
| 251 | - " </method>" \ | |
| 252 | - " <method name= 'getStringAtAddress'>" \ | |
| 253 | - " <arg type='i' name='addr' direction='in' />" \ | |
| 254 | - " <arg type='i' name='len' direction='in' />" \ | |
| 255 | - " <arg type='y' name='lf' direction='in' />" \ | |
| 256 | - " <arg type='s' name='text' direction='out' />" \ | |
| 257 | - " </method>" | |
| 258 | - | |
| 259 | - ); | |
| 260 | - | |
| 261 | - // Constrói métodos usando a tabela de controle | |
| 262 | - const LIB3270_ACTION_ENTRY * actions = lib3270_get_action_table(); | |
| 263 | - for(ix = 0; actions[ix].name; ix++) | |
| 264 | - { | |
| 265 | - g_string_append_printf( | |
| 266 | - introspection, \ | |
| 267 | - " <method name='%s'>" \ | |
| 268 | - " </method>", actions[ix].name | |
| 269 | - ); | |
| 270 | - } | |
| 271 | - | |
| 272 | - // Toggle properties | |
| 273 | - for(ix = 0; ix < (int) LIB3270_TOGGLE_COUNT; ix++) { | |
| 274 | - g_string_append_printf(introspection, " <property type='i' name='%s' access='readwrite'/>", lib3270_get_toggle_name((LIB3270_TOGGLE) ix)); | |
| 275 | - } | |
| 276 | - | |
| 277 | - // Boolean properties | |
| 278 | - const LIB3270_INT_PROPERTY * bol_props = lib3270_get_boolean_properties_list(); | |
| 279 | - for(ix = 0; bol_props[ix].name; ix++) { | |
| 280 | - debug("Boolean(%s)",bol_props[ix].name); | |
| 281 | - g_string_append_printf(introspection, " <property type='b' name='%s' access='%s'/>", | |
| 282 | - bol_props[ix].name, | |
| 283 | - ((bol_props[ix].set == NULL) ? "read" : "readwrite") | |
| 284 | - ); | |
| 285 | - } | |
| 286 | - | |
| 287 | - // Integer properties | |
| 288 | - const LIB3270_INT_PROPERTY * int_props = lib3270_get_int_properties_list(); | |
| 289 | - for(ix = 0; int_props[ix].name; ix++) { | |
| 290 | - g_string_append_printf(introspection, " <property type='i' name='%s' access='%s'/>", | |
| 291 | - int_props[ix].name, | |
| 292 | - ((int_props[ix].set == NULL) ? "read" : "readwrite") | |
| 293 | - ); | |
| 294 | - } | |
| 295 | - | |
| 296 | - // String properties | |
| 297 | - const LIB3270_STRING_PROPERTY * str_props = lib3270_get_string_properties_list(); | |
| 298 | - for(ix = 0; str_props[ix].name; ix++) { | |
| 299 | - g_string_append_printf(introspection, " <property type='s' name='%s' access='%s'/>", | |
| 300 | - str_props[ix].name, | |
| 301 | - ((str_props[ix].set == NULL) ? "read" : "readwrite") | |
| 302 | - ); | |
| 303 | - } | |
| 304 | - | |
| 305 | - g_string_append(introspection, | |
| 306 | - " </interface>" | |
| 307 | - "</node>" | |
| 308 | - ); | |
| 309 | - | |
| 310 | - gchar * introspection_xml = g_string_free(introspection,FALSE); | |
| 311 | - | |
| 312 | - debug("\n%s\n",introspection_xml); | |
| 313 | - | |
| 314 | - GDBusNodeInfo * introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL); | |
| 315 | - | |
| 316 | - // Register object-id | |
| 317 | - ipc->id = g_dbus_connection_register_object ( | |
| 318 | - ipc->connection, | |
| 319 | - "/br/com/bb/tn3270", | |
| 320 | - introspection_data->interfaces[0], | |
| 321 | - &interface_vtable, | |
| 322 | - ipc, | |
| 323 | - NULL, | |
| 324 | - error | |
| 325 | - ); | |
| 326 | - | |
| 327 | - g_dbus_node_info_unref(introspection_data); | |
| 328 | - g_free(introspection_xml); | |
| 329 | - | |
| 330 | - break; | |
| 331 | - } | |
| 332 | - | |
| 333 | - } | |
| 334 | - | |
| 335 | - g_free(object_name); | |
| 336 | - | |
| 337 | - } | |
| 338 | - | |
| 339 | -} | |
| 340 | - | |
| 341 | -const gchar * ipc3270_get_display_charset(GObject *object) { | |
| 342 | - return lib3270_get_display_charset(IPC3270(object)->hSession); | |
| 343 | -} | |
| 344 | - | |
| 345 | -H3270 * ipc3270_get_session(GObject *object) { | |
| 346 | - return IPC3270(object)->hSession; | |
| 347 | -} | |
| 348 | - | |
| 349 | -void ipc3270_set_error(GObject *object, int errcode, GError **error) { | |
| 350 | - g_set_error(error,IPC3270(object)->error_domain,errcode,"%s",strerror(errcode)); | |
| 351 | -} |
src/linux/gobject.h
| ... | ... | @@ -1,77 +0,0 @@ |
| 1 | -/* | |
| 2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob | |
| 5 | - * o nome G3270. | |
| 6 | - * | |
| 7 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 8 | - * | |
| 9 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 10 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 11 | - * Free Software Foundation. | |
| 12 | - * | |
| 13 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 14 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 15 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 16 | - * obter mais detalhes. | |
| 17 | - * | |
| 18 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 19 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 20 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 21 | - * | |
| 22 | - * Este programa está nomeado como - e possui - linhas de código. | |
| 23 | - * | |
| 24 | - * Contatos: | |
| 25 | - * | |
| 26 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 27 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 28 | - * | |
| 29 | - */ | |
| 30 | - | |
| 31 | - /** | |
| 32 | - * @brief Private definitions for pw3270 IPC linux module. | |
| 33 | - * | |
| 34 | - */ | |
| 35 | - | |
| 36 | -#ifndef LINUX_GOBJECT_H_INCLUDED | |
| 37 | - | |
| 38 | - #define LINUX_GOBJECT_H_INCLUDED | |
| 39 | - | |
| 40 | - #include <config.h> | |
| 41 | - | |
| 42 | - #define ENABLE_NLS | |
| 43 | - #define GETTEXT_PACKAGE PACKAGE_NAME | |
| 44 | - | |
| 45 | - #include <libintl.h> | |
| 46 | - #include <glib/gi18n.h> | |
| 47 | - #include <gio/gio.h> | |
| 48 | - | |
| 49 | - #include <lib3270.h> | |
| 50 | - #include <lib3270/ipc.h> | |
| 51 | - | |
| 52 | - G_BEGIN_DECLS | |
| 53 | - | |
| 54 | - typedef struct _ipc3270 ipc3270; | |
| 55 | - typedef struct _ipc3270Class ipc3270Class; | |
| 56 | - | |
| 57 | - struct _ipc3270 { | |
| 58 | - GObject parent; | |
| 59 | - GDBusConnection * connection; | |
| 60 | - guint id; | |
| 61 | - H3270 * hSession; | |
| 62 | - GQuark error_domain; | |
| 63 | - }; | |
| 64 | - | |
| 65 | - struct _ipc3270Class { | |
| 66 | - GObjectClass parent; | |
| 67 | - }; | |
| 68 | - | |
| 69 | - /* | |
| 70 | - G_GNUC_INTERNAL void ipc3270_method_call (GDBusConnection *connection, const gchar *sender, const gchar *object_path, const gchar *interface_name, const gchar *method_name, GVariant *parameters, GDBusMethodInvocation *invocation, gpointer user_data); | |
| 71 | - G_GNUC_INTERNAL gboolean ipc3270_set_property(GDBusConnection *connection, const gchar *sender, const gchar *object_path, const gchar *interface_name, const gchar *property_name, GVariant *value, GError **error, gpointer user_data); | |
| 72 | - G_GNUC_INTERNAL GVariant * ipc3270_get_property (GDBusConnection *connection, const gchar *sender, const gchar *object_path, const gchar *interface_name, const gchar *property_name, GError **error, gpointer user_data); | |
| 73 | - */ | |
| 74 | - | |
| 75 | - G_END_DECLS | |
| 76 | - | |
| 77 | -#endif // LINUX_GOBJECT_H_INCLUDED |
src/linux/start.c.1
| ... | ... | @@ -1,191 +0,0 @@ |
| 1 | -/* | |
| 2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob | |
| 5 | - * o nome G3270. | |
| 6 | - * | |
| 7 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 8 | - * | |
| 9 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 10 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 11 | - * Free Software Foundation. | |
| 12 | - * | |
| 13 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 14 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 15 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 16 | - * obter mais detalhes. | |
| 17 | - * | |
| 18 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 19 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 20 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 21 | - * | |
| 22 | - * Este programa está nomeado como testprogram.c e possui - linhas de código. | |
| 23 | - * | |
| 24 | - * Contatos: | |
| 25 | - * | |
| 26 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 27 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 28 | - * | |
| 29 | - */ | |
| 30 | - | |
| 31 | - | |
| 32 | - /** | |
| 33 | - * @brief Plugin startup/stop for linux. | |
| 34 | - * | |
| 35 | - */ | |
| 36 | - | |
| 37 | - #include "private.h" | |
| 38 | - | |
| 39 | - #include <dbus/dbus-glib.h> | |
| 40 | - #include <dbus/dbus-glib-bindings.h> | |
| 41 | - | |
| 42 | - static void pw3270_dbus_cleanup(struct DBusSession * dBus) { | |
| 43 | - | |
| 44 | - if(dBus->proxy) { | |
| 45 | - g_object_unref(dBus); | |
| 46 | - } | |
| 47 | - | |
| 48 | - } | |
| 49 | - | |
| 50 | - int pw3270_plugin_start(GtkWidget *window, GtkWidget *terminal) { | |
| 51 | - | |
| 52 | - struct DBusSession * dBus = g_new0(struct DBusSession,1); | |
| 53 | - GError * error = NULL; | |
| 54 | - int id; | |
| 55 | - | |
| 56 | - g_object_set_data_full(G_OBJECT(terminal), "dbus-session-info", dBus, (GDestroyNotify) pw3270_dbus_cleanup); | |
| 57 | - | |
| 58 | - dBus->connection = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error); | |
| 59 | - | |
| 60 | - if(error) { | |
| 61 | - GtkWidget *dialog = gtk_message_dialog_new( | |
| 62 | - GTK_WINDOW(window), | |
| 63 | - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 64 | - GTK_MESSAGE_ERROR, | |
| 65 | - GTK_BUTTONS_OK, | |
| 66 | - _( "Can't get D-Bus connection" )); | |
| 67 | - | |
| 68 | - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message); | |
| 69 | - g_error_free(error); | |
| 70 | - | |
| 71 | - gtk_dialog_run(GTK_DIALOG(dialog)); | |
| 72 | - gtk_widget_destroy(dialog); | |
| 73 | - | |
| 74 | - return -1; | |
| 75 | - } | |
| 76 | - | |
| 77 | - g_dbus_connection_set_exit_on_close(dBus->connection,FALSE); | |
| 78 | - | |
| 79 | - /* | |
| 80 | - dBus->proxy = g_dbus_proxy_new_sync( | |
| 81 | - dBus->connection, | |
| 82 | - G_DBUS_PROXY_FLAGS_NONE, | |
| 83 | - NULL, // GDBusInterfaceInfo | |
| 84 | - "br.com.bb." PACKAGE_NAME, // name | |
| 85 | - "/br/com/bb/" PACKAGE_NAME "/terminal", // object path | |
| 86 | - "br.com.bb." PACKAGE_NAME ".terminal", // interface | |
| 87 | - NULL, // GCancellable | |
| 88 | - &error ); | |
| 89 | - | |
| 90 | - if(error) { | |
| 91 | - | |
| 92 | - GtkWidget *dialog = gtk_message_dialog_new( | |
| 93 | - GTK_WINDOW(window), | |
| 94 | - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 95 | - GTK_MESSAGE_ERROR, | |
| 96 | - GTK_BUTTONS_OK, | |
| 97 | - _( "Can't get D-Bus proxy object" )); | |
| 98 | - | |
| 99 | - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message); | |
| 100 | - g_error_free(error); | |
| 101 | - | |
| 102 | - gtk_dialog_run(GTK_DIALOG(dialog)); | |
| 103 | - gtk_widget_destroy(dialog); | |
| 104 | - | |
| 105 | - return -1; | |
| 106 | - } | |
| 107 | - */ | |
| 108 | - | |
| 109 | - for(id='a'; id < 'z' && !error && !dBus->proxy; id++) { | |
| 110 | - | |
| 111 | - gchar *name = g_strdup_printf("br.com.bb.%s.%c",gtk_widget_get_name(window),id); | |
| 112 | - | |
| 113 | - debug("Requesting \"%s\"",name); | |
| 114 | - | |
| 115 | - // https://dbus.freedesktop.org/doc/dbus-specification.html | |
| 116 | - GVariant * response = | |
| 117 | - g_dbus_connection_call_sync ( | |
| 118 | - dBus->connection, | |
| 119 | - DBUS_SERVICE_DBUS, | |
| 120 | - DBUS_PATH_DBUS, | |
| 121 | - DBUS_INTERFACE_DBUS, | |
| 122 | - "RequestName", | |
| 123 | - g_variant_new ("(su)", name, DBUS_NAME_FLAG_DO_NOT_QUEUE), | |
| 124 | - NULL, | |
| 125 | - G_DBUS_CALL_FLAGS_NONE, | |
| 126 | - -1, | |
| 127 | - NULL, | |
| 128 | - &error | |
| 129 | - ); | |
| 130 | - | |
| 131 | - if(error) { | |
| 132 | - g_message("Can't request \"%s\": %s",name,error->message); | |
| 133 | - g_error_free(error); | |
| 134 | - error = NULL; | |
| 135 | - } | |
| 136 | - | |
| 137 | - if(response) { | |
| 138 | - | |
| 139 | - guint32 reply = 0; | |
| 140 | - g_variant_get(response, "(u)", &reply); | |
| 141 | - g_variant_unref(response); | |
| 142 | - | |
| 143 | - if(reply == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { | |
| 144 | - | |
| 145 | - dBus->proxy = g_dbus_proxy_new_sync( | |
| 146 | - dBus->connection, | |
| 147 | - G_DBUS_PROXY_FLAGS_NONE, | |
| 148 | - NULL, // GDBusInterfaceInfo | |
| 149 | - name, // name | |
| 150 | - "/br/com/bb/" PACKAGE_NAME "/terminal", // object path | |
| 151 | - "br.com.bb." PACKAGE_NAME ".terminal", // interface | |
| 152 | - NULL, // GCancellable | |
| 153 | - &error ); | |
| 154 | - | |
| 155 | - gchar * widget_name = g_strdup_printf("%s:%c",gtk_widget_get_name(window),id); | |
| 156 | - v3270_set_session_name(terminal, widget_name); | |
| 157 | - g_free(widget_name); | |
| 158 | - | |
| 159 | - g_message("Got %s - %s", name, v3270_get_session_name(terminal)); | |
| 160 | - | |
| 161 | - } | |
| 162 | - | |
| 163 | - } | |
| 164 | - | |
| 165 | - g_free(name); | |
| 166 | - | |
| 167 | - } | |
| 168 | - | |
| 169 | - if(!dBus->proxy) { | |
| 170 | - GtkWidget *dialog = gtk_message_dialog_new( | |
| 171 | - GTK_WINDOW(window), | |
| 172 | - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
| 173 | - GTK_MESSAGE_ERROR, | |
| 174 | - GTK_BUTTONS_OK, | |
| 175 | - _( "Can't get DBUS object name" )); | |
| 176 | - | |
| 177 | - gtk_dialog_run(GTK_DIALOG(dialog)); | |
| 178 | - gtk_widget_destroy(dialog); | |
| 179 | - | |
| 180 | - return -1; | |
| 181 | - } | |
| 182 | - | |
| 183 | - // Got D-Bus name, register object. | |
| 184 | - | |
| 185 | - return 0; | |
| 186 | - | |
| 187 | - } | |
| 188 | - | |
| 189 | - #endif // !_WIN32 | |
| 190 | - | |
| 191 | - |
src/methods.c
| ... | ... | @@ -1,172 +0,0 @@ |
| 1 | -/* | |
| 2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | - * | |
| 6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | - * | |
| 8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | - * Free Software Foundation. | |
| 11 | - * | |
| 12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | - * obter mais detalhes. | |
| 16 | - * | |
| 17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | - * | |
| 21 | - * Este programa está nomeado como main.c e possui - linhas de código. | |
| 22 | - * | |
| 23 | - * Referências: | |
| 24 | - * | |
| 25 | - * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c | |
| 26 | - * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c | |
| 27 | - * | |
| 28 | - * Contatos: | |
| 29 | - * | |
| 30 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 31 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 32 | - * | |
| 33 | - */ | |
| 34 | - | |
| 35 | -#include <config.h> | |
| 36 | -#include <string.h> | |
| 37 | -#include <lib3270/ipc.h> | |
| 38 | -#include <lib3270.h> | |
| 39 | -#include <lib3270/actions.h> | |
| 40 | - | |
| 41 | -#include <dbus/dbus-glib.h> | |
| 42 | -#include <dbus/dbus-glib-bindings.h> | |
| 43 | - | |
| 44 | -GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *parameters, GError **error) { | |
| 45 | - | |
| 46 | - size_t ix; | |
| 47 | - | |
| 48 | - debug("%s(%s)",__FUNCTION__,method_name); | |
| 49 | - | |
| 50 | - if(!g_ascii_strcasecmp(method_name,"getString")) | |
| 51 | - { | |
| 52 | - return ipc3270_GVariant_from_input_string(object, lib3270_get_string_at_address(ipc3270_get_session(object),0,-1,'\n'), error); | |
| 53 | - } | |
| 54 | - else if(!g_ascii_strcasecmp(method_name,"setString")) | |
| 55 | - { | |
| 56 | - gchar *text = NULL; | |
| 57 | - g_variant_get(parameters, "(&s)", &text); | |
| 58 | - | |
| 59 | - g_autofree gchar * converted = ipc3270_convert_output_string(object, text, error); | |
| 60 | - if(lib3270_input_string(ipc3270_get_session(object),(const unsigned char *) converted) < 0) | |
| 61 | - { | |
| 62 | - // Failed! | |
| 63 | - ipc3270_set_error(object,errno,error); | |
| 64 | - return NULL; | |
| 65 | - } | |
| 66 | - | |
| 67 | - // Suceeded | |
| 68 | - return g_variant_new_int16((gint16) 0); | |
| 69 | - | |
| 70 | - } | |
| 71 | - else if(!g_ascii_strcasecmp(method_name,"setStringAt")) | |
| 72 | - { | |
| 73 | - gint row,col; | |
| 74 | - gchar *text = NULL; | |
| 75 | - g_variant_get(parameters, "(ii&s)", &row, &col, &text); | |
| 76 | - | |
| 77 | - g_autofree gchar * converted = ipc3270_convert_output_string(object, text, error); | |
| 78 | - if(lib3270_set_string_at(ipc3270_get_session(object),row,col,(const unsigned char *) converted) < 0) | |
| 79 | - { | |
| 80 | - // Failed! | |
| 81 | - ipc3270_set_error(object,errno,error); | |
| 82 | - return NULL; | |
| 83 | - } | |
| 84 | - | |
| 85 | - // Suceeded | |
| 86 | - return g_variant_new_int16((gint16) 0); | |
| 87 | - | |
| 88 | - } | |
| 89 | - else if(!g_ascii_strcasecmp(method_name,"getStringAt")) | |
| 90 | - { | |
| 91 | - gint row,col,len; | |
| 92 | - guchar lf; | |
| 93 | - g_variant_get(parameters, "(iiy)", &row, &col, &len,&lf); | |
| 94 | - | |
| 95 | - return ipc3270_GVariant_from_input_string(object,lib3270_get_string_at(ipc3270_get_session(object), row, col, len, lf),error); | |
| 96 | - | |
| 97 | - } | |
| 98 | - else if(!g_ascii_strcasecmp(method_name,"setStringAtAddress")) | |
| 99 | - { | |
| 100 | - gint addr; | |
| 101 | - gchar *text = NULL; | |
| 102 | - g_variant_get(parameters, "(i&s)", &addr, &text); | |
| 103 | - | |
| 104 | - g_autofree gchar * converted = ipc3270_convert_output_string(object, text, error); | |
| 105 | - if(lib3270_set_string_at_address(ipc3270_get_session(object),addr,(unsigned char *) converted) < 0) | |
| 106 | - { | |
| 107 | - // Failed! | |
| 108 | - ipc3270_set_error(object,errno,error); | |
| 109 | - return NULL; | |
| 110 | - } | |
| 111 | - | |
| 112 | - // Suceeded | |
| 113 | - return g_variant_new_int16((gint16) 0); | |
| 114 | - | |
| 115 | - } | |
| 116 | - else if(!g_ascii_strcasecmp(method_name,"getStringAtAddress")) | |
| 117 | - { | |
| 118 | - gint addr,len; | |
| 119 | - guchar lf; | |
| 120 | - g_variant_get(parameters, "(iiy)", &addr, &len, &lf); | |
| 121 | - | |
| 122 | - return ipc3270_GVariant_from_input_string(object,lib3270_get_string_at_address(ipc3270_get_session(object), addr, len, lf),error); | |
| 123 | - | |
| 124 | - } | |
| 125 | - // Check action table. | |
| 126 | - const LIB3270_ACTION_ENTRY * actions = lib3270_get_action_table(); | |
| 127 | - for(ix = 0; actions[ix].name; ix++) | |
| 128 | - { | |
| 129 | - if(!g_ascii_strcasecmp(actions[ix].name,method_name)) { | |
| 130 | - | |
| 131 | - int rc = actions[ix].call(ipc3270_get_session(object)); | |
| 132 | - if(rc) | |
| 133 | - { | |
| 134 | - // Failed | |
| 135 | - ipc3270_set_error(object,errno,error); | |
| 136 | - return NULL; | |
| 137 | - } | |
| 138 | - | |
| 139 | - // Suceeded | |
| 140 | - return g_variant_new_int16((gint16) 0); | |
| 141 | - | |
| 142 | - } | |
| 143 | - } | |
| 144 | - | |
| 145 | - // Check int methods | |
| 146 | - const IPC_METHOD_INT_ARG * int_methods = ipc3270_get_int_arg_methods(); | |
| 147 | - | |
| 148 | - for(ix = 0; int_methods[ix].name; ix++) | |
| 149 | - { | |
| 150 | - if(!g_ascii_strcasecmp(int_methods[ix].name,method_name)) { | |
| 151 | - | |
| 152 | - gint value; | |
| 153 | - g_variant_get(parameters, "(i)", &value); | |
| 154 | - | |
| 155 | - int rc = int_methods[ix].call(ipc3270_get_session(object), value); | |
| 156 | - if(rc) | |
| 157 | - { | |
| 158 | - // Failed | |
| 159 | - ipc3270_set_error(object,errno,error); | |
| 160 | - return NULL; | |
| 161 | - } | |
| 162 | - | |
| 163 | - // Suceeded | |
| 164 | - return g_variant_new_int16((gint16) 0); | |
| 165 | - | |
| 166 | - } | |
| 167 | - | |
| 168 | - } | |
| 169 | - | |
| 170 | - return NULL; | |
| 171 | - | |
| 172 | -} |
| ... | ... | @@ -0,0 +1,29 @@ |
| 1 | +#include <windows.h> | |
| 2 | + | |
| 3 | +VS_VERSION_INFO VERSIONINFO | |
| 4 | +FILEVERSION @PACKAGE_MAJOR_VERSION@,@PACKAGE_MINOR_VERSION@,@PACKAGE_MAJOR_RELEASE@,0 | |
| 5 | +PRODUCTVERSION @PACKAGE_MAJOR_VERSION@,@PACKAGE_MINOR_VERSION@,@PACKAGE_MAJOR_RELEASE@,0 | |
| 6 | + | |
| 7 | +BEGIN | |
| 8 | + | |
| 9 | + BLOCK "StringFileInfo" | |
| 10 | + BEGIN | |
| 11 | + BLOCK "080904E4" | |
| 12 | + BEGIN | |
| 13 | + VALUE "FileDescription", "@PACKAGE_NAME@ IPC Plugin\0" | |
| 14 | + VALUE "CompanyName", "Banco do Brasil S/A.\0" | |
| 15 | + VALUE "FileVersion", "@WIN32_VERSION@\0" | |
| 16 | + VALUE "LegalCopyright", "(C) 2017 Banco do Brasil S/A. All Rights Reserved\0" | |
| 17 | + VALUE "OriginalFilename", "ipc3270@DLLEXT@\0" | |
| 18 | + VALUE "ProductName", "@PACKAGE_NAME@\0" | |
| 19 | + VALUE "ProductVersion", "@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@.@PACKAGE_MAJOR_RELEASE@.0\0" | |
| 20 | + END | |
| 21 | + END | |
| 22 | + | |
| 23 | + BLOCK "VarFileInfo" | |
| 24 | + BEGIN | |
| 25 | + VALUE "Translation", 0x809, 0x04E4 | |
| 26 | + END | |
| 27 | + | |
| 28 | +END | |
| 29 | + | ... | ... |
src/setproperties.c
| ... | ... | @@ -1,151 +0,0 @@ |
| 1 | -/* | |
| 2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | - * | |
| 6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | - * | |
| 8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | - * Free Software Foundation. | |
| 11 | - * | |
| 12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | - * obter mais detalhes. | |
| 16 | - * | |
| 17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | - * | |
| 21 | - * Este programa está nomeado como main.c e possui - linhas de código. | |
| 22 | - * | |
| 23 | - * Referências: | |
| 24 | - * | |
| 25 | - * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c | |
| 26 | - * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c | |
| 27 | - * | |
| 28 | - * Contatos: | |
| 29 | - * | |
| 30 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 31 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 32 | - * | |
| 33 | - */ | |
| 34 | - | |
| 35 | -#include <config.h> | |
| 36 | -#include <lib3270/ipc.h> | |
| 37 | -#include <lib3270.h> | |
| 38 | -#include <lib3270/properties.h> | |
| 39 | - | |
| 40 | -#include <dbus/dbus-glib.h> | |
| 41 | -#include <dbus/dbus-glib-bindings.h> | |
| 42 | - | |
| 43 | -gboolean ipc3270_set_property(GObject *object, const gchar *property_name, GVariant *value, GError **error) { | |
| 44 | - | |
| 45 | - // Check for property | |
| 46 | - size_t ix; | |
| 47 | - | |
| 48 | - // Boolean properties | |
| 49 | - const LIB3270_INT_PROPERTY * boolprop = lib3270_get_boolean_properties_list(); | |
| 50 | - for(ix = 0; boolprop[ix].name; ix++) { | |
| 51 | - | |
| 52 | - if(boolprop[ix].set && !g_ascii_strcasecmp(boolprop[ix].name, property_name)) { | |
| 53 | - | |
| 54 | - // Found it! | |
| 55 | - if(boolprop[ix].set(ipc3270_get_session(object), (int) (g_variant_get_boolean(value) ? 1 : 0))) { | |
| 56 | - | |
| 57 | - // Erro! | |
| 58 | - g_set_error (error, | |
| 59 | - G_IO_ERROR, | |
| 60 | - G_IO_ERROR_FAILED, | |
| 61 | - g_strerror(errno) | |
| 62 | - ); | |
| 63 | - | |
| 64 | - return FALSE; | |
| 65 | - } | |
| 66 | - | |
| 67 | - return TRUE; | |
| 68 | - | |
| 69 | - } | |
| 70 | - | |
| 71 | - } | |
| 72 | - | |
| 73 | - // Integer properties | |
| 74 | - const LIB3270_INT_PROPERTY * intprop = lib3270_get_int_properties_list(); | |
| 75 | - for(ix = 0; intprop[ix].name; ix++) { | |
| 76 | - | |
| 77 | - if(intprop[ix].set && !g_ascii_strcasecmp(intprop[ix].name, property_name)) { | |
| 78 | - | |
| 79 | - // Found it! | |
| 80 | - if(intprop[ix].set(ipc3270_get_session(object), (int) (g_variant_get_boolean(value) ? 1 : 0))) { | |
| 81 | - | |
| 82 | - // Erro! | |
| 83 | - g_set_error (error, | |
| 84 | - G_IO_ERROR, | |
| 85 | - G_IO_ERROR_FAILED, | |
| 86 | - g_strerror(errno) | |
| 87 | - ); | |
| 88 | - | |
| 89 | - return FALSE; | |
| 90 | - } | |
| 91 | - | |
| 92 | - return TRUE; | |
| 93 | - | |
| 94 | - } | |
| 95 | - | |
| 96 | - } | |
| 97 | - | |
| 98 | - // String properties | |
| 99 | - const LIB3270_STRING_PROPERTY * strprop = lib3270_get_string_properties_list(); | |
| 100 | - for(ix = 0; strprop[ix].name; ix++) { | |
| 101 | - | |
| 102 | - if(strprop[ix].set && !g_ascii_strcasecmp(strprop[ix].name, property_name)) { | |
| 103 | - | |
| 104 | - // Found it! | |
| 105 | - if(strprop[ix].set(ipc3270_get_session(object), g_variant_get_string(value,NULL))) { | |
| 106 | - | |
| 107 | - // Erro! | |
| 108 | - g_set_error (error, | |
| 109 | - G_IO_ERROR, | |
| 110 | - G_IO_ERROR_FAILED, | |
| 111 | - g_strerror(errno) | |
| 112 | - ); | |
| 113 | - | |
| 114 | - return FALSE; | |
| 115 | - } | |
| 116 | - | |
| 117 | - return TRUE; | |
| 118 | - | |
| 119 | - } | |
| 120 | - | |
| 121 | - } | |
| 122 | - | |
| 123 | - // Check for toggle | |
| 124 | - LIB3270_TOGGLE toggle = lib3270_get_toggle_id(property_name); | |
| 125 | - if(toggle != (LIB3270_TOGGLE) -1) { | |
| 126 | - | |
| 127 | - // Is a Tn3270 toggle, get it! | |
| 128 | - if(lib3270_set_toggle(ipc3270_get_session(object),toggle,(int) g_variant_get_int32(value))) { | |
| 129 | - | |
| 130 | - // Erro! | |
| 131 | - g_set_error (error, | |
| 132 | - G_IO_ERROR, | |
| 133 | - G_IO_ERROR_FAILED, | |
| 134 | - g_strerror(errno) | |
| 135 | - ); | |
| 136 | - | |
| 137 | - return FALSE; | |
| 138 | - | |
| 139 | - } | |
| 140 | - | |
| 141 | - return TRUE; | |
| 142 | - } | |
| 143 | - | |
| 144 | - g_set_error (error, | |
| 145 | - G_IO_ERROR, | |
| 146 | - G_IO_ERROR_NOT_FOUND, | |
| 147 | - "Can't find any property named %s", property_name | |
| 148 | - ); | |
| 149 | - | |
| 150 | - return FALSE; | |
| 151 | -} |
src/testprogram/testprogram.c
| ... | ... | @@ -41,7 +41,7 @@ |
| 41 | 41 | |
| 42 | 42 | /*---[ Implement ]----------------------------------------------------------------------------------*/ |
| 43 | 43 | |
| 44 | -static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { | |
| 44 | + static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { | |
| 45 | 45 | |
| 46 | 46 | GtkWidget * window = gtk_application_window_new(app); |
| 47 | 47 | GtkWidget * terminal = v3270_new(); |
| ... | ... | @@ -75,18 +75,40 @@ static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { |
| 75 | 75 | |
| 76 | 76 | int main (int argc, char **argv) { |
| 77 | 77 | |
| 78 | - GtkApplication *app; | |
| 79 | - int status; | |
| 78 | + /* | |
| 79 | + GVariantBuilder builder; | |
| 80 | 80 | |
| 81 | - app = gtk_application_new ("br.com.bb.pw3270",G_APPLICATION_FLAGS_NONE); | |
| 81 | + g_variant_builder_init(&builder,G_VARIANT_TYPE("(isi)")); | |
| 82 | 82 | |
| 83 | - g_signal_connect (app, "activate", G_CALLBACK(activate), NULL); | |
| 83 | + g_variant_builder_add(&builder, "i", 10); | |
| 84 | + g_variant_builder_add(&builder, "s", "teste"); | |
| 85 | + g_variant_builder_add(&builder, "i", 20); | |
| 84 | 86 | |
| 85 | - status = g_application_run (G_APPLICATION (app), argc, argv); | |
| 86 | - g_object_unref (app); | |
| 87 | + GVariant *value = g_variant_builder_end(&builder); | |
| 87 | 88 | |
| 88 | - g_message("rc=%d",status); | |
| 89 | - return status; | |
| 89 | + size_t szPacket = 0; | |
| 90 | + g_autofree unsigned char * buffer = ipc3270_pack("teste", value, &szPacket); | |
| 91 | + g_variant_unref(value); | |
| 92 | + | |
| 93 | + debug("Package \"%s\" was created with %u bytes", buffer, (unsigned int) szPacket); | |
| 94 | + | |
| 95 | + value = ipc3270_unpack(buffer); | |
| 96 | + | |
| 97 | + g_variant_unref(value); | |
| 98 | + */ | |
| 99 | + | |
| 100 | + GtkApplication *app; | |
| 101 | + int status; | |
| 102 | + | |
| 103 | + app = gtk_application_new ("br.com.bb.pw3270",G_APPLICATION_FLAGS_NONE); | |
| 104 | + | |
| 105 | + g_signal_connect (app, "activate", G_CALLBACK(activate), NULL); | |
| 106 | + | |
| 107 | + status = g_application_run (G_APPLICATION (app), argc, argv); | |
| 108 | + g_object_unref (app); | |
| 109 | + | |
| 110 | + g_message("rc=%d",status); | |
| 111 | + return status; | |
| 90 | 112 | |
| 91 | 113 | } |
| 92 | 114 | ... | ... |
src/windows/gobject.c
| ... | ... | @@ -1,125 +0,0 @@ |
| 1 | -/* | |
| 2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | - * | |
| 6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | - * | |
| 8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | - * Free Software Foundation. | |
| 11 | - * | |
| 12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | - * obter mais detalhes. | |
| 16 | - * | |
| 17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | - * | |
| 21 | - * Este programa está nomeado como gobject.c e possui - linhas de código. | |
| 22 | - * | |
| 23 | - * Contatos: | |
| 24 | - * | |
| 25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 27 | - * | |
| 28 | - */ | |
| 29 | - | |
| 30 | -#include "gobject.h" | |
| 31 | -#include <lib3270.h> | |
| 32 | -#include <lib3270/actions.h> | |
| 33 | -#include <lib3270/properties.h> | |
| 34 | - | |
| 35 | -G_DEFINE_TYPE(ipc3270, ipc3270, G_TYPE_OBJECT) | |
| 36 | - | |
| 37 | -static void ipc3270_finalize(GObject *object) { | |
| 38 | - | |
| 39 | - ipc3270 * ipc = IPC3270(object); | |
| 40 | - | |
| 41 | - | |
| 42 | - G_OBJECT_CLASS(ipc3270_parent_class)->finalize(object); | |
| 43 | -} | |
| 44 | - | |
| 45 | - | |
| 46 | -static void ipc3270_class_init(ipc3270Class *klass) { | |
| 47 | - | |
| 48 | - debug("%s",__FUNCTION__); | |
| 49 | - | |
| 50 | - GObjectClass *object_class; | |
| 51 | - object_class = G_OBJECT_CLASS (klass); | |
| 52 | - object_class->finalize = ipc3270_finalize; | |
| 53 | - | |
| 54 | -} | |
| 55 | - | |
| 56 | -static void ipc3270_init(ipc3270 *object) { | |
| 57 | - | |
| 58 | - debug("%s",__FUNCTION__); | |
| 59 | - object->error_domain = g_quark_from_static_string(PACKAGE_NAME); | |
| 60 | - | |
| 61 | -} | |
| 62 | - | |
| 63 | -GObject * ipc3270_new() { | |
| 64 | - return g_object_new(GLIB_TYPE_IPC3270, NULL); | |
| 65 | -} | |
| 66 | - | |
| 67 | -void ipc3270_set_session(GObject *object, H3270 *hSession, const char *name, GError **error) { | |
| 68 | - | |
| 69 | - char id; | |
| 70 | - | |
| 71 | - ipc3270 * ipc = IPC3270(object); | |
| 72 | - ipc->hSession = hSession; | |
| 73 | - | |
| 74 | - for(id='A';id < 'Z';id++) { | |
| 75 | - | |
| 76 | - gchar * pipename = g_strdup_printf("\\\\.\\pipe\\%s\\%c",name,id); | |
| 77 | - gchar * ptr; | |
| 78 | - HANDLE hPipe; | |
| 79 | - | |
| 80 | - for(ptr=pipename;*ptr;ptr++) | |
| 81 | - *ptr = g_ascii_tolower(*ptr); | |
| 82 | - | |
| 83 | - hPipe = CreateNamedPipe( TEXT(pipename), // pipe name | |
| 84 | - PIPE_ACCESS_DUPLEX | // read/write access | |
| 85 | - FILE_FLAG_OVERLAPPED, // overlapped mode | |
| 86 | - PIPE_TYPE_MESSAGE | // pipe type | |
| 87 | - PIPE_READMODE_MESSAGE | // pipe mode | |
| 88 | - PIPE_WAIT, // blocking mode | |
| 89 | - 1, // number of instances | |
| 90 | - PIPE_BUFFER_LENGTH, // output buffer size | |
| 91 | - PIPE_BUFFER_LENGTH, // input buffer size | |
| 92 | - NMPWAIT_USE_DEFAULT_WAIT, // client time-out | |
| 93 | - NULL); // default security attributes | |
| 94 | - | |
| 95 | - debug("%s = %p",pipename,hPipe); | |
| 96 | - g_free(pipename); | |
| 97 | - | |
| 98 | - if(hPipe != INVALID_HANDLE_VALUE) { | |
| 99 | - | |
| 100 | - ipc->source = (IPC3270_PIPE_SOURCE *) g_source_new(&ipc3270_source_funcs,sizeof(IPC3270_PIPE_SOURCE)); | |
| 101 | - | |
| 102 | - lib3270_set_session_id(ipc->hSession, id); | |
| 103 | - | |
| 104 | - ipc->source->hPipe = hPipe; | |
| 105 | - ipc->source->state = PIPE_STATE_WAITING; | |
| 106 | - ipc->source->overlap.hEvent = CreateEvent( NULL,TRUE,TRUE,NULL); | |
| 107 | - | |
| 108 | - g_source_attach((GSource *) ipc->source,NULL); | |
| 109 | - | |
| 110 | - // IO_accept(source); | |
| 111 | - ipc3270_wait_for_client(ipc->source); | |
| 112 | - | |
| 113 | - break; | |
| 114 | - } | |
| 115 | - | |
| 116 | - } | |
| 117 | - | |
| 118 | - | |
| 119 | -} | |
| 120 | - | |
| 121 | -const gchar * ipc3270_get_display_charset(GObject *object) { | |
| 122 | - return lib3270_get_display_charset(IPC3270(object)->hSession); | |
| 123 | -} | |
| 124 | - | |
| 125 | - |
src/windows/gobject.h
| ... | ... | @@ -1,97 +0,0 @@ |
| 1 | -/* | |
| 2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob | |
| 5 | - * o nome G3270. | |
| 6 | - * | |
| 7 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 8 | - * | |
| 9 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 10 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 11 | - * Free Software Foundation. | |
| 12 | - * | |
| 13 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 14 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 15 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 16 | - * obter mais detalhes. | |
| 17 | - * | |
| 18 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 19 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 20 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 21 | - * | |
| 22 | - * Este programa está nomeado como - e possui - linhas de código. | |
| 23 | - * | |
| 24 | - * Contatos: | |
| 25 | - * | |
| 26 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 27 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 28 | - * | |
| 29 | - */ | |
| 30 | - | |
| 31 | - /** | |
| 32 | - * @brief Private definitions for pw3270 IPC windows module. | |
| 33 | - * | |
| 34 | - */ | |
| 35 | - | |
| 36 | -#ifndef WINDOWS_GOBJECT_H_INCLUDED | |
| 37 | - | |
| 38 | - #define WINDOWS_GOBJECT_H_INCLUDED | |
| 39 | - | |
| 40 | - #include <windows.h> | |
| 41 | - #include <config.h> | |
| 42 | - | |
| 43 | - #define ENABLE_NLS | |
| 44 | - #define GETTEXT_PACKAGE PACKAGE_NAME | |
| 45 | - | |
| 46 | - #include <libintl.h> | |
| 47 | - #include <glib/gi18n.h> | |
| 48 | - #include <gio/gio.h> | |
| 49 | - | |
| 50 | - #include <lib3270.h> | |
| 51 | - #include <lib3270/ipc.h> | |
| 52 | - | |
| 53 | - #define PIPE_BUFFER_LENGTH 8192 | |
| 54 | - | |
| 55 | - G_BEGIN_DECLS | |
| 56 | - | |
| 57 | - typedef struct _ipc3270 ipc3270; | |
| 58 | - typedef struct _ipc3270Class ipc3270Class; | |
| 59 | - typedef struct _ipc3270Request ipc3270Request; | |
| 60 | - | |
| 61 | - typedef enum _ipc3270_pipe_state { | |
| 62 | - PIPE_STATE_WAITING, | |
| 63 | - PIPE_STATE_READ, | |
| 64 | - PIPE_STATE_PENDING_READ, | |
| 65 | - PIPE_STATE_UNDEFINED | |
| 66 | - } IPC3270_PIPE_STATE; | |
| 67 | - | |
| 68 | - typedef struct _ipc3270_pipe_source { | |
| 69 | - GSource gsrc; | |
| 70 | - HANDLE hPipe; | |
| 71 | - | |
| 72 | - IPC3270_PIPE_STATE state; | |
| 73 | - | |
| 74 | - OVERLAPPED overlap; | |
| 75 | - unsigned char buffer[PIPE_BUFFER_LENGTH+1]; | |
| 76 | - | |
| 77 | - } IPC3270_PIPE_SOURCE; | |
| 78 | - | |
| 79 | - struct _ipc3270 { | |
| 80 | - H3270 * hSession; | |
| 81 | - IPC3270_PIPE_SOURCE * source; | |
| 82 | - GQuark error_domain; | |
| 83 | - }; | |
| 84 | - | |
| 85 | - struct _ipc3270Class { | |
| 86 | - GObjectClass parent; | |
| 87 | - }; | |
| 88 | - | |
| 89 | - G_GNUC_INTERNAL GSourceFuncs ipc3270_source_funcs; | |
| 90 | - | |
| 91 | - G_GNUC_INTERNAL void ipc3270_wait_for_client(IPC3270_PIPE_SOURCE *source); | |
| 92 | - G_GNUC_INTERNAL unsigned char * ipc3270_pack(GVariant *values); | |
| 93 | - G_GNUC_INTERNAL GVariant * ipc3270_unpack(const unsigned char *packet); | |
| 94 | - | |
| 95 | - G_END_DECLS | |
| 96 | - | |
| 97 | -#endif // WINDOWS_GOBJECT_H_INCLUDED |
src/windows/inout.c
| ... | ... | @@ -1,275 +0,0 @@ |
| 1 | -/* | |
| 2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob | |
| 5 | - * o nome G3270. | |
| 6 | - * | |
| 7 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 8 | - * | |
| 9 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 10 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 11 | - * Free Software Foundation. | |
| 12 | - * | |
| 13 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 14 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 15 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 16 | - * obter mais detalhes. | |
| 17 | - * | |
| 18 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 19 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 20 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 21 | - * | |
| 22 | - * Este programa está nomeado como inout.c e possui - linhas de código. | |
| 23 | - * | |
| 24 | - * Contatos: | |
| 25 | - * | |
| 26 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 27 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 28 | - * | |
| 29 | - */ | |
| 30 | - | |
| 31 | - | |
| 32 | - /** | |
| 33 | - * @brief Pack/Unpack IPC data block. | |
| 34 | - * | |
| 35 | - */ | |
| 36 | - | |
| 37 | - #include <config.h> | |
| 38 | - #include <lib3270/ipc.h> | |
| 39 | - #include <string.h> | |
| 40 | - #include <stdlib.h> | |
| 41 | - | |
| 42 | -/*---[ Implement ]----------------------------------------------------------------------------------*/ | |
| 43 | - | |
| 44 | -unsigned char * ipc3270_pack(GVariant *values) { | |
| 45 | - | |
| 46 | - GVariantIter iter; | |
| 47 | - gsize count = g_variant_iter_init(&iter, values); | |
| 48 | - g_autofree char * types = g_new0(char, count); | |
| 49 | - GVariant * child; | |
| 50 | - size_t ix = 0; | |
| 51 | - size_t szBuffer = sizeof(gint16); | |
| 52 | - | |
| 53 | - g_print("Packaging %u itens\n", (unsigned int) count); | |
| 54 | - while ((child = g_variant_iter_next_value (&iter))) { | |
| 55 | - | |
| 56 | - // g_print("type='%s' size=%u\n", g_variant_get_type_string(child), (unsigned int) g_variant_get_size(child)); | |
| 57 | - | |
| 58 | - types[ix] = g_variant_get_type_string(child)[0]; | |
| 59 | - | |
| 60 | - szBuffer += (1+g_variant_get_size(child)); | |
| 61 | - if(types[ix] == 's') { | |
| 62 | - szBuffer += sizeof(gint16); | |
| 63 | - } | |
| 64 | - | |
| 65 | - g_variant_unref(child); | |
| 66 | - ix++; | |
| 67 | - } | |
| 68 | - | |
| 69 | - unsigned char * outputBuffer = g_malloc0(szBuffer); | |
| 70 | - unsigned char * txtptr = outputBuffer + sizeof(guint16) + sizeof(guint16); | |
| 71 | - | |
| 72 | - *((guint16 *) outputBuffer) = (guint16) szBuffer; | |
| 73 | - *((guint16 *) (outputBuffer + sizeof(guint16))) = (guint16) count; | |
| 74 | - | |
| 75 | - ix = 0; | |
| 76 | - g_variant_iter_init(&iter, values); | |
| 77 | - while ((child = g_variant_iter_next_value (&iter))) { | |
| 78 | - | |
| 79 | - debug("type='%s' size=%u index=%u", g_variant_get_type_string(child), (unsigned int) g_variant_get_size(child), (unsigned int) (txtptr - outputBuffer)); | |
| 80 | - | |
| 81 | - *(txtptr++) = types[ix]; | |
| 82 | - | |
| 83 | - switch(types[ix]) { | |
| 84 | - | |
| 85 | - // https://developer.gnome.org/glib/stable/gvariant-format-strings.html | |
| 86 | - | |
| 87 | - case 's': | |
| 88 | - strcpy((char *) txtptr,g_variant_get_string(child,NULL)); | |
| 89 | - txtptr += (strlen((char *) txtptr)+1); | |
| 90 | - break; | |
| 91 | - | |
| 92 | - case 'b': // gboolean | |
| 93 | - *(txtptr++) = g_variant_get_boolean(child) ? 1 : 0; | |
| 94 | - break; | |
| 95 | - | |
| 96 | - case 'y': // guchar | |
| 97 | - *(txtptr++) = g_variant_get_byte(child); | |
| 98 | - break; | |
| 99 | - | |
| 100 | - case 'n': // gint16 | |
| 101 | - *((gint16 *) txtptr) = g_variant_get_int16(child); | |
| 102 | - txtptr += sizeof(gint16); | |
| 103 | - break; | |
| 104 | - | |
| 105 | - case 'q': // guint16 | |
| 106 | - *((guint16 *) txtptr) = g_variant_get_uint16(child); | |
| 107 | - txtptr += sizeof(guint16); | |
| 108 | - break; | |
| 109 | - | |
| 110 | - case 'i': // gint32 | |
| 111 | - case 'h': // gint32 | |
| 112 | - *((gint32 *) txtptr) = g_variant_get_int32(child); | |
| 113 | - txtptr += sizeof(gint32); | |
| 114 | - break; | |
| 115 | - | |
| 116 | - case 'u': // guint32 | |
| 117 | - *((guint32 *) txtptr) = g_variant_get_uint32(child); | |
| 118 | - txtptr += sizeof(guint32); | |
| 119 | - break; | |
| 120 | - | |
| 121 | - case 'x': // gint64 | |
| 122 | - *((gint64 *) txtptr) = g_variant_get_int64(child); | |
| 123 | - txtptr += sizeof(gint64); | |
| 124 | - break; | |
| 125 | - | |
| 126 | - case 't': // guint64 | |
| 127 | - *((guint64 *) txtptr) = g_variant_get_uint64(child); | |
| 128 | - txtptr += sizeof(guint64); | |
| 129 | - break; | |
| 130 | - | |
| 131 | - default: | |
| 132 | - errno = EINVAL; | |
| 133 | - g_free(outputBuffer); | |
| 134 | - return NULL; | |
| 135 | - } | |
| 136 | - | |
| 137 | - g_variant_unref(child); | |
| 138 | - ix++; | |
| 139 | - } | |
| 140 | - | |
| 141 | - return outputBuffer; | |
| 142 | -} | |
| 143 | - | |
| 144 | -GVariant * ipc3270_unpack(const unsigned char *packet) { | |
| 145 | - | |
| 146 | - size_t szPacket = (size_t) * ((guint16 *) packet); | |
| 147 | - size_t count = (size_t) * ((guint16 *) (packet+sizeof(guint16))); | |
| 148 | - | |
| 149 | - const unsigned char *txtptr = packet + (sizeof(guint16) * 2); | |
| 150 | - size_t ix; | |
| 151 | - | |
| 152 | - g_autofree gchar * descrs = g_malloc0(count+3); | |
| 153 | - descrs[0] = '('; | |
| 154 | - descrs[count+1] = ')'; | |
| 155 | - | |
| 156 | - debug("Unpacking package with %u bytes and %u itens\n", (unsigned int) szPacket, (unsigned int) count); | |
| 157 | - | |
| 158 | - for(ix = 0; ix < count; ix++) { | |
| 159 | - | |
| 160 | - debug("Format(%u): %c at %u",(unsigned int) ix, *txtptr, (unsigned int) (txtptr - packet)); | |
| 161 | - | |
| 162 | - descrs[ix+1] = *(txtptr++); | |
| 163 | - | |
| 164 | - switch(descrs[ix+1]) { | |
| 165 | - case 's': | |
| 166 | - txtptr += strlen((char *) txtptr)+1; | |
| 167 | - break; | |
| 168 | - | |
| 169 | - case 'b': // gboolean | |
| 170 | - case 'y': // guchar | |
| 171 | - txtptr++; | |
| 172 | - break; | |
| 173 | - | |
| 174 | - case 'n': // gint16 | |
| 175 | - txtptr += sizeof(gint16); | |
| 176 | - break; | |
| 177 | - | |
| 178 | - case 'q': // guint16 | |
| 179 | - txtptr += sizeof(guint16); | |
| 180 | - break; | |
| 181 | - | |
| 182 | - case 'i': // gint32 | |
| 183 | - case 'h': // gint32 | |
| 184 | - txtptr += sizeof(gint32); | |
| 185 | - break; | |
| 186 | - | |
| 187 | - case 'u': // guint32 | |
| 188 | - txtptr += sizeof(guint32); | |
| 189 | - break; | |
| 190 | - | |
| 191 | - case 'x': // gint64 | |
| 192 | - txtptr += sizeof(gint64); | |
| 193 | - break; | |
| 194 | - | |
| 195 | - case 't': // guint64 | |
| 196 | - txtptr += sizeof(guint64); | |
| 197 | - break; | |
| 198 | - | |
| 199 | - default: | |
| 200 | - errno = EINVAL; | |
| 201 | - return NULL; | |
| 202 | - } | |
| 203 | - } | |
| 204 | - | |
| 205 | - debug("Format: \"%s\"\n",descrs); | |
| 206 | - | |
| 207 | - GVariantBuilder builder; | |
| 208 | - g_variant_builder_init(&builder,G_VARIANT_TYPE(descrs)); | |
| 209 | - | |
| 210 | - txtptr = packet + (sizeof(guint16) * 2); | |
| 211 | - for(ix = 0; ix < count; ix++) { | |
| 212 | - | |
| 213 | - debug("Format(%u): %c at %u",(unsigned int) ix, *txtptr, (unsigned int) (txtptr - packet)); | |
| 214 | - txtptr++; | |
| 215 | - | |
| 216 | - switch(descrs[ix+1]) { | |
| 217 | - case 's': | |
| 218 | - g_variant_builder_add(&builder, "s", txtptr); | |
| 219 | - txtptr += strlen((char *) txtptr)+1; | |
| 220 | - break; | |
| 221 | - | |
| 222 | - case 'b': // gboolean | |
| 223 | - g_variant_builder_add(&builder, "b", *((gboolean *) txtptr)); | |
| 224 | - txtptr++; | |
| 225 | - break; | |
| 226 | - | |
| 227 | - case 'y': // guchar | |
| 228 | - g_variant_builder_add(&builder, "y", *((guchar *) txtptr)); | |
| 229 | - txtptr++; | |
| 230 | - break; | |
| 231 | - | |
| 232 | - case 'n': // gint16 | |
| 233 | - g_variant_builder_add(&builder, "n", *((gint16 *) txtptr)); | |
| 234 | - txtptr += sizeof(gint16); | |
| 235 | - break; | |
| 236 | - | |
| 237 | - case 'q': // guint16 | |
| 238 | - g_variant_builder_add(&builder, "q", *((guint16 *) txtptr)); | |
| 239 | - txtptr += sizeof(guint16); | |
| 240 | - break; | |
| 241 | - | |
| 242 | - case 'i': // gint32 | |
| 243 | - g_variant_builder_add(&builder, "i", *((gint32 *) txtptr)); | |
| 244 | - txtptr += sizeof(gint32); | |
| 245 | - break; | |
| 246 | - | |
| 247 | - case 'h': // gint32 | |
| 248 | - g_variant_builder_add(&builder, "h", *((gint32 *) txtptr)); | |
| 249 | - txtptr += sizeof(gint32); | |
| 250 | - break; | |
| 251 | - | |
| 252 | - case 'u': // guint32 | |
| 253 | - g_variant_builder_add(&builder, "u", *((guint32 *) txtptr)); | |
| 254 | - txtptr += sizeof(guint32); | |
| 255 | - break; | |
| 256 | - | |
| 257 | - case 'x': // gint64 | |
| 258 | - g_variant_builder_add(&builder, "x", *((gint64 *) txtptr)); | |
| 259 | - txtptr += sizeof(gint64); | |
| 260 | - break; | |
| 261 | - | |
| 262 | - case 't': // guint64 | |
| 263 | - g_variant_builder_add(&builder, "t", *((guint64 *) txtptr)); | |
| 264 | - txtptr += sizeof(guint64); | |
| 265 | - break; | |
| 266 | - | |
| 267 | - default: | |
| 268 | - errno = EINVAL; | |
| 269 | - return NULL; | |
| 270 | - } | |
| 271 | - } | |
| 272 | - | |
| 273 | - return g_variant_builder_end(&builder); | |
| 274 | - | |
| 275 | -} |
src/windows/pipesource.c
| ... | ... | @@ -1,214 +0,0 @@ |
| 1 | -/* | |
| 2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | - * | |
| 6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | - * | |
| 8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | - * Free Software Foundation. | |
| 11 | - * | |
| 12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | - * obter mais detalhes. | |
| 16 | - * | |
| 17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | - * | |
| 21 | - * Este programa está nomeado como pipesource.c e possui - linhas de código. | |
| 22 | - * | |
| 23 | - * Contatos: | |
| 24 | - * | |
| 25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 27 | - * | |
| 28 | - */ | |
| 29 | - | |
| 30 | -#include "gobject.h" | |
| 31 | - | |
| 32 | -void ipc3270_wait_for_client(IPC3270_PIPE_SOURCE *source) { | |
| 33 | - | |
| 34 | - if(ConnectNamedPipe(source->hPipe,&source->overlap)) { | |
| 35 | - g_message("Error %u in ConnectNamedPipe",(unsigned int) GetLastError()); | |
| 36 | - // popup_lasterror("%s",_( "Error in ConnectNamedPipe" )); | |
| 37 | - return; | |
| 38 | - } | |
| 39 | - | |
| 40 | - switch(GetLastError()) { | |
| 41 | - case ERROR_IO_PENDING: // The overlapped connection in progress. | |
| 42 | - source->state = PIPE_STATE_WAITING; | |
| 43 | - break; | |
| 44 | - | |
| 45 | - | |
| 46 | - case ERROR_PIPE_CONNECTED: // Client is already connected, so signal an event. | |
| 47 | - if(SetEvent(source->overlap.hEvent)) | |
| 48 | - break; | |
| 49 | - | |
| 50 | - default: | |
| 51 | - g_message("Error %u in ConnectNamedPipe",(unsigned int) GetLastError()); | |
| 52 | - // popup_lasterror("%s", _( "ConnectNamedPipe failed" )); | |
| 53 | - } | |
| 54 | - | |
| 55 | -} | |
| 56 | - | |
| 57 | -static gboolean IO_prepare(GSource *source, gint *timeout) { | |
| 58 | - /* | |
| 59 | - * Called before all the file descriptors are polled. | |
| 60 | - * If the source can determine that it is ready here | |
| 61 | - * (without waiting for the results of the poll() call) | |
| 62 | - * it should return TRUE. | |
| 63 | - * | |
| 64 | - * It can also return a timeout_ value which should be the maximum | |
| 65 | - * timeout (in milliseconds) which should be passed to the poll() call. | |
| 66 | - * The actual timeout used will be -1 if all sources returned -1, | |
| 67 | - * or it will be the minimum of all the timeout_ values | |
| 68 | - * returned which were >= 0. | |
| 69 | - * | |
| 70 | - */ | |
| 71 | - if(WaitForSingleObject(((IPC3270_PIPE_SOURCE *) source)->overlap.hEvent,0) == WAIT_OBJECT_0) | |
| 72 | - return TRUE; | |
| 73 | - | |
| 74 | - *timeout = 10; | |
| 75 | - | |
| 76 | - return FALSE; | |
| 77 | - | |
| 78 | -} | |
| 79 | - | |
| 80 | -static gboolean IO_check(GSource *source) { | |
| 81 | - /* | |
| 82 | - * Called after all the file descriptors are polled. | |
| 83 | - * The source should return TRUE if it is ready to be dispatched. | |
| 84 | - * Note that some time may have passed since the previous prepare | |
| 85 | - * function was called, so the source should be checked again here. | |
| 86 | - * | |
| 87 | - */ | |
| 88 | - if(WaitForSingleObject(((IPC3270_PIPE_SOURCE *) source)->overlap.hEvent,0) == WAIT_OBJECT_0) | |
| 89 | - return TRUE; | |
| 90 | - | |
| 91 | - return FALSE; | |
| 92 | -} | |
| 93 | - | |
| 94 | -static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { | |
| 95 | - | |
| 96 | -} | |
| 97 | - | |
| 98 | -static void read_input_pipe(IPC3270_PIPE_SOURCE *source) { | |
| 99 | - | |
| 100 | - DWORD cbRead = 0; | |
| 101 | - | |
| 102 | - if(ReadFile(source->hPipe,source->buffer,PIPE_BUFFER_LENGTH,&cbRead,&source->overlap) && cbRead > 0) | |
| 103 | - process_input(source,cbRead); | |
| 104 | - | |
| 105 | - // The read operation is still pending. | |
| 106 | - switch(GetLastError()) | |
| 107 | - { | |
| 108 | - case 0: | |
| 109 | - break; | |
| 110 | - | |
| 111 | - case ERROR_IO_PENDING: | |
| 112 | - source->state = PIPE_STATE_PENDING_READ; | |
| 113 | - break; | |
| 114 | - | |
| 115 | - case ERROR_PIPE_LISTENING: | |
| 116 | - source->state = PIPE_STATE_READ; | |
| 117 | - break; | |
| 118 | - | |
| 119 | - case ERROR_BROKEN_PIPE: | |
| 120 | - | |
| 121 | - if(!DisconnectNamedPipe(source->hPipe)) { | |
| 122 | - | |
| 123 | - g_message("Error %u on DisconnectNamedPipe", (unsigned int) GetLastError()); | |
| 124 | - | |
| 125 | - } else { | |
| 126 | - | |
| 127 | - ipc3270_wait_for_client(source); | |
| 128 | - | |
| 129 | - } | |
| 130 | - break; | |
| 131 | - | |
| 132 | - case ERROR_PIPE_NOT_CONNECTED: | |
| 133 | - g_message("Cliente was disconnected"); | |
| 134 | - break; | |
| 135 | - | |
| 136 | - default: | |
| 137 | - if(source->hPipe != INVALID_HANDLE_VALUE) { | |
| 138 | - g_message( "Error %u receiving message from pipe", (unsigned int) GetLastError()); | |
| 139 | - } | |
| 140 | - } | |
| 141 | - | |
| 142 | -} | |
| 143 | - | |
| 144 | - | |
| 145 | -static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer data) { | |
| 146 | - /* | |
| 147 | - * Called to dispatch the event source, | |
| 148 | - * after it has returned TRUE in either its prepare or its check function. | |
| 149 | - * The dispatch function is passed in a callback function and data. | |
| 150 | - * The callback function may be NULL if the source was never connected | |
| 151 | - * to a callback using g_source_set_callback(). The dispatch function | |
| 152 | - * should call the callback function with user_data and whatever additional | |
| 153 | - * parameters are needed for this type of event source. | |
| 154 | - */ | |
| 155 | - BOOL fSuccess; | |
| 156 | - DWORD cbRead = 0; | |
| 157 | - | |
| 158 | - fSuccess = GetOverlappedResult(((IPC3270_PIPE_SOURCE *) source)->hPipe,&((IPC3270_PIPE_SOURCE *) source)->overlap,&cbRead,FALSE ); | |
| 159 | - | |
| 160 | - switch(((IPC3270_PIPE_SOURCE *) source)->state) { | |
| 161 | - case PIPE_STATE_WAITING: | |
| 162 | - | |
| 163 | - if(fSuccess) { | |
| 164 | - | |
| 165 | - g_message("Client is connected"); | |
| 166 | - ((IPC3270_PIPE_SOURCE *) source)->state = PIPE_STATE_READ; | |
| 167 | - | |
| 168 | - } else { | |
| 169 | - | |
| 170 | - // popup_lasterror("%s", _( "Pipe connection failed" )); | |
| 171 | - | |
| 172 | - } | |
| 173 | - break; | |
| 174 | - | |
| 175 | - case PIPE_STATE_READ: | |
| 176 | - // trace("Reading pipe (cbRead=%d)",(int) cbRead); | |
| 177 | - read_input_pipe( (IPC3270_PIPE_SOURCE *) source); | |
| 178 | - break; | |
| 179 | - | |
| 180 | - case PIPE_STATE_PENDING_READ: | |
| 181 | - if(fSuccess && cbRead > 0) | |
| 182 | - process_input((IPC3270_PIPE_SOURCE *) source,cbRead); | |
| 183 | - ((IPC3270_PIPE_SOURCE *) source)->state = PIPE_STATE_READ; | |
| 184 | - break; | |
| 185 | - | |
| 186 | - case PIPE_STATE_UNDEFINED: | |
| 187 | - break; | |
| 188 | - | |
| 189 | - } | |
| 190 | - | |
| 191 | - return TRUE; | |
| 192 | -} | |
| 193 | - | |
| 194 | -static gboolean IO_closure(gpointer data) { | |
| 195 | - return 0; | |
| 196 | -} | |
| 197 | - | |
| 198 | -static void IO_finalize(GSource *source) { | |
| 199 | - | |
| 200 | - if( ((IPC3270_PIPE_SOURCE *) source)->hPipe != INVALID_HANDLE_VALUE) { | |
| 201 | - CloseHandle(((IPC3270_PIPE_SOURCE *) source)->hPipe); | |
| 202 | - ((IPC3270_PIPE_SOURCE *) source)->hPipe = INVALID_HANDLE_VALUE; | |
| 203 | - } | |
| 204 | - | |
| 205 | -} | |
| 206 | - | |
| 207 | -GSourceFuncs ipc3270_source_funcs = { | |
| 208 | - IO_prepare, | |
| 209 | - IO_check, | |
| 210 | - IO_dispatch, | |
| 211 | - IO_finalize, | |
| 212 | - IO_closure, | |
| 213 | - NULL | |
| 214 | -}; |
src/windows/resources.rc.in
| ... | ... | @@ -1,29 +0,0 @@ |
| 1 | -#include <windows.h> | |
| 2 | - | |
| 3 | -VS_VERSION_INFO VERSIONINFO | |
| 4 | -FILEVERSION @PACKAGE_MAJOR_VERSION@,@PACKAGE_MINOR_VERSION@,@PACKAGE_MAJOR_RELEASE@,0 | |
| 5 | -PRODUCTVERSION @PACKAGE_MAJOR_VERSION@,@PACKAGE_MINOR_VERSION@,@PACKAGE_MAJOR_RELEASE@,0 | |
| 6 | - | |
| 7 | -BEGIN | |
| 8 | - | |
| 9 | - BLOCK "StringFileInfo" | |
| 10 | - BEGIN | |
| 11 | - BLOCK "080904E4" | |
| 12 | - BEGIN | |
| 13 | - VALUE "FileDescription", "@PACKAGE_DESCRIPTION@\0" | |
| 14 | - VALUE "CompanyName", "Banco do Brasil S/A.\0" | |
| 15 | - VALUE "FileVersion", "@WIN32_VERSION@\0" | |
| 16 | - VALUE "LegalCopyright", "(C) 2017 Banco do Brasil S/A. All Rights Reserved\0" | |
| 17 | - VALUE "OriginalFilename", "@PACKAGE_TARNAME@@DLLEXT@\0" | |
| 18 | - VALUE "ProductName", "@PACKAGE_NAME@\0" | |
| 19 | - VALUE "ProductVersion", "@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@.@PACKAGE_MAJOR_RELEASE@.0\0" | |
| 20 | - END | |
| 21 | - END | |
| 22 | - | |
| 23 | - BLOCK "VarFileInfo" | |
| 24 | - BEGIN | |
| 25 | - VALUE "Translation", 0x809, 0x04E4 | |
| 26 | - END | |
| 27 | - | |
| 28 | -END | |
| 29 | - |