From 190f2b2d48166da30f6408bae8f5a6a30fb2ac27 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Tue, 19 Feb 2013 13:16:23 +0000 Subject: [PATCH] Iniciando implementacao do plugin dbus --- src/plugins/3270dbus/Makefile.in | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/plugins/3270dbus/daemon.c | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/plugins/3270dbus/daemon.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/plugins/3270dbus/gobject.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/plugins/3270dbus/iocallback.c | 349 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/plugins/3270dbus/main.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/plugins/3270dbus/pw3270dbus.cbp | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/plugins/3270dbus/pw3270dbus.xml | 22 ++++++++++++++++++++++ src/plugins/3270dbus/service.h | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/plugins/3270dbus/test.sh | 26 ++++++++++++++++++++++++++ src/plugins/dbus/Makefile.in | 117 --------------------------------------------------------------------------------------------------------------------- src/plugins/dbus/daemon.c | 121 ------------------------------------------------------------------------------------------------------------------------- src/plugins/dbus/daemon.h | 46 ---------------------------------------------- src/plugins/dbus/gobject.c | 92 -------------------------------------------------------------------------------------------- src/plugins/dbus/iocallback.c | 349 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/plugins/dbus/main.c | 86 -------------------------------------------------------------------------------------- src/plugins/dbus/pw3270dbus.cbp | 63 --------------------------------------------------------------- src/plugins/dbus/pw3270dbus.xml | 22 ---------------------- src/plugins/dbus/service.h | 47 ----------------------------------------------- src/plugins/dbus/test.sh | 26 -------------------------- 20 files changed, 997 insertions(+), 969 deletions(-) create mode 100644 src/plugins/3270dbus/Makefile.in create mode 100644 src/plugins/3270dbus/daemon.c create mode 100644 src/plugins/3270dbus/daemon.h create mode 100644 src/plugins/3270dbus/gobject.c create mode 100644 src/plugins/3270dbus/iocallback.c create mode 100644 src/plugins/3270dbus/main.c create mode 100644 src/plugins/3270dbus/pw3270dbus.cbp create mode 100644 src/plugins/3270dbus/pw3270dbus.xml create mode 100644 src/plugins/3270dbus/service.h create mode 100755 src/plugins/3270dbus/test.sh delete mode 100644 src/plugins/dbus/Makefile.in delete mode 100644 src/plugins/dbus/daemon.c delete mode 100644 src/plugins/dbus/daemon.h delete mode 100644 src/plugins/dbus/gobject.c delete mode 100644 src/plugins/dbus/iocallback.c delete mode 100644 src/plugins/dbus/main.c delete mode 100644 src/plugins/dbus/pw3270dbus.cbp delete mode 100644 src/plugins/dbus/pw3270dbus.xml delete mode 100644 src/plugins/dbus/service.h delete mode 100755 src/plugins/dbus/test.sh diff --git a/src/plugins/3270dbus/Makefile.in b/src/plugins/3270dbus/Makefile.in new file mode 100644 index 0000000..7000634 --- /dev/null +++ b/src/plugins/3270dbus/Makefile.in @@ -0,0 +1,119 @@ +# +# "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 +# (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a +# aplicativos mainframe. Registro no INPI sob o nome G3270. +# +# Copyright (C) <2008> +# +# Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob +# os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela +# Free Software Foundation. +# +# Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER +# GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO +# A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para +# obter mais detalhes. +# +# Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este +# programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple +# Place, Suite 330, Boston, MA, 02111-1307, USA +# +# Contatos: +# +# perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) +# erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça) +# licinio@bb.com.br (Licínio Luis Branco) +# kraucer@bb.com.br (Kraucer Fernandes Mazuco) +# + +#---[ Sources ]---------------------------------------------------------------- + +MODULE_NAME=pw3270dbus +DEPENDS=Makefile dbus-glue.h +PLUGIN_SRC=main.c gobject.c +DAEMON_SRC=daemon.c gobject.c iocallback.c + +#---[ Paths ]------------------------------------------------------------------ + +ROOTDIR ?= . +OBJDIR ?= $(ROOTDIR)/.obj +BINDIR ?= $(ROOTDIR)/.bin +BINDBG ?= $(BINDIR)/Debug +BINRLS ?= $(BINDIR)/Release + +OBJDBG = $(OBJDIR)/Debug +OBJRLS = $(OBJDIR)/Release +OBJEXT = o + +#---[ Tools ]------------------------------------------------------------------ + +MKDIR=@MKDIR_P@ +CC=@CC@ +LD=@CC@ +DBUSBINDINGTOOL=@DBUSBINDINGTOOL@ + +#---[ Flags ]------------------------------------------------------------------ + +DLL_FLAGS=-shared +DEBUG_CFLAGS=-DDEBUG=1 -g -Wall + +LIB3270_CFLAGS ?= `pkg-config --cflags lib3270` +DBUS_CFLAGS=@DBUS_CFLAGS@ +GLIB_CFLAGS=@GLIB_CFLAGS@ +GTK_CFLAGS=@GTK_CFLAGS@ + +LIB3270_LIBS ?= `pkg-config --libs lib3270` +DBUS_LIBS=@DBUS_LIBS@ +GLIB_LIBS=@GLIB_LIBS@ +GTK_LIBS=@GTK_LIBS@ + +#---[ Rules ]------------------------------------------------------------------ + +$(OBJDBG)/%.o: %.c $(DEPENDS) + @echo " CC `basename $@`" + @$(MKDIR) `dirname $@` + @$(CC) $(CFLAGS) $(DBUS_CFLAGS) $(GLIB_CFLAGS) $(GTK_CFLAGS) $(DEBUG_CFLAGS) $(LIB3270_CFLAGS) -o $@ -c $< + +$(OBJRLS)/%.o: %.c $(DEPENDS) + @echo " CC `basename $@`" + @$(MKDIR) `dirname $@` + @$(CC) $(CFLAGS) $(DBUS_CFLAGS) $(GLIB_CFLAGS) $(GTK_CFLAGS) $(LIB3270_CFLAGS) -o $@ -c $< + + +#---[ Release targets ]-------------------------------------------------------- + +Release: $(BINRLS)/plugins/$(MODULE_NAME).so + +$(BINRLS)/plugins/$(MODULE_NAME).so: $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJRLS)/$(SRC).o) + @echo " CCLD `basename $@`" + @$(MKDIR) `dirname $@` + @$(LD) $(DLL_FLAGS) -Wl,-soname,`basename $@` $(LDFLAGS) -o $@ $^ $(LIBS) + +#---[ Debug targets ]---------------------------------------------------------- + +Debug: $(BINDBG)/plugins/$(MODULE_NAME).so $(BINDBG)/libhllapi.so + +$(BINDBG)/plugins/$(MODULE_NAME).so: $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJDBG)/$(SRC).o) + @echo " CCLD `basename $@`" + @$(MKDIR) `dirname $@` + @$(LD) $(DLL_FLAGS) -Wl,-soname,`basename $@` $(LDFLAGS) -o $@ $^ $(LIBS) $(LIB3270_LIBS) $(GLIB_LIBS) $(GTK_LIBS) + +#---[ Misc targets ]----------------------------------------------------------- + +debug-service: $(BINDBG)/@PACKAGE_NAME@d + +dbus-glue.h: pw3270dbus.xml + @$(DBUSBINDINGTOOL) --mode=glib-server --output=$@ --prefix=pw3270_dbus $^ + +$(BINDBG)/@PACKAGE_NAME@d: $(foreach SRC, $(basename $(DAEMON_SRC)), $(OBJDBG)/$(SRC).o) + @echo " CCLD `basename $@`" + @$(MKDIR) `dirname $@` + @$(CC) $(CFLAGS) -o $@ $^ $(DBUS_LIBS) $(GLIB_LIBS) $(LIB3270_LIBS) + +cleandebug-service: clean + +clean: + @rm -fr $(OBJDIR) + @rm -fr $(BINDIR) + @rm -f dbus-glue.h + @find . -name "*~" -exec rm -f {} \; diff --git a/src/plugins/3270dbus/daemon.c b/src/plugins/3270dbus/daemon.c new file mode 100644 index 0000000..0e4b9f0 --- /dev/null +++ b/src/plugins/3270dbus/daemon.c @@ -0,0 +1,121 @@ +/* + * "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" + +/*---[ Globals ]---------------------------------------------------------------------------------*/ + + static DBusGConnection * connection = NULL; + static DBusGProxy * proxy = NULL; + static H3270 * hSession = NULL; + + GMainLoop * main_loop = NULL; + + +/*---[ Implement ]-------------------------------------------------------------------------------*/ + +static gpointer dbus_register_object (DBusGConnection *connection,DBusGProxy *proxy,GType object_type,const DBusGObjectInfo *info,const gchar *path) +{ + GObject *object = g_object_new (object_type, NULL); + dbus_g_object_type_install_info (object_type, info); + dbus_g_connection_register_g_object (connection, path, object); + return object; +} + +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); + + dbus_register_object(connection,proxy,PW3270_TYPE_DBUS,&dbus_glib_pw3270_dbus_object_info,PW3270_DBUS_SERVICE_PATH); + + return 0; +} + +int main(int numpar, char *param[]) +{ + g_type_init (); + + if (!g_thread_supported ()) + g_thread_init (NULL); + + dbus_g_thread_init (); + + 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/plugins/3270dbus/daemon.h b/src/plugins/3270dbus/daemon.h new file mode 100644 index 0000000..152a618 --- /dev/null +++ b/src/plugins/3270dbus/daemon.h @@ -0,0 +1,46 @@ +/* + * "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 "service.h" + +/*---[ Globals ]---------------------------------------------------------------------------------*/ + + G_GNUC_INTERNAL GMainLoop * main_loop; + + +/*---[ Prototipes ]------------------------------------------------------------------------------*/ + + G_GNUC_INTERNAL void pw3270_dbus_register_io_handlers(void); + diff --git a/src/plugins/3270dbus/gobject.c b/src/plugins/3270dbus/gobject.c new file mode 100644 index 0000000..378186e --- /dev/null +++ b/src/plugins/3270dbus/gobject.c @@ -0,0 +1,92 @@ +/* + * "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 gobject.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 + +#include "service.h" + +/*---[ Globals ]---------------------------------------------------------------------------------*/ + + +/*---[ Implement ]-------------------------------------------------------------------------------*/ + +G_DEFINE_TYPE(PW3270Dbus, pw3270_dbus, G_TYPE_OBJECT) + +static void pw3270_dbus_finalize(GObject *object) +{ + G_OBJECT_CLASS(pw3270_dbus_parent_class)->finalize (object); +} + + +static void pw3270_dbus_class_init(PW3270DbusClass *klass) +{ + GObjectClass *object_class; + object_class = G_OBJECT_CLASS (klass); + object_class->finalize = pw3270_dbus_finalize; +} + +static void pw3270_dbus_init(PW3270Dbus *object) +{ + +} + +PW3270Dbus * pw3270_dbus_new(void) +{ + return g_object_new(PW3270_TYPE_DBUS, NULL); +} + +void pw3270_dbus_get_revision(PW3270Dbus *object, DBusGMethodInvocation *context) +{ + dbus_g_method_return(context,PACKAGE_REVISION); +} + +void pw3270_dbus_connect(PW3270Dbus *object, const gchar *uri, DBusGMethodInvocation *context) +{ + g_message("Connecting to \"%s\" by remote request",uri); + dbus_g_method_return(context,lib3270_connect(pw3270_dbus_get_session_handle(PW3270_DBUS(object)),uri,0)); +} + +void pw3270_dbus_disconnect(PW3270Dbus *object, DBusGMethodInvocation *context) +{ + g_message("Disconnecting by remote request"); + lib3270_disconnect(pw3270_dbus_get_session_handle(PW3270_DBUS(object))); + dbus_g_method_return(context,0); +} + diff --git a/src/plugins/3270dbus/iocallback.c b/src/plugins/3270dbus/iocallback.c new file mode 100644 index 0000000..cd6b4a8 --- /dev/null +++ b/src/plugins/3270dbus/iocallback.c @@ -0,0 +1,349 @@ +/* + * "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); + +#ifdef WIN32 +static void * static_AddInput(HANDLE source, H3270 *session, void (*fn)(H3270 *session)); +static void * static_AddExcept(HANDLE source, H3270 *session, void (*fn)(H3270 *session)); +#else +static void * static_AddInput(int source, H3270 *session, void (*fn)(H3270 *session)); +static void * static_AddExcept(int source, H3270 *session, void (*fn)(H3270 *session)); +#endif // WIN32 + +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; + 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 int static_CallAndWait(int(*callback)(H3270 *session, void *), H3270 *session, void *parm) +{ + struct bgParameter p = { TRUE, session, -1, callback, parm }; + GThread *thread; + +// trace("Starting auxiliary thread for callback %p",callback); + + p.running = TRUE; + thread = g_thread_create( (GThreadFunc) BgCall, &p, 0, NULL); + + if(!thread) + { + g_error("Can't start background thread"); + return -1; + } + + while(p.running) + 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 + + }; + + if(lib3270_register_handlers(&hdl)) + { + g_error("%s","Can't set lib3270 I/O handlers"); + } + +} diff --git a/src/plugins/3270dbus/main.c b/src/plugins/3270dbus/main.c new file mode 100644 index 0000000..4d0d512 --- /dev/null +++ b/src/plugins/3270dbus/main.c @@ -0,0 +1,102 @@ +/* + * "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 main.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) + * + */ + +#include +#include +#include +#include + +#include +#include + +#include "service.h" +#include "dbus-glue.h" + +#include + +/*---[ Globals ]---------------------------------------------------------------------------------*/ + + static DBusGConnection * connection = NULL; + static DBusGProxy * proxy = NULL; + +/*---[ Implement ]-------------------------------------------------------------------------------*/ + + static gpointer dbus_register_object (DBusGConnection *connection,DBusGProxy *proxy,GType object_type,const DBusGObjectInfo *info,const gchar *path) + { + GObject *object = g_object_new (object_type, NULL); + dbus_g_object_type_install_info (object_type, info); + dbus_g_connection_register_g_object (connection, path, object); + return object; + } + + LIB3270_EXPORT int pw3270_plugin_init(GtkWidget *window) + { + + GError * error = NULL; + guint result; + + connection = dbus_g_bus_get_private(DBUS_BUS_SESSION, g_main_context_default(), &error); + if(error) + { + GtkWidget *dialog = gtk_message_dialog_new( + GTK_WINDOW(window), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + _( "Can't connect to DBUS server" )); + + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message); + + g_message("Error \"%s\" getting session dbus",error->message); + + g_error_free(error); + + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + + 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); + + dbus_register_object(connection,proxy,PW3270_TYPE_DBUS,&dbus_glib_pw3270_dbus_object_info,PW3270_DBUS_SERVICE_PATH); + + return 0; + } + + LIB3270_EXPORT int pw3270_plugin_deinit(GtkWidget *window) + { + + return 0; + } diff --git a/src/plugins/3270dbus/pw3270dbus.cbp b/src/plugins/3270dbus/pw3270dbus.cbp new file mode 100644 index 0000000..1f7b071 --- /dev/null +++ b/src/plugins/3270dbus/pw3270dbus.cbp @@ -0,0 +1,67 @@ + + + + + + diff --git a/src/plugins/3270dbus/pw3270dbus.xml b/src/plugins/3270dbus/pw3270dbus.xml new file mode 100644 index 0000000..068caaa --- /dev/null +++ b/src/plugins/3270dbus/pw3270dbus.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/plugins/3270dbus/service.h b/src/plugins/3270dbus/service.h new file mode 100644 index 0000000..ed264c8 --- /dev/null +++ b/src/plugins/3270dbus/service.h @@ -0,0 +1,53 @@ +#ifndef _PW3270_DBUS_SERVICE_H + + #define _PW3270_DBUS_SERVICE_H 1 + + #define ENABLE_NLS + #define GETTEXT_PACKAGE PACKAGE_NAME + + #include + #include + + #include + #include + #include + #include + #include + + #define PW3270_DBUS_SERVICE_PATH "/br/com/bb/pw3270" + #define PW3270_DBUS_SERVICE "br.com.bb.pw3270" + + #define PW3270_TYPE_DBUS (pw3270_dbus_get_type ()) + #define PW3270_DBUS(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PW3270_TYPE_DBUS, PW3270Dbus)) + #define PW3270_DBUS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PW3270_TYPE_DBUS, PW3270DbusClass)) + #define IS_PW3270_DBUS(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PW3270_TYPE_DBUS)) + #define IS_PW3270_DBUS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PW3270_TYPE_DBUS)) + #define PW3270_DBUS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PW3270_TYPE_DBUS, PW3270DbusClass)) + + G_BEGIN_DECLS + + typedef struct _PW3270Dbus PW3270Dbus; + typedef struct _PW3270DbusClass PW3270DbusClass; + + struct _PW3270Dbus + { + GObject parent; + }; + + struct _PW3270DbusClass + { + GObjectClass parent; + }; + + PW3270Dbus * pw3270_dbus_new (void); + GType pw3270_dbus_get_type (void); + + void pw3270_dbus_get_revision(PW3270Dbus *object, DBusGMethodInvocation *context); + void pw3270_dbus_quit(PW3270Dbus *object, DBusGMethodInvocation *context); + void pw3270_dbus_connect(PW3270Dbus *object, const gchar *uri, DBusGMethodInvocation *context); + void pw3270_dbus_disconnect(PW3270Dbus *object, DBusGMethodInvocation *context); + H3270 * pw3270_dbus_get_session_handle(PW3270Dbus *object); + + G_END_DECLS + +#endif // _PW3270_DBUS_SERVICE_H diff --git a/src/plugins/3270dbus/test.sh b/src/plugins/3270dbus/test.sh new file mode 100755 index 0000000..26acfe8 --- /dev/null +++ b/src/plugins/3270dbus/test.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +case $1 in + + revision) + dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.getRevision + ;; + + connect) + dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.connect string:$2 + ;; + + disconnect) + dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.disconnect + ;; + + quit) + dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.quit + ;; + + *) + dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.getRevision + ;; + +esac + diff --git a/src/plugins/dbus/Makefile.in b/src/plugins/dbus/Makefile.in deleted file mode 100644 index 1cfa98a..0000000 --- a/src/plugins/dbus/Makefile.in +++ /dev/null @@ -1,117 +0,0 @@ -# -# "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 -# (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a -# aplicativos mainframe. Registro no INPI sob o nome G3270. -# -# Copyright (C) <2008> -# -# Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob -# os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela -# Free Software Foundation. -# -# Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER -# GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO -# A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para -# obter mais detalhes. -# -# Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este -# programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple -# Place, Suite 330, Boston, MA, 02111-1307, USA -# -# Contatos: -# -# perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) -# erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça) -# licinio@bb.com.br (Licínio Luis Branco) -# kraucer@bb.com.br (Kraucer Fernandes Mazuco) -# - -#---[ Sources ]---------------------------------------------------------------- - -MODULE_NAME=pw3270dbus -DEPENDS=Makefile dbus-glue.h -PLUGIN_SRC=main.c gobject.c -DAEMON_SRC=daemon.c gobject.c iocallback.c - -#---[ Paths ]------------------------------------------------------------------ - -ROOTDIR ?= . -OBJDIR ?= $(ROOTDIR)/.obj -BINDIR ?= $(ROOTDIR)/.bin -BINDBG ?= $(BINDIR)/Debug -BINRLS ?= $(BINDIR)/Release - -OBJDBG = $(OBJDIR)/Debug -OBJRLS = $(OBJDIR)/Release -OBJEXT = o - -#---[ Tools ]------------------------------------------------------------------ - -MKDIR=@MKDIR_P@ -CC=@CC@ -LD=@CC@ -DBUSBINDINGTOOL=@DBUSBINDINGTOOL@ - -#---[ Flags ]------------------------------------------------------------------ - -DLL_FLAGS=-shared -DEBUG_CFLAGS=-DDEBUG=1 -g -Wall - -LIB3270_CFLAGS ?= `pkg-config --cflags lib3270` -DBUS_CFLAGS=@DBUS_CFLAGS@ -GLIB_CFLAGS=@GLIB_CFLAGS@ - -LIB3270_LIBS ?= `pkg-config --libs lib3270` -DBUS_LIBS=@DBUS_LIBS@ -GLIB_LIBS=@GLIB_LIBS@ - -#---[ Rules ]------------------------------------------------------------------ - -$(OBJDBG)/%.o: %.c $(DEPENDS) - @echo " CC `basename $@`" - @$(MKDIR) `dirname $@` - @$(CC) $(CFLAGS) $(DBUS_CFLAGS) $(GLIB_CFLAGS) $(DEBUG_CFLAGS) $(LIB3270_CFLAGS) -o $@ -c $< - -$(OBJRLS)/%.o: %.c $(DEPENDS) - @echo " CC `basename $@`" - @$(MKDIR) `dirname $@` - @$(CC) $(CFLAGS) $(DBUS_CFLAGS) $(GLIB_CFLAGS) $(LIB3270_CFLAGS) -o $@ -c $< - - -#---[ Release targets ]-------------------------------------------------------- - -Release: $(BINRLS)/plugins/$(MODULE_NAME).so - -$(BINRLS)/plugins/$(MODULE_NAME).so: $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJRLS)/$(SRC).o) - @echo " CCLD `basename $@`" - @$(MKDIR) `dirname $@` - @$(LD) $(DLL_FLAGS) -Wl,-soname,`basename $@` $(LDFLAGS) -o $@ $^ $(LIBS) - -#---[ Debug targets ]---------------------------------------------------------- - -Debug: $(BINDBG)/plugins/$(MODULE_NAME).so $(BINDBG)/libhllapi.so - -$(BINDBG)/plugins/$(MODULE_NAME).so: $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJDBG)/$(SRC).o) - @echo " CCLD `basename $@`" - @$(MKDIR) `dirname $@` - @$(LD) $(DLL_FLAGS) -Wl,-soname,`basename $@` $(LDFLAGS) -o $@ $^ $(LIBS) $(LIB3270_LIBS) $(GLIB_LIBS) - -#---[ Misc targets ]----------------------------------------------------------- - -debug-service: $(BINDBG)/@PACKAGE_NAME@d - -dbus-glue.h: pw3270dbus.xml - @$(DBUSBINDINGTOOL) --mode=glib-server --output=$@ --prefix=pw3270_dbus $^ - -$(BINDBG)/@PACKAGE_NAME@d: $(foreach SRC, $(basename $(DAEMON_SRC)), $(OBJDBG)/$(SRC).o) - @echo " CCLD `basename $@`" - @$(MKDIR) `dirname $@` - @$(CC) $(CFLAGS) -o $@ $^ $(DBUS_LIBS) $(GLIB_LIBS) $(LIB3270_LIBS) - -cleandebug-service: clean - -clean: - @rm -fr $(OBJDIR) - @rm -fr $(BINDIR) - @rm -f dbus-glue.h - @find . -name "*~" -exec rm -f {} \; diff --git a/src/plugins/dbus/daemon.c b/src/plugins/dbus/daemon.c deleted file mode 100644 index 0e4b9f0..0000000 --- a/src/plugins/dbus/daemon.c +++ /dev/null @@ -1,121 +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" - -/*---[ Globals ]---------------------------------------------------------------------------------*/ - - static DBusGConnection * connection = NULL; - static DBusGProxy * proxy = NULL; - static H3270 * hSession = NULL; - - GMainLoop * main_loop = NULL; - - -/*---[ Implement ]-------------------------------------------------------------------------------*/ - -static gpointer dbus_register_object (DBusGConnection *connection,DBusGProxy *proxy,GType object_type,const DBusGObjectInfo *info,const gchar *path) -{ - GObject *object = g_object_new (object_type, NULL); - dbus_g_object_type_install_info (object_type, info); - dbus_g_connection_register_g_object (connection, path, object); - return object; -} - -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); - - dbus_register_object(connection,proxy,PW3270_TYPE_DBUS,&dbus_glib_pw3270_dbus_object_info,PW3270_DBUS_SERVICE_PATH); - - return 0; -} - -int main(int numpar, char *param[]) -{ - g_type_init (); - - if (!g_thread_supported ()) - g_thread_init (NULL); - - dbus_g_thread_init (); - - 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/plugins/dbus/daemon.h b/src/plugins/dbus/daemon.h deleted file mode 100644 index 152a618..0000000 --- a/src/plugins/dbus/daemon.h +++ /dev/null @@ -1,46 +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 "service.h" - -/*---[ Globals ]---------------------------------------------------------------------------------*/ - - G_GNUC_INTERNAL GMainLoop * main_loop; - - -/*---[ Prototipes ]------------------------------------------------------------------------------*/ - - G_GNUC_INTERNAL void pw3270_dbus_register_io_handlers(void); - diff --git a/src/plugins/dbus/gobject.c b/src/plugins/dbus/gobject.c deleted file mode 100644 index 378186e..0000000 --- a/src/plugins/dbus/gobject.c +++ /dev/null @@ -1,92 +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 gobject.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 - -#include "service.h" - -/*---[ Globals ]---------------------------------------------------------------------------------*/ - - -/*---[ Implement ]-------------------------------------------------------------------------------*/ - -G_DEFINE_TYPE(PW3270Dbus, pw3270_dbus, G_TYPE_OBJECT) - -static void pw3270_dbus_finalize(GObject *object) -{ - G_OBJECT_CLASS(pw3270_dbus_parent_class)->finalize (object); -} - - -static void pw3270_dbus_class_init(PW3270DbusClass *klass) -{ - GObjectClass *object_class; - object_class = G_OBJECT_CLASS (klass); - object_class->finalize = pw3270_dbus_finalize; -} - -static void pw3270_dbus_init(PW3270Dbus *object) -{ - -} - -PW3270Dbus * pw3270_dbus_new(void) -{ - return g_object_new(PW3270_TYPE_DBUS, NULL); -} - -void pw3270_dbus_get_revision(PW3270Dbus *object, DBusGMethodInvocation *context) -{ - dbus_g_method_return(context,PACKAGE_REVISION); -} - -void pw3270_dbus_connect(PW3270Dbus *object, const gchar *uri, DBusGMethodInvocation *context) -{ - g_message("Connecting to \"%s\" by remote request",uri); - dbus_g_method_return(context,lib3270_connect(pw3270_dbus_get_session_handle(PW3270_DBUS(object)),uri,0)); -} - -void pw3270_dbus_disconnect(PW3270Dbus *object, DBusGMethodInvocation *context) -{ - g_message("Disconnecting by remote request"); - lib3270_disconnect(pw3270_dbus_get_session_handle(PW3270_DBUS(object))); - dbus_g_method_return(context,0); -} - diff --git a/src/plugins/dbus/iocallback.c b/src/plugins/dbus/iocallback.c deleted file mode 100644 index cd6b4a8..0000000 --- a/src/plugins/dbus/iocallback.c +++ /dev/null @@ -1,349 +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); - -#ifdef WIN32 -static void * static_AddInput(HANDLE source, H3270 *session, void (*fn)(H3270 *session)); -static void * static_AddExcept(HANDLE source, H3270 *session, void (*fn)(H3270 *session)); -#else -static void * static_AddInput(int source, H3270 *session, void (*fn)(H3270 *session)); -static void * static_AddExcept(int source, H3270 *session, void (*fn)(H3270 *session)); -#endif // WIN32 - -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; - 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 int static_CallAndWait(int(*callback)(H3270 *session, void *), H3270 *session, void *parm) -{ - struct bgParameter p = { TRUE, session, -1, callback, parm }; - GThread *thread; - -// trace("Starting auxiliary thread for callback %p",callback); - - p.running = TRUE; - thread = g_thread_create( (GThreadFunc) BgCall, &p, 0, NULL); - - if(!thread) - { - g_error("Can't start background thread"); - return -1; - } - - while(p.running) - 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 - - }; - - if(lib3270_register_handlers(&hdl)) - { - g_error("%s","Can't set lib3270 I/O handlers"); - } - -} diff --git a/src/plugins/dbus/main.c b/src/plugins/dbus/main.c deleted file mode 100644 index 1cd8c93..0000000 --- a/src/plugins/dbus/main.c +++ /dev/null @@ -1,86 +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 main.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) - * - */ - -#include -#include -#include -#include - -#include -#include - -#include "service.h" -#include "dbus-glue.h" - -/*---[ Globals ]---------------------------------------------------------------------------------*/ - - static DBusGConnection * connection = NULL; - static DBusGProxy * proxy = NULL; - -/*---[ Implement ]-------------------------------------------------------------------------------*/ - - static gpointer dbus_register_object (DBusGConnection *connection,DBusGProxy *proxy,GType object_type,const DBusGObjectInfo *info,const gchar *path) - { - GObject *object = g_object_new (object_type, NULL); - dbus_g_object_type_install_info (object_type, info); - dbus_g_connection_register_g_object (connection, path, object); - return object; - } - - LIB3270_EXPORT int pw3270_plugin_init(GtkWidget *window) - { - - GError * error = NULL; - guint result; - - connection = dbus_g_bus_get_private(DBUS_BUS_SESSION, g_main_context_default(), &error); - if(error) - { - # Popup 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); - - dbus_register_object(connection,proxy,PW3270_TYPE_DBUS,&dbus_glib_pw3270_dbus_object_info,PW3270_DBUS_SERVICE_PATH); - - return 0; - } - - LIB3270_EXPORT int pw3270_plugin_deinit(GtkWidget *window) - { - - return 0; - } diff --git a/src/plugins/dbus/pw3270dbus.cbp b/src/plugins/dbus/pw3270dbus.cbp deleted file mode 100644 index eff236b..0000000 --- a/src/plugins/dbus/pw3270dbus.cbp +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - diff --git a/src/plugins/dbus/pw3270dbus.xml b/src/plugins/dbus/pw3270dbus.xml deleted file mode 100644 index 068caaa..0000000 --- a/src/plugins/dbus/pw3270dbus.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/plugins/dbus/service.h b/src/plugins/dbus/service.h deleted file mode 100644 index 334f443..0000000 --- a/src/plugins/dbus/service.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef _PW3270_DBUS_SERVICE_H - - #define _PW3270_DBUS_SERVICE_H 1 - - #include - #include - #include - #include - #include - - #define PW3270_DBUS_SERVICE_PATH "/br/com/bb/pw3270" - #define PW3270_DBUS_SERVICE "br.com.bb.pw3270" - - #define PW3270_TYPE_DBUS (pw3270_dbus_get_type ()) - #define PW3270_DBUS(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PW3270_TYPE_DBUS, PW3270Dbus)) - #define PW3270_DBUS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PW3270_TYPE_DBUS, PW3270DbusClass)) - #define IS_PW3270_DBUS(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PW3270_TYPE_DBUS)) - #define IS_PW3270_DBUS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PW3270_TYPE_DBUS)) - #define PW3270_DBUS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PW3270_TYPE_DBUS, PW3270DbusClass)) - - G_BEGIN_DECLS - - typedef struct _PW3270Dbus PW3270Dbus; - typedef struct _PW3270DbusClass PW3270DbusClass; - - struct _PW3270Dbus - { - GObject parent; - }; - - struct _PW3270DbusClass - { - GObjectClass parent; - }; - - PW3270Dbus * pw3270_dbus_new (void); - GType pw3270_dbus_get_type (void); - - void pw3270_dbus_get_revision(PW3270Dbus *object, DBusGMethodInvocation *context); - void pw3270_dbus_quit(PW3270Dbus *object, DBusGMethodInvocation *context); - void pw3270_dbus_connect(PW3270Dbus *object, const gchar *uri, DBusGMethodInvocation *context); - void pw3270_dbus_disconnect(PW3270Dbus *object, DBusGMethodInvocation *context); - H3270 * pw3270_dbus_get_session_handle(PW3270Dbus *object); - - G_END_DECLS - -#endif // _PW3270_DBUS_SERVICE_H diff --git a/src/plugins/dbus/test.sh b/src/plugins/dbus/test.sh deleted file mode 100755 index 26acfe8..0000000 --- a/src/plugins/dbus/test.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -case $1 in - - revision) - dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.getRevision - ;; - - connect) - dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.connect string:$2 - ;; - - disconnect) - dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.disconnect - ;; - - quit) - dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.quit - ;; - - *) - dbus-send --session --print-reply --dest=br.com.bb.pw3270 /br/com/bb/pw3270 br.com.bb.pw3270.getRevision - ;; - -esac - -- libgit2 0.21.2