Commit 9d7dc6de7a9c42bffa7e4a04c13280ec4be11089

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

Working on win32 ipc module.

.gitignore
... ... @@ -16,4 +16,4 @@ Makefile
16 16 conf/systemd.service
17 17 src/core/windows/resources.rc
18 18 src/plugin/windows/resources.rc
19   -
  19 +*.pid
... ...
configure.ac
... ... @@ -180,7 +180,7 @@ dnl ---------------------------------------------------------------------------
180 180 dnl Check for LIBV3270
181 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 185 AC_SUBST(V3270_LIBS)
186 186 AC_SUBST(V3270_CFLAGS)
... ... @@ -189,7 +189,7 @@ dnl ---------------------------------------------------------------------------
189 189 dnl Check for GTK
190 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 194 AC_SUBST(GTK_LIBS)
195 195 AC_SUBST(GTK_CFLAGS)
... ... @@ -198,7 +198,7 @@ dnl ---------------------------------------------------------------------------
198 198 dnl Check for GLIB
199 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 202 AC_SUBST(GLIB_LIBS)
203 203 AC_SUBST(GLIB_CFLAGS)
204 204  
... ...
pw3270-plugin-ipc.cbp
... ... @@ -106,7 +106,6 @@
106 106 <Unit filename="src/testprogram/testprogram.c">
107 107 <Option compilerVar="CC" />
108 108 </Unit>
109   - <Unit filename="src/windows/gobject.h" />
110 109 <Extensions>
111 110 <code_completion />
112 111 <envvars />
... ...
src/core/windows/gobject.c
... ... @@ -36,10 +36,9 @@ G_DEFINE_TYPE(ipc3270, ipc3270, G_TYPE_OBJECT)
36 36  
37 37 static void ipc3270_finalize(GObject *object) {
38 38  
39   - ipc3270 * ipc = IPC3270(object);
40   -
41   -
  39 + // ipc3270 * ipc = IPC3270(object);
42 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 101 lib3270_set_session_id(ipc->hSession, id);
103 102  
104 103 ipc->source->hPipe = hPipe;
  104 + ipc->source->object = object;
105 105 ipc->source->state = PIPE_STATE_WAITING;
106 106 ipc->source->overlap.hEvent = CreateEvent( NULL,TRUE,TRUE,NULL);
107 107  
... ...
src/core/windows/gobject.h
... ... @@ -67,6 +67,7 @@
67 67  
68 68 typedef struct _ipc3270_pipe_source {
69 69 GSource gsrc;
  70 + GObject * object;
70 71 HANDLE hPipe;
71 72  
72 73 IPC3270_PIPE_STATE state;
... ...
src/core/windows/inout.c
... ... @@ -41,6 +41,31 @@
41 41  
42 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 69 unsigned char * ipc3270_pack(const gchar * name, int id, GVariant *values, size_t * szPacket) {
45 70  
46 71 GVariantIter iter;
... ... @@ -50,7 +75,7 @@ unsigned char * ipc3270_pack(const gchar * name, int id, GVariant *values, size_
50 75 size_t ix = 0;
51 76  
52 77 // Init packet size;
53   - *szPacket = strlen(name) + 1 + (sizeof(guint16) * 2) ;
  78 + *szPacket = strlen(name) + 1 + (sizeof(guint16) * 2);
54 79  
55 80 g_print("Packaging %u itens for \"%s\"\n", (unsigned int) count, name);
56 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 42 source->state = PIPE_STATE_WAITING;
43 43 break;
44 44  
45   -
46 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 50 default:
51 51 g_message("Error %u in ConnectNamedPipe",(unsigned int) GetLastError());
... ... @@ -93,6 +93,57 @@ static gboolean IO_check(GSource *source) {
93 93  
94 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 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 218  
168 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 224 break;
... ...
src/include/lib3270/ipc.h
... ... @@ -71,6 +71,7 @@
71 71  
72 72 // TODO: Move for windows private.h
73 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 75 GVariant * ipc3270_unpack(const unsigned char *packet, int *id);
75 76  
76 77 G_END_DECLS
... ...
src/service/session.c
... ... @@ -46,7 +46,7 @@ G_DEFINE_TYPE(session, session, GLIB_TYPE_IPC3270)
46 46  
47 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 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 64 static void session_init(session *object) {
65 65  
66 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  
... ...