Commit 9077bc4c71ca4e48408ea226500481b14ecf5a4e
1 parent
be11789b
Exists in
master
and in
1 other branch
Debugging action methods and properties.
Showing
11 changed files
with
102 additions
and
26 deletions
Show diff stats
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
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 | ... | ... |