From 9192562c738d09dd91b26296dc72aea360d2b667 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Fri, 31 Jul 2020 16:31:04 -0300 Subject: [PATCH] Adding IPC method to wait for connection state. --- client/src/include/lib3270/ipc.h | 23 ++++++++++++----------- client/src/session/local/private.h | 1 + client/src/session/local/wait.cc | 6 ++++++ client/src/session/remote/private.h | 1 + client/src/session/remote/wait.cc | 24 ++++++++++++++++++++++++ client/src/testprogram/testprogram.cc | 1 + server/src/core/linux/gobject.c | 5 +++++ server/src/core/methods/methods.c | 1 + server/src/core/methods/private.h | 1 + server/src/core/methods/wait.c | 8 ++++++++ 10 files changed, 60 insertions(+), 11 deletions(-) diff --git a/client/src/include/lib3270/ipc.h b/client/src/include/lib3270/ipc.h index 694466c..c7e3572 100644 --- a/client/src/include/lib3270/ipc.h +++ b/client/src/include/lib3270/ipc.h @@ -600,6 +600,9 @@ /// @brief Wait until session state changes to "ready". virtual void waitForReady(time_t timeout = DEFAULT_TIMEOUT) const = 0; + /// @brief Wait for connection state. + virtual void waitForConnectionState(ConnectionState state, time_t timeout = DEFAULT_TIMEOUT) const = 0; + /// @brief Wait for screen changes. virtual void waitForChange(time_t seconds = DEFAULT_TIMEOUT) const = 0; @@ -663,17 +666,6 @@ /// @brief Writes characters to the associated output sequence from the put area. int overflow(int c) override; - /* - /// @brief Write information to log file. - void info(const char *fmt, ...) const; - - /// @brief Write warning to log file. - void warning(const char *fmt, ...) const; - - /// @brief Write error to log file. - void error(const char *fmt, ...) const; - */ - public: Host(const char *id, const char *charset = nullptr); @@ -733,6 +725,15 @@ return this->session->waitForKeyboardUnlock(timeout); } + /// @brief Wait for connection state. + inline void waitForConnectionState(ConnectionState state, time_t timeout = DEFAULT_TIMEOUT) { + return this->session->waitForConnectionState(state,timeout); + } + + inline void wait(ConnectionState state, time_t timeout = DEFAULT_TIMEOUT) { + return this->session->waitForConnectionState(state,timeout); + } + /// @brief Execute action by name. inline Host & action(const char *action_name) { session->action(action_name); diff --git a/client/src/session/local/private.h b/client/src/session/local/private.h index 402b717..3f9015b 100644 --- a/client/src/session/local/private.h +++ b/client/src/session/local/private.h @@ -122,6 +122,7 @@ void wait(time_t seconds) const override; void waitForReady(time_t timeout) const override; + void waitForConnectionState(ConnectionState state, time_t timeout) const override; void waitForChange(time_t timeout) const override; LIB3270_KEYBOARD_LOCK_STATE waitForKeyboardUnlock(time_t seconds) const override; diff --git a/client/src/session/local/wait.cc b/client/src/session/local/wait.cc index 684af9f..07954b0 100644 --- a/client/src/session/local/wait.cc +++ b/client/src/session/local/wait.cc @@ -56,6 +56,12 @@ chkResponse(lib3270_wait_for_ready(this->hSession, timeout)); } + void Local::Session::waitForConnectionState(ConnectionState state, time_t timeout) const { + + std::lock_guard lock(const_cast(this)->sync); + chkResponse(lib3270_wait_for_cstate(this->hSession, (LIB3270_CSTATE) state, timeout)); + } + LIB3270_KEYBOARD_LOCK_STATE Local::Session::waitForKeyboardUnlock(time_t timeout) const { std::lock_guard lock(const_cast(this)->sync); diff --git a/client/src/session/remote/private.h b/client/src/session/remote/private.h index ac344a7..aaca92d 100644 --- a/client/src/session/remote/private.h +++ b/client/src/session/remote/private.h @@ -121,6 +121,7 @@ void wait(time_t seconds) const override; void waitForReady(time_t timeout) const override; + void waitForConnectionState(ConnectionState state, time_t timeout) const override; void waitForChange(time_t timeout) const override; LIB3270_KEYBOARD_LOCK_STATE waitForKeyboardUnlock(time_t seconds) const override; diff --git a/client/src/session/remote/wait.cc b/client/src/session/remote/wait.cc index caead33..2260236 100644 --- a/client/src/session/remote/wait.cc +++ b/client/src/session/remote/wait.cc @@ -113,6 +113,30 @@ } + void IPC::Session::waitForConnectionState(ConnectionState state, time_t timeout) const { + + debug(__FUNCTION__,"(",timeout,")"); + + wait(timeout, [this,state]() { + + int rc; + + debug("Running waitForConnectionState request..."); + + Request(*this,"waitForConnectionState") + .push((uint32_t) state) + .push((uint32_t) 1) + .call() + .pop(rc); + + debug("Wait for connection state returned ",rc); + + return rc; + + }); + + } + LIB3270_KEYBOARD_LOCK_STATE IPC::Session::waitForKeyboardUnlock(time_t timeout) const { int rc; diff --git a/client/src/testprogram/testprogram.cc b/client/src/testprogram/testprogram.cc index 072a64d..0732730 100644 --- a/client/src/testprogram/testprogram.cc +++ b/client/src/testprogram/testprogram.cc @@ -171,6 +171,7 @@ TN3270::Host host{session}; host.connect(); + host.wait(TN3270::CONNECTED_TN3270E); { auto start = time(nullptr); diff --git a/server/src/core/linux/gobject.c b/server/src/core/linux/gobject.c index 36d3335..f030a42 100644 --- a/server/src/core/linux/gobject.c +++ b/server/src/core/linux/gobject.c @@ -171,6 +171,11 @@ void ipc3270_add_terminal_introspection(GString *introspection) { " " \ " " \ " " \ + " " \ + " " \ + " " \ + " " \ + " " \ " " \ " " \ " " \ diff --git a/server/src/core/methods/methods.c b/server/src/core/methods/methods.c index 6cdde71..769922a 100644 --- a/server/src/core/methods/methods.c +++ b/server/src/core/methods/methods.c @@ -48,6 +48,7 @@ int ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *req { "wait", ipc3270_method_wait }, { "waitforready", ipc3270_method_wait_for_ready }, + { "waitForConnectionState", ipc3270_method_wait_for_cstate }, { "waitforupdate", ipc3270_method_wait_for_update }, { "waitforkeyboardunlock", ipc3270_method_wait_for_keyboard_unlock }, diff --git a/server/src/core/methods/private.h b/server/src/core/methods/private.h index c7c410e..bebe34d 100644 --- a/server/src/core/methods/private.h +++ b/server/src/core/methods/private.h @@ -52,6 +52,7 @@ G_GNUC_INTERNAL int ipc3270_method_wait(GObject *session, GVariant *request, GObject *response, GError **error); G_GNUC_INTERNAL int ipc3270_method_wait_for_ready(GObject *session, GVariant *request, GObject *response, GError **error); + G_GNUC_INTERNAL int ipc3270_method_wait_for_cstate(GObject *session, GVariant *request, GObject *response, GError **error); G_GNUC_INTERNAL int ipc3270_method_wait_for_update(GObject *session, GVariant *request, GObject *response, GError **error); G_GNUC_INTERNAL int ipc3270_method_wait_for_keyboard_unlock(GObject *session, GVariant *request, GObject *response, GError **error); diff --git a/server/src/core/methods/wait.c b/server/src/core/methods/wait.c index 392211a..f7093b9 100644 --- a/server/src/core/methods/wait.c +++ b/server/src/core/methods/wait.c @@ -116,6 +116,14 @@ int ipc3270_method_wait_for_ready(GObject *session, GVariant *request, GObject * return 0; } +int ipc3270_method_wait_for_cstate(GObject *session, GVariant *request, GObject *response, GError G_GNUC_UNUSED(**error)) { + guint seconds = 1; + guint cstate = 0; + g_variant_get(request, "(uu)", &seconds); + ipc3270_response_append_int32(response,lib3270_wait_for_cstate(ipc3270_get_session(session),(LIB3270_CSTATE) cstate, seconds)); + return 0; +} + int ipc3270_method_wait_for_update(GObject *session, GVariant *request, GObject *response, GError G_GNUC_UNUSED(**error)) { guint seconds = 1; g_variant_get(request, "(u)", &seconds); -- libgit2 0.21.2