From 518e10caecf15da92751397cf3b7932d14280232 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Wed, 16 Sep 2020 19:46:16 -0300 Subject: [PATCH] Implementing IPC response with multiple results. --- client/src/session/remote/actions.cc | 4 ++++ client/src/testprogram/testprogram.cc | 54 +++++++++++++++++++++++++++++++----------------------- server/pw3270-plugin-ipc.cbp | 3 --- server/src/core/response.c | 10 ++++++++-- server/src/core/windows/inout.c | 36 ++++++++++++++++++++++++++++++++++++ server/src/core/windows/pipesource.c | 24 +++++------------------- server/src/include/ipc-glib.h | 10 +++++++--- 7 files changed, 91 insertions(+), 50 deletions(-) diff --git a/client/src/session/remote/actions.cc b/client/src/session/remote/actions.cc index 1dd3307..204b4ae 100644 --- a/client/src/session/remote/actions.cc +++ b/client/src/session/remote/actions.cc @@ -151,6 +151,10 @@ throw std::system_error(ENOTSUP, std::system_category()); } + Session::Cursor IPC::Session::getCursorPosition() { + throw std::system_error(ENOTSUP, std::system_category()); + } + } diff --git a/client/src/testprogram/testprogram.cc b/client/src/testprogram/testprogram.cc index 1ea8fbb..ca0f302 100644 --- a/client/src/testprogram/testprogram.cc +++ b/client/src/testprogram/testprogram.cc @@ -103,7 +103,7 @@ TN3270::Host host{session}; - // name="url"; + name="url"; cout << endl << endl; for(auto attribute : host.getAttributes()) { @@ -257,37 +257,45 @@ }; - int long_index =0; - int opt; - while((opt = getopt_long(argc, argv, "s:A", options, &long_index )) != -1) { + try { + + int long_index =0; + int opt; + while((opt = getopt_long(argc, argv, "s:A", options, &long_index )) != -1) { - switch(opt) { - case 's': - session = optarg; - cout << "Session: " << session << endl; - break; + switch(opt) { + case 's': + session = optarg; + cout << "Session: " << session << endl; + break; - case 'A': - testAttributes(session,optarg); - break; + case 'A': + testAttributes(session,optarg); + break; - case 'U': - url = optarg; - cout << "URL: " << session << endl; - break; + case 'U': + url = optarg; + cout << "URL: " << session << endl; + break; - case 'P': - testPerformance(session,url); - return 0; + case 'P': + testPerformance(session,url); + return 0; - case 'I': - testHost(session,url); - return 0; + case 'I': + testHost(session,url); + return 0; + + } } - } + } catch(const std::exception &e) { + cerr << "Error:" << endl << "\t" << e.what() << endl << endl; + exit(-1); + + } #else printf("\nRunning IPC Client tests\n"); diff --git a/server/pw3270-plugin-ipc.cbp b/server/pw3270-plugin-ipc.cbp index ce6b1c0..20d5153 100644 --- a/server/pw3270-plugin-ipc.cbp +++ b/server/pw3270-plugin-ipc.cbp @@ -121,9 +121,6 @@ - - diff --git a/server/src/core/response.c b/server/src/core/response.c index 9c25bc1..42cb323 100644 --- a/server/src/core/response.c +++ b/server/src/core/response.c @@ -45,8 +45,10 @@ #include #include -#include -#include +#ifndef _WIN32 + #include + #include +#endif // _WIN32 /*--[ Widget definition ]----------------------------------------------------------------------------*/ @@ -130,6 +132,10 @@ GVariant * ipc3270_response_steal_value(GObject *object) { return value; } +const GList * ipc3270_get_values(GObject *object) { + IPC3270_RESPONSE(object)->values; +} + guint ipc3270_response_length(GObject *object) { return g_list_length(IPC3270_RESPONSE(object)->values); } diff --git a/server/src/core/windows/inout.c b/server/src/core/windows/inout.c index b8cfd9f..a9a0c17 100644 --- a/server/src/core/windows/inout.c +++ b/server/src/core/windows/inout.c @@ -168,6 +168,40 @@ unsigned char * pack_value(unsigned char *txtptr, GVariant *value) { } +unsigned char * ipc3270_pack(const gchar *name, GObject *object, int id, size_t * szPacket) { + + const GList * node; + size_t vCount = 0; + + g_return_val_if_fail(IS_IPC3270_RESPONSE(object),NULL); + + // Set packet size. + *szPacket = + strlen(name) + 1 + + (sizeof(guint16) * 2); + + for(node = ipc3270_get_values(object); node; node = g_list_next(node)) { + vCount++; + *szPacket += g_variant_get_size(node->data)+1; + } + + unsigned char * outputBuffer = g_malloc0(*szPacket); + unsigned char * txtptr = setup_header(outputBuffer,name,id,vCount); + + for(node = ipc3270_get_values(object); node; node = g_list_next(node)) { + txtptr = pack_value(txtptr, node->data); + if(!txtptr) { + g_free(outputBuffer); + return NULL; + } + } + + debug("used=%u allocated=%u",(unsigned int) (txtptr-outputBuffer), (unsigned int) *szPacket); + return outputBuffer; + +} + +/* unsigned char * ipc3270_pack_value(const gchar *name, int id, GVariant *value, size_t * szPacket) { debug("%s(%s)",__FUNCTION__,name); @@ -239,6 +273,7 @@ unsigned char * ipc3270_pack(const gchar * name, int id, GVariant *values, size_ return outputBuffer; } +*/ GVariant * ipc3270_unpack(const unsigned char *packet, int *id) { @@ -387,3 +422,4 @@ GVariant * ipc3270_unpack(const unsigned char *packet, int *id) { return g_variant_builder_end(&builder); } + diff --git a/server/src/core/windows/pipesource.c b/server/src/core/windows/pipesource.c index 139d568..1c8bd20 100644 --- a/server/src/core/windows/pipesource.c +++ b/server/src/core/windows/pipesource.c @@ -109,7 +109,7 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { */ g_autoptr (GError) error = NULL; - g_autoptr (GVariant) response = NULL; + g_autoptr(GObject) response = ipc3270_response_new(); g_autoptr (GVariant) parameters = ipc3270_unpack(source->buffer, &request_type); /* @@ -123,30 +123,16 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { // Process query switch(request_type) { case 1: // getProperty - response = ipc3270_get_property(source->object, request_name, &error); + ipc3270_response_append(response,ipc3270_get_property(source->object, request_name, &error)); break; case 2: // setProperty ipc3270_set_property(source->object, request_name, parameters, &error); - response = g_variant_new_int32(0); + ipc3270_response_append_int32(response,0); break; case 3: // method - { - g_autoptr(GObject) rsp = ipc3270_response_new(); - - debug("Parameters: %p", parameters); - debug("rsp: %p", rsp); - debug("Error=%p",error); - - ipc3270_method_call(source->object, request_name, parameters, rsp, &error); - - debug("Error=%p",error); - - if(ipc3270_response_has_values(rsp)) - response = ipc3270_response_steal_value(rsp); - - } + ipc3270_method_call(source->object, request_name, parameters, response, &error); break; default: @@ -177,7 +163,7 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { } else { - buffer = ipc3270_pack_value(request_name, 0, response, &szPacket); + buffer = ipc3270_pack(request_name,response,0,&szPacket); } diff --git a/server/src/include/ipc-glib.h b/server/src/include/ipc-glib.h index ea6dfe2..7129972 100644 --- a/server/src/include/ipc-glib.h +++ b/server/src/include/ipc-glib.h @@ -106,7 +106,9 @@ typedef struct _ipc3270ResponseClass ipc3270ResponseClass; GObject * ipc3270_response_new(); + GType ipc3270Response_get_type(void); + void ipc3270_response_append(GObject *object, GVariant *value); void ipc3270_response_append_int32(GObject *object, gint32 value); void ipc3270_response_append_uint32(GObject *object, guint32 value); void ipc3270_response_append_string(GObject *object, const gchar *text); @@ -114,6 +116,7 @@ gboolean ipc3270_response_has_values(GObject *object); guint ipc3270_response_length(GObject *object); + const GList * ipc3270_get_values(GObject *object); GVariant * ipc3270_response_steal_value(GObject *object); @@ -151,9 +154,10 @@ GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GError **error); #ifdef _WIN32 - unsigned char * ipc3270_pack(const gchar *name, int id, GVariant *values, size_t * szPacket); - unsigned char * ipc3270_pack_value(const gchar *name, int id, GVariant *value, size_t * szPacket); - unsigned char * ipc3270_pack_error(const GError *error, size_t * szPacket); +// unsigned char * ipc3270_pack(const gchar *name, int id, GVariant *values, size_t * szPacket); +// unsigned char * ipc3270_pack_value(const gchar *name, int id, GVariant *value, size_t * szPacket); +// unsigned char * ipc3270_pack_error(const GError *error, size_t * szPacket); + unsigned char * ipc3270_pack(const gchar *name, GObject *object, int id, size_t * szPacket); GVariant * ipc3270_unpack(const unsigned char *packet, int *id); #endif // _WIN32 -- libgit2 0.21.2