Commit 2d9339caf7a21800d4964cf25eb9968293f2bc65
1 parent
baa72652
Exists in
master
and in
1 other branch
Fixing bugs on remote attributes.
Showing
7 changed files
with
86 additions
and
10 deletions
Show diff stats
client/src/session/remote/actions.cc
@@ -47,6 +47,10 @@ | @@ -47,6 +47,10 @@ | ||
47 | 47 | ||
48 | namespace TN3270 { | 48 | namespace TN3270 { |
49 | 49 | ||
50 | + TN3270::Action * IPC::Session::getAction(const LIB3270_ACTION *descriptor) { | ||
51 | + return new IPC::Action(this, descriptor); | ||
52 | + } | ||
53 | + | ||
50 | IPC::Action::Action(Session *session, const LIB3270_ACTION *descriptor) : TN3270::Action(descriptor) { | 54 | IPC::Action::Action(Session *session, const LIB3270_ACTION *descriptor) : TN3270::Action(descriptor) { |
51 | this->session = session; | 55 | this->session = session; |
52 | } | 56 | } |
@@ -55,10 +59,12 @@ | @@ -55,10 +59,12 @@ | ||
55 | 59 | ||
56 | bool rc; | 60 | bool rc; |
57 | 61 | ||
62 | + debug(__FUNCTION__); | ||
58 | Request(*session,"activatable") | 63 | Request(*session,"activatable") |
59 | .push(descriptor->name) | 64 | .push(descriptor->name) |
60 | .call() | 65 | .call() |
61 | .pop(rc); | 66 | .pop(rc); |
67 | + debug(__FUNCTION__); | ||
62 | 68 | ||
63 | return rc; | 69 | return rc; |
64 | } | 70 | } |
client/src/session/remote/attribute.cc
@@ -196,6 +196,61 @@ | @@ -196,6 +196,61 @@ | ||
196 | 196 | ||
197 | }; | 197 | }; |
198 | 198 | ||
199 | + // Toggle attribute | ||
200 | + class TN3270_PRIVATE ToggleAttribute : public TemplateAttribute<LIB3270_TOGGLE_ENTRY> { | ||
201 | + public: | ||
202 | + ToggleAttribute(const IPC::Session *session, const LIB3270_TOGGLE_ENTRY *worker) : TemplateAttribute<LIB3270_TOGGLE_ENTRY>(session, Attribute::Boolean, worker) { | ||
203 | + | ||
204 | + get.asString = [](const Attribute & attr, const void *worker) { | ||
205 | + return attr.getBoolean() ? "true" : "false"; | ||
206 | + }; | ||
207 | + | ||
208 | + get.asInt32 = [](const Attribute & attr, const void *worker) { | ||
209 | + return (uint32_t) attr.getBoolean(); | ||
210 | + }; | ||
211 | + | ||
212 | + get.asUint32 = [](const Attribute & attr, const void *worker) { | ||
213 | + return (uint32_t) attr.getInt32(); | ||
214 | + }; | ||
215 | + | ||
216 | + get.asBoolean = [](const Attribute & attr, const void *worker) { | ||
217 | + | ||
218 | + const struct Worker * w = (const struct Worker *) worker; | ||
219 | + | ||
220 | + bool value; | ||
221 | + | ||
222 | + IPC::Request(*w->session,false,w->methods->name) | ||
223 | + .call() | ||
224 | + .pop(value); | ||
225 | + | ||
226 | + return value; | ||
227 | + }; | ||
228 | + | ||
229 | + set.asInt32 = [](const Attribute & attr, const void *worker, const int32_t value) { | ||
230 | + | ||
231 | + const struct Worker * w = (const struct Worker *) worker; | ||
232 | + | ||
233 | + IPC::Request(*w->session,true,w->methods->name) | ||
234 | + .push(value) | ||
235 | + .call(); | ||
236 | + | ||
237 | + }; | ||
238 | + | ||
239 | + set.asBoolean = [](const Attribute & attr, const void *worker, const bool value) { | ||
240 | + | ||
241 | + const struct Worker * w = (const struct Worker *) worker; | ||
242 | + | ||
243 | + IPC::Request(*w->session,true,w->methods->name) | ||
244 | + .push(value) | ||
245 | + .call(); | ||
246 | + | ||
247 | + }; | ||
248 | + | ||
249 | + } | ||
250 | + | ||
251 | + }; | ||
252 | + | ||
253 | + | ||
199 | // Unsigned int attribute | 254 | // Unsigned int attribute |
200 | class TN3270_PRIVATE UnsignedIntAttribute : public TemplateAttribute<LIB3270_UINT_PROPERTY> { | 255 | class TN3270_PRIVATE UnsignedIntAttribute : public TemplateAttribute<LIB3270_UINT_PROPERTY> { |
201 | public: | 256 | public: |
@@ -367,7 +422,6 @@ | @@ -367,7 +422,6 @@ | ||
367 | 422 | ||
368 | // Check for boolean properties | 423 | // Check for boolean properties |
369 | { | 424 | { |
370 | - /* | ||
371 | const LIB3270_TOGGLE_ENTRY *toggles = lib3270_get_toggle_list(); | 425 | const LIB3270_TOGGLE_ENTRY *toggles = lib3270_get_toggle_list(); |
372 | for(size_t ix = 0; toggles[ix].name; ix++) { | 426 | for(size_t ix = 0; toggles[ix].name; ix++) { |
373 | 427 | ||
@@ -376,7 +430,6 @@ | @@ -376,7 +430,6 @@ | ||
376 | } | 430 | } |
377 | 431 | ||
378 | } | 432 | } |
379 | - */ | ||
380 | 433 | ||
381 | const LIB3270_INT_PROPERTY * intprop = lib3270_get_boolean_properties_list(); | 434 | const LIB3270_INT_PROPERTY * intprop = lib3270_get_boolean_properties_list(); |
382 | for(size_t ix = 0; intprop[ix].name; ix++) { | 435 | for(size_t ix = 0; intprop[ix].name; ix++) { |
@@ -426,12 +479,10 @@ | @@ -426,12 +479,10 @@ | ||
426 | 479 | ||
427 | // Add boolean properties | 480 | // Add boolean properties |
428 | { | 481 | { |
429 | - /* | ||
430 | const LIB3270_TOGGLE_ENTRY *toggles = lib3270_get_toggle_list(); | 482 | const LIB3270_TOGGLE_ENTRY *toggles = lib3270_get_toggle_list(); |
431 | for(size_t ix = 0; toggles[ix].name; ix++) { | 483 | for(size_t ix = 0; toggles[ix].name; ix++) { |
432 | attributes.push_back(ToggleAttribute(this,&toggles[ix])); | 484 | attributes.push_back(ToggleAttribute(this,&toggles[ix])); |
433 | } | 485 | } |
434 | - */ | ||
435 | 486 | ||
436 | const LIB3270_INT_PROPERTY * intprop = lib3270_get_boolean_properties_list(); | 487 | const LIB3270_INT_PROPERTY * intprop = lib3270_get_boolean_properties_list(); |
437 | for(size_t ix = 0; intprop[ix].name; ix++) { | 488 | for(size_t ix = 0; intprop[ix].name; ix++) { |
client/src/session/remote/private.h
@@ -105,6 +105,9 @@ | @@ -105,6 +105,9 @@ | ||
105 | virtual ~Session(); | 105 | virtual ~Session(); |
106 | 106 | ||
107 | // Actions | 107 | // Actions |
108 | + TN3270::Action * getAction(const LIB3270_ACTION *descriptor) override; | ||
109 | + | ||
110 | + // Actions | ||
108 | void action(const char *action_name) override; | 111 | void action(const char *action_name) override; |
109 | void connect(const char *url, int seconds) override; | 112 | void connect(const char *url, int seconds) override; |
110 | void disconnect() override; | 113 | void disconnect() override; |
client/src/testprogram/testprogram.cc
@@ -214,7 +214,7 @@ | @@ -214,7 +214,7 @@ | ||
214 | 214 | ||
215 | TN3270::Action * action = host.getAction("reconnect"); | 215 | TN3270::Action * action = host.getAction("reconnect"); |
216 | 216 | ||
217 | - action->activatable(); | 217 | + cout << "Reconnect is " << (action->activatable() ? "available" : "unavailable") << endl; |
218 | 218 | ||
219 | delete action; | 219 | delete action; |
220 | } | 220 | } |
server/src/core/linux/response.c
@@ -124,6 +124,16 @@ void ipc3270_response_append_string(GObject *object, const gchar *text) { | @@ -124,6 +124,16 @@ void ipc3270_response_append_string(GObject *object, const gchar *text) { | ||
124 | 124 | ||
125 | } | 125 | } |
126 | 126 | ||
127 | +void ipc3270_response_append_boolean(GObject *object, gboolean value) { | ||
128 | + | ||
129 | + ipc3270Response * response = IPC3270_RESPONSE(object); | ||
130 | + | ||
131 | + if(response->value) | ||
132 | + g_variant_unref(response->value); | ||
133 | + | ||
134 | + response->value = g_variant_new_boolean(value); | ||
135 | +} | ||
136 | + | ||
127 | GVariant * ipc3270_response_steal_value(GObject *object) { | 137 | GVariant * ipc3270_response_steal_value(GObject *object) { |
128 | 138 | ||
129 | ipc3270Response * response = IPC3270_RESPONSE(object); | 139 | ipc3270Response * response = IPC3270_RESPONSE(object); |
server/src/core/methods/action.c
@@ -46,21 +46,25 @@ int ipc3270_method_action(GObject *session, GVariant *request, GObject *response | @@ -46,21 +46,25 @@ int ipc3270_method_action(GObject *session, GVariant *request, GObject *response | ||
46 | return 0; | 46 | return 0; |
47 | } | 47 | } |
48 | 48 | ||
49 | -int ipc3270_method_activatable(GObject *session, GVariant *request, GObject *response, GError G_GNUC_UNUSED(**error)) { | 49 | +int ipc3270_method_activatable(GObject *session, GVariant *request, GObject *response, GError **error) { |
50 | 50 | ||
51 | if(g_variant_n_children(request) != 1) { | 51 | if(g_variant_n_children(request) != 1) { |
52 | g_message("activatable was called with %u arguments.",(unsigned int) g_variant_n_children(request)); | 52 | g_message("activatable was called with %u arguments.",(unsigned int) g_variant_n_children(request)); |
53 | - ipc3270_response_append_int32(response, EINVAL); | 53 | + |
54 | + if(!*error) | ||
55 | + g_set_error_literal(error,g_quark_from_static_string(PACKAGE_NAME),EINVAL,"Unexpected argument number"); | ||
56 | + | ||
57 | + return 0; | ||
54 | } | 58 | } |
55 | 59 | ||
56 | GVariant *value = g_variant_get_child_value(request,0); | 60 | GVariant *value = g_variant_get_child_value(request,0); |
57 | 61 | ||
58 | - LIB3270_ACTION * action = lib3270_action_get_by_name(g_variant_get_string(value,NULL)); | 62 | + const LIB3270_ACTION * action = lib3270_action_get_by_name(g_variant_get_string(value,NULL)); |
59 | 63 | ||
60 | if(action) { | 64 | if(action) { |
61 | - ipc3270_response_append_int32(response, lib3270_action_is_activatable(action, ipc3270_get_session(session))); | 65 | + ipc3270_response_append_boolean(response, lib3270_action_is_activatable(action, ipc3270_get_session(session))); |
62 | } else { | 66 | } else { |
63 | - ipc3270_response_append_int32(response, ENOENT); | 67 | + ipc3270_response_append_boolean(response, FALSE); |
64 | } | 68 | } |
65 | 69 | ||
66 | g_variant_unref(value); | 70 | g_variant_unref(value); |
server/src/include/ipc-glib.h
@@ -109,6 +109,8 @@ | @@ -109,6 +109,8 @@ | ||
109 | void ipc3270_response_append_int32(GObject *object, gint32 value); | 109 | void ipc3270_response_append_int32(GObject *object, gint32 value); |
110 | void ipc3270_response_append_uint32(GObject *object, guint32 value); | 110 | void ipc3270_response_append_uint32(GObject *object, guint32 value); |
111 | void ipc3270_response_append_string(GObject *object, const gchar *text); | 111 | void ipc3270_response_append_string(GObject *object, const gchar *text); |
112 | + void ipc3270_response_append_boolean(GObject *object, gboolean value); | ||
113 | + | ||
112 | gboolean ipc3270_response_has_values(GObject *object); | 114 | gboolean ipc3270_response_has_values(GObject *object); |
113 | GVariant * ipc3270_response_steal_value(GObject *object); | 115 | GVariant * ipc3270_response_steal_value(GObject *object); |
114 | 116 |