From 37b5492d17d507176a2bce6b44d0f2f994c75043 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Wed, 20 Feb 2019 15:50:34 -0300 Subject: [PATCH] Migrating HLLAPI compatible plugin to another repository. --- .gitignore | 4 +++- Makefile.in | 42 ++++++++++++++++-------------------------- hllapi.cbp | 41 +++++++++++++++++++++++++++++++++++++++++ src/daemon/linux/daemon.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/daemon/linux/iocallback.c | 361 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/plugin/linux/daemon.c | 122 -------------------------------------------------------------------------------------------------------------------------- src/plugin/linux/iocallback.c | 361 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/plugin/linux/main.c | 3 +-- src/testprogram/testprogram.c | 247 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 791 insertions(+), 512 deletions(-) create mode 100644 hllapi.cbp create mode 100644 src/daemon/linux/daemon.c create mode 100644 src/daemon/linux/iocallback.c delete mode 100644 src/plugin/linux/daemon.c delete mode 100644 src/plugin/linux/iocallback.c create mode 100644 src/testprogram/testprogram.c diff --git a/.gitignore b/.gitignore index 946f055..c4fe5e1 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,6 @@ Makefile scripts config.h stamp-h1 - +*.layout +.bin +.obj diff --git a/Makefile.in b/Makefile.in index eb0fe93..6b8adb5 100644 --- a/Makefile.in +++ b/Makefile.in @@ -31,6 +31,7 @@ PACKAGE_NAME=@PACKAGE_NAME@ PLUGIN_SOURCES= \ $(wildcard src/plugin/*.c) \ + $(wildcard src/plugin/@OSNAME@/*.c) \ $(wildcard src/plugin/@OSNAME@/*.rc) TEST_SOURCES= \ @@ -78,9 +79,7 @@ BINRLS=$(BINDIR)/Release #---[ Rules ]---------------------------------------------------------------------------- DEPENDS= \ - Makefile \ - src/include/*.h \ - src/include/lib3270/*.h + Makefile CFLAGS= \ @CFLAGS@ \ @@ -229,11 +228,17 @@ $(POTDIR)/$(MODULE_NAME).pot: \ locale: \ $(POTDIR)/$(MODULE_NAME).pot +run: \ + $(BINDBG)/$(MODULE_NAME)@DLLEXT@ \ + $(BINDBG)/$(MODULE_NAME)@EXEEXT@ + + $(BINDBG)/$(MODULE_NAME)@EXEEXT@ #---[ Debug Targets ]-------------------------------------------------------------------- Debug: \ - $(BINDBG)/$(MODULE_NAME)@DLLEXT@ + $(BINDBG)/$(MODULE_NAME)@DLLEXT@ \ + $(BINDBG)/$(MODULE_NAME)@EXEEXT@ $(BINDBG)/lib$(MODULE_NAME).a: \ $(foreach SRC, $(basename $(CORE_SOURCES)), $(OBJDBG)/$(SRC).o) @@ -260,25 +265,8 @@ $(BINDBG)/$(MODULE_NAME)@EXEEXT@: \ $(GTK_LIBS) \ $(GLIB_LIBS) -$(BINDBG)/$(PACKAGE_NAME)d@EXEEXT@: \ - $(foreach SRC, $(basename $(SERVICE_SOURCES)), $(OBJDBG)/$(SRC).o) \ - $(BINDBG)/lib$(MODULE_NAME).a - - @$(MKDIR) $(@D) - @echo $< ... - @$(LD) \ - -o $@ \ - $(foreach SRC, $(basename $(SERVICE_SOURCES)), $(OBJDBG)/$(SRC).o) \ - -L$(BINDBG) \ - -Wl,-rpath,$(BINDBG) \ - $(LDFLAGS) \ - $(LIBS) \ - -l$(MODULE_NAME) \ - $(GLIB_LIBS) - $(BINDBG)/$(MODULE_NAME)@DLLEXT@: \ - $(foreach SRC, $(basename $(PLUGIN_SOURCES)), $(OBJDBG)/$(SRC).o) \ - $(BINDBG)/lib$(MODULE_NAME).a + $(foreach SRC, $(basename $(PLUGIN_SOURCES)), $(OBJDBG)/$(SRC).o) @$(MKDIR) $(@D) @echo $< ... @@ -287,7 +275,7 @@ $(BINDBG)/$(MODULE_NAME)@DLLEXT@: \ -o $@ \ $(LDFLAGS) \ $(foreach SRC, $(basename $(PLUGIN_SOURCES)), $(OBJDBG)/$(SRC).o) \ - -L$(BINDBG) -l$(MODULE_NAME) \ + -L$(BINDBG) -lpw3270cpp \ $(V3270_LIBS) \ $(LIBS) \ $(GTK_LIBS) @@ -308,8 +296,10 @@ cleanDebug: @rm -fr $(BINDBG) @rm -fr $(OBJDIR)/marshal -clean: \ - cleanDebug \ - cleanRelease +cleanRelease: + + @rm -fr $(OBJRLS) + @rm -fr $(BINRLS) + @rm -fr $(OBJDIR)/marshal diff --git a/hllapi.cbp b/hllapi.cbp new file mode 100644 index 0000000..4796fd4 --- /dev/null +++ b/hllapi.cbp @@ -0,0 +1,41 @@ + + + + + + diff --git a/src/daemon/linux/daemon.c b/src/daemon/linux/daemon.c new file mode 100644 index 0000000..a429514 --- /dev/null +++ b/src/daemon/linux/daemon.c @@ -0,0 +1,122 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como daemon.c e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * licinio@bb.com.br (Licínio Luis Branco) + * kraucer@bb.com.br (Kraucer Fernandes Mazuco) + * + * Referencias: + * + * https://live.gnome.org/DBusGlibBindings + * + */ + +#include +#include +#include +#include + +#include "daemon.h" +#include "dbus-glue.h" + +#define PW3270_DBUS_SERVICE_PATH "/br/com/bb/pw3270" +#define PW3270_DBUS_SERVICE "br.com.bb.pw3270" + + +/*---[ Globals ]---------------------------------------------------------------------------------*/ + + static DBusGConnection * connection = NULL; + static DBusGProxy * proxy = NULL; + static H3270 * hSession = NULL; + + GMainLoop * main_loop = NULL; + + +/*---[ Implement ]-------------------------------------------------------------------------------*/ + +static int initialize(void) +{ + GError * error = NULL; + guint result; + + connection = dbus_g_bus_get_private(DBUS_BUS_SESSION, g_main_context_default(), &error); + if(error) + { + g_message("Error \"%s\" getting session dbus",error->message); + g_error_free(error); + return -1; + } + + proxy = dbus_g_proxy_new_for_name(connection,DBUS_SERVICE_DBUS,DBUS_PATH_DBUS,DBUS_INTERFACE_DBUS); + + org_freedesktop_DBus_request_name(proxy, PW3270_DBUS_SERVICE, DBUS_NAME_FLAG_DO_NOT_QUEUE, &result, &error); + + pw3270_dbus_register_object(connection,proxy,PW3270_TYPE_DBUS,&dbus_glib_pw3270_dbus_object_info,PW3270_DBUS_SERVICE_PATH); + + return 0; +} + +static void loghandler(H3270 *session, const char *module, int rc, const char *fmt, va_list args) +{ + g_logv(module,rc ? G_LOG_LEVEL_WARNING : G_LOG_LEVEL_MESSAGE, fmt, args); +} + +int main(int numpar, char *param[]) +{ + g_type_init (); + + if (!g_thread_supported ()) + g_thread_init (NULL); + + dbus_g_thread_init (); + + lib3270_set_log_handler(loghandler); + pw3270_dbus_register_io_handlers(); + + hSession = lib3270_session_new(""); + + main_loop = g_main_loop_new (NULL, FALSE); + + if(initialize()) + return -1; + + g_main_loop_run(main_loop); + + lib3270_session_free(hSession); + + return 0; +} + +void pw3270_dbus_quit(PW3270Dbus *object, DBusGMethodInvocation *context) +{ + g_main_loop_quit(main_loop); + dbus_g_method_return(context,0); +} + +H3270 * pw3270_dbus_get_session_handle(PW3270Dbus *object) +{ + return hSession; +} + diff --git a/src/daemon/linux/iocallback.c b/src/daemon/linux/iocallback.c new file mode 100644 index 0000000..5292f4c --- /dev/null +++ b/src/daemon/linux/iocallback.c @@ -0,0 +1,361 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como iocallback.c e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * licinio@bb.com.br (Licínio Luis Branco) + * kraucer@bb.com.br (Kraucer Fernandes Mazuco) + * + */ + +#if defined(_WIN32) /*[*/ + #include +#elif defined(__APPLE__) + #include + #include +#else + #include + #include +#endif /*]*/ + +#include +#include +#include "daemon.h" + +static int static_CallAndWait(int(*callback)(H3270 *session, void *), H3270 *session, void *parm); +static void static_RemoveSource(void *id); + +static void * static_AddInput(int source, H3270 *session, void (*fn)(H3270 *session)); +static void * static_AddExcept(int source, H3270 *session, void (*fn)(H3270 *session)); + +static void * static_AddTimeOut(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)); +static void static_RemoveTimeOut(void * timer); +static int static_Sleep(H3270 *hSession, int seconds); +static int static_RunPendingEvents(H3270 *hSession, int wait); + +static gboolean IO_prepare(GSource *source, gint *timeout); +static gboolean IO_check(GSource *source); +static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer user_data); +static void IO_finalize(GSource *source); /* Can be NULL */ +static gboolean IO_closure(gpointer data); + +/*---[ Structs ]-------------------------------------------------------------------------------------------*/ + + typedef struct _IO_Source + { + GSource gsrc; + GPollFD poll; +#if defined(_WIN32) + HANDLE source; +#else + int source; +#endif // _WIN32 + void (*fn)(H3270 *session); + H3270 *session; + } IO_Source; + + typedef struct _timer + { + unsigned char remove; + void (*fn)(H3270 *session); + H3270 *session; + } TIMER; + + static GSourceFuncs IOSources = + { + IO_prepare, + IO_check, + IO_dispatch, + IO_finalize, + IO_closure, + NULL + }; + +/*---[ Implement ]-----------------------------------------------------------------------------------------*/ + +#ifdef _WIN32 +static void * AddSource(HANDLE source, H3270 *session, gushort events, void (*fn)(H3270 *session)) +#else +static void * AddSource(int source, H3270 *session, gushort events, void (*fn)(H3270 *session)) +#endif // _WIN32 +{ + IO_Source *src = (IO_Source *) g_source_new(&IOSources,sizeof(IO_Source)); + + src->source = source; + src->fn = fn; + src->poll.fd = (int) source; + src->poll.events = events; + src->session = session; + + g_source_attach((GSource *) src,NULL); + g_source_add_poll((GSource *) src,&src->poll); + + return src; +} + +#ifdef _WIN32 +static void * static_AddInput(HANDLE source, H3270 *session, void (*fn)(H3270 *session)) +#else +static void * static_AddInput(int source, H3270 *session, void (*fn)(H3270 *session)) +#endif // _WIN32 +{ + return AddSource(source,session,G_IO_IN|G_IO_HUP|G_IO_ERR,fn); +} + +static void static_RemoveSource(void *id) +{ + if(id) + g_source_destroy((GSource *) id); +} + +#if defined(_WIN32) +static void * static_AddExcept(HANDLE source, H3270 *session, void (*fn)(H3270 *session)) +{ + return 0; +} +#else +static void * static_AddExcept(int source, H3270 *session, void (*fn)(H3270 *session)) +{ + return AddSource(source,session,G_IO_HUP|G_IO_ERR,fn); +} +#endif // _WIN32 + +static gboolean do_timer(TIMER *t) +{ + if(!t->remove) + t->fn(t->session); + return FALSE; +} + +static void * static_AddTimeOut(unsigned long interval, H3270 *session, void (*proc)(H3270 *session)) +{ + TIMER *t = g_malloc0(sizeof(TIMER)); + + t->fn = proc; + t->session = session; + + g_timeout_add_full(G_PRIORITY_DEFAULT, (guint) interval, (GSourceFunc) do_timer, t, g_free); + + return t; +} + +static void static_RemoveTimeOut(void * timer) +{ + ((TIMER *) timer)->remove++; +} + +static gboolean IO_prepare(GSource *source, gint *timeout) +{ + /* + * Called before all the file descriptors are polled. + * If the source can determine that it is ready here + * (without waiting for the results of the poll() call) + * it should return TRUE. + * + * It can also return a timeout_ value which should be the maximum + * timeout (in milliseconds) which should be passed to the poll() call. + * The actual timeout used will be -1 if all sources returned -1, + * or it will be the minimum of all the timeout_ values + * returned which were >= 0. + * + */ + return 0; +} + +static gboolean IO_check(GSource *source) +{ + /* + * Called after all the file descriptors are polled. + * The source should return TRUE if it is ready to be dispatched. + * Note that some time may have passed since the previous prepare + * function was called, so the source should be checked again here. + * + */ +#if defined(_WIN32) /*[*/ + + if(WaitForSingleObject(((IO_Source *) source)->source,0) == WAIT_OBJECT_0) + return TRUE; + +#else /*][*/ + + struct pollfd fds; + + memset(&fds,0,sizeof(fds)); + + fds.fd = ((IO_Source *) source)->poll.fd; + fds.events = ((IO_Source *) source)->poll.events; + + if(poll(&fds,1,0) > 0) + return TRUE; + +#endif /*]*/ + + return FALSE; +} + +static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) +{ + /* + * Called to dispatch the event source, + * after it has returned TRUE in either its prepare or its check function. + * The dispatch function is passed in a callback function and data. + * The callback function may be NULL if the source was never connected + * to a callback using g_source_set_callback(). The dispatch function + * should call the callback function with user_data and whatever additional + * parameters are needed for this type of event source. + */ + ((IO_Source *) source)->fn(((IO_Source *) source)->session); + return TRUE; +} + +static void IO_finalize(GSource *source) +{ + +} + +static gboolean IO_closure(gpointer data) +{ + return 0; +} + +struct bgParameter +{ + gboolean running; + gboolean timer; + H3270 *session; + int rc; + int(*callback)(H3270 *session, void *); + void *parm; + +}; + +gpointer BgCall(struct bgParameter *p) +{ +// trace("%s starts",__FUNCTION__); + p->rc = p->callback(p->session, p->parm); + p->running = FALSE; +// trace("%s ends",__FUNCTION__); + return 0; +} + +static gboolean wait_for_thread(struct bgParameter *p) +{ + if(!p->running) + { + p->timer = 0; + return FALSE; + } + return TRUE; +} + +static int static_CallAndWait(int(*callback)(H3270 *session, void *), H3270 *session, void *parm) +{ + struct bgParameter p = { TRUE, TRUE, session, -1, callback, parm }; + GThread * thread; + +// trace("Starting auxiliary thread for callback %p",callback); + + p.running = TRUE; + p.timer = TRUE; + + thread = g_thread_create( (GThreadFunc) BgCall, &p, 0, NULL); + + if(!thread) + { + g_error("Can't start background thread"); + return -1; + } + + g_timeout_add(50,(GSourceFunc) wait_for_thread,(gpointer) &p); + + while(p.timer) + g_main_context_iteration(g_main_loop_get_context(main_loop),TRUE); + + return p.rc; +} + +static int static_Sleep(H3270 *hSession, int seconds) +{ + time_t end = time(0) + seconds; + + while(time(0) < end) + g_main_iteration(TRUE); + + return 0; +} + +static int static_RunPendingEvents(H3270 *hSession, int wait) +{ + GMainContext *context = g_main_loop_get_context(main_loop); + int rc = 0; + while(g_main_context_pending(context)) + { + rc = 1; + g_main_context_iteration(context,FALSE); + } + + if(wait) + g_main_context_iteration(context,TRUE); + + return rc; +} + +static void beep(H3270 *session) +{ +} + +void pw3270_dbus_register_io_handlers(void) +{ + static const struct lib3270_callbacks hdl = + { + sizeof(struct lib3270_callbacks), + + static_AddTimeOut, + static_RemoveTimeOut, + + static_AddInput, + static_RemoveSource, + + static_AddExcept, + +#ifdef G_THREADS_ENABLED + static_CallAndWait, +#else + NULL, +#endif + + static_Sleep, + static_RunPendingEvents, + beep + + }; + + #error Need rewrite + + if(lib3270_register_handlers(&hdl)) + { + g_error("%s","Can't set lib3270 I/O handlers"); + } + +} diff --git a/src/plugin/linux/daemon.c b/src/plugin/linux/daemon.c deleted file mode 100644 index a429514..0000000 --- a/src/plugin/linux/daemon.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a - * aplicativos mainframe. Registro no INPI sob o nome G3270. - * - * Copyright (C) <2008> - * - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela - * Free Software Foundation. - * - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para - * obter mais detalhes. - * - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin - * St, Fifth Floor, Boston, MA 02110-1301 USA - * - * Este programa está nomeado como daemon.c e possui - linhas de código. - * - * Contatos: - * - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) - * licinio@bb.com.br (Licínio Luis Branco) - * kraucer@bb.com.br (Kraucer Fernandes Mazuco) - * - * Referencias: - * - * https://live.gnome.org/DBusGlibBindings - * - */ - -#include -#include -#include -#include - -#include "daemon.h" -#include "dbus-glue.h" - -#define PW3270_DBUS_SERVICE_PATH "/br/com/bb/pw3270" -#define PW3270_DBUS_SERVICE "br.com.bb.pw3270" - - -/*---[ Globals ]---------------------------------------------------------------------------------*/ - - static DBusGConnection * connection = NULL; - static DBusGProxy * proxy = NULL; - static H3270 * hSession = NULL; - - GMainLoop * main_loop = NULL; - - -/*---[ Implement ]-------------------------------------------------------------------------------*/ - -static int initialize(void) -{ - GError * error = NULL; - guint result; - - connection = dbus_g_bus_get_private(DBUS_BUS_SESSION, g_main_context_default(), &error); - if(error) - { - g_message("Error \"%s\" getting session dbus",error->message); - g_error_free(error); - return -1; - } - - proxy = dbus_g_proxy_new_for_name(connection,DBUS_SERVICE_DBUS,DBUS_PATH_DBUS,DBUS_INTERFACE_DBUS); - - org_freedesktop_DBus_request_name(proxy, PW3270_DBUS_SERVICE, DBUS_NAME_FLAG_DO_NOT_QUEUE, &result, &error); - - pw3270_dbus_register_object(connection,proxy,PW3270_TYPE_DBUS,&dbus_glib_pw3270_dbus_object_info,PW3270_DBUS_SERVICE_PATH); - - return 0; -} - -static void loghandler(H3270 *session, const char *module, int rc, const char *fmt, va_list args) -{ - g_logv(module,rc ? G_LOG_LEVEL_WARNING : G_LOG_LEVEL_MESSAGE, fmt, args); -} - -int main(int numpar, char *param[]) -{ - g_type_init (); - - if (!g_thread_supported ()) - g_thread_init (NULL); - - dbus_g_thread_init (); - - lib3270_set_log_handler(loghandler); - pw3270_dbus_register_io_handlers(); - - hSession = lib3270_session_new(""); - - main_loop = g_main_loop_new (NULL, FALSE); - - if(initialize()) - return -1; - - g_main_loop_run(main_loop); - - lib3270_session_free(hSession); - - return 0; -} - -void pw3270_dbus_quit(PW3270Dbus *object, DBusGMethodInvocation *context) -{ - g_main_loop_quit(main_loop); - dbus_g_method_return(context,0); -} - -H3270 * pw3270_dbus_get_session_handle(PW3270Dbus *object) -{ - return hSession; -} - diff --git a/src/plugin/linux/iocallback.c b/src/plugin/linux/iocallback.c deleted file mode 100644 index 5292f4c..0000000 --- a/src/plugin/linux/iocallback.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a - * aplicativos mainframe. Registro no INPI sob o nome G3270. - * - * Copyright (C) <2008> - * - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela - * Free Software Foundation. - * - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para - * obter mais detalhes. - * - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin - * St, Fifth Floor, Boston, MA 02110-1301 USA - * - * Este programa está nomeado como iocallback.c e possui - linhas de código. - * - * Contatos: - * - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) - * licinio@bb.com.br (Licínio Luis Branco) - * kraucer@bb.com.br (Kraucer Fernandes Mazuco) - * - */ - -#if defined(_WIN32) /*[*/ - #include -#elif defined(__APPLE__) - #include - #include -#else - #include - #include -#endif /*]*/ - -#include -#include -#include "daemon.h" - -static int static_CallAndWait(int(*callback)(H3270 *session, void *), H3270 *session, void *parm); -static void static_RemoveSource(void *id); - -static void * static_AddInput(int source, H3270 *session, void (*fn)(H3270 *session)); -static void * static_AddExcept(int source, H3270 *session, void (*fn)(H3270 *session)); - -static void * static_AddTimeOut(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)); -static void static_RemoveTimeOut(void * timer); -static int static_Sleep(H3270 *hSession, int seconds); -static int static_RunPendingEvents(H3270 *hSession, int wait); - -static gboolean IO_prepare(GSource *source, gint *timeout); -static gboolean IO_check(GSource *source); -static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer user_data); -static void IO_finalize(GSource *source); /* Can be NULL */ -static gboolean IO_closure(gpointer data); - -/*---[ Structs ]-------------------------------------------------------------------------------------------*/ - - typedef struct _IO_Source - { - GSource gsrc; - GPollFD poll; -#if defined(_WIN32) - HANDLE source; -#else - int source; -#endif // _WIN32 - void (*fn)(H3270 *session); - H3270 *session; - } IO_Source; - - typedef struct _timer - { - unsigned char remove; - void (*fn)(H3270 *session); - H3270 *session; - } TIMER; - - static GSourceFuncs IOSources = - { - IO_prepare, - IO_check, - IO_dispatch, - IO_finalize, - IO_closure, - NULL - }; - -/*---[ Implement ]-----------------------------------------------------------------------------------------*/ - -#ifdef _WIN32 -static void * AddSource(HANDLE source, H3270 *session, gushort events, void (*fn)(H3270 *session)) -#else -static void * AddSource(int source, H3270 *session, gushort events, void (*fn)(H3270 *session)) -#endif // _WIN32 -{ - IO_Source *src = (IO_Source *) g_source_new(&IOSources,sizeof(IO_Source)); - - src->source = source; - src->fn = fn; - src->poll.fd = (int) source; - src->poll.events = events; - src->session = session; - - g_source_attach((GSource *) src,NULL); - g_source_add_poll((GSource *) src,&src->poll); - - return src; -} - -#ifdef _WIN32 -static void * static_AddInput(HANDLE source, H3270 *session, void (*fn)(H3270 *session)) -#else -static void * static_AddInput(int source, H3270 *session, void (*fn)(H3270 *session)) -#endif // _WIN32 -{ - return AddSource(source,session,G_IO_IN|G_IO_HUP|G_IO_ERR,fn); -} - -static void static_RemoveSource(void *id) -{ - if(id) - g_source_destroy((GSource *) id); -} - -#if defined(_WIN32) -static void * static_AddExcept(HANDLE source, H3270 *session, void (*fn)(H3270 *session)) -{ - return 0; -} -#else -static void * static_AddExcept(int source, H3270 *session, void (*fn)(H3270 *session)) -{ - return AddSource(source,session,G_IO_HUP|G_IO_ERR,fn); -} -#endif // _WIN32 - -static gboolean do_timer(TIMER *t) -{ - if(!t->remove) - t->fn(t->session); - return FALSE; -} - -static void * static_AddTimeOut(unsigned long interval, H3270 *session, void (*proc)(H3270 *session)) -{ - TIMER *t = g_malloc0(sizeof(TIMER)); - - t->fn = proc; - t->session = session; - - g_timeout_add_full(G_PRIORITY_DEFAULT, (guint) interval, (GSourceFunc) do_timer, t, g_free); - - return t; -} - -static void static_RemoveTimeOut(void * timer) -{ - ((TIMER *) timer)->remove++; -} - -static gboolean IO_prepare(GSource *source, gint *timeout) -{ - /* - * Called before all the file descriptors are polled. - * If the source can determine that it is ready here - * (without waiting for the results of the poll() call) - * it should return TRUE. - * - * It can also return a timeout_ value which should be the maximum - * timeout (in milliseconds) which should be passed to the poll() call. - * The actual timeout used will be -1 if all sources returned -1, - * or it will be the minimum of all the timeout_ values - * returned which were >= 0. - * - */ - return 0; -} - -static gboolean IO_check(GSource *source) -{ - /* - * Called after all the file descriptors are polled. - * The source should return TRUE if it is ready to be dispatched. - * Note that some time may have passed since the previous prepare - * function was called, so the source should be checked again here. - * - */ -#if defined(_WIN32) /*[*/ - - if(WaitForSingleObject(((IO_Source *) source)->source,0) == WAIT_OBJECT_0) - return TRUE; - -#else /*][*/ - - struct pollfd fds; - - memset(&fds,0,sizeof(fds)); - - fds.fd = ((IO_Source *) source)->poll.fd; - fds.events = ((IO_Source *) source)->poll.events; - - if(poll(&fds,1,0) > 0) - return TRUE; - -#endif /*]*/ - - return FALSE; -} - -static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) -{ - /* - * Called to dispatch the event source, - * after it has returned TRUE in either its prepare or its check function. - * The dispatch function is passed in a callback function and data. - * The callback function may be NULL if the source was never connected - * to a callback using g_source_set_callback(). The dispatch function - * should call the callback function with user_data and whatever additional - * parameters are needed for this type of event source. - */ - ((IO_Source *) source)->fn(((IO_Source *) source)->session); - return TRUE; -} - -static void IO_finalize(GSource *source) -{ - -} - -static gboolean IO_closure(gpointer data) -{ - return 0; -} - -struct bgParameter -{ - gboolean running; - gboolean timer; - H3270 *session; - int rc; - int(*callback)(H3270 *session, void *); - void *parm; - -}; - -gpointer BgCall(struct bgParameter *p) -{ -// trace("%s starts",__FUNCTION__); - p->rc = p->callback(p->session, p->parm); - p->running = FALSE; -// trace("%s ends",__FUNCTION__); - return 0; -} - -static gboolean wait_for_thread(struct bgParameter *p) -{ - if(!p->running) - { - p->timer = 0; - return FALSE; - } - return TRUE; -} - -static int static_CallAndWait(int(*callback)(H3270 *session, void *), H3270 *session, void *parm) -{ - struct bgParameter p = { TRUE, TRUE, session, -1, callback, parm }; - GThread * thread; - -// trace("Starting auxiliary thread for callback %p",callback); - - p.running = TRUE; - p.timer = TRUE; - - thread = g_thread_create( (GThreadFunc) BgCall, &p, 0, NULL); - - if(!thread) - { - g_error("Can't start background thread"); - return -1; - } - - g_timeout_add(50,(GSourceFunc) wait_for_thread,(gpointer) &p); - - while(p.timer) - g_main_context_iteration(g_main_loop_get_context(main_loop),TRUE); - - return p.rc; -} - -static int static_Sleep(H3270 *hSession, int seconds) -{ - time_t end = time(0) + seconds; - - while(time(0) < end) - g_main_iteration(TRUE); - - return 0; -} - -static int static_RunPendingEvents(H3270 *hSession, int wait) -{ - GMainContext *context = g_main_loop_get_context(main_loop); - int rc = 0; - while(g_main_context_pending(context)) - { - rc = 1; - g_main_context_iteration(context,FALSE); - } - - if(wait) - g_main_context_iteration(context,TRUE); - - return rc; -} - -static void beep(H3270 *session) -{ -} - -void pw3270_dbus_register_io_handlers(void) -{ - static const struct lib3270_callbacks hdl = - { - sizeof(struct lib3270_callbacks), - - static_AddTimeOut, - static_RemoveTimeOut, - - static_AddInput, - static_RemoveSource, - - static_AddExcept, - -#ifdef G_THREADS_ENABLED - static_CallAndWait, -#else - NULL, -#endif - - static_Sleep, - static_RunPendingEvents, - beep - - }; - - #error Need rewrite - - if(lib3270_register_handlers(&hdl)) - { - g_error("%s","Can't set lib3270 I/O handlers"); - } - -} diff --git a/src/plugin/linux/main.c b/src/plugin/linux/main.c index d24d358..4f93f08 100644 --- a/src/plugin/linux/main.c +++ b/src/plugin/linux/main.c @@ -40,7 +40,7 @@ #include #include "service.h" -#include "dbus-glue.h" +//#include "dbus-glue.h" #include @@ -55,7 +55,6 @@ LIB3270_EXPORT int pw3270_plugin_start(GtkWidget *window, GtkWidget *terminal) { - GError * error = NULL; guint result; char session_id = 0; diff --git a/src/testprogram/testprogram.c b/src/testprogram/testprogram.c new file mode 100644 index 0000000..cdc484f --- /dev/null +++ b/src/testprogram/testprogram.c @@ -0,0 +1,247 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob + * o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como testprogram.c e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + + /** + * @brief Test program for pw3270 HLLAPI compatibility plugin. + * + */ + + #include + #include + #include + #include + #include + #include + + /*---[ Globals ]------------------------------------------------------------------------------------*/ + + const gchar * plugin_path = ".bin/Debug"; + const gchar * session_name = "pw3270"; + const gchar * plugin_name = "ipc3270c." G_MODULE_SUFFIX; + + /*---[ Implement ]----------------------------------------------------------------------------------*/ + + static void close_module(GtkWidget *widget, GModule *module) + { + g_message("Closing module %p",module); + + static void (*stop)(GtkWidget *window, GtkWidget *terminal) = NULL; + if(!g_module_symbol(module,"pw3270_plugin_stop",(gpointer) &stop)) + { + g_message("Can't get stop method from plugin: %s",g_module_error()); + } + else + { + stop(gtk_widget_get_toplevel(widget),widget); + } + + g_module_close(module); + g_message("Module %p was closed",module); + } + + static void toggle_ds_trace(GtkToggleToolButton *button, GtkWidget *terminal) + { + v3270_set_toggle(terminal,LIB3270_TOGGLE_DS_TRACE,gtk_toggle_tool_button_get_active(button)); + } + + static void toggle_event_trace(GtkToggleToolButton *button, GtkWidget *terminal) + { + v3270_set_toggle(terminal,LIB3270_TOGGLE_EVENT_TRACE,gtk_toggle_tool_button_get_active(button)); + } + + static void toggle_ssl_trace(GtkToggleToolButton *button, GtkWidget *terminal) + { + v3270_set_toggle(terminal,LIB3270_TOGGLE_SSL_TRACE,gtk_toggle_tool_button_get_active(button)); + } + + static void toggle_screen_trace(GtkToggleToolButton *button, GtkWidget *terminal) + { + v3270_set_toggle(terminal,LIB3270_TOGGLE_SCREEN_TRACE,gtk_toggle_tool_button_get_active(button)); + } + + static void toggle_started_trace(GtkToggleToolButton *button, GModule *module) + { + if(!module) + return; + + GtkWidget * terminal = g_object_get_data(G_OBJECT(button),"terminal"); + + const gchar * method_name = (gtk_toggle_tool_button_get_active(button) ? "pw3270_plugin_start" : "pw3270_plugin_stop"); + + static void (*call)(GtkWidget *window, GtkWidget *terminal) = NULL; + if(!g_module_symbol(module,method_name,(gpointer) &call)) + { + g_message("Can't get method \"%s\": %s",method_name,g_module_error()); + return; + } + + g_message("Calling %s",method_name); + call(gtk_widget_get_toplevel(terminal), GTK_WIDGET(terminal)); + + } + + static GtkToolItem * create_tool_item(GtkWidget *terminal, const gchar *label, const gchar *tooltip, GCallback callback) + { + GtkToolItem * item = gtk_toggle_tool_button_new(); + gtk_tool_button_set_label(GTK_TOOL_BUTTON(item),label); + + g_signal_connect(GTK_WIDGET(item), "toggled", G_CALLBACK(callback), terminal); + + if(tooltip) + gtk_widget_set_tooltip_text(GTK_WIDGET(item),tooltip); + + return item; + } + + static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { + + GtkWidget * window = gtk_application_window_new(app); + GtkWidget * terminal = v3270_new(); + GtkWidget * notebook = gtk_notebook_new(); + GModule * module = NULL; + + gtk_widget_set_name(window,session_name); + + // Setup tabs + gtk_notebook_append_page(GTK_NOTEBOOK(notebook),terminal,gtk_label_new(v3270_get_session_name(terminal))); + + // Load plugin + { + g_autofree gchar * plugin = g_build_filename(plugin_path,plugin_name,NULL); + + g_message("Loading %s",plugin); + + module = g_module_open(plugin,G_MODULE_BIND_LOCAL); + + if(module) + { + g_signal_connect (terminal, "destroy", G_CALLBACK(close_module), module); + } + else + { + g_message("Can't open \"%s\": %s",plugin,g_module_error()); + gtk_main_quit(); + } + + } + // Create trace window + { + GtkWidget * box = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); + GtkWidget * trace = v3270_trace_new(terminal); + GtkWidget * toolbar = gtk_toolbar_new(); + GtkToolItem * start = gtk_toggle_tool_button_new(); + + gtk_widget_set_sensitive(GTK_WIDGET(start),module != NULL); + + g_object_set_data(G_OBJECT(start),"terminal",terminal); + + gtk_tool_button_set_label(GTK_TOOL_BUTTON(start),"Enable"); + g_signal_connect(GTK_WIDGET(start), "toggled", G_CALLBACK(toggle_started_trace), module); + gtk_widget_set_tooltip_text(GTK_WIDGET(start),"Start/Stop plugin module"); + + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), start, -1); + + gtk_toolbar_insert(GTK_TOOLBAR(toolbar),gtk_separator_tool_item_new(),-1); + + gtk_toolbar_insert(GTK_TOOLBAR(toolbar),create_tool_item(terminal, "DS Trace","Toggle DS Trace",G_CALLBACK(toggle_ds_trace)),-1); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar),create_tool_item(terminal, "Event Trace","Toggle Event Trace",G_CALLBACK(toggle_event_trace)),-1); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar),create_tool_item(terminal, "Screen Trace","Toggle Screen Trace",G_CALLBACK(toggle_screen_trace)),-1); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar),create_tool_item(terminal, "SSL Trace","Toggle SSL Trace",G_CALLBACK(toggle_ssl_trace)),-1); + + gtk_box_pack_start(GTK_BOX(box),toolbar,FALSE,FALSE,0); + gtk_box_pack_start(GTK_BOX(box),trace,TRUE,TRUE,0); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook),box,gtk_label_new("Trace")); + } + + // Setup and show main window + gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); + gtk_window_set_default_size (GTK_WINDOW (window), 800, 500); + gtk_container_add(GTK_CONTAINER(window),notebook); + gtk_widget_show_all (window); + + // Setup title. + const gchar *url = lib3270_get_url(v3270_get_session(terminal)); + if(url) { + + v3270_set_url(terminal,url); + v3270_reconnect(terminal); + + gchar * title = g_strdup_printf("%s - %s", v3270_get_session_name(terminal), url); + gtk_window_set_title(GTK_WINDOW(window), title); + g_free(title); + + } else { + + gtk_window_set_title(GTK_WINDOW(window), v3270_get_session_name(terminal)); + + } + +} + +int main (int argc, char **argv) { + + /* + GVariantBuilder builder; + + g_variant_builder_init(&builder,G_VARIANT_TYPE("(isi)")); + + g_variant_builder_add(&builder, "i", 10); + g_variant_builder_add(&builder, "s", "teste"); + g_variant_builder_add(&builder, "i", 20); + + GVariant *value = g_variant_builder_end(&builder); + + size_t szPacket = 0; + g_autofree unsigned char * buffer = ipc3270_pack("teste", value, &szPacket); + g_variant_unref(value); + + debug("Package \"%s\" was created with %u bytes", buffer, (unsigned int) szPacket); + + value = ipc3270_unpack(buffer); + + g_variant_unref(value); + */ + + GtkApplication *app; + int status; + + app = gtk_application_new ("br.com.bb.pw3270",G_APPLICATION_FLAGS_NONE); + + g_signal_connect (app, "activate", G_CALLBACK(activate), NULL); + + status = g_application_run (G_APPLICATION (app), argc, argv); + g_object_unref (app); + + g_message("rc=%d",status); + return status; + +} + -- libgit2 0.21.2