Commit 9d7dc6de7a9c42bffa7e4a04c13280ec4be11089

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

Working on win32 ipc module.

@@ -16,4 +16,4 @@ Makefile @@ -16,4 +16,4 @@ Makefile
16 conf/systemd.service 16 conf/systemd.service
17 src/core/windows/resources.rc 17 src/core/windows/resources.rc
18 src/plugin/windows/resources.rc 18 src/plugin/windows/resources.rc
19 - 19 +*.pid
@@ -180,7 +180,7 @@ dnl --------------------------------------------------------------------------- @@ -180,7 +180,7 @@ dnl ---------------------------------------------------------------------------
180 dnl Check for LIBV3270 180 dnl Check for LIBV3270
181 dnl --------------------------------------------------------------------------- 181 dnl ---------------------------------------------------------------------------
182 182
183 -PKG_CHECK_MODULES( [V3270], [v3270], AC_DEFINE(HAVE_V3270), AC_MSG_ERROR([V3270 not present.])) 183 +PKG_CHECK_MODULES( [V3270], [libv3270], AC_DEFINE(HAVE_V3270), AC_MSG_ERROR([V3270 not present.]))
184 184
185 AC_SUBST(V3270_LIBS) 185 AC_SUBST(V3270_LIBS)
186 AC_SUBST(V3270_CFLAGS) 186 AC_SUBST(V3270_CFLAGS)
@@ -189,7 +189,7 @@ dnl --------------------------------------------------------------------------- @@ -189,7 +189,7 @@ dnl ---------------------------------------------------------------------------
189 dnl Check for GTK 189 dnl Check for GTK
190 dnl --------------------------------------------------------------------------- 190 dnl ---------------------------------------------------------------------------
191 191
192 -PKG_CHECK_MODULES( [GTK], [gtk+-3.0 gmodule-2.0], AC_DEFINE(HAVE_GTK), AC_MSG_ERROR([GTK not present.])) 192 +PKG_CHECK_MODULES( [GTK], [gtk+-3.0], AC_DEFINE(HAVE_GTK), AC_MSG_ERROR([GTK not present.]))
193 193
194 AC_SUBST(GTK_LIBS) 194 AC_SUBST(GTK_LIBS)
195 AC_SUBST(GTK_CFLAGS) 195 AC_SUBST(GTK_CFLAGS)
@@ -198,7 +198,7 @@ dnl --------------------------------------------------------------------------- @@ -198,7 +198,7 @@ dnl ---------------------------------------------------------------------------
198 dnl Check for GLIB 198 dnl Check for GLIB
199 dnl --------------------------------------------------------------------------- 199 dnl ---------------------------------------------------------------------------
200 200
201 -PKG_CHECK_MODULES( [GLIB], [glib-2.0], AC_DEFINE(HAVE_GLIB), AC_MSG_ERROR([GLIB not present.] )) 201 +PKG_CHECK_MODULES( [GLIB], [glib-2.0 gobject-2.0 gmodule-2.0 gio-2.0], AC_DEFINE(HAVE_GLIB), AC_MSG_ERROR([GLIB not present.] ))
202 AC_SUBST(GLIB_LIBS) 202 AC_SUBST(GLIB_LIBS)
203 AC_SUBST(GLIB_CFLAGS) 203 AC_SUBST(GLIB_CFLAGS)
204 204
pw3270-plugin-ipc.cbp
@@ -106,7 +106,6 @@ @@ -106,7 +106,6 @@
106 <Unit filename="src/testprogram/testprogram.c"> 106 <Unit filename="src/testprogram/testprogram.c">
107 <Option compilerVar="CC" /> 107 <Option compilerVar="CC" />
108 </Unit> 108 </Unit>
109 - <Unit filename="src/windows/gobject.h" />  
110 <Extensions> 109 <Extensions>
111 <code_completion /> 110 <code_completion />
112 <envvars /> 111 <envvars />
src/core/windows/gobject.c
@@ -36,10 +36,9 @@ G_DEFINE_TYPE(ipc3270, ipc3270, G_TYPE_OBJECT) @@ -36,10 +36,9 @@ G_DEFINE_TYPE(ipc3270, ipc3270, G_TYPE_OBJECT)
36 36
37 static void ipc3270_finalize(GObject *object) { 37 static void ipc3270_finalize(GObject *object) {
38 38
39 - ipc3270 * ipc = IPC3270(object);  
40 -  
41 - 39 + // ipc3270 * ipc = IPC3270(object);
42 G_OBJECT_CLASS(ipc3270_parent_class)->finalize(object); 40 G_OBJECT_CLASS(ipc3270_parent_class)->finalize(object);
  41 +
43 } 42 }
44 43
45 44
@@ -102,6 +101,7 @@ void ipc3270_set_session(GObject *object, H3270 *hSession, const char *name, GEr @@ -102,6 +101,7 @@ void ipc3270_set_session(GObject *object, H3270 *hSession, const char *name, GEr
102 lib3270_set_session_id(ipc->hSession, id); 101 lib3270_set_session_id(ipc->hSession, id);
103 102
104 ipc->source->hPipe = hPipe; 103 ipc->source->hPipe = hPipe;
  104 + ipc->source->object = object;
105 ipc->source->state = PIPE_STATE_WAITING; 105 ipc->source->state = PIPE_STATE_WAITING;
106 ipc->source->overlap.hEvent = CreateEvent( NULL,TRUE,TRUE,NULL); 106 ipc->source->overlap.hEvent = CreateEvent( NULL,TRUE,TRUE,NULL);
107 107
src/core/windows/gobject.h
@@ -67,6 +67,7 @@ @@ -67,6 +67,7 @@
67 67
68 typedef struct _ipc3270_pipe_source { 68 typedef struct _ipc3270_pipe_source {
69 GSource gsrc; 69 GSource gsrc;
  70 + GObject * object;
70 HANDLE hPipe; 71 HANDLE hPipe;
71 72
72 IPC3270_PIPE_STATE state; 73 IPC3270_PIPE_STATE state;
src/core/windows/inout.c
@@ -41,6 +41,31 @@ @@ -41,6 +41,31 @@
41 41
42 /*---[ Implement ]----------------------------------------------------------------------------------*/ 42 /*---[ Implement ]----------------------------------------------------------------------------------*/
43 43
  44 +unsigned char * ipc3270_pack_error(const GError *error, size_t * szPacket) {
  45 +
  46 + static const char * error_response = "error";
  47 +
  48 + *szPacket = strlen(error_response) + 1 + (sizeof(guint16) * 2) + strlen(error->message);
  49 +
  50 + // Allocate buffer
  51 + unsigned char * outputBuffer = g_malloc0(*szPacket);
  52 + unsigned char * txtptr = outputBuffer;
  53 +
  54 + // Add name
  55 + strcpy((char *) txtptr,error_response);
  56 + txtptr += strlen((char *) txtptr) + 1;
  57 +
  58 + // Add RC
  59 + *((guint16 *) txtptr) = (guint16) error->code;
  60 + txtptr += sizeof(guint16);
  61 +
  62 + // Add message
  63 + strcpy((char *) txtptr,error->message);
  64 + txtptr += (strlen((char *) txtptr)+1);
  65 +
  66 + return outputBuffer;
  67 +}
  68 +
44 unsigned char * ipc3270_pack(const gchar * name, int id, GVariant *values, size_t * szPacket) { 69 unsigned char * ipc3270_pack(const gchar * name, int id, GVariant *values, size_t * szPacket) {
45 70
46 GVariantIter iter; 71 GVariantIter iter;
@@ -50,7 +75,7 @@ unsigned char * ipc3270_pack(const gchar * name, int id, GVariant *values, size_ @@ -50,7 +75,7 @@ unsigned char * ipc3270_pack(const gchar * name, int id, GVariant *values, size_
50 size_t ix = 0; 75 size_t ix = 0;
51 76
52 // Init packet size; 77 // Init packet size;
53 - *szPacket = strlen(name) + 1 + (sizeof(guint16) * 2) ; 78 + *szPacket = strlen(name) + 1 + (sizeof(guint16) * 2);
54 79
55 g_print("Packaging %u itens for \"%s\"\n", (unsigned int) count, name); 80 g_print("Packaging %u itens for \"%s\"\n", (unsigned int) count, name);
56 while ((child = g_variant_iter_next_value (&iter))) { 81 while ((child = g_variant_iter_next_value (&iter))) {
src/core/windows/pipesource.c
@@ -42,10 +42,10 @@ void ipc3270_wait_for_client(IPC3270_PIPE_SOURCE *source) { @@ -42,10 +42,10 @@ void ipc3270_wait_for_client(IPC3270_PIPE_SOURCE *source) {
42 source->state = PIPE_STATE_WAITING; 42 source->state = PIPE_STATE_WAITING;
43 break; 43 break;
44 44
45 -  
46 case ERROR_PIPE_CONNECTED: // Client is already connected, so signal an event. 45 case ERROR_PIPE_CONNECTED: // Client is already connected, so signal an event.
47 - if(SetEvent(source->overlap.hEvent))  
48 - break; 46 + source->state = PIPE_STATE_WAITING;
  47 + SetEvent(source->overlap.hEvent);
  48 + break;
49 49
50 default: 50 default:
51 g_message("Error %u in ConnectNamedPipe",(unsigned int) GetLastError()); 51 g_message("Error %u in ConnectNamedPipe",(unsigned int) GetLastError());
@@ -93,6 +93,57 @@ static gboolean IO_check(GSource *source) { @@ -93,6 +93,57 @@ static gboolean IO_check(GSource *source) {
93 93
94 static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { 94 static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) {
95 95
  96 + const gchar * request_name = (const gchar *) (source->buffer);
  97 + int request_type = 0;
  98 +
  99 + debug("Received packet \"%s\" with %u bytes", request_name, (unsigned int) cbRead);
  100 +
  101 + g_autoptr (GError) error = NULL;
  102 + g_autoptr (GVariant) parameters = ipc3270_unpack(source->buffer, &request_type);
  103 + g_autoptr (GVariant) response = NULL;
  104 +
  105 + if(!parameters) {
  106 + g_message("Rejecting invalid request \"%s\"", request_name);
  107 + }
  108 +
  109 + // Process query
  110 + switch(request_type) {
  111 + case 1: // getProperty
  112 + response = ipc3270_get_property(source->object, request_name, &error);
  113 + break;
  114 +
  115 + case 2: // setProperty
  116 + ipc3270_set_property(source->object, request_name, parameters, &error);
  117 + break;
  118 +
  119 + case 3: // method
  120 + response = ipc3270_method_call(source->object, request_name, parameters, &error);
  121 + break;
  122 +
  123 + default:
  124 + g_message("Rejecting request \"%s\": Invalid type %d",request_name, request_type);
  125 + g_set_error(&error,IPC3270(source->object)->error_domain,EINVAL,"Invalid or unexpected type %d",request_type);
  126 +
  127 + }
  128 +
  129 + // Pack response
  130 + size_t szPacket = 0;
  131 + g_autofree unsigned char * buffer = NULL;
  132 +
  133 + if(error) {
  134 +
  135 + buffer = ipc3270_pack_error(error, &szPacket);
  136 +
  137 + } else {
  138 +
  139 + buffer = ipc3270_pack(request_name, 0, response, &szPacket);
  140 +
  141 + }
  142 +
  143 + // Send response
  144 + DWORD wrote = (DWORD) szPacket;
  145 + WriteFile(source->hPipe,buffer,wrote,&wrote,NULL);
  146 +
96 } 147 }
97 148
98 static void read_input_pipe(IPC3270_PIPE_SOURCE *source) { 149 static void read_input_pipe(IPC3270_PIPE_SOURCE *source) {
@@ -167,7 +218,7 @@ static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer data @@ -167,7 +218,7 @@ static gboolean IO_dispatch(GSource *source, GSourceFunc callback, gpointer data
167 218
168 } else { 219 } else {
169 220
170 - // popup_lasterror("%s", _( "Pipe connection failed" )); 221 + g_message("Pipe connection failed with rc=%u",(unsigned int) GetLastError());
171 222
172 } 223 }
173 break; 224 break;
src/include/lib3270/ipc.h
@@ -71,6 +71,7 @@ @@ -71,6 +71,7 @@
71 71
72 // TODO: Move for windows private.h 72 // TODO: Move for windows private.h
73 unsigned char * ipc3270_pack(const gchar *name, int id, GVariant *values, size_t * szPacket); 73 unsigned char * ipc3270_pack(const gchar *name, int id, GVariant *values, size_t * szPacket);
  74 + unsigned char * ipc3270_pack_error(const GError *error, size_t * szPacket);
74 GVariant * ipc3270_unpack(const unsigned char *packet, int *id); 75 GVariant * ipc3270_unpack(const unsigned char *packet, int *id);
75 76
76 G_END_DECLS 77 G_END_DECLS
src/service/session.c
@@ -46,7 +46,7 @@ G_DEFINE_TYPE(session, session, GLIB_TYPE_IPC3270) @@ -46,7 +46,7 @@ G_DEFINE_TYPE(session, session, GLIB_TYPE_IPC3270)
46 46
47 static void session_finalize(GObject *object) { 47 static void session_finalize(GObject *object) {
48 48
49 - lib3270_session_free(ipc3270_get_session(IPC3270(object))); 49 + lib3270_session_free(ipc3270_get_session(object));
50 G_OBJECT_CLASS(session_parent_class)->finalize(object); 50 G_OBJECT_CLASS(session_parent_class)->finalize(object);
51 51
52 } 52 }
@@ -64,9 +64,7 @@ static void session_class_init(sessionClass *klass) { @@ -64,9 +64,7 @@ static void session_class_init(sessionClass *klass) {
64 static void session_init(session *object) { 64 static void session_init(session *object) {
65 65
66 debug("%s",__FUNCTION__); 66 debug("%s",__FUNCTION__);
67 -  
68 - ipc3270 *ipc = IPC3270(object);  
69 - ipc3270_set_session(ipc,lib3270_session_new(""),PACKAGE_NAME,NULL); 67 + ipc3270_set_session(&object->parent,lib3270_session_new(""),PACKAGE_NAME,NULL);
70 68
71 } 69 }
72 70