diff --git a/src/include/lib3270.h b/src/include/lib3270.h index 2140152..7dae17e 100644 --- a/src/include/lib3270.h +++ b/src/include/lib3270.h @@ -571,9 +571,9 @@ * @param h Session handle. * @param ix Toggle id. * @param value New toggle state (non zero for true). - * + * * @returns 0 if the toggle is already at the state, 1 if the toggle was changed; < 0 on invalid toggle id */ - LIB3270_EXPORT void lib3270_set_toggle(H3270 *h, LIB3270_TOGGLE ix, int value); + LIB3270_EXPORT int lib3270_set_toggle(H3270 *h, LIB3270_TOGGLE ix, int value); /** * Translate a string toggle name to the corresponding value. diff --git a/src/include/pw3270/ipcpackets.h b/src/include/pw3270/ipcpackets.h index 67a4ee2..e8c62a4 100644 --- a/src/include/pw3270/ipcpackets.h +++ b/src/include/pw3270/ipcpackets.h @@ -49,7 +49,7 @@ HLLAPI_PACKET_ERASE_EOF, HLLAPI_PACKET_PRINT, HLLAPI_PACKET_GET_CSTATE, - HLLAPI_PACKET_IS_READY, + HLLAPI_PACKET_IS_READY, HLLAPI_PACKET_SET_TOGGLE, HLLAPI_PACKET_INVALID @@ -149,6 +149,11 @@ struct hllapi_packet_emulate_input unsigned char pasting; char text[1]; }; + struct hllapi_packet_set +{ + unsigned char packet_id; + unsigned short id; unsigned short value; +}; #pragma pack() diff --git a/src/lib3270/toggles.c b/src/lib3270/toggles.c index 25c3dc0..7e260f3 100644 --- a/src/lib3270/toggles.c +++ b/src/lib3270/toggles.c @@ -105,25 +105,22 @@ static void toggle_notify(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGG session->update_toggle(session,ix,t->value,TT_INTERACTIVE,toggle_names[ix]); } - -LIB3270_EXPORT void lib3270_set_toggle(H3270 *session, LIB3270_TOGGLE ix, int value) + LIB3270_EXPORT int lib3270_set_toggle(H3270 *session, LIB3270_TOGGLE ix, int value) { - char v = value ? True : False; - struct lib3270_toggle * t; + char v = value ? True : False; struct lib3270_toggle * t; CHECK_SESSION_HANDLE(session); if(ix < 0 || ix >= LIB3270_TOGGLE_COUNT) - return; + return -EINVAL; t = &session->toggle[ix]; if(v == t->value) - return; - - t->value = v; + return 0; + t->value = v; - toggle_notify(session,t,ix); + toggle_notify(session,t,ix); return 1; } LIB3270_EXPORT int lib3270_toggle(H3270 *session, LIB3270_TOGGLE ix) diff --git a/src/plugins/dbus3270/gobject.c b/src/plugins/dbus3270/gobject.c index 7e4f49e..8cf18f8 100644 --- a/src/plugins/dbus3270/gobject.c +++ b/src/plugins/dbus3270/gobject.c @@ -279,8 +279,7 @@ void pw3270_dbus_get_text_at(PW3270Dbus *object, int row, int col, int len, DBus void pw3270_dbus_set_toggle(PW3270Dbus *object, int id, int value, DBusGMethodInvocation *context) { trace("%s object=%p context=%p",__FUNCTION__,object,context); - lib3270_set_toggle(pw3270_dbus_get_session_handle(object),id,value); - dbus_g_method_return(context,0); + dbus_g_method_return(context,lib3270_set_toggle(pw3270_dbus_get_session_handle(object),id,value)); } void pw3270_dbus_cmp_text_at(PW3270Dbus *object, int row, int col, const gchar *utftext, DBusGMethodInvocation *context) diff --git a/src/plugins/hllapi/pluginmain.c b/src/plugins/hllapi/pluginmain.c index 6ce3fdd..5add30c 100644 --- a/src/plugins/hllapi/pluginmain.c +++ b/src/plugins/hllapi/pluginmain.c @@ -274,7 +274,9 @@ case HLLAPI_PACKET_GET_CSTATE: send_result(source,lib3270_get_connection_state(lib3270_get_default_session_handle())); break; - + case HLLAPI_PACKET_SET_TOGGLE: + send_result(source,lib3270_set_toggle(lib3270_get_default_session_handle(), + ((struct hllapi_packet_set *) source->buffer)->id, ((struct hllapi_packet_set *) source->buffer)->value)); break; default: send_result(source, EINVAL); g_message("Invalid remote request (id=%d)",source->buffer[0]); diff --git a/src/plugins/rx3270/local.cc b/src/plugins/rx3270/local.cc index 25eef56..6585d64 100644 --- a/src/plugins/rx3270/local.cc +++ b/src/plugins/rx3270/local.cc @@ -68,13 +68,14 @@ int wait(int seconds); int wait_for_ready(int seconds); + char * get_text(int baddr, size_t len); char * get_text_at(int row, int col, size_t sz); int cmp_text_at(int row, int col, const char *text); int set_text_at(int row, int col, const char *str); int set_cursor_position(int row, int col); - void set_toggle(LIB3270_TOGGLE ix, bool value); + int set_toggle(LIB3270_TOGGLE ix, bool value); int enter(void); int pfkey(int key); @@ -93,12 +94,13 @@ int (*_pfkey)(H3270 *hSession, int key); int (*_pakey)(H3270 *hSession, int key); int (*_wait_for_ready)(H3270 *hSession, int seconds); + char * (*_get_text)(H3270 *h, int offset, int len); char * (*_get_text_at)(H3270 *h, int row, int col, int len); int (*_cmp_text_at)(H3270 *h, int row, int col, const char *text); int (*_set_text_at)(H3270 *h, int row, int col, const unsigned char *str); int (*_is_ready)(H3270 *h); int (*_set_cursor_position)(H3270 *h, int row, int col); - void (*_set_toggle)(H3270 *h, LIB3270_TOGGLE ix, int value); + int (*_set_toggle)(H3270 *h, LIB3270_TOGGLE ix, int value); #ifdef WIN32 HMODULE hModule; @@ -283,6 +285,7 @@ dynamic::dynamic() { (void **) & _pfkey, "lib3270_pfkey" }, { (void **) & _pakey, "lib3270_pakey" }, { (void **) & _wait_for_ready, "lib3270_wait_for_ready" }, + { (void **) & _get_text, "lib3270_get_text" }, { (void **) & _get_text_at, "lib3270_get_text_at" }, { (void **) & _cmp_text_at, "lib3270_cmp_text_at" }, { (void **) & _set_text_at, "lib3270_set_string_at" }, @@ -505,6 +508,13 @@ int dynamic::wait_for_ready(int seconds) return _wait_for_ready(hSession,seconds); } +char * dynamic::get_text(int offset, size_t len) +{ + if(!hModule) + return NULL; + return _get_text(hSession,offset,len); +} + char * dynamic::get_text_at(int row, int col, size_t sz) { if(!hModule) @@ -554,8 +564,9 @@ int dynamic::pakey(int key) return _pakey(hSession,key); } -void dynamic::set_toggle(LIB3270_TOGGLE ix, bool value) +int dynamic::set_toggle(LIB3270_TOGGLE ix, bool value) { if(hModule) - _set_toggle(hSession,ix,(int) value); + return _set_toggle(hSession,ix,(int) value); + return -1; } diff --git a/src/plugins/rx3270/pluginmain.cc b/src/plugins/rx3270/pluginmain.cc index 8a76799..4dbc536 100644 --- a/src/plugins/rx3270/pluginmain.cc +++ b/src/plugins/rx3270/pluginmain.cc @@ -53,13 +53,14 @@ int wait(int seconds); int wait_for_ready(int seconds); + char * get_text(int baddr, size_t len); char * get_text_at(int row, int col, size_t sz); int cmp_text_at(int row, int col, const char *text); int set_text_at(int row, int col, const char *str); int set_cursor_position(int row, int col); - void set_toggle(LIB3270_TOGGLE ix, bool value); + int set_toggle(LIB3270_TOGGLE ix, bool value); int enter(void); int pfkey(int key); @@ -183,12 +184,17 @@ return lib3270_set_cursor_position(hSession,row,col); } - void plugin::set_toggle(LIB3270_TOGGLE ix, bool value) + int plugin::set_toggle(LIB3270_TOGGLE ix, bool value) { - lib3270_set_toggle(hSession,ix,(int) value); + return lib3270_set_toggle(hSession,ix,(int) value); } void plugin::logva(const char *fmt, va_list args) { lib3270_write_va_log(hSession,"REXX",fmt,args); } + + char * plugin::get_text(int baddr, size_t len) + { + return lib3270_get_text(hSession,baddr,len); + } diff --git a/src/plugins/rx3270/remote.cc b/src/plugins/rx3270/remote.cc index 8b4a2d4..eff0203 100644 --- a/src/plugins/rx3270/remote.cc +++ b/src/plugins/rx3270/remote.cc @@ -61,6 +61,7 @@ int wait(int seconds); int wait_for_ready(int seconds); + char * get_text(int baddr, size_t len); char * get_text_at(int row, int col, size_t sz); int cmp_text_at(int row, int col, const char *text); int set_text_at(int row, int col, const char *str); @@ -69,7 +70,7 @@ int set_cursor_position(int row, int col); - void set_toggle(LIB3270_TOGGLE ix, bool value); + int set_toggle(LIB3270_TOGGLE ix, bool value); int enter(void); int pfkey(int key); @@ -910,13 +911,17 @@ int remote::pakey(int key) return -1; } -void remote::set_toggle(LIB3270_TOGGLE ix, bool value) +int remote::set_toggle(LIB3270_TOGGLE ix, bool value) { #if defined(WIN32) if(hPipe != INVALID_HANDLE_VALUE) { - #warning Implementar + struct hllapi_packet_set query = { HLLAPI_PACKET_SET_TOGGLE, (unsigned short) ix, (unsigned short) value }; + struct hllapi_packet_result response; + DWORD cbSize = sizeof(query); + TransactNamedPipe(hPipe,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); + return response.rc; } #elif defined(HAVE_DBUS) @@ -928,12 +933,12 @@ void remote::set_toggle(LIB3270_TOGGLE ix, bool value) if(msg) { dbus_message_append_args(msg, DBUS_TYPE_INT32, &i, DBUS_TYPE_INT32, &v, DBUS_TYPE_INVALID); - get_intval(call(msg)); + return get_intval(call(msg)); } - #endif + return -1; } int remote::wait_for_text_at(int row, int col, const char *key, int timeout) @@ -957,3 +962,9 @@ int remote::wait_for_text_at(int row, int col, const char *key, int timeout) return ETIMEDOUT; } + +char * remote::get_text(int baddr, size_t len) +{ + #warning IMPLEMENTAR + return NULL; +} diff --git a/src/plugins/rx3270/rexx_methods.cc b/src/plugins/rx3270/rexx_methods.cc index e26356c..967fc68 100644 --- a/src/plugins/rx3270/rexx_methods.cc +++ b/src/plugins/rx3270/rexx_methods.cc @@ -338,3 +338,22 @@ RexxMethod5(int, rx3270_method_wait_for_text_at, CSELF, sessionPtr, int, row, in return -1; } +RexxMethod3(RexxStringObject, rx3270_method_get_text, CSELF, sessionPtr, OPTIONAL_int, baddr, OPTIONAL_int, sz) +{ + rx3270 * hSession = (rx3270 *) sessionPtr; + + if(hSession) + { + char *str = hSession->get_text(baddr,sz > 0 ? sz : -1); + if(str) + { + char * text = hSession->get_local_string(str); + RexxStringObject ret = context->String((CSTRING) text); + free(str); + free(text); + return ret; + } + } + + return context->String(""); +} diff --git a/src/plugins/rx3270/rx3270.cls b/src/plugins/rx3270/rx3270.cls index 8b2eef6..e23dbbc 100644 --- a/src/plugins/rx3270/rx3270.cls +++ b/src/plugins/rx3270/rx3270.cls @@ -64,25 +64,28 @@ ::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 GET EXTERNAL "LIBRARY rx3270 rx3270_method_get_text" ::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 getScreenContent +return self~get() ::method queryStringAt use arg row, col, key @@ -104,7 +107,7 @@ return self~SetTextAt(row,col,str) return self~GetTextAt(row,col,size) ::method sendEnterKey -return self~Enter() +return self~enter() ::method sendPFKey use arg key diff --git a/src/plugins/rx3270/rx3270.h b/src/plugins/rx3270/rx3270.h index 760ee4c..c382a70 100644 --- a/src/plugins/rx3270/rx3270.h +++ b/src/plugins/rx3270/rx3270.h @@ -95,7 +95,7 @@ REXX_METHOD_PROTOTYPE(rx3270_method_set_cursor); REXX_METHOD_PROTOTYPE(rx3270_method_enter); REXX_METHOD_PROTOTYPE(rx3270_method_pfkey); - REXX_METHOD_PROTOTYPE(rx3270_method_pakey); + REXX_METHOD_PROTOTYPE(rx3270_method_pakey); REXX_METHOD_PROTOTYPE(rx3270_method_get_text); REXX_METHOD_PROTOTYPE(rx3270_method_get_text_at); REXX_METHOD_PROTOTYPE(rx3270_method_set_text_at); REXX_METHOD_PROTOTYPE(rx3270_method_cmp_text_at); @@ -157,13 +157,13 @@ 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; + virtual int set_toggle(LIB3270_TOGGLE ix, bool value) = 0; virtual int enter(void) = 0; virtual int pfkey(int key) = 0; virtual int pakey(int key) = 0; - virtual char * get_text_at(int row, int col, size_t sz) = 0; + virtual char * get_text_at(int row, int col, size_t sz) = 0; virtual char * get_text(int baddr, size_t len) = 0; virtual int cmp_text_at(int row, int col, const char *text) = 0; virtual int set_text_at(int row, int col, const char *str) = 0; diff --git a/src/plugins/rx3270/rxapimain.cc b/src/plugins/rx3270/rxapimain.cc index d2a5bad..93fb933 100644 --- a/src/plugins/rx3270/rxapimain.cc +++ b/src/plugins/rx3270/rxapimain.cc @@ -36,6 +36,7 @@ */ #include "rx3270.h" + #include #include #ifdef HAVE_SYSLOG @@ -131,6 +132,7 @@ RexxMethodEntry rx3270_methods[] = REXX_METHOD(rx3270_method_enter, rx3270_method_enter ), REXX_METHOD(rx3270_method_pfkey, rx3270_method_pfkey ), REXX_METHOD(rx3270_method_pakey, rx3270_method_pakey ), + REXX_METHOD(rx3270_method_get_text, rx3270_method_get_text ), REXX_METHOD(rx3270_method_get_text_at, rx3270_method_get_text_at ), REXX_METHOD(rx3270_method_set_text_at, rx3270_method_set_text_at ), REXX_METHOD(rx3270_method_cmp_text_at, rx3270_method_cmp_text_at ), diff --git a/src/plugins/rx3270/text.cc b/src/plugins/rx3270/text.cc index 62417a3..1d7c141 100644 --- a/src/plugins/rx3270/text.cc +++ b/src/plugins/rx3270/text.cc @@ -43,7 +43,7 @@ char * rx3270::get_3270_string(const char *str) size_t out = (in << 1); char *ptr; char *buffer = (char *) malloc(out); - char *ret; + char *ret; memset(ptr=buffer,0,out); -- libgit2 0.21.2