Commit 9d7dc6de7a9c42bffa7e4a04c13280ec4be11089
1 parent
c2552058
Exists in
master
and in
1 other branch
Working on win32 ipc module.
Showing
9 changed files
with
92 additions
and
17 deletions
Show diff stats
.gitignore
configure.ac
| @@ -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
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 |