diff --git a/src/plugins/rx3270/remote.cc b/src/plugins/rx3270/remote.cc index c307d82..8b4a2d4 100644 --- a/src/plugins/rx3270/remote.cc +++ b/src/plugins/rx3270/remote.cc @@ -65,6 +65,8 @@ int cmp_text_at(int row, int col, const char *text); int set_text_at(int row, int col, const char *str); + int wait_for_text_at(int row, int col, const char *key, int timeout); + int set_cursor_position(int row, int col); void set_toggle(LIB3270_TOGGLE ix, bool value); @@ -934,3 +936,24 @@ void remote::set_toggle(LIB3270_TOGGLE ix, bool value) } +int remote::wait_for_text_at(int row, int col, const char *key, int timeout) +{ + time_t end = time(0)+timeout; + + while(time(0) < end) + { + if(!is_connected()) + return ENOTCONN; + + if(!cmp_text_at(row,col,key)) + return 0; + +#ifdef WIN32 + Sleep(500); +#else + usleep(500); +#endif + } + + return ETIMEDOUT; +} diff --git a/src/plugins/rx3270/rexx_methods.cc b/src/plugins/rx3270/rexx_methods.cc index 7396c59..e26356c 100644 --- a/src/plugins/rx3270/rexx_methods.cc +++ b/src/plugins/rx3270/rexx_methods.cc @@ -327,3 +327,14 @@ RexxMethod4(logical_t, rx3270_method_test, CSELF, sessionPtr, CSTRING, key, int, return false; } + +RexxMethod5(int, rx3270_method_wait_for_text_at, CSELF, sessionPtr, int, row, int, col, CSTRING, key, int, timeout) +{ + rx3270 * hSession = (rx3270 *) sessionPtr; + + if(hSession) + return hSession->wait_for_text_at(row,col,key,timeout); + + return -1; +} + diff --git a/src/plugins/rx3270/rx3270.cls b/src/plugins/rx3270/rx3270.cls index 6441aed..8b2eef6 100644 --- a/src/plugins/rx3270/rx3270.cls +++ b/src/plugins/rx3270/rx3270.cls @@ -64,5 +64,58 @@ ::METHOD GETTEXTAT EXTERNAL "LIBRARY rx3270 rx3270_method_get_text_at" ::METHOD SETTEXTAT EXTERNAL "LIBRARY rx3270 rx3270_method_set_text_at" ::METHOD CMPTEXTAT EXTERNAL "LIBRARY rx3270 rx3270_method_cmp_text_at" +::METHOD WAITFORTEXTAT EXTERNAL "LIBRARY rx3270 rx3270_method_wait_for_text_at" ::METHOD TEST EXTERNAL "LIBRARY rx3270 rx3270_method_test" +/* +getConnectionState +waitForEvents +getScreenContent +RunMode + +::method isConnected +return self~getConnectionState() = "CONNECTED_TN3270E" + +::method waitForStringAt + use arg row, col, key, timeout + if datatype(timeout) <> "NUM" + then timeout = 60 +return self~WaitForTextAt(row,col,key,timeout) + +*/ + +::method queryStringAt + use arg row, col, key +return self~GetTextAt(row,col,length(key)) == key + +::method waitForTerminalReady + use arg timeout +return self~WaitForReady(timeout) + +::method isTerminalReady +return self~ready() + +::method setStringAt + use arg row, col, str +return self~SetTextAt(row,col,str) + +::method getStringAt + use arg row, col, size +return self~GetTextAt(row,col,size) + +::method sendEnterKey +return self~Enter() + +::method sendPFKey + use arg key +return self~pfKey(key) + +::method setCursorPosition + use arg row, col +return self~SetCursor(row,col) + +::method getScreenContentAt + use arg row, col, size +return self~GetTextAt(row,col,size) + + diff --git a/src/plugins/rx3270/rx3270.h b/src/plugins/rx3270/rx3270.h index e1cbf55..760ee4c 100644 --- a/src/plugins/rx3270/rx3270.h +++ b/src/plugins/rx3270/rx3270.h @@ -104,6 +104,7 @@ REXX_METHOD_PROTOTYPE(rx3270_method_ds_trace); REXX_METHOD_PROTOTYPE(rx3270_method_set_option); REXX_METHOD_PROTOTYPE(rx3270_method_test); + REXX_METHOD_PROTOTYPE(rx3270_method_wait_for_text_at); /*---[ Globals ]---------------------------------------------------------------------------------------------*/ @@ -154,6 +155,7 @@ virtual int iterate(bool wait = true) = 0; virtual int wait(int seconds) = 0; virtual int wait_for_ready(int seconds) = 0; + virtual int wait_for_text_at(int row, int col, const char *key, int timeout); virtual int set_cursor_position(int row, int col) = 0; virtual void set_toggle(LIB3270_TOGGLE ix, bool value) = 0; diff --git a/src/plugins/rx3270/rxapimain.cc b/src/plugins/rx3270/rxapimain.cc index 22e9b08..d2a5bad 100644 --- a/src/plugins/rx3270/rxapimain.cc +++ b/src/plugins/rx3270/rxapimain.cc @@ -110,6 +110,8 @@ RexxRoutineEntry rx3270_functions[] = REXX_TYPED_ROUTINE(rx3270queryStringAt, rx3270queryStringAt), REXX_TYPED_ROUTINE(rx3270SetStringAt, rx3270SetStringAt), + // rx3270Popup + REXX_LAST_METHOD() }; @@ -137,6 +139,7 @@ RexxMethodEntry rx3270_methods[] = REXX_METHOD(rx3270_method_ds_trace, rx3270_method_ds_trace ), REXX_METHOD(rx3270_method_set_option, rx3270_method_set_option ), REXX_METHOD(rx3270_method_test, rx3270_method_test ), + REXX_METHOD(rx3270_method_wait_for_text_at, rx3270_method_wait_for_text_at ), REXX_LAST_METHOD() }; @@ -184,3 +187,21 @@ void rx3270::logva(const char *fmt, va_list args) vfprintf(stderr,fmt,args); #endif } + +int rx3270::wait_for_text_at(int row, int col, const char *key, int timeout) +{ + time_t end = time(0)+timeout; + + while(time(0) < end) + { + if(!is_connected()) + return ENOTCONN; + + if(!cmp_text_at(row,col,key)) + return 0; + + iterate(); + } + + return ETIMEDOUT; +} -- libgit2 0.21.2