Commit 2d9339caf7a21800d4964cf25eb9968293f2bc65

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

Fixing bugs on remote attributes.

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