Commit 9192562c738d09dd91b26296dc72aea360d2b667
1 parent
6e995388
Exists in
master
and in
1 other branch
Adding IPC method to wait for connection state.
Showing
10 changed files
with
60 additions
and
11 deletions
Show diff stats
client/src/include/lib3270/ipc.h
... | ... | @@ -600,6 +600,9 @@ |
600 | 600 | /// @brief Wait until session state changes to "ready". |
601 | 601 | virtual void waitForReady(time_t timeout = DEFAULT_TIMEOUT) const = 0; |
602 | 602 | |
603 | + /// @brief Wait for connection state. | |
604 | + virtual void waitForConnectionState(ConnectionState state, time_t timeout = DEFAULT_TIMEOUT) const = 0; | |
605 | + | |
603 | 606 | /// @brief Wait for screen changes. |
604 | 607 | virtual void waitForChange(time_t seconds = DEFAULT_TIMEOUT) const = 0; |
605 | 608 | |
... | ... | @@ -663,17 +666,6 @@ |
663 | 666 | /// @brief Writes characters to the associated output sequence from the put area. |
664 | 667 | int overflow(int c) override; |
665 | 668 | |
666 | - /* | |
667 | - /// @brief Write information to log file. | |
668 | - void info(const char *fmt, ...) const; | |
669 | - | |
670 | - /// @brief Write warning to log file. | |
671 | - void warning(const char *fmt, ...) const; | |
672 | - | |
673 | - /// @brief Write error to log file. | |
674 | - void error(const char *fmt, ...) const; | |
675 | - */ | |
676 | - | |
677 | 669 | public: |
678 | 670 | Host(const char *id, const char *charset = nullptr); |
679 | 671 | |
... | ... | @@ -733,6 +725,15 @@ |
733 | 725 | return this->session->waitForKeyboardUnlock(timeout); |
734 | 726 | } |
735 | 727 | |
728 | + /// @brief Wait for connection state. | |
729 | + inline void waitForConnectionState(ConnectionState state, time_t timeout = DEFAULT_TIMEOUT) { | |
730 | + return this->session->waitForConnectionState(state,timeout); | |
731 | + } | |
732 | + | |
733 | + inline void wait(ConnectionState state, time_t timeout = DEFAULT_TIMEOUT) { | |
734 | + return this->session->waitForConnectionState(state,timeout); | |
735 | + } | |
736 | + | |
736 | 737 | /// @brief Execute action by name. |
737 | 738 | inline Host & action(const char *action_name) { |
738 | 739 | session->action(action_name); | ... | ... |
client/src/session/local/private.h
... | ... | @@ -122,6 +122,7 @@ |
122 | 122 | |
123 | 123 | void wait(time_t seconds) const override; |
124 | 124 | void waitForReady(time_t timeout) const override; |
125 | + void waitForConnectionState(ConnectionState state, time_t timeout) const override; | |
125 | 126 | void waitForChange(time_t timeout) const override; |
126 | 127 | |
127 | 128 | LIB3270_KEYBOARD_LOCK_STATE waitForKeyboardUnlock(time_t seconds) const override; | ... | ... |
client/src/session/local/wait.cc
... | ... | @@ -56,6 +56,12 @@ |
56 | 56 | chkResponse(lib3270_wait_for_ready(this->hSession, timeout)); |
57 | 57 | } |
58 | 58 | |
59 | + void Local::Session::waitForConnectionState(ConnectionState state, time_t timeout) const { | |
60 | + | |
61 | + std::lock_guard<std::mutex> lock(const_cast<Local::Session *>(this)->sync); | |
62 | + chkResponse(lib3270_wait_for_cstate(this->hSession, (LIB3270_CSTATE) state, timeout)); | |
63 | + } | |
64 | + | |
59 | 65 | LIB3270_KEYBOARD_LOCK_STATE Local::Session::waitForKeyboardUnlock(time_t timeout) const { |
60 | 66 | |
61 | 67 | std::lock_guard<std::mutex> lock(const_cast<Local::Session *>(this)->sync); | ... | ... |
client/src/session/remote/private.h
... | ... | @@ -121,6 +121,7 @@ |
121 | 121 | |
122 | 122 | void wait(time_t seconds) const override; |
123 | 123 | void waitForReady(time_t timeout) const override; |
124 | + void waitForConnectionState(ConnectionState state, time_t timeout) const override; | |
124 | 125 | void waitForChange(time_t timeout) const override; |
125 | 126 | |
126 | 127 | LIB3270_KEYBOARD_LOCK_STATE waitForKeyboardUnlock(time_t seconds) const override; | ... | ... |
client/src/session/remote/wait.cc
... | ... | @@ -113,6 +113,30 @@ |
113 | 113 | |
114 | 114 | } |
115 | 115 | |
116 | + void IPC::Session::waitForConnectionState(ConnectionState state, time_t timeout) const { | |
117 | + | |
118 | + debug(__FUNCTION__,"(",timeout,")"); | |
119 | + | |
120 | + wait(timeout, [this,state]() { | |
121 | + | |
122 | + int rc; | |
123 | + | |
124 | + debug("Running waitForConnectionState request..."); | |
125 | + | |
126 | + Request(*this,"waitForConnectionState") | |
127 | + .push((uint32_t) state) | |
128 | + .push((uint32_t) 1) | |
129 | + .call() | |
130 | + .pop(rc); | |
131 | + | |
132 | + debug("Wait for connection state returned ",rc); | |
133 | + | |
134 | + return rc; | |
135 | + | |
136 | + }); | |
137 | + | |
138 | + } | |
139 | + | |
116 | 140 | LIB3270_KEYBOARD_LOCK_STATE IPC::Session::waitForKeyboardUnlock(time_t timeout) const { |
117 | 141 | |
118 | 142 | int rc; | ... | ... |
client/src/testprogram/testprogram.cc
server/src/core/linux/gobject.c
... | ... | @@ -171,6 +171,11 @@ void ipc3270_add_terminal_introspection(GString *introspection) { |
171 | 171 | " <arg type='u' name='seconds' direction='in' />" \ |
172 | 172 | " <arg type='i' name='result' direction='out' />" \ |
173 | 173 | " </method>" \ |
174 | + " <method name= 'waitForConnectionState'>" \ | |
175 | + " <arg type='u' name='cstate' direction='in' />" \ | |
176 | + " <arg type='u' name='seconds' direction='in' />" \ | |
177 | + " <arg type='i' name='result' direction='out' />" \ | |
178 | + " </method>" \ | |
174 | 179 | " <method name= 'waitForKeyboardUnlock'>" \ |
175 | 180 | " <arg type='u' name='seconds' direction='in' />" \ |
176 | 181 | " <arg type='i' name='result' direction='out' />" \ | ... | ... |
server/src/core/methods/methods.c
... | ... | @@ -48,6 +48,7 @@ int ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *req |
48 | 48 | |
49 | 49 | { "wait", ipc3270_method_wait }, |
50 | 50 | { "waitforready", ipc3270_method_wait_for_ready }, |
51 | + { "waitForConnectionState", ipc3270_method_wait_for_cstate }, | |
51 | 52 | { "waitforupdate", ipc3270_method_wait_for_update }, |
52 | 53 | { "waitforkeyboardunlock", ipc3270_method_wait_for_keyboard_unlock }, |
53 | 54 | ... | ... |
server/src/core/methods/private.h
... | ... | @@ -52,6 +52,7 @@ |
52 | 52 | |
53 | 53 | G_GNUC_INTERNAL int ipc3270_method_wait(GObject *session, GVariant *request, GObject *response, GError **error); |
54 | 54 | G_GNUC_INTERNAL int ipc3270_method_wait_for_ready(GObject *session, GVariant *request, GObject *response, GError **error); |
55 | + G_GNUC_INTERNAL int ipc3270_method_wait_for_cstate(GObject *session, GVariant *request, GObject *response, GError **error); | |
55 | 56 | G_GNUC_INTERNAL int ipc3270_method_wait_for_update(GObject *session, GVariant *request, GObject *response, GError **error); |
56 | 57 | G_GNUC_INTERNAL int ipc3270_method_wait_for_keyboard_unlock(GObject *session, GVariant *request, GObject *response, GError **error); |
57 | 58 | ... | ... |
server/src/core/methods/wait.c
... | ... | @@ -116,6 +116,14 @@ int ipc3270_method_wait_for_ready(GObject *session, GVariant *request, GObject * |
116 | 116 | return 0; |
117 | 117 | } |
118 | 118 | |
119 | +int ipc3270_method_wait_for_cstate(GObject *session, GVariant *request, GObject *response, GError G_GNUC_UNUSED(**error)) { | |
120 | + guint seconds = 1; | |
121 | + guint cstate = 0; | |
122 | + g_variant_get(request, "(uu)", &seconds); | |
123 | + ipc3270_response_append_int32(response,lib3270_wait_for_cstate(ipc3270_get_session(session),(LIB3270_CSTATE) cstate, seconds)); | |
124 | + return 0; | |
125 | +} | |
126 | + | |
119 | 127 | int ipc3270_method_wait_for_update(GObject *session, GVariant *request, GObject *response, GError G_GNUC_UNUSED(**error)) { |
120 | 128 | guint seconds = 1; |
121 | 129 | g_variant_get(request, "(u)", &seconds); | ... | ... |