Commit 518e10caecf15da92751397cf3b7932d14280232
1 parent
35fcf870
Exists in
master
and in
1 other branch
Implementing IPC response with multiple results.
Showing
7 changed files
with
91 additions
and
50 deletions
Show diff stats
client/src/session/remote/actions.cc
@@ -151,6 +151,10 @@ | @@ -151,6 +151,10 @@ | ||
151 | throw std::system_error(ENOTSUP, std::system_category()); | 151 | throw std::system_error(ENOTSUP, std::system_category()); |
152 | } | 152 | } |
153 | 153 | ||
154 | + Session::Cursor IPC::Session::getCursorPosition() { | ||
155 | + throw std::system_error(ENOTSUP, std::system_category()); | ||
156 | + } | ||
157 | + | ||
154 | } | 158 | } |
155 | 159 | ||
156 | 160 |
client/src/testprogram/testprogram.cc
@@ -103,7 +103,7 @@ | @@ -103,7 +103,7 @@ | ||
103 | 103 | ||
104 | TN3270::Host host{session}; | 104 | TN3270::Host host{session}; |
105 | 105 | ||
106 | - // name="url"; | 106 | + name="url"; |
107 | 107 | ||
108 | cout << endl << endl; | 108 | cout << endl << endl; |
109 | for(auto attribute : host.getAttributes()) { | 109 | for(auto attribute : host.getAttributes()) { |
@@ -257,37 +257,45 @@ | @@ -257,37 +257,45 @@ | ||
257 | 257 | ||
258 | }; | 258 | }; |
259 | 259 | ||
260 | - int long_index =0; | ||
261 | - int opt; | ||
262 | - while((opt = getopt_long(argc, argv, "s:A", options, &long_index )) != -1) { | 260 | + try { |
261 | + | ||
262 | + int long_index =0; | ||
263 | + int opt; | ||
264 | + while((opt = getopt_long(argc, argv, "s:A", options, &long_index )) != -1) { | ||
263 | 265 | ||
264 | - switch(opt) { | ||
265 | - case 's': | ||
266 | - session = optarg; | ||
267 | - cout << "Session: " << session << endl; | ||
268 | - break; | 266 | + switch(opt) { |
267 | + case 's': | ||
268 | + session = optarg; | ||
269 | + cout << "Session: " << session << endl; | ||
270 | + break; | ||
269 | 271 | ||
270 | - case 'A': | ||
271 | - testAttributes(session,optarg); | ||
272 | - break; | 272 | + case 'A': |
273 | + testAttributes(session,optarg); | ||
274 | + break; | ||
273 | 275 | ||
274 | - case 'U': | ||
275 | - url = optarg; | ||
276 | - cout << "URL: " << session << endl; | ||
277 | - break; | 276 | + case 'U': |
277 | + url = optarg; | ||
278 | + cout << "URL: " << session << endl; | ||
279 | + break; | ||
278 | 280 | ||
279 | - case 'P': | ||
280 | - testPerformance(session,url); | ||
281 | - return 0; | 281 | + case 'P': |
282 | + testPerformance(session,url); | ||
283 | + return 0; | ||
282 | 284 | ||
283 | - case 'I': | ||
284 | - testHost(session,url); | ||
285 | - return 0; | 285 | + case 'I': |
286 | + testHost(session,url); | ||
287 | + return 0; | ||
288 | + | ||
289 | + } | ||
286 | 290 | ||
287 | } | 291 | } |
288 | 292 | ||
289 | - } | 293 | + } catch(const std::exception &e) { |
290 | 294 | ||
295 | + cerr << "Error:" << endl << "\t" << e.what() << endl << endl; | ||
296 | + exit(-1); | ||
297 | + | ||
298 | + } | ||
291 | #else | 299 | #else |
292 | 300 | ||
293 | printf("\nRunning IPC Client tests\n"); | 301 | printf("\nRunning IPC Client tests\n"); |
server/pw3270-plugin-ipc.cbp
@@ -121,9 +121,6 @@ | @@ -121,9 +121,6 @@ | ||
121 | <Unit filename="src/core/windows/resources.rc"> | 121 | <Unit filename="src/core/windows/resources.rc"> |
122 | <Option compilerVar="WINDRES" /> | 122 | <Option compilerVar="WINDRES" /> |
123 | </Unit> | 123 | </Unit> |
124 | - <Unit filename="src/core/windows/response.c"> | ||
125 | - <Option compilerVar="CC" /> | ||
126 | - </Unit> | ||
127 | <Unit filename="src/core/windows/start.c"> | 124 | <Unit filename="src/core/windows/start.c"> |
128 | <Option compilerVar="CC" /> | 125 | <Option compilerVar="CC" /> |
129 | </Unit> | 126 | </Unit> |
server/src/core/response.c
@@ -45,8 +45,10 @@ | @@ -45,8 +45,10 @@ | ||
45 | #include <lib3270/toggle.h> | 45 | #include <lib3270/toggle.h> |
46 | #include <v3270.h> | 46 | #include <v3270.h> |
47 | 47 | ||
48 | -#include <dbus/dbus-glib.h> | ||
49 | -#include <dbus/dbus-glib-bindings.h> | 48 | +#ifndef _WIN32 |
49 | + #include <dbus/dbus-glib.h> | ||
50 | + #include <dbus/dbus-glib-bindings.h> | ||
51 | +#endif // _WIN32 | ||
50 | 52 | ||
51 | /*--[ Widget definition ]----------------------------------------------------------------------------*/ | 53 | /*--[ Widget definition ]----------------------------------------------------------------------------*/ |
52 | 54 | ||
@@ -130,6 +132,10 @@ GVariant * ipc3270_response_steal_value(GObject *object) { | @@ -130,6 +132,10 @@ GVariant * ipc3270_response_steal_value(GObject *object) { | ||
130 | return value; | 132 | return value; |
131 | } | 133 | } |
132 | 134 | ||
135 | +const GList * ipc3270_get_values(GObject *object) { | ||
136 | + IPC3270_RESPONSE(object)->values; | ||
137 | +} | ||
138 | + | ||
133 | guint ipc3270_response_length(GObject *object) { | 139 | guint ipc3270_response_length(GObject *object) { |
134 | return g_list_length(IPC3270_RESPONSE(object)->values); | 140 | return g_list_length(IPC3270_RESPONSE(object)->values); |
135 | } | 141 | } |
server/src/core/windows/inout.c
@@ -168,6 +168,40 @@ unsigned char * pack_value(unsigned char *txtptr, GVariant *value) { | @@ -168,6 +168,40 @@ unsigned char * pack_value(unsigned char *txtptr, GVariant *value) { | ||
168 | 168 | ||
169 | } | 169 | } |
170 | 170 | ||
171 | +unsigned char * ipc3270_pack(const gchar *name, GObject *object, int id, size_t * szPacket) { | ||
172 | + | ||
173 | + const GList * node; | ||
174 | + size_t vCount = 0; | ||
175 | + | ||
176 | + g_return_val_if_fail(IS_IPC3270_RESPONSE(object),NULL); | ||
177 | + | ||
178 | + // Set packet size. | ||
179 | + *szPacket = | ||
180 | + strlen(name) + 1 | ||
181 | + + (sizeof(guint16) * 2); | ||
182 | + | ||
183 | + for(node = ipc3270_get_values(object); node; node = g_list_next(node)) { | ||
184 | + vCount++; | ||
185 | + *szPacket += g_variant_get_size(node->data)+1; | ||
186 | + } | ||
187 | + | ||
188 | + unsigned char * outputBuffer = g_malloc0(*szPacket); | ||
189 | + unsigned char * txtptr = setup_header(outputBuffer,name,id,vCount); | ||
190 | + | ||
191 | + for(node = ipc3270_get_values(object); node; node = g_list_next(node)) { | ||
192 | + txtptr = pack_value(txtptr, node->data); | ||
193 | + if(!txtptr) { | ||
194 | + g_free(outputBuffer); | ||
195 | + return NULL; | ||
196 | + } | ||
197 | + } | ||
198 | + | ||
199 | + debug("used=%u allocated=%u",(unsigned int) (txtptr-outputBuffer), (unsigned int) *szPacket); | ||
200 | + return outputBuffer; | ||
201 | + | ||
202 | +} | ||
203 | + | ||
204 | +/* | ||
171 | unsigned char * ipc3270_pack_value(const gchar *name, int id, GVariant *value, size_t * szPacket) { | 205 | unsigned char * ipc3270_pack_value(const gchar *name, int id, GVariant *value, size_t * szPacket) { |
172 | 206 | ||
173 | debug("%s(%s)",__FUNCTION__,name); | 207 | debug("%s(%s)",__FUNCTION__,name); |
@@ -239,6 +273,7 @@ unsigned char * ipc3270_pack(const gchar * name, int id, GVariant *values, size_ | @@ -239,6 +273,7 @@ unsigned char * ipc3270_pack(const gchar * name, int id, GVariant *values, size_ | ||
239 | 273 | ||
240 | return outputBuffer; | 274 | return outputBuffer; |
241 | } | 275 | } |
276 | +*/ | ||
242 | 277 | ||
243 | GVariant * ipc3270_unpack(const unsigned char *packet, int *id) { | 278 | GVariant * ipc3270_unpack(const unsigned char *packet, int *id) { |
244 | 279 | ||
@@ -387,3 +422,4 @@ GVariant * ipc3270_unpack(const unsigned char *packet, int *id) { | @@ -387,3 +422,4 @@ GVariant * ipc3270_unpack(const unsigned char *packet, int *id) { | ||
387 | return g_variant_builder_end(&builder); | 422 | return g_variant_builder_end(&builder); |
388 | 423 | ||
389 | } | 424 | } |
425 | + |
server/src/core/windows/pipesource.c
@@ -109,7 +109,7 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { | @@ -109,7 +109,7 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { | ||
109 | */ | 109 | */ |
110 | 110 | ||
111 | g_autoptr (GError) error = NULL; | 111 | g_autoptr (GError) error = NULL; |
112 | - g_autoptr (GVariant) response = NULL; | 112 | + g_autoptr(GObject) response = ipc3270_response_new(); |
113 | g_autoptr (GVariant) parameters = ipc3270_unpack(source->buffer, &request_type); | 113 | g_autoptr (GVariant) parameters = ipc3270_unpack(source->buffer, &request_type); |
114 | 114 | ||
115 | /* | 115 | /* |
@@ -123,30 +123,16 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { | @@ -123,30 +123,16 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { | ||
123 | // Process query | 123 | // Process query |
124 | switch(request_type) { | 124 | switch(request_type) { |
125 | case 1: // getProperty | 125 | case 1: // getProperty |
126 | - response = ipc3270_get_property(source->object, request_name, &error); | 126 | + ipc3270_response_append(response,ipc3270_get_property(source->object, request_name, &error)); |
127 | break; | 127 | break; |
128 | 128 | ||
129 | case 2: // setProperty | 129 | case 2: // setProperty |
130 | ipc3270_set_property(source->object, request_name, parameters, &error); | 130 | ipc3270_set_property(source->object, request_name, parameters, &error); |
131 | - response = g_variant_new_int32(0); | 131 | + ipc3270_response_append_int32(response,0); |
132 | break; | 132 | break; |
133 | 133 | ||
134 | case 3: // method | 134 | case 3: // method |
135 | - { | ||
136 | - g_autoptr(GObject) rsp = ipc3270_response_new(); | ||
137 | - | ||
138 | - debug("Parameters: %p", parameters); | ||
139 | - debug("rsp: %p", rsp); | ||
140 | - debug("Error=%p",error); | ||
141 | - | ||
142 | - ipc3270_method_call(source->object, request_name, parameters, rsp, &error); | ||
143 | - | ||
144 | - debug("Error=%p",error); | ||
145 | - | ||
146 | - if(ipc3270_response_has_values(rsp)) | ||
147 | - response = ipc3270_response_steal_value(rsp); | ||
148 | - | ||
149 | - } | 135 | + ipc3270_method_call(source->object, request_name, parameters, response, &error); |
150 | break; | 136 | break; |
151 | 137 | ||
152 | default: | 138 | default: |
@@ -177,7 +163,7 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { | @@ -177,7 +163,7 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { | ||
177 | 163 | ||
178 | } else { | 164 | } else { |
179 | 165 | ||
180 | - buffer = ipc3270_pack_value(request_name, 0, response, &szPacket); | 166 | + buffer = ipc3270_pack(request_name,response,0,&szPacket); |
181 | 167 | ||
182 | } | 168 | } |
183 | 169 |
server/src/include/ipc-glib.h
@@ -106,7 +106,9 @@ | @@ -106,7 +106,9 @@ | ||
106 | typedef struct _ipc3270ResponseClass ipc3270ResponseClass; | 106 | typedef struct _ipc3270ResponseClass ipc3270ResponseClass; |
107 | 107 | ||
108 | GObject * ipc3270_response_new(); | 108 | GObject * ipc3270_response_new(); |
109 | + GType ipc3270Response_get_type(void); | ||
109 | 110 | ||
111 | + void ipc3270_response_append(GObject *object, GVariant *value); | ||
110 | void ipc3270_response_append_int32(GObject *object, gint32 value); | 112 | void ipc3270_response_append_int32(GObject *object, gint32 value); |
111 | void ipc3270_response_append_uint32(GObject *object, guint32 value); | 113 | void ipc3270_response_append_uint32(GObject *object, guint32 value); |
112 | void ipc3270_response_append_string(GObject *object, const gchar *text); | 114 | void ipc3270_response_append_string(GObject *object, const gchar *text); |
@@ -114,6 +116,7 @@ | @@ -114,6 +116,7 @@ | ||
114 | 116 | ||
115 | gboolean ipc3270_response_has_values(GObject *object); | 117 | gboolean ipc3270_response_has_values(GObject *object); |
116 | guint ipc3270_response_length(GObject *object); | 118 | guint ipc3270_response_length(GObject *object); |
119 | + const GList * ipc3270_get_values(GObject *object); | ||
117 | 120 | ||
118 | GVariant * ipc3270_response_steal_value(GObject *object); | 121 | GVariant * ipc3270_response_steal_value(GObject *object); |
119 | 122 | ||
@@ -151,9 +154,10 @@ | @@ -151,9 +154,10 @@ | ||
151 | GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GError **error); | 154 | GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GError **error); |
152 | 155 | ||
153 | #ifdef _WIN32 | 156 | #ifdef _WIN32 |
154 | - unsigned char * ipc3270_pack(const gchar *name, int id, GVariant *values, size_t * szPacket); | ||
155 | - unsigned char * ipc3270_pack_value(const gchar *name, int id, GVariant *value, size_t * szPacket); | ||
156 | - unsigned char * ipc3270_pack_error(const GError *error, size_t * szPacket); | 157 | +// unsigned char * ipc3270_pack(const gchar *name, int id, GVariant *values, size_t * szPacket); |
158 | +// unsigned char * ipc3270_pack_value(const gchar *name, int id, GVariant *value, size_t * szPacket); | ||
159 | +// unsigned char * ipc3270_pack_error(const GError *error, size_t * szPacket); | ||
160 | + unsigned char * ipc3270_pack(const gchar *name, GObject *object, int id, size_t * szPacket); | ||
157 | GVariant * ipc3270_unpack(const unsigned char *packet, int *id); | 161 | GVariant * ipc3270_unpack(const unsigned char *packet, int *id); |
158 | #endif // _WIN32 | 162 | #endif // _WIN32 |
159 | 163 |