Commit 9077bc4c71ca4e48408ea226500481b14ecf5a4e

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

Debugging action methods and properties.

client/src/core/session.cc
... ... @@ -378,11 +378,25 @@
378 378 return rc;
379 379 }
380 380  
381   - /// @brief Search
  381 + /// @brief Checks if the terminal contains the string.
382 382 size_t Session::find(const char * str, size_t pos) const {
383 383 return toString((int) 0,(int) -1, '\0').find(str,pos);
384 384 }
385 385  
  386 + /// @brief Get the number of occurrences of a string in the terminal.
  387 + size_t Session::count(const char * str, size_t pos) const {
  388 +
  389 + std::string contents = toString((int) 0,(int) -1, '\0');
  390 + size_t rc = 0;
  391 +
  392 + while( (pos = contents.find(str,pos)) != std::string::npos) {
  393 + rc++;
  394 + }
  395 +
  396 + return rc;
  397 +
  398 + }
  399 +
386 400 /// @brief Compare contents.
387 401 int Session::compare(int baddr, const char* s, int len) const {
388 402  
... ...
client/src/host/string.cc
... ... @@ -60,7 +60,7 @@ std::string TN3270::Host::toString(unsigned short row, unsigned short col, int l
60 60  
61 61 }
62 62  
63   -/// @brief Search
  63 +/// @brief Checks if the terminal contains the string.
64 64 size_t TN3270::Host::find(const char * str, size_t pos) const {
65 65  
66 66 this->session->waitForReady(this->timeout);
... ... @@ -68,6 +68,14 @@ size_t TN3270::Host::find(const char * str, size_t pos) const {
68 68  
69 69 }
70 70  
  71 +/// @brief Get the number of occurrences of a string in the terminal.
  72 +size_t TN3270::Host::count(const char * str, size_t pos) const {
  73 +
  74 + this->session->waitForReady(this->timeout);
  75 + return this->session->count(str,pos);
  76 +
  77 +}
  78 +
71 79 /// @brief Compare contents.
72 80 int TN3270::Host::compare(int baddr, const char* s, int len) const {
73 81  
... ...
client/src/include/lib3270/ipc.h
... ... @@ -585,9 +585,12 @@
585 585 /// @brief Create an action object
586 586 virtual Action * getAction(const LIB3270_ACTION *descriptor);
587 587  
588   - /// @brief Search
  588 + /// @brief Checks if the terminal contains the string.
589 589 size_t find(const char * str, size_t pos = 0) const;
590 590  
  591 + /// @brief Get the number of occurrences of a string in the terminal.
  592 + size_t count(const char * str, size_t pos = 0) const;
  593 +
591 594 /// @brief Compare contents.
592 595 int compare(int baddr, const char* s, int len = -1) const;
593 596 int compare(unsigned short row, unsigned short col, const char* s, int len = -1) const;
... ... @@ -863,9 +866,12 @@
863 866 return session->wait(addr,text,timeout);
864 867 }
865 868  
866   - /// @brief Search
  869 + /// @brief Checks if the terminal contains the string.
867 870 size_t find(const char * str, size_t pos = 0) const;
868 871  
  872 + /// @brief Get the number of occurrences of a string in the terminal.
  873 + size_t count(const char * str, size_t pos = 0) const;
  874 +
869 875 /// @brief Compare contents.
870 876 int compare(int baddr, const char* s, int len = -1) const;
871 877 int compare(unsigned short row, unsigned short col, const char* s, int len = -1) const;
... ...
client/src/include/lib3270/ipc/action.h
... ... @@ -53,12 +53,12 @@
53 53 Action(const LIB3270_ACTION *descriptor);
54 54  
55 55 public:
56   - virtual bool activatable() const noexcept = 0;
  56 + virtual bool activatable() const = 0;
57 57 virtual void activate() = 0;
58 58 virtual void wait(time_t seconds = 0) = 0;
59 59 virtual ~Action();
60 60  
61   - inline operator bool() const noexcept {
  61 + inline operator bool() const {
62 62 return activatable();
63 63 }
64 64  
... ...
client/src/session/remote/actions.cc
... ... @@ -47,6 +47,30 @@
47 47  
48 48 namespace TN3270 {
49 49  
  50 + IPC::Action::Action(Session *session, const LIB3270_ACTION *descriptor) : TN3270::Action(descriptor) {
  51 + this->session = session;
  52 + }
  53 +
  54 + bool IPC::Action::activatable() const {
  55 +
  56 + bool rc;
  57 +
  58 + Request(*session,"activatable")
  59 + .push(descriptor->name)
  60 + .call()
  61 + .pop(rc);
  62 +
  63 + return rc;
  64 + }
  65 +
  66 + void IPC::Action::activate() {
  67 + session->action(descriptor->name);
  68 + }
  69 +
  70 + void IPC::Action::wait(time_t seconds) {
  71 + session->waitForReady(seconds);
  72 + }
  73 +
50 74 void IPC::Session::action(const char *action_name) {
51 75  
52 76 int32_t rc;
... ...
client/src/session/remote/private.h
... ... @@ -42,6 +42,7 @@
42 42  
43 43 #include <config.h>
44 44 #include <ipc-client-internals.h>
  45 + #include <lib3270/ipc/action.h>
45 46 #include <string>
46 47 #include <lib3270.h>
47 48 #include <stdexcept>
... ... @@ -53,6 +54,20 @@
53 54  
54 55 namespace IPC {
55 56  
  57 + class Session;
  58 +
  59 + class Action : public TN3270::Action {
  60 + private:
  61 + Session *session;
  62 +
  63 + public:
  64 + Action(Session *session, const LIB3270_ACTION *descriptor);
  65 + bool activatable() const override;
  66 + void activate() override;
  67 + void wait(time_t seconds) override;
  68 +
  69 + };
  70 +
56 71 class TN3270_PRIVATE Session : public TN3270::Abstract::Session {
57 72 private:
58 73  
... ...
server/src/core/getproperties.c
... ... @@ -65,7 +65,7 @@ GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GEr
65 65 }
66 66  
67 67 // Erro!
68   - ipc3270_set_error(object,ENOENT,error);
  68 + ipc3270_set_error(object,errno,error);
69 69 return NULL;
70 70  
71 71 }
... ...
server/src/core/linux/gobject.c
... ... @@ -112,6 +112,10 @@ void ipc3270_add_terminal_introspection(GString *introspection) {
112 112 " <arg type='s' name='name' direction='in' />" \
113 113 " <arg type='i' name='result' direction='out' />" \
114 114 " </method>"
  115 + " <method name='activatable'>"
  116 + " <arg type='s' name='name' direction='in' />" \
  117 + " <arg type='b' name='result' direction='out' />" \
  118 + " </method>"
115 119 " <method name='pfkey'>" \
116 120 " <arg type='i' name='keycode' direction='in'/>" \
117 121 " <arg type='i' name='result' direction='out' />" \
... ...
server/src/core/methods/action.c
... ... @@ -46,3 +46,24 @@ int ipc3270_method_action(GObject *session, GVariant *request, GObject *response
46 46 return 0;
47 47 }
48 48  
  49 +int ipc3270_method_activatable(GObject *session, GVariant *request, GObject *response, GError G_GNUC_UNUSED(**error)) {
  50 +
  51 + if(g_variant_n_children(request) != 1) {
  52 + g_message("activatable was called with %u arguments.",(unsigned int) g_variant_n_children(request));
  53 + ipc3270_response_append_int32(response, EINVAL);
  54 + }
  55 +
  56 + GVariant *value = g_variant_get_child_value(request,0);
  57 +
  58 + LIB3270_ACTION * action = lib3270_action_get_by_name(g_variant_get_string(value,NULL));
  59 +
  60 + if(action) {
  61 + ipc3270_response_append_int32(response, lib3270_action_is_activatable(action, ipc3270_get_session(session)));
  62 + } else {
  63 + ipc3270_response_append_int32(response, ENOENT);
  64 + }
  65 +
  66 + g_variant_unref(value);
  67 +
  68 + return 0;
  69 +}
... ...
server/src/core/methods/methods.c
... ... @@ -72,6 +72,7 @@ int ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *req
72 72 { "setCursorPosition", ipc3270_method_set_cursor },
73 73  
74 74 { "action", ipc3270_method_action },
  75 + { "activatable", ipc3270_method_activatable },
75 76  
76 77 };
77 78  
... ... @@ -98,31 +99,13 @@ int ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *req
98 99 }
99 100  
100 101 // Check actions table.
101   - const LIB3270_ACTION * action = lib3270_get_action(method_name);
  102 + const LIB3270_ACTION * action = lib3270_action_get_by_name(method_name);
102 103 if(action) {
103 104 if(lib3270_action_activate(action,hSession)) {
104 105 ipc3270_set_error(object,errno,error);
105 106 }
106 107 return 0;
107 108 }
108   - /*
109   - const LIB3270_ACTION * actions = lib3270_get_actions();
110   - for(ix = 0; actions[ix].name; ix++) {
111   -
112   - if(!g_ascii_strcasecmp(actions[ix].name,method_name)) {
113   -
114   - if(!actions[ix].enabled(hSession))
115   - ipc3270_set_error(object,EPERM,error);
116   - else if(actions[ix].activate(hSession))
117   - ipc3270_set_error(object,errno,error);
118   - else
119   - ipc3270_response_append_int32(response, 0);
120   -
121   - return 0;
122   -
123   - }
124   - }
125   - */
126 109  
127 110 // Check lib3270 internal methods
128 111 const IPC_METHOD_INT_ARG * int_methods = ipc3270_get_int_arg_methods();
... ...
server/src/core/methods/private.h
... ... @@ -58,6 +58,7 @@
58 58 G_GNUC_INTERNAL int ipc3270_method_set_cursor(GObject *session, GVariant *request, GObject *response, GError **error);
59 59  
60 60 G_GNUC_INTERNAL int ipc3270_method_action(GObject *session, GVariant *request, GObject *response, GError **error);
  61 + G_GNUC_INTERNAL int ipc3270_method_activatable(GObject *session, GVariant *request, GObject *response, GError **error);
61 62  
62 63 G_GNUC_INTERNAL int ipc3270_method_get_field_attribute(GObject *session, GVariant *request, GObject *response, GError **error);
63 64  
... ...