Commit 37b5492d17d507176a2bce6b44d0f2f994c75043

Authored by Perry Werneck
1 parent 48811875
Exists in master and in 1 other branch develop

Migrating HLLAPI compatible plugin to another repository.

@@ -7,4 +7,6 @@ Makefile @@ -7,4 +7,6 @@ Makefile
7 scripts 7 scripts
8 config.h 8 config.h
9 stamp-h1 9 stamp-h1
10 - 10 +*.layout
  11 +.bin
  12 +.obj
@@ -31,6 +31,7 @@ PACKAGE_NAME=@PACKAGE_NAME@ @@ -31,6 +31,7 @@ PACKAGE_NAME=@PACKAGE_NAME@
31 31
32 PLUGIN_SOURCES= \ 32 PLUGIN_SOURCES= \
33 $(wildcard src/plugin/*.c) \ 33 $(wildcard src/plugin/*.c) \
  34 + $(wildcard src/plugin/@OSNAME@/*.c) \
34 $(wildcard src/plugin/@OSNAME@/*.rc) 35 $(wildcard src/plugin/@OSNAME@/*.rc)
35 36
36 TEST_SOURCES= \ 37 TEST_SOURCES= \
@@ -78,9 +79,7 @@ BINRLS=$(BINDIR)/Release @@ -78,9 +79,7 @@ BINRLS=$(BINDIR)/Release
78 #---[ Rules ]---------------------------------------------------------------------------- 79 #---[ Rules ]----------------------------------------------------------------------------
79 80
80 DEPENDS= \ 81 DEPENDS= \
81 - Makefile \  
82 - src/include/*.h \  
83 - src/include/lib3270/*.h 82 + Makefile
84 83
85 CFLAGS= \ 84 CFLAGS= \
86 @CFLAGS@ \ 85 @CFLAGS@ \
@@ -229,11 +228,17 @@ $(POTDIR)/$(MODULE_NAME).pot: \ @@ -229,11 +228,17 @@ $(POTDIR)/$(MODULE_NAME).pot: \
229 locale: \ 228 locale: \
230 $(POTDIR)/$(MODULE_NAME).pot 229 $(POTDIR)/$(MODULE_NAME).pot
231 230
  231 +run: \
  232 + $(BINDBG)/$(MODULE_NAME)@DLLEXT@ \
  233 + $(BINDBG)/$(MODULE_NAME)@EXEEXT@
  234 +
  235 + $(BINDBG)/$(MODULE_NAME)@EXEEXT@
232 236
233 #---[ Debug Targets ]-------------------------------------------------------------------- 237 #---[ Debug Targets ]--------------------------------------------------------------------
234 238
235 Debug: \ 239 Debug: \
236 - $(BINDBG)/$(MODULE_NAME)@DLLEXT@ 240 + $(BINDBG)/$(MODULE_NAME)@DLLEXT@ \
  241 + $(BINDBG)/$(MODULE_NAME)@EXEEXT@
237 242
238 $(BINDBG)/lib$(MODULE_NAME).a: \ 243 $(BINDBG)/lib$(MODULE_NAME).a: \
239 $(foreach SRC, $(basename $(CORE_SOURCES)), $(OBJDBG)/$(SRC).o) 244 $(foreach SRC, $(basename $(CORE_SOURCES)), $(OBJDBG)/$(SRC).o)
@@ -260,25 +265,8 @@ $(BINDBG)/$(MODULE_NAME)@EXEEXT@: \ @@ -260,25 +265,8 @@ $(BINDBG)/$(MODULE_NAME)@EXEEXT@: \
260 $(GTK_LIBS) \ 265 $(GTK_LIBS) \
261 $(GLIB_LIBS) 266 $(GLIB_LIBS)
262 267
263 -$(BINDBG)/$(PACKAGE_NAME)d@EXEEXT@: \  
264 - $(foreach SRC, $(basename $(SERVICE_SOURCES)), $(OBJDBG)/$(SRC).o) \  
265 - $(BINDBG)/lib$(MODULE_NAME).a  
266 -  
267 - @$(MKDIR) $(@D)  
268 - @echo $< ...  
269 - @$(LD) \  
270 - -o $@ \  
271 - $(foreach SRC, $(basename $(SERVICE_SOURCES)), $(OBJDBG)/$(SRC).o) \  
272 - -L$(BINDBG) \  
273 - -Wl,-rpath,$(BINDBG) \  
274 - $(LDFLAGS) \  
275 - $(LIBS) \  
276 - -l$(MODULE_NAME) \  
277 - $(GLIB_LIBS)  
278 -  
279 $(BINDBG)/$(MODULE_NAME)@DLLEXT@: \ 268 $(BINDBG)/$(MODULE_NAME)@DLLEXT@: \
280 - $(foreach SRC, $(basename $(PLUGIN_SOURCES)), $(OBJDBG)/$(SRC).o) \  
281 - $(BINDBG)/lib$(MODULE_NAME).a 269 + $(foreach SRC, $(basename $(PLUGIN_SOURCES)), $(OBJDBG)/$(SRC).o)
282 270
283 @$(MKDIR) $(@D) 271 @$(MKDIR) $(@D)
284 @echo $< ... 272 @echo $< ...
@@ -287,7 +275,7 @@ $(BINDBG)/$(MODULE_NAME)@DLLEXT@: \ @@ -287,7 +275,7 @@ $(BINDBG)/$(MODULE_NAME)@DLLEXT@: \
287 -o $@ \ 275 -o $@ \
288 $(LDFLAGS) \ 276 $(LDFLAGS) \
289 $(foreach SRC, $(basename $(PLUGIN_SOURCES)), $(OBJDBG)/$(SRC).o) \ 277 $(foreach SRC, $(basename $(PLUGIN_SOURCES)), $(OBJDBG)/$(SRC).o) \
290 - -L$(BINDBG) -l$(MODULE_NAME) \ 278 + -L$(BINDBG) -lpw3270cpp \
291 $(V3270_LIBS) \ 279 $(V3270_LIBS) \
292 $(LIBS) \ 280 $(LIBS) \
293 $(GTK_LIBS) 281 $(GTK_LIBS)
@@ -308,8 +296,10 @@ cleanDebug: @@ -308,8 +296,10 @@ cleanDebug:
308 @rm -fr $(BINDBG) 296 @rm -fr $(BINDBG)
309 @rm -fr $(OBJDIR)/marshal 297 @rm -fr $(OBJDIR)/marshal
310 298
311 -clean: \  
312 - cleanDebug \  
313 - cleanRelease 299 +cleanRelease:
  300 +
  301 + @rm -fr $(OBJRLS)
  302 + @rm -fr $(BINRLS)
  303 + @rm -fr $(OBJDIR)/marshal
314 304
315 305
hllapi.cbp 0 → 100644
@@ -0,0 +1,41 @@ @@ -0,0 +1,41 @@
  1 +<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
  2 +<CodeBlocks_project_file>
  3 + <FileVersion major="1" minor="6" />
  4 + <Project>
  5 + <Option title="pw3270 HLLAPI v5.1 compatibility plugin" />
  6 + <Option pch_mode="2" />
  7 + <Option compiler="gcc" />
  8 + <Build>
  9 + <Target title="Debug">
  10 + <Option output=".bin/Debug/pw3270 HLLAPI v5" prefix_auto="1" extension_auto="1" />
  11 + <Option object_output=".obj/Debug/" />
  12 + <Option type="1" />
  13 + <Option compiler="gcc" />
  14 + <Compiler>
  15 + <Add option="-g" />
  16 + </Compiler>
  17 + </Target>
  18 + <Target title="Release">
  19 + <Option output=".bin/Release/pw3270 HLLAPI v5" prefix_auto="1" extension_auto="1" />
  20 + <Option object_output=".obj/Release/" />
  21 + <Option type="1" />
  22 + <Option compiler="gcc" />
  23 + <Compiler>
  24 + <Add option="-O2" />
  25 + </Compiler>
  26 + <Linker>
  27 + <Add option="-s" />
  28 + </Linker>
  29 + </Target>
  30 + </Build>
  31 + <Compiler>
  32 + <Add option="-Wall" />
  33 + </Compiler>
  34 + <Extensions>
  35 + <code_completion />
  36 + <envvars />
  37 + <debugger />
  38 + <lib_finder disable_auto="1" />
  39 + </Extensions>
  40 + </Project>
  41 +</CodeBlocks_project_file>
src/daemon/linux/daemon.c 0 → 100644
@@ -0,0 +1,122 @@ @@ -0,0 +1,122 @@
  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 daemon.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 + * licinio@bb.com.br (Licínio Luis Branco)
  28 + * kraucer@bb.com.br (Kraucer Fernandes Mazuco)
  29 + *
  30 + * Referencias:
  31 + *
  32 + * https://live.gnome.org/DBusGlibBindings
  33 + *
  34 + */
  35 +
  36 +#include <glib.h>
  37 +#include <dbus/dbus.h>
  38 +#include <dbus/dbus-glib-lowlevel.h>
  39 +#include <dbus/dbus-glib.h>
  40 +
  41 +#include "daemon.h"
  42 +#include "dbus-glue.h"
  43 +
  44 +#define PW3270_DBUS_SERVICE_PATH "/br/com/bb/pw3270"
  45 +#define PW3270_DBUS_SERVICE "br.com.bb.pw3270"
  46 +
  47 +
  48 +/*---[ Globals ]---------------------------------------------------------------------------------*/
  49 +
  50 + static DBusGConnection * connection = NULL;
  51 + static DBusGProxy * proxy = NULL;
  52 + static H3270 * hSession = NULL;
  53 +
  54 + GMainLoop * main_loop = NULL;
  55 +
  56 +
  57 +/*---[ Implement ]-------------------------------------------------------------------------------*/
  58 +
  59 +static int initialize(void)
  60 +{
  61 + GError * error = NULL;
  62 + guint result;
  63 +
  64 + connection = dbus_g_bus_get_private(DBUS_BUS_SESSION, g_main_context_default(), &error);
  65 + if(error)
  66 + {
  67 + g_message("Error \"%s\" getting session dbus",error->message);
  68 + g_error_free(error);
  69 + return -1;
  70 + }
  71 +
  72 + proxy = dbus_g_proxy_new_for_name(connection,DBUS_SERVICE_DBUS,DBUS_PATH_DBUS,DBUS_INTERFACE_DBUS);
  73 +
  74 + org_freedesktop_DBus_request_name(proxy, PW3270_DBUS_SERVICE, DBUS_NAME_FLAG_DO_NOT_QUEUE, &result, &error);
  75 +
  76 + pw3270_dbus_register_object(connection,proxy,PW3270_TYPE_DBUS,&dbus_glib_pw3270_dbus_object_info,PW3270_DBUS_SERVICE_PATH);
  77 +
  78 + return 0;
  79 +}
  80 +
  81 +static void loghandler(H3270 *session, const char *module, int rc, const char *fmt, va_list args)
  82 +{
  83 + g_logv(module,rc ? G_LOG_LEVEL_WARNING : G_LOG_LEVEL_MESSAGE, fmt, args);
  84 +}
  85 +
  86 +int main(int numpar, char *param[])
  87 +{
  88 + g_type_init ();
  89 +
  90 + if (!g_thread_supported ())
  91 + g_thread_init (NULL);
  92 +
  93 + dbus_g_thread_init ();
  94 +
  95 + lib3270_set_log_handler(loghandler);
  96 + pw3270_dbus_register_io_handlers();
  97 +
  98 + hSession = lib3270_session_new("");
  99 +
  100 + main_loop = g_main_loop_new (NULL, FALSE);
  101 +
  102 + if(initialize())
  103 + return -1;
  104 +
  105 + g_main_loop_run(main_loop);
  106 +
  107 + lib3270_session_free(hSession);
  108 +
  109 + return 0;
  110 +}
  111 +
  112 +void pw3270_dbus_quit(PW3270Dbus *object, DBusGMethodInvocation *context)
  113 +{
  114 + g_main_loop_quit(main_loop);
  115 + dbus_g_method_return(context,0);
  116 +}
  117 +
  118 +H3270 * pw3270_dbus_get_session_handle(PW3270Dbus *object)
  119 +{
  120 + return hSession;
  121 +}
  122 +
src/daemon/linux/iocallback.c 0 → 100644
@@ -0,0 +1,361 @@ @@ -0,0 +1,361 @@
  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 iocallback.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 + * licinio@bb.com.br (Licínio Luis Branco)
  28 + * kraucer@bb.com.br (Kraucer Fernandes Mazuco)
  29 + *
  30 + */
  31 +
  32 +#if defined(_WIN32) /*[*/
  33 + #include <windows.h>
  34 +#elif defined(__APPLE__)
  35 + #include <poll.h>
  36 + #include <string.h>
  37 +#else
  38 + #include <poll.h>
  39 + #include <string.h>
  40 +#endif /*]*/
  41 +
  42 +#include <stdio.h>
  43 +#include <glib.h>
  44 +#include "daemon.h"
  45 +
  46 +static int static_CallAndWait(int(*callback)(H3270 *session, void *), H3270 *session, void *parm);
  47 +static void static_RemoveSource(void *id);
  48 +
  49 +static void * static_AddInput(int source, H3270 *session, void (*fn)(H3270 *session));
  50 +static void * static_AddExcept(int source, H3270 *session, void (*fn)(H3270 *session));
  51 +
  52 +static void * static_AddTimeOut(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session));
  53 +static void static_RemoveTimeOut(void * timer);
  54 +static int static_Sleep(H3270 *hSession, int seconds);
  55 +static int static_RunPendingEvents(H3270 *hSession, int wait);
  56 +
  57 +static gboolean IO_prepare(GSource *source, gint *timeout);
  58 +static gboolean IO_check(GSource *source);
  59 +static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer user_data);
  60 +static void IO_finalize(GSource *source); /* Can be NULL */
  61 +static gboolean IO_closure(gpointer data);
  62 +
  63 +/*---[ Structs ]-------------------------------------------------------------------------------------------*/
  64 +
  65 + typedef struct _IO_Source
  66 + {
  67 + GSource gsrc;
  68 + GPollFD poll;
  69 +#if defined(_WIN32)
  70 + HANDLE source;
  71 +#else
  72 + int source;
  73 +#endif // _WIN32
  74 + void (*fn)(H3270 *session);
  75 + H3270 *session;
  76 + } IO_Source;
  77 +
  78 + typedef struct _timer
  79 + {
  80 + unsigned char remove;
  81 + void (*fn)(H3270 *session);
  82 + H3270 *session;
  83 + } TIMER;
  84 +
  85 + static GSourceFuncs IOSources =
  86 + {
  87 + IO_prepare,
  88 + IO_check,
  89 + IO_dispatch,
  90 + IO_finalize,
  91 + IO_closure,
  92 + NULL
  93 + };
  94 +
  95 +/*---[ Implement ]-----------------------------------------------------------------------------------------*/
  96 +
  97 +#ifdef _WIN32
  98 +static void * AddSource(HANDLE source, H3270 *session, gushort events, void (*fn)(H3270 *session))
  99 +#else
  100 +static void * AddSource(int source, H3270 *session, gushort events, void (*fn)(H3270 *session))
  101 +#endif // _WIN32
  102 +{
  103 + IO_Source *src = (IO_Source *) g_source_new(&IOSources,sizeof(IO_Source));
  104 +
  105 + src->source = source;
  106 + src->fn = fn;
  107 + src->poll.fd = (int) source;
  108 + src->poll.events = events;
  109 + src->session = session;
  110 +
  111 + g_source_attach((GSource *) src,NULL);
  112 + g_source_add_poll((GSource *) src,&src->poll);
  113 +
  114 + return src;
  115 +}
  116 +
  117 +#ifdef _WIN32
  118 +static void * static_AddInput(HANDLE source, H3270 *session, void (*fn)(H3270 *session))
  119 +#else
  120 +static void * static_AddInput(int source, H3270 *session, void (*fn)(H3270 *session))
  121 +#endif // _WIN32
  122 +{
  123 + return AddSource(source,session,G_IO_IN|G_IO_HUP|G_IO_ERR,fn);
  124 +}
  125 +
  126 +static void static_RemoveSource(void *id)
  127 +{
  128 + if(id)
  129 + g_source_destroy((GSource *) id);
  130 +}
  131 +
  132 +#if defined(_WIN32)
  133 +static void * static_AddExcept(HANDLE source, H3270 *session, void (*fn)(H3270 *session))
  134 +{
  135 + return 0;
  136 +}
  137 +#else
  138 +static void * static_AddExcept(int source, H3270 *session, void (*fn)(H3270 *session))
  139 +{
  140 + return AddSource(source,session,G_IO_HUP|G_IO_ERR,fn);
  141 +}
  142 +#endif // _WIN32
  143 +
  144 +static gboolean do_timer(TIMER *t)
  145 +{
  146 + if(!t->remove)
  147 + t->fn(t->session);
  148 + return FALSE;
  149 +}
  150 +
  151 +static void * static_AddTimeOut(unsigned long interval, H3270 *session, void (*proc)(H3270 *session))
  152 +{
  153 + TIMER *t = g_malloc0(sizeof(TIMER));
  154 +
  155 + t->fn = proc;
  156 + t->session = session;
  157 +
  158 + g_timeout_add_full(G_PRIORITY_DEFAULT, (guint) interval, (GSourceFunc) do_timer, t, g_free);
  159 +
  160 + return t;
  161 +}
  162 +
  163 +static void static_RemoveTimeOut(void * timer)
  164 +{
  165 + ((TIMER *) timer)->remove++;
  166 +}
  167 +
  168 +static gboolean IO_prepare(GSource *source, gint *timeout)
  169 +{
  170 + /*
  171 + * Called before all the file descriptors are polled.
  172 + * If the source can determine that it is ready here
  173 + * (without waiting for the results of the poll() call)
  174 + * it should return TRUE.
  175 + *
  176 + * It can also return a timeout_ value which should be the maximum
  177 + * timeout (in milliseconds) which should be passed to the poll() call.
  178 + * The actual timeout used will be -1 if all sources returned -1,
  179 + * or it will be the minimum of all the timeout_ values
  180 + * returned which were >= 0.
  181 + *
  182 + */
  183 + return 0;
  184 +}
  185 +
  186 +static gboolean IO_check(GSource *source)
  187 +{
  188 + /*
  189 + * Called after all the file descriptors are polled.
  190 + * The source should return TRUE if it is ready to be dispatched.
  191 + * Note that some time may have passed since the previous prepare
  192 + * function was called, so the source should be checked again here.
  193 + *
  194 + */
  195 +#if defined(_WIN32) /*[*/
  196 +
  197 + if(WaitForSingleObject(((IO_Source *) source)->source,0) == WAIT_OBJECT_0)
  198 + return TRUE;
  199 +
  200 +#else /*][*/
  201 +
  202 + struct pollfd fds;
  203 +
  204 + memset(&fds,0,sizeof(fds));
  205 +
  206 + fds.fd = ((IO_Source *) source)->poll.fd;
  207 + fds.events = ((IO_Source *) source)->poll.events;
  208 +
  209 + if(poll(&fds,1,0) > 0)
  210 + return TRUE;
  211 +
  212 +#endif /*]*/
  213 +
  214 + return FALSE;
  215 +}
  216 +
  217 +static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer user_data)
  218 +{
  219 + /*
  220 + * Called to dispatch the event source,
  221 + * after it has returned TRUE in either its prepare or its check function.
  222 + * The dispatch function is passed in a callback function and data.
  223 + * The callback function may be NULL if the source was never connected
  224 + * to a callback using g_source_set_callback(). The dispatch function
  225 + * should call the callback function with user_data and whatever additional
  226 + * parameters are needed for this type of event source.
  227 + */
  228 + ((IO_Source *) source)->fn(((IO_Source *) source)->session);
  229 + return TRUE;
  230 +}
  231 +
  232 +static void IO_finalize(GSource *source)
  233 +{
  234 +
  235 +}
  236 +
  237 +static gboolean IO_closure(gpointer data)
  238 +{
  239 + return 0;
  240 +}
  241 +
  242 +struct bgParameter
  243 +{
  244 + gboolean running;
  245 + gboolean timer;
  246 + H3270 *session;
  247 + int rc;
  248 + int(*callback)(H3270 *session, void *);
  249 + void *parm;
  250 +
  251 +};
  252 +
  253 +gpointer BgCall(struct bgParameter *p)
  254 +{
  255 +// trace("%s starts",__FUNCTION__);
  256 + p->rc = p->callback(p->session, p->parm);
  257 + p->running = FALSE;
  258 +// trace("%s ends",__FUNCTION__);
  259 + return 0;
  260 +}
  261 +
  262 +static gboolean wait_for_thread(struct bgParameter *p)
  263 +{
  264 + if(!p->running)
  265 + {
  266 + p->timer = 0;
  267 + return FALSE;
  268 + }
  269 + return TRUE;
  270 +}
  271 +
  272 +static int static_CallAndWait(int(*callback)(H3270 *session, void *), H3270 *session, void *parm)
  273 +{
  274 + struct bgParameter p = { TRUE, TRUE, session, -1, callback, parm };
  275 + GThread * thread;
  276 +
  277 +// trace("Starting auxiliary thread for callback %p",callback);
  278 +
  279 + p.running = TRUE;
  280 + p.timer = TRUE;
  281 +
  282 + thread = g_thread_create( (GThreadFunc) BgCall, &p, 0, NULL);
  283 +
  284 + if(!thread)
  285 + {
  286 + g_error("Can't start background thread");
  287 + return -1;
  288 + }
  289 +
  290 + g_timeout_add(50,(GSourceFunc) wait_for_thread,(gpointer) &p);
  291 +
  292 + while(p.timer)
  293 + g_main_context_iteration(g_main_loop_get_context(main_loop),TRUE);
  294 +
  295 + return p.rc;
  296 +}
  297 +
  298 +static int static_Sleep(H3270 *hSession, int seconds)
  299 +{
  300 + time_t end = time(0) + seconds;
  301 +
  302 + while(time(0) < end)
  303 + g_main_iteration(TRUE);
  304 +
  305 + return 0;
  306 +}
  307 +
  308 +static int static_RunPendingEvents(H3270 *hSession, int wait)
  309 +{
  310 + GMainContext *context = g_main_loop_get_context(main_loop);
  311 + int rc = 0;
  312 + while(g_main_context_pending(context))
  313 + {
  314 + rc = 1;
  315 + g_main_context_iteration(context,FALSE);
  316 + }
  317 +
  318 + if(wait)
  319 + g_main_context_iteration(context,TRUE);
  320 +
  321 + return rc;
  322 +}
  323 +
  324 +static void beep(H3270 *session)
  325 +{
  326 +}
  327 +
  328 +void pw3270_dbus_register_io_handlers(void)
  329 +{
  330 + static const struct lib3270_callbacks hdl =
  331 + {
  332 + sizeof(struct lib3270_callbacks),
  333 +
  334 + static_AddTimeOut,
  335 + static_RemoveTimeOut,
  336 +
  337 + static_AddInput,
  338 + static_RemoveSource,
  339 +
  340 + static_AddExcept,
  341 +
  342 +#ifdef G_THREADS_ENABLED
  343 + static_CallAndWait,
  344 +#else
  345 + NULL,
  346 +#endif
  347 +
  348 + static_Sleep,
  349 + static_RunPendingEvents,
  350 + beep
  351 +
  352 + };
  353 +
  354 + #error Need rewrite
  355 +
  356 + if(lib3270_register_handlers(&hdl))
  357 + {
  358 + g_error("%s","Can't set lib3270 I/O handlers");
  359 + }
  360 +
  361 +}
src/plugin/linux/daemon.c
@@ -1,122 +0,0 @@ @@ -1,122 +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 daemon.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 - * licinio@bb.com.br (Licínio Luis Branco)  
28 - * kraucer@bb.com.br (Kraucer Fernandes Mazuco)  
29 - *  
30 - * Referencias:  
31 - *  
32 - * https://live.gnome.org/DBusGlibBindings  
33 - *  
34 - */  
35 -  
36 -#include <glib.h>  
37 -#include <dbus/dbus.h>  
38 -#include <dbus/dbus-glib-lowlevel.h>  
39 -#include <dbus/dbus-glib.h>  
40 -  
41 -#include "daemon.h"  
42 -#include "dbus-glue.h"  
43 -  
44 -#define PW3270_DBUS_SERVICE_PATH "/br/com/bb/pw3270"  
45 -#define PW3270_DBUS_SERVICE "br.com.bb.pw3270"  
46 -  
47 -  
48 -/*---[ Globals ]---------------------------------------------------------------------------------*/  
49 -  
50 - static DBusGConnection * connection = NULL;  
51 - static DBusGProxy * proxy = NULL;  
52 - static H3270 * hSession = NULL;  
53 -  
54 - GMainLoop * main_loop = NULL;  
55 -  
56 -  
57 -/*---[ Implement ]-------------------------------------------------------------------------------*/  
58 -  
59 -static int initialize(void)  
60 -{  
61 - GError * error = NULL;  
62 - guint result;  
63 -  
64 - connection = dbus_g_bus_get_private(DBUS_BUS_SESSION, g_main_context_default(), &error);  
65 - if(error)  
66 - {  
67 - g_message("Error \"%s\" getting session dbus",error->message);  
68 - g_error_free(error);  
69 - return -1;  
70 - }  
71 -  
72 - proxy = dbus_g_proxy_new_for_name(connection,DBUS_SERVICE_DBUS,DBUS_PATH_DBUS,DBUS_INTERFACE_DBUS);  
73 -  
74 - org_freedesktop_DBus_request_name(proxy, PW3270_DBUS_SERVICE, DBUS_NAME_FLAG_DO_NOT_QUEUE, &result, &error);  
75 -  
76 - pw3270_dbus_register_object(connection,proxy,PW3270_TYPE_DBUS,&dbus_glib_pw3270_dbus_object_info,PW3270_DBUS_SERVICE_PATH);  
77 -  
78 - return 0;  
79 -}  
80 -  
81 -static void loghandler(H3270 *session, const char *module, int rc, const char *fmt, va_list args)  
82 -{  
83 - g_logv(module,rc ? G_LOG_LEVEL_WARNING : G_LOG_LEVEL_MESSAGE, fmt, args);  
84 -}  
85 -  
86 -int main(int numpar, char *param[])  
87 -{  
88 - g_type_init ();  
89 -  
90 - if (!g_thread_supported ())  
91 - g_thread_init (NULL);  
92 -  
93 - dbus_g_thread_init ();  
94 -  
95 - lib3270_set_log_handler(loghandler);  
96 - pw3270_dbus_register_io_handlers();  
97 -  
98 - hSession = lib3270_session_new("");  
99 -  
100 - main_loop = g_main_loop_new (NULL, FALSE);  
101 -  
102 - if(initialize())  
103 - return -1;  
104 -  
105 - g_main_loop_run(main_loop);  
106 -  
107 - lib3270_session_free(hSession);  
108 -  
109 - return 0;  
110 -}  
111 -  
112 -void pw3270_dbus_quit(PW3270Dbus *object, DBusGMethodInvocation *context)  
113 -{  
114 - g_main_loop_quit(main_loop);  
115 - dbus_g_method_return(context,0);  
116 -}  
117 -  
118 -H3270 * pw3270_dbus_get_session_handle(PW3270Dbus *object)  
119 -{  
120 - return hSession;  
121 -}  
122 -  
src/plugin/linux/iocallback.c
@@ -1,361 +0,0 @@ @@ -1,361 +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 iocallback.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 - * licinio@bb.com.br (Licínio Luis Branco)  
28 - * kraucer@bb.com.br (Kraucer Fernandes Mazuco)  
29 - *  
30 - */  
31 -  
32 -#if defined(_WIN32) /*[*/  
33 - #include <windows.h>  
34 -#elif defined(__APPLE__)  
35 - #include <poll.h>  
36 - #include <string.h>  
37 -#else  
38 - #include <poll.h>  
39 - #include <string.h>  
40 -#endif /*]*/  
41 -  
42 -#include <stdio.h>  
43 -#include <glib.h>  
44 -#include "daemon.h"  
45 -  
46 -static int static_CallAndWait(int(*callback)(H3270 *session, void *), H3270 *session, void *parm);  
47 -static void static_RemoveSource(void *id);  
48 -  
49 -static void * static_AddInput(int source, H3270 *session, void (*fn)(H3270 *session));  
50 -static void * static_AddExcept(int source, H3270 *session, void (*fn)(H3270 *session));  
51 -  
52 -static void * static_AddTimeOut(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session));  
53 -static void static_RemoveTimeOut(void * timer);  
54 -static int static_Sleep(H3270 *hSession, int seconds);  
55 -static int static_RunPendingEvents(H3270 *hSession, int wait);  
56 -  
57 -static gboolean IO_prepare(GSource *source, gint *timeout);  
58 -static gboolean IO_check(GSource *source);  
59 -static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer user_data);  
60 -static void IO_finalize(GSource *source); /* Can be NULL */  
61 -static gboolean IO_closure(gpointer data);  
62 -  
63 -/*---[ Structs ]-------------------------------------------------------------------------------------------*/  
64 -  
65 - typedef struct _IO_Source  
66 - {  
67 - GSource gsrc;  
68 - GPollFD poll;  
69 -#if defined(_WIN32)  
70 - HANDLE source;  
71 -#else  
72 - int source;  
73 -#endif // _WIN32  
74 - void (*fn)(H3270 *session);  
75 - H3270 *session;  
76 - } IO_Source;  
77 -  
78 - typedef struct _timer  
79 - {  
80 - unsigned char remove;  
81 - void (*fn)(H3270 *session);  
82 - H3270 *session;  
83 - } TIMER;  
84 -  
85 - static GSourceFuncs IOSources =  
86 - {  
87 - IO_prepare,  
88 - IO_check,  
89 - IO_dispatch,  
90 - IO_finalize,  
91 - IO_closure,  
92 - NULL  
93 - };  
94 -  
95 -/*---[ Implement ]-----------------------------------------------------------------------------------------*/  
96 -  
97 -#ifdef _WIN32  
98 -static void * AddSource(HANDLE source, H3270 *session, gushort events, void (*fn)(H3270 *session))  
99 -#else  
100 -static void * AddSource(int source, H3270 *session, gushort events, void (*fn)(H3270 *session))  
101 -#endif // _WIN32  
102 -{  
103 - IO_Source *src = (IO_Source *) g_source_new(&IOSources,sizeof(IO_Source));  
104 -  
105 - src->source = source;  
106 - src->fn = fn;  
107 - src->poll.fd = (int) source;  
108 - src->poll.events = events;  
109 - src->session = session;  
110 -  
111 - g_source_attach((GSource *) src,NULL);  
112 - g_source_add_poll((GSource *) src,&src->poll);  
113 -  
114 - return src;  
115 -}  
116 -  
117 -#ifdef _WIN32  
118 -static void * static_AddInput(HANDLE source, H3270 *session, void (*fn)(H3270 *session))  
119 -#else  
120 -static void * static_AddInput(int source, H3270 *session, void (*fn)(H3270 *session))  
121 -#endif // _WIN32  
122 -{  
123 - return AddSource(source,session,G_IO_IN|G_IO_HUP|G_IO_ERR,fn);  
124 -}  
125 -  
126 -static void static_RemoveSource(void *id)  
127 -{  
128 - if(id)  
129 - g_source_destroy((GSource *) id);  
130 -}  
131 -  
132 -#if defined(_WIN32)  
133 -static void * static_AddExcept(HANDLE source, H3270 *session, void (*fn)(H3270 *session))  
134 -{  
135 - return 0;  
136 -}  
137 -#else  
138 -static void * static_AddExcept(int source, H3270 *session, void (*fn)(H3270 *session))  
139 -{  
140 - return AddSource(source,session,G_IO_HUP|G_IO_ERR,fn);  
141 -}  
142 -#endif // _WIN32  
143 -  
144 -static gboolean do_timer(TIMER *t)  
145 -{  
146 - if(!t->remove)  
147 - t->fn(t->session);  
148 - return FALSE;  
149 -}  
150 -  
151 -static void * static_AddTimeOut(unsigned long interval, H3270 *session, void (*proc)(H3270 *session))  
152 -{  
153 - TIMER *t = g_malloc0(sizeof(TIMER));  
154 -  
155 - t->fn = proc;  
156 - t->session = session;  
157 -  
158 - g_timeout_add_full(G_PRIORITY_DEFAULT, (guint) interval, (GSourceFunc) do_timer, t, g_free);  
159 -  
160 - return t;  
161 -}  
162 -  
163 -static void static_RemoveTimeOut(void * timer)  
164 -{  
165 - ((TIMER *) timer)->remove++;  
166 -}  
167 -  
168 -static gboolean IO_prepare(GSource *source, gint *timeout)  
169 -{  
170 - /*  
171 - * Called before all the file descriptors are polled.  
172 - * If the source can determine that it is ready here  
173 - * (without waiting for the results of the poll() call)  
174 - * it should return TRUE.  
175 - *  
176 - * It can also return a timeout_ value which should be the maximum  
177 - * timeout (in milliseconds) which should be passed to the poll() call.  
178 - * The actual timeout used will be -1 if all sources returned -1,  
179 - * or it will be the minimum of all the timeout_ values  
180 - * returned which were >= 0.  
181 - *  
182 - */  
183 - return 0;  
184 -}  
185 -  
186 -static gboolean IO_check(GSource *source)  
187 -{  
188 - /*  
189 - * Called after all the file descriptors are polled.  
190 - * The source should return TRUE if it is ready to be dispatched.  
191 - * Note that some time may have passed since the previous prepare  
192 - * function was called, so the source should be checked again here.  
193 - *  
194 - */  
195 -#if defined(_WIN32) /*[*/  
196 -  
197 - if(WaitForSingleObject(((IO_Source *) source)->source,0) == WAIT_OBJECT_0)  
198 - return TRUE;  
199 -  
200 -#else /*][*/  
201 -  
202 - struct pollfd fds;  
203 -  
204 - memset(&fds,0,sizeof(fds));  
205 -  
206 - fds.fd = ((IO_Source *) source)->poll.fd;  
207 - fds.events = ((IO_Source *) source)->poll.events;  
208 -  
209 - if(poll(&fds,1,0) > 0)  
210 - return TRUE;  
211 -  
212 -#endif /*]*/  
213 -  
214 - return FALSE;  
215 -}  
216 -  
217 -static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer user_data)  
218 -{  
219 - /*  
220 - * Called to dispatch the event source,  
221 - * after it has returned TRUE in either its prepare or its check function.  
222 - * The dispatch function is passed in a callback function and data.  
223 - * The callback function may be NULL if the source was never connected  
224 - * to a callback using g_source_set_callback(). The dispatch function  
225 - * should call the callback function with user_data and whatever additional  
226 - * parameters are needed for this type of event source.  
227 - */  
228 - ((IO_Source *) source)->fn(((IO_Source *) source)->session);  
229 - return TRUE;  
230 -}  
231 -  
232 -static void IO_finalize(GSource *source)  
233 -{  
234 -  
235 -}  
236 -  
237 -static gboolean IO_closure(gpointer data)  
238 -{  
239 - return 0;  
240 -}  
241 -  
242 -struct bgParameter  
243 -{  
244 - gboolean running;  
245 - gboolean timer;  
246 - H3270 *session;  
247 - int rc;  
248 - int(*callback)(H3270 *session, void *);  
249 - void *parm;  
250 -  
251 -};  
252 -  
253 -gpointer BgCall(struct bgParameter *p)  
254 -{  
255 -// trace("%s starts",__FUNCTION__);  
256 - p->rc = p->callback(p->session, p->parm);  
257 - p->running = FALSE;  
258 -// trace("%s ends",__FUNCTION__);  
259 - return 0;  
260 -}  
261 -  
262 -static gboolean wait_for_thread(struct bgParameter *p)  
263 -{  
264 - if(!p->running)  
265 - {  
266 - p->timer = 0;  
267 - return FALSE;  
268 - }  
269 - return TRUE;  
270 -}  
271 -  
272 -static int static_CallAndWait(int(*callback)(H3270 *session, void *), H3270 *session, void *parm)  
273 -{  
274 - struct bgParameter p = { TRUE, TRUE, session, -1, callback, parm };  
275 - GThread * thread;  
276 -  
277 -// trace("Starting auxiliary thread for callback %p",callback);  
278 -  
279 - p.running = TRUE;  
280 - p.timer = TRUE;  
281 -  
282 - thread = g_thread_create( (GThreadFunc) BgCall, &p, 0, NULL);  
283 -  
284 - if(!thread)  
285 - {  
286 - g_error("Can't start background thread");  
287 - return -1;  
288 - }  
289 -  
290 - g_timeout_add(50,(GSourceFunc) wait_for_thread,(gpointer) &p);  
291 -  
292 - while(p.timer)  
293 - g_main_context_iteration(g_main_loop_get_context(main_loop),TRUE);  
294 -  
295 - return p.rc;  
296 -}  
297 -  
298 -static int static_Sleep(H3270 *hSession, int seconds)  
299 -{  
300 - time_t end = time(0) + seconds;  
301 -  
302 - while(time(0) < end)  
303 - g_main_iteration(TRUE);  
304 -  
305 - return 0;  
306 -}  
307 -  
308 -static int static_RunPendingEvents(H3270 *hSession, int wait)  
309 -{  
310 - GMainContext *context = g_main_loop_get_context(main_loop);  
311 - int rc = 0;  
312 - while(g_main_context_pending(context))  
313 - {  
314 - rc = 1;  
315 - g_main_context_iteration(context,FALSE);  
316 - }  
317 -  
318 - if(wait)  
319 - g_main_context_iteration(context,TRUE);  
320 -  
321 - return rc;  
322 -}  
323 -  
324 -static void beep(H3270 *session)  
325 -{  
326 -}  
327 -  
328 -void pw3270_dbus_register_io_handlers(void)  
329 -{  
330 - static const struct lib3270_callbacks hdl =  
331 - {  
332 - sizeof(struct lib3270_callbacks),  
333 -  
334 - static_AddTimeOut,  
335 - static_RemoveTimeOut,  
336 -  
337 - static_AddInput,  
338 - static_RemoveSource,  
339 -  
340 - static_AddExcept,  
341 -  
342 -#ifdef G_THREADS_ENABLED  
343 - static_CallAndWait,  
344 -#else  
345 - NULL,  
346 -#endif  
347 -  
348 - static_Sleep,  
349 - static_RunPendingEvents,  
350 - beep  
351 -  
352 - };  
353 -  
354 - #error Need rewrite  
355 -  
356 - if(lib3270_register_handlers(&hdl))  
357 - {  
358 - g_error("%s","Can't set lib3270 I/O handlers");  
359 - }  
360 -  
361 -}  
src/plugin/linux/main.c
@@ -40,7 +40,7 @@ @@ -40,7 +40,7 @@
40 #include <pw3270/plugin.h> 40 #include <pw3270/plugin.h>
41 41
42 #include "service.h" 42 #include "service.h"
43 -#include "dbus-glue.h" 43 +//#include "dbus-glue.h"
44 44
45 #include <gtk/gtk.h> 45 #include <gtk/gtk.h>
46 46
@@ -55,7 +55,6 @@ @@ -55,7 +55,6 @@
55 55
56 LIB3270_EXPORT int pw3270_plugin_start(GtkWidget *window, GtkWidget *terminal) 56 LIB3270_EXPORT int pw3270_plugin_start(GtkWidget *window, GtkWidget *terminal)
57 { 57 {
58 -  
59 GError * error = NULL; 58 GError * error = NULL;
60 guint result; 59 guint result;
61 char session_id = 0; 60 char session_id = 0;
src/testprogram/testprogram.c 0 → 100644
@@ -0,0 +1,247 @@ @@ -0,0 +1,247 @@
  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 Test program for pw3270 HLLAPI compatibility plugin.
  34 + *
  35 + */
  36 +
  37 + #include <config.h>
  38 + #include <v3270.h>
  39 + #include <v3270/trace.h>
  40 + #include <pw3270/plugin.h>
  41 + #include <string.h>
  42 + #include <stdlib.h>
  43 +
  44 + /*---[ Globals ]------------------------------------------------------------------------------------*/
  45 +
  46 + const gchar * plugin_path = ".bin/Debug";
  47 + const gchar * session_name = "pw3270";
  48 + const gchar * plugin_name = "ipc3270c." G_MODULE_SUFFIX;
  49 +
  50 + /*---[ Implement ]----------------------------------------------------------------------------------*/
  51 +
  52 + static void close_module(GtkWidget *widget, GModule *module)
  53 + {
  54 + g_message("Closing module %p",module);
  55 +
  56 + static void (*stop)(GtkWidget *window, GtkWidget *terminal) = NULL;
  57 + if(!g_module_symbol(module,"pw3270_plugin_stop",(gpointer) &stop))
  58 + {
  59 + g_message("Can't get stop method from plugin: %s",g_module_error());
  60 + }
  61 + else
  62 + {
  63 + stop(gtk_widget_get_toplevel(widget),widget);
  64 + }
  65 +
  66 + g_module_close(module);
  67 + g_message("Module %p was closed",module);
  68 + }
  69 +
  70 + static void toggle_ds_trace(GtkToggleToolButton *button, GtkWidget *terminal)
  71 + {
  72 + v3270_set_toggle(terminal,LIB3270_TOGGLE_DS_TRACE,gtk_toggle_tool_button_get_active(button));
  73 + }
  74 +
  75 + static void toggle_event_trace(GtkToggleToolButton *button, GtkWidget *terminal)
  76 + {
  77 + v3270_set_toggle(terminal,LIB3270_TOGGLE_EVENT_TRACE,gtk_toggle_tool_button_get_active(button));
  78 + }
  79 +
  80 + static void toggle_ssl_trace(GtkToggleToolButton *button, GtkWidget *terminal)
  81 + {
  82 + v3270_set_toggle(terminal,LIB3270_TOGGLE_SSL_TRACE,gtk_toggle_tool_button_get_active(button));
  83 + }
  84 +
  85 + static void toggle_screen_trace(GtkToggleToolButton *button, GtkWidget *terminal)
  86 + {
  87 + v3270_set_toggle(terminal,LIB3270_TOGGLE_SCREEN_TRACE,gtk_toggle_tool_button_get_active(button));
  88 + }
  89 +
  90 + static void toggle_started_trace(GtkToggleToolButton *button, GModule *module)
  91 + {
  92 + if(!module)
  93 + return;
  94 +
  95 + GtkWidget * terminal = g_object_get_data(G_OBJECT(button),"terminal");
  96 +
  97 + const gchar * method_name = (gtk_toggle_tool_button_get_active(button) ? "pw3270_plugin_start" : "pw3270_plugin_stop");
  98 +
  99 + static void (*call)(GtkWidget *window, GtkWidget *terminal) = NULL;
  100 + if(!g_module_symbol(module,method_name,(gpointer) &call))
  101 + {
  102 + g_message("Can't get method \"%s\": %s",method_name,g_module_error());
  103 + return;
  104 + }
  105 +
  106 + g_message("Calling %s",method_name);
  107 + call(gtk_widget_get_toplevel(terminal), GTK_WIDGET(terminal));
  108 +
  109 + }
  110 +
  111 + static GtkToolItem * create_tool_item(GtkWidget *terminal, const gchar *label, const gchar *tooltip, GCallback callback)
  112 + {
  113 + GtkToolItem * item = gtk_toggle_tool_button_new();
  114 + gtk_tool_button_set_label(GTK_TOOL_BUTTON(item),label);
  115 +
  116 + g_signal_connect(GTK_WIDGET(item), "toggled", G_CALLBACK(callback), terminal);
  117 +
  118 + if(tooltip)
  119 + gtk_widget_set_tooltip_text(GTK_WIDGET(item),tooltip);
  120 +
  121 + return item;
  122 + }
  123 +
  124 + static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) {
  125 +
  126 + GtkWidget * window = gtk_application_window_new(app);
  127 + GtkWidget * terminal = v3270_new();
  128 + GtkWidget * notebook = gtk_notebook_new();
  129 + GModule * module = NULL;
  130 +
  131 + gtk_widget_set_name(window,session_name);
  132 +
  133 + // Setup tabs
  134 + gtk_notebook_append_page(GTK_NOTEBOOK(notebook),terminal,gtk_label_new(v3270_get_session_name(terminal)));
  135 +
  136 + // Load plugin
  137 + {
  138 + g_autofree gchar * plugin = g_build_filename(plugin_path,plugin_name,NULL);
  139 +
  140 + g_message("Loading %s",plugin);
  141 +
  142 + module = g_module_open(plugin,G_MODULE_BIND_LOCAL);
  143 +
  144 + if(module)
  145 + {
  146 + g_signal_connect (terminal, "destroy", G_CALLBACK(close_module), module);
  147 + }
  148 + else
  149 + {
  150 + g_message("Can't open \"%s\": %s",plugin,g_module_error());
  151 + gtk_main_quit();
  152 + }
  153 +
  154 + }
  155 + // Create trace window
  156 + {
  157 + GtkWidget * box = gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
  158 + GtkWidget * trace = v3270_trace_new(terminal);
  159 + GtkWidget * toolbar = gtk_toolbar_new();
  160 + GtkToolItem * start = gtk_toggle_tool_button_new();
  161 +
  162 + gtk_widget_set_sensitive(GTK_WIDGET(start),module != NULL);
  163 +
  164 + g_object_set_data(G_OBJECT(start),"terminal",terminal);
  165 +
  166 + gtk_tool_button_set_label(GTK_TOOL_BUTTON(start),"Enable");
  167 + g_signal_connect(GTK_WIDGET(start), "toggled", G_CALLBACK(toggle_started_trace), module);
  168 + gtk_widget_set_tooltip_text(GTK_WIDGET(start),"Start/Stop plugin module");
  169 +
  170 + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), start, -1);
  171 +
  172 + gtk_toolbar_insert(GTK_TOOLBAR(toolbar),gtk_separator_tool_item_new(),-1);
  173 +
  174 + gtk_toolbar_insert(GTK_TOOLBAR(toolbar),create_tool_item(terminal, "DS Trace","Toggle DS Trace",G_CALLBACK(toggle_ds_trace)),-1);
  175 + gtk_toolbar_insert(GTK_TOOLBAR(toolbar),create_tool_item(terminal, "Event Trace","Toggle Event Trace",G_CALLBACK(toggle_event_trace)),-1);
  176 + gtk_toolbar_insert(GTK_TOOLBAR(toolbar),create_tool_item(terminal, "Screen Trace","Toggle Screen Trace",G_CALLBACK(toggle_screen_trace)),-1);
  177 + gtk_toolbar_insert(GTK_TOOLBAR(toolbar),create_tool_item(terminal, "SSL Trace","Toggle SSL Trace",G_CALLBACK(toggle_ssl_trace)),-1);
  178 +
  179 + gtk_box_pack_start(GTK_BOX(box),toolbar,FALSE,FALSE,0);
  180 + gtk_box_pack_start(GTK_BOX(box),trace,TRUE,TRUE,0);
  181 + gtk_notebook_append_page(GTK_NOTEBOOK(notebook),box,gtk_label_new("Trace"));
  182 + }
  183 +
  184 + // Setup and show main window
  185 + gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
  186 + gtk_window_set_default_size (GTK_WINDOW (window), 800, 500);
  187 + gtk_container_add(GTK_CONTAINER(window),notebook);
  188 + gtk_widget_show_all (window);
  189 +
  190 + // Setup title.
  191 + const gchar *url = lib3270_get_url(v3270_get_session(terminal));
  192 + if(url) {
  193 +
  194 + v3270_set_url(terminal,url);
  195 + v3270_reconnect(terminal);
  196 +
  197 + gchar * title = g_strdup_printf("%s - %s", v3270_get_session_name(terminal), url);
  198 + gtk_window_set_title(GTK_WINDOW(window), title);
  199 + g_free(title);
  200 +
  201 + } else {
  202 +
  203 + gtk_window_set_title(GTK_WINDOW(window), v3270_get_session_name(terminal));
  204 +
  205 + }
  206 +
  207 +}
  208 +
  209 +int main (int argc, char **argv) {
  210 +
  211 + /*
  212 + GVariantBuilder builder;
  213 +
  214 + g_variant_builder_init(&builder,G_VARIANT_TYPE("(isi)"));
  215 +
  216 + g_variant_builder_add(&builder, "i", 10);
  217 + g_variant_builder_add(&builder, "s", "teste");
  218 + g_variant_builder_add(&builder, "i", 20);
  219 +
  220 + GVariant *value = g_variant_builder_end(&builder);
  221 +
  222 + size_t szPacket = 0;
  223 + g_autofree unsigned char * buffer = ipc3270_pack("teste", value, &szPacket);
  224 + g_variant_unref(value);
  225 +
  226 + debug("Package \"%s\" was created with %u bytes", buffer, (unsigned int) szPacket);
  227 +
  228 + value = ipc3270_unpack(buffer);
  229 +
  230 + g_variant_unref(value);
  231 + */
  232 +
  233 + GtkApplication *app;
  234 + int status;
  235 +
  236 + app = gtk_application_new ("br.com.bb.pw3270",G_APPLICATION_FLAGS_NONE);
  237 +
  238 + g_signal_connect (app, "activate", G_CALLBACK(activate), NULL);
  239 +
  240 + status = g_application_run (G_APPLICATION (app), argc, argv);
  241 + g_object_unref (app);
  242 +
  243 + g_message("rc=%d",status);
  244 + return status;
  245 +
  246 +}
  247 +