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