diff --git a/Makefile.in b/Makefile.in
index 01432c3..1014d2e 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -126,6 +126,9 @@ src/tools/%@EXEEXT@: src/tools/%.c
$(BINDIR)/Debug/plugins/%@DLLEXT@: src/plugins/%/* $(BINDIR)/Debug/$(PACKAGE_TARNAME)$(EXEEXT)
@make BINDIR="../../../$(BINDIR)" PW3270_LIBS="-L../../../$(BINDIR)/Debug@DLLDIR@ -l3270 -lpw3270" PW3270_CFLAGS="-I../../../src/include" -C $(dir $<) Debug
+$(BINDIR)/Release/plugins/%@DLLEXT@: src/plugins/%/* $(BINDIR)/Release/$(PACKAGE_TARNAME)$(EXEEXT)
+ @make BINDIR="../../../$(BINDIR)" PW3270_LIBS="-L../../../$(BINDIR)/Release@DLLDIR@ -l3270 -lpw3270" PW3270_CFLAGS="-I../../../src/include" -C $(dir $<) Release
+
#---[ Release targets ]--------------------------------------------------------
all: $(BINDIR)/Release/$(PACKAGE_TARNAME)$(EXEEXT) locale filelist
@@ -292,6 +295,7 @@ clean:
@make -C src/lib3270 clean
@make -C src/pw3270 clean
@make -C src/tools clean
+ @make -C src/plugins/remotectl clean
@rm -f $(PACKAGE_NAME).png
@rm -f $(PACKAGE_NAME)-logo.png
@rm -f *.log
diff --git a/configure.ac b/configure.ac
index 2c44273..94df14c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -358,6 +358,7 @@ AC_CONFIG_FILES([
src/pw3270/Makefile
src/pw3270/uiparser/Makefile
src/tools/Makefile
+ src/plugins/remotectl/Makefile
man/Makefile
makegtkruntime.sh
])
diff --git a/pw3270.cbp b/pw3270.cbp
index ebce596..d4c5081 100644
--- a/pw3270.cbp
+++ b/pw3270.cbp
@@ -68,6 +68,7 @@
+
@@ -213,6 +214,17 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/include/pw3270/hllapi.h b/src/include/pw3270/hllapi.h
new file mode 100644
index 0000000..bdff388
--- /dev/null
+++ b/src/include/pw3270/hllapi.h
@@ -0,0 +1,61 @@
+/*
+ * "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 hllapi.h 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)
+ *
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ #define HLLAPI_REQUEST_ID 0x01
+ #define HLLAPI_MAXLENGTH 32768
+
+ #define HLLAPI_CMD_CONNECTPS 1 /**< connect presentation space */
+ #define HLLAPI_CMD_SENDSTRING 3 /**< send string */
+ #define HLLAPI_CMD_COPYPSTOSTR 8 /**< copy presentation space to string */
+ #define HLLAPI_CMD_SETCURSOR 40 /**< set cursor */
+ #define HLLAPI_CMD_GETREVISION 2000 /**< Get lib3270 revision */
+
+ #pragma pack(1)
+ typedef struct _hllapi_data
+ {
+ unsigned char id; /**< Request id */
+ unsigned long func; /**< Function number */
+ unsigned short rc; /**< Short argument/return code */
+ unsigned short len; /**< Text length */
+ char string[1]; /**< String argument */
+ } HLLAPI_DATA;
+ #pragma pack()
+
+ LIB3270_EXPORT int hllapi(unsigned long function, const char *string, unsigned short length, unsigned short *rc);
+
+#ifdef __cplusplus
+} /* end of extern "C" */
+#endif
+
diff --git a/src/include/pw3270/plugin.h b/src/include/pw3270/plugin.h
index e825d49..66fac8f 100644
--- a/src/include/pw3270/plugin.h
+++ b/src/include/pw3270/plugin.h
@@ -34,10 +34,13 @@
#define PW3270_PLUGIN_INCLUDED 1
#include
- #include
+ #include
LIB3270_EXPORT int pw3270_plugin_init(GtkWidget *window);
LIB3270_EXPORT int pw3270_plugin_deinit(GtkWidget *window);
+ LIB3270_EXPORT void pw3270_plugin_start(GtkWidget *window);
+ LIB3270_EXPORT void pw3270_plugin_stop(GtkWidget *window);
+
#endif // PW3270_PLUGIN_INCLUDED
diff --git a/src/plugins/remotectl/Makefile.in b/src/plugins/remotectl/Makefile.in
new file mode 100644
index 0000000..761da97
--- /dev/null
+++ b/src/plugins/remotectl/Makefile.in
@@ -0,0 +1,110 @@
+#
+# "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=remotectl
+DEPENDS=*.h ../../include/*.h ../../include/lib3270/*.h Makefile
+PLUGIN_SRC=remotectl.c pipesource.c
+HLLAPI_SRC=hllapi.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@
+MSGCAT=@MSGCAT@
+XGETTEXT=@XGETTEXT@
+
+#---[ Rules ]------------------------------------------------------------------
+
+DLL_FLAGS=@DLL_FLAGS@
+DEBUG_CFLAGS=-DDEBUG=1 -g -Wall
+
+PW3270_LIBS ?= `pkg-config --libs pw3270 lib3270`
+PW3270_CFLAGS ?= `pkg-config --cflags pw3270 lib3270`
+GTK_CFLAGS ?= @GTK_CFLAGS@ @GTKMAC_CFLAGS@
+GTK_LIBS ?= @GTK_LIBS@ @GTKMAC_LIBS@
+
+$(OBJDBG)/%.o: %.c $(DEPENDS)
+ @echo " CC `basename $@`"
+ @$(MKDIR) `dirname $@`
+ @$(CC) $(CFLAGS) $(DEBUG_CFLAGS) $(PW3270_CFLAGS) $(GTK_CFLAGS) -o $@ -c $<
+
+$(OBJRLS)/%.o: %.c $(DEPENDS)
+ @echo " CC `basename $@`"
+ @$(MKDIR) `dirname $@`
+ @$(CC) $(CFLAGS) $(PW3270_CFLAGS) $(GTK_CFLAGS) -o $@ -c $<
+
+
+#---[ Release targets ]--------------------------------------------------------
+
+Release: $(BINRLS)/plugins/$(MODULE_NAME).dll $(BINRLS)/libhllapi.dll
+
+$(BINRLS)/plugins/$(MODULE_NAME).dll: $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJRLS)/$(SRC).o)
+ @echo " CCLD `basename $@`"
+ @$(MKDIR) `dirname $@`
+ @$(LD) $(DLL_FLAGS) -Wl,-soname,`basename $@` $(LDFLAGS) -o $@ $^ $(LIBS) $(PW3270_LIBS) $(GTK_LIBS)
+
+$(BINRLS)/libhllapi.dll: $(foreach SRC, $(basename $(HLLAPI_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).dll $(BINDBG)/libhllapi.dll
+
+$(BINDBG)/plugins/$(MODULE_NAME).dll: $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJDBG)/$(SRC).o)
+ @echo " CCLD `basename $@`"
+ @$(MKDIR) `dirname $@`
+ @$(LD) $(DLL_FLAGS) -Wl,-soname,`basename $@` $(LDFLAGS) -o $@ $^ $(LIBS) $(PW3270_LIBS) $(GTK_LIBS)
+
+$(BINDBG)/libhllapi.dll: $(foreach SRC, $(basename $(HLLAPI_SRC)), $(OBJDBG)/$(SRC).o)
+ @echo " CCLD `basename $@`"
+ @$(MKDIR) `dirname $@`
+ @$(LD) $(DLL_FLAGS) -Wl,-soname,`basename $@` $(LDFLAGS) -o $@ $^ $(LIBS)
+
+#---[ Misc targets ]-----------------------------------------------------------
+
+clean:
+ @rm -fr $(OBJDIR)
+ @rm -fr $(BINDIR)
+ @find . -name "*~" -exec rm -f {} \;
diff --git a/src/plugins/remotectl/hllapi.c b/src/plugins/remotectl/hllapi.c
new file mode 100644
index 0000000..7cf78b9
--- /dev/null
+++ b/src/plugins/remotectl/hllapi.c
@@ -0,0 +1,110 @@
+/*
+ * "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
+ *
+ * Este programa está nomeado como hllapi.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)
+ *
+ */
+
+ #include
+ #include
+ #include
+ #include
+ #include
+
+/*--[ Implement ]------------------------------------------------------------------------------------*/
+
+ LIB3270_EXPORT int hllapi(unsigned long func, const char *string, unsigned short length, unsigned short *rc)
+ {
+ int result = -1;
+
+#ifdef WIN32
+
+ static DWORD dwMode = PIPE_READMODE_MESSAGE;
+ static const LPTSTR lpszPipeName = TEXT( "\\\\.\\pipe\\pw3270" );
+ HANDLE hPipe = INVALID_HANDLE_VALUE;
+
+ if(length < 0 && string)
+ length = strlen(string);
+
+ if(!WaitNamedPipe(lpszPipeName,10000))
+ return ETIMEDOUT;
+
+ hPipe = CreateFile( lpszPipeName, // pipe name
+ GENERIC_WRITE|GENERIC_READ, // Read/Write access
+ 0, // no sharing
+ NULL, // default security attributes
+ OPEN_EXISTING, // opens existing pipe
+ 0, // Attributes
+ NULL); // no template file
+
+ if(hPipe == INVALID_HANDLE_VALUE)
+ return -1;
+
+ if(!SetNamedPipeHandleState(hPipe,&dwMode,NULL,NULL))
+ {
+ result = -1;
+ }
+ else
+ {
+ HLLAPI_DATA *buffer = malloc(HLLAPI_MAXLENGTH+1);
+ DWORD cbSize = 0;
+ HLLAPI_DATA *data = malloc(sizeof(HLLAPI_DATA) + length);
+
+ data->id = HLLAPI_REQUEST_ID;
+ data->func = func;
+ data->rc = *rc;
+ data->len = length;
+
+ if(string && length > 0)
+ memcpy(data->string,string,length);
+
+ if(!TransactNamedPipe(hPipe,(LPVOID) data,sizeof(HLLAPI_DATA) + length,buffer,HLLAPI_MAXLENGTH,&cbSize,NULL))
+ {
+ result = -1;
+ }
+ else
+ {
+ *rc = buffer->rc;
+
+ if(string && length > 0)
+ memcpy(string,buffer->string,length);
+
+ result = 0;
+ }
+
+ free(data);
+ free(buffer);
+ }
+
+ CloseHandle(hPipe);
+
+#else
+
+ #error NOT IMPLEMENTED
+
+#endif // WIN32
+
+ return result;
+ }
diff --git a/src/plugins/remotectl/pipesource.c b/src/plugins/remotectl/pipesource.c
new file mode 100644
index 0000000..b038bb7
--- /dev/null
+++ b/src/plugins/remotectl/pipesource.c
@@ -0,0 +1,282 @@
+/*
+ * "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
+ *
+ * Este programa está nomeado como pipesource.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)
+ * macmiranda@bb.com.br (Marco Aurélio Caldas Miranda)
+ *
+ */
+
+#ifdef WIN32
+
+ #include
+ #include
+ #include
+ #include "remotectl.h"
+
+/*---[ Defines ]----------------------------------------------------------------------------*/
+
+ #pragma pack(1)
+
+ typedef struct _pipe_source
+ {
+ GSource gsrc;
+ HANDLE hPipe;
+
+ enum _PIPE_STATE
+ {
+ PIPE_STATE_WAITING,
+ PIPE_STATE_READ,
+ PIPE_STATE_PENDING_READ,
+
+ PIPE_STATE_UNDEFINED,
+ } state;
+
+ OVERLAPPED overlap;
+ unsigned char buffer[PIPE_BUFFER_LENGTH+1];
+ } pipe_source;
+
+ #pragma pack()
+
+/*---[ GSource ]----------------------------------------------------------------------------*/
+
+static void wait_for_client(pipe_source *source)
+{
+ if(ConnectNamedPipe(source->hPipe,&source->overlap))
+ {
+ popup_lasterror("%s",_( "Error in ConnectNamedPipe" ));
+ return;
+ }
+
+ switch(GetLastError())
+ {
+ // The overlapped connection in progress.
+ case ERROR_IO_PENDING:
+ trace("%s: ERROR_IO_PENDING",__FUNCTION__);
+ source->state = PIPE_STATE_WAITING;
+ break;
+
+ // Client is already connected, so signal an event.
+ case ERROR_PIPE_CONNECTED:
+ trace("%s: ERROR_PIPE_CONNECTED",__FUNCTION__);
+ if(SetEvent(source->overlap.hEvent))
+ break;
+
+ // If an error occurs during the connect operation...
+ default:
+ popup_lasterror("%s", _( "ConnectNamedPipe failed" ));
+ }
+
+ }
+
+ 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.
+ *
+ */
+ if(WaitForSingleObject(((pipe_source *) source)->overlap.hEvent,0) == WAIT_OBJECT_0)
+ {
+ trace("%s: source=%p",__FUNCTION__,source);
+ return TRUE;
+ }
+
+ *timeout = 10;
+ return FALSE;
+ }
+
+ 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(WaitForSingleObject(((pipe_source *) source)->overlap.hEvent,0) == WAIT_OBJECT_0)
+ return TRUE;
+
+ return FALSE;
+ }
+
+ static void process_input(pipe_source *source, DWORD cbRead)
+ {
+ gint argc = 0;
+ gchar **argv;
+ GError * error = NULL;
+ gchar * cmd;
+
+ source->buffer[cbRead] = 0;
+
+ }
+
+ static void read_input_pipe(pipe_source *source)
+ {
+ DWORD cbRead = 0;
+
+ if(ReadFile(source->hPipe,source->buffer,PIPE_BUFFER_LENGTH,&cbRead,&source->overlap) && cbRead > 0)
+ process_input(source,cbRead);
+
+ // The read operation is still pending.
+ switch(GetLastError())
+ {
+ case ERROR_IO_PENDING:
+ trace("%s: PIPE_STATE_PENDING_READ",__FUNCTION__);
+ source->state = PIPE_STATE_PENDING_READ;
+ break;
+
+ case ERROR_PIPE_LISTENING:
+ trace("%s: ERROR_PIPE_LISTENING",__FUNCTION__);
+ source->state = PIPE_STATE_READ;
+ break;
+
+ case ERROR_BROKEN_PIPE:
+ trace("%s: ERROR_BROKEN_PIPE",__FUNCTION__);
+ if(!DisconnectNamedPipe(source->hPipe))
+ popup_lasterror("%s",_( "Error in DisconnectNamedPipe" ));
+ else
+ wait_for_client(source);
+ break;
+
+ case ERROR_PIPE_NOT_CONNECTED:
+ trace("%s: ERROR_PIPE_NOT_CONNECTED",__FUNCTION__);
+ break;
+
+ default:
+ if(source->hPipe != INVALID_HANDLE_VALUE)
+ popup_lasterror("%s",_( "Error receiving message from pipe" ) );
+ }
+
+ }
+
+ static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer 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.
+ */
+ BOOL fSuccess;
+ DWORD cbRead = 0;
+ DWORD dwErr = 0;
+
+ fSuccess = GetOverlappedResult(((pipe_source *) source)->hPipe,&((pipe_source *) source)->overlap,&cbRead,FALSE );
+
+ trace("%s: source=%p data=%p Result=%s cbRead=%d",__FUNCTION__,source,data,fSuccess ? "Success" : "Unsuccess",(int) cbRead);
+
+ switch(((pipe_source *) source)->state)
+ {
+ case PIPE_STATE_WAITING:
+ if(fSuccess)
+ {
+ trace("Pipe connected (cbRet=%d)",(int) cbRead);
+ ((pipe_source *) source)->state = PIPE_STATE_READ;
+ }
+ else
+ {
+ popup_lasterror("%s", _( "Pipe connection failed" ));
+ }
+ break;
+
+ case PIPE_STATE_READ:
+ trace("Reading pipe (cbRead=%d)",(int) cbRead);
+ read_input_pipe( (pipe_source *) source);
+ break;
+
+ case PIPE_STATE_PENDING_READ:
+ if(fSuccess && cbRead > 0)
+ process_input((pipe_source *) source,cbRead);
+ ((pipe_source *) source)->state = PIPE_STATE_READ;
+ break;
+
+#ifdef DEBUG
+ default:
+ trace("%s: source=%p data=%p Unexpected mode %d",__FUNCTION__,source,data,((pipe_source *) source)->state);
+#endif
+ }
+
+ return TRUE;
+ }
+
+ static void IO_finalize(GSource *source)
+ {
+ trace("%s: source=%p",__FUNCTION__,source);
+
+ if( ((pipe_source *) source)->hPipe != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(((pipe_source *) source)->hPipe);
+ ((pipe_source *) source)->hPipe = INVALID_HANDLE_VALUE;
+ }
+
+ }
+
+ static gboolean IO_closure(gpointer data)
+ {
+ trace("%s: data=%p",__FUNCTION__,data);
+ return 0;
+ }
+
+
+ void init_source_pipe(HANDLE hPipe)
+ {
+ static GSourceFuncs pipe_source_funcs =
+ {
+ IO_prepare,
+ IO_check,
+ IO_dispatch,
+ IO_finalize,
+ IO_closure,
+ NULL
+ };
+
+ pipe_source *source = (pipe_source *) g_source_new(&pipe_source_funcs,sizeof(pipe_source));
+
+ source->hPipe = hPipe;
+ source->state = PIPE_STATE_WAITING;
+ source->overlap.hEvent = CreateEvent( NULL,TRUE,TRUE,NULL);
+
+ g_source_attach((GSource *) source,NULL);
+
+ wait_for_client(source);
+
+ return;
+ }
+
+#endif // WIN32
diff --git a/src/plugins/remotectl/remotectl.c b/src/plugins/remotectl/remotectl.c
new file mode 100644
index 0000000..af5bfa3
--- /dev/null
+++ b/src/plugins/remotectl/remotectl.c
@@ -0,0 +1,124 @@
+/*
+ * "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 remotectl.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)
+ *
+ * Agradecimento:
+ *
+ * Hélio Passos
+ *
+ */
+
+ #include "remotectl.h"
+ #include
+
+/*--[ Implement ]------------------------------------------------------------------------------------*/
+
+#ifdef WIN32
+
+ void popup_lasterror(const gchar *fmt, ...)
+ {
+ char buffer[4096];
+ va_list arg_ptr;
+ int sz;
+ DWORD errcode = GetLastError();
+ char *ptr;
+ LPVOID lpMsgBuf = 0;
+
+ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errcode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
+
+ for(ptr=lpMsgBuf;*ptr && *ptr != '\n';ptr++);
+ *ptr = 0;
+
+ va_start(arg_ptr, fmt);
+ vsnprintf(buffer,4095,fmt,arg_ptr);
+ va_end(arg_ptr);
+
+ sz = strlen(buffer);
+ snprintf(buffer+sz,4096-sz,": %s\n(rc=%d)",lpMsgBuf,(int) errcode);
+
+ printf("%s\n",buffer);
+
+#ifdef DEBUG
+ fprintf(stderr,"%s\n",buffer);
+ fflush(stderr);
+#endif
+
+ LocalFree(lpMsgBuf);
+ }
+
+#endif // WIN32
+
+ LIB3270_EXPORT int pw3270_plugin_init(GtkWidget *window)
+ {
+#ifdef WIN32
+ static const LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\" PACKAGE_NAME );
+ HANDLE hPipe;
+
+ trace("\n\n%s\n\n",__FUNCTION__);
+
+ hPipe = CreateNamedPipe( lpszPipename, // pipe name
+ PIPE_ACCESS_DUPLEX | // read/write access
+ FILE_FLAG_OVERLAPPED, // overlapped mode
+ PIPE_TYPE_MESSAGE | // pipe type
+ PIPE_READMODE_MESSAGE | // pipe mode
+ PIPE_WAIT, // blocking mode
+ 1, // number of instances
+ PIPE_BUFFER_LENGTH, // output buffer size
+ PIPE_BUFFER_LENGTH, // input buffer size
+ 0, // client time-out
+ NULL); // default security attributes
+
+
+ if (hPipe == INVALID_HANDLE_VALUE)
+ {
+ popup_lasterror( _( "Can´t create pipe %s" ),lpszPipename);
+ return -1;
+ }
+
+ init_source_pipe(hPipe);
+
+#else
+
+ #error Nao implementado
+
+#endif // WIN32
+
+ return 0;
+ }
+
+ LIB3270_EXPORT int pw3270_plugin_deinit(GtkWidget *window)
+ {
+#ifdef WIN32
+
+#else
+
+ #error Nao implementado
+
+#endif // WIN32
+ return 0;
+ }
+
+
diff --git a/src/plugins/remotectl/remotectl.h b/src/plugins/remotectl/remotectl.h
new file mode 100644
index 0000000..bdf3e63
--- /dev/null
+++ b/src/plugins/remotectl/remotectl.h
@@ -0,0 +1,58 @@
+/*
+ * "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 remotectl.h e possui - linhas de código.
+ *
+ * Contatos:
+ *
+ * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
+ * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
+ *
+ * Agradecimento:
+ *
+ * Hélio Passos
+ *
+ */
+
+ #define ENABLE_NLS
+ #define GETTEXT_PACKAGE PACKAGE_NAME
+
+ #include
+ #include
+ #include
+
+ #include
+ #include
+ #include
+
+#ifdef WIN32
+
+ #define PIPE_BUFFER_LENGTH 4096
+
+ void init_source_pipe(HANDLE hPipe);
+ void popup_lasterror(const gchar *fmt, ...);
+
+#endif // WIN32
+
+
+
+
+
+
--
libgit2 0.21.2