Commit 3061a0da2ccc57335d3ab547bda00ded2496fde2
1 parent
b3b06a9c
Exists in
master
and in
5 other branches
Incluindo funções para o plugin rexx
Showing
10 changed files
with
451 additions
and
24 deletions
Show diff stats
configure.ac
| ... | ... | @@ -51,6 +51,9 @@ AC_CONFIG_HEADER([src/include/lib3270/config.h]) |
| 51 | 51 | dnl Initialise automake stuff. |
| 52 | 52 | AM_INIT_AUTOMAKE |
| 53 | 53 | |
| 54 | +dnl Check for iconv | |
| 55 | +AM_ICONV | |
| 56 | + | |
| 54 | 57 | #--[ Check for tools & Libraries ]---------------------------------------------------------------------------------------------------------------------------- |
| 55 | 58 | |
| 56 | 59 | AC_PROG_CXX | ... | ... |
pw3270.cbp
| ... | ... | @@ -235,6 +235,8 @@ |
| 235 | 235 | <Unit filename="src/plugins/rx3270/pluginmain.cc" /> |
| 236 | 236 | <Unit filename="src/plugins/rx3270/rx3270.h" /> |
| 237 | 237 | <Unit filename="src/plugins/rx3270/rxapimain.cc" /> |
| 238 | + <Unit filename="src/plugins/rx3270/text.cc" /> | |
| 239 | + <Unit filename="src/plugins/rx3270/typed_routines.cc" /> | |
| 238 | 240 | <Unit filename="src/pw3270/Makefile.in" /> |
| 239 | 241 | <Unit filename="src/pw3270/actions.c"> |
| 240 | 242 | <Option compilerVar="CC" /> | ... | ... |
src/include/lib3270.h
| ... | ... | @@ -667,6 +667,9 @@ |
| 667 | 667 | LIB3270_EXPORT int lib3270_in_tn3270e(H3270 *h); |
| 668 | 668 | LIB3270_EXPORT int lib3270_in_e(H3270 *h); |
| 669 | 669 | |
| 670 | + #define lib3270_is_connected(h) lib3270_in_tn3270e(h) | |
| 671 | + #define lib3270_is_ready(h) lib3270_get_program_message(h) == LIB3270_MESSAGE_NONE | |
| 672 | + | |
| 670 | 673 | LIB3270_EXPORT LIB3270_SSL_STATE lib3270_get_secure(H3270 *session); |
| 671 | 674 | |
| 672 | 675 | |
| ... | ... | @@ -746,6 +749,8 @@ |
| 746 | 749 | */ |
| 747 | 750 | LIB3270_EXPORT const char * lib3270_get_charset(H3270 *session); |
| 748 | 751 | |
| 752 | + LIB3270_EXPORT const char * lib3270_get_default_charset(void); | |
| 753 | + | |
| 749 | 754 | /** |
| 750 | 755 | * Get selected area. |
| 751 | 756 | * | ... | ... |
src/include/lib3270/config.h.in
src/lib3270/charset.c
| ... | ... | @@ -726,10 +726,15 @@ void set_display_charset(H3270 *session, const char *dcs) |
| 726 | 726 | session->charset = strdup(dcs); |
| 727 | 727 | } |
| 728 | 728 | |
| 729 | +LIB3270_EXPORT const char * lib3270_get_default_charset(void) | |
| 730 | +{ | |
| 731 | + return "ISO-8859-1"; | |
| 732 | +} | |
| 733 | + | |
| 729 | 734 | LIB3270_EXPORT const char * lib3270_get_charset(H3270 *session) |
| 730 | 735 | { |
| 731 | 736 | CHECK_SESSION_HANDLE(session); |
| 732 | - return session->charset ? session->charset : "ISO-8859-1"; | |
| 737 | + return session->charset ? session->charset : lib3270_get_default_charset(); | |
| 733 | 738 | } |
| 734 | 739 | |
| 735 | 740 | static KeySym StringToKeysym(char *s) | ... | ... |
src/plugins/rx3270/Makefile.in
| ... | ... | @@ -29,7 +29,7 @@ |
| 29 | 29 | MODULE_NAME=rx3270 |
| 30 | 30 | DEPENDS=*.h ../../include/*.h ../../include/lib3270/*.h Makefile |
| 31 | 31 | PLUGIN_SRC=pluginmain.cc |
| 32 | -EXTAPI_SRC=rxapimain.cc | |
| 32 | +EXTAPI_SRC=rxapimain.cc text.cc typed_routines.cc | |
| 33 | 33 | |
| 34 | 34 | #---[ Tools ]------------------------------------------------------------------ |
| 35 | 35 | ... | ... |
src/plugins/rx3270/rx3270.h
| ... | ... | @@ -38,13 +38,45 @@ |
| 38 | 38 | #include <lib3270/log.h> |
| 39 | 39 | #include <oorexxapi.h> |
| 40 | 40 | |
| 41 | +#ifdef HAVE_ICONV | |
| 42 | + #include <iconv.h> | |
| 43 | +#endif | |
| 44 | + | |
| 45 | + | |
| 41 | 46 | /*---[ Exports ]---------------------------------------------------------------------------------------------*/ |
| 42 | 47 | |
| 43 | 48 | LIB3270_EXPORT RexxRoutineEntry rx3270_functions[]; |
| 44 | 49 | LIB3270_EXPORT RexxPackageEntry rx3270_package_entry; |
| 45 | 50 | |
| 51 | +/*---[ Rexx entry points ]-----------------------------------------------------------------------------------*/ | |
| 52 | + | |
| 53 | + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270version); | |
| 54 | + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270QueryCState); | |
| 55 | + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270Disconnect); | |
| 56 | + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270Connect); | |
| 57 | + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270isConnected); | |
| 58 | + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270WaitForEvents); | |
| 59 | + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270Sleep); | |
| 60 | + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270SendENTERKey); | |
| 61 | + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270SendPFKey); | |
| 62 | + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270SendPAKey); | |
| 63 | + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270WaitForTerminalReady); | |
| 64 | + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270WaitForStringAt); | |
| 65 | + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270GetStringAt); | |
| 66 | + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270IsTerminalReady); | |
| 67 | + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270ReadScreen); | |
| 68 | + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270queryStringAt); | |
| 69 | + | |
| 46 | 70 | /*---[ Globals ]---------------------------------------------------------------------------------------------*/ |
| 47 | 71 | |
| 72 | + #define RX3270SESSION lib3270_get_default_session_handle() | |
| 73 | + | |
| 74 | + char * get_contents(H3270 *hSession, int start, int sz); | |
| 75 | + | |
| 76 | +#ifdef HAVE_ICONV | |
| 77 | + extern iconv_t outputConv; | |
| 78 | + extern iconv_t inputConv; | |
| 79 | +#endif | |
| 48 | 80 | |
| 49 | 81 | /*--[ Prototipes ]-------------------------------------------------------------------------------------------*/ |
| 50 | 82 | ... | ... |
src/plugins/rx3270/rxapimain.cc
| ... | ... | @@ -36,15 +36,29 @@ |
| 36 | 36 | */ |
| 37 | 37 | |
| 38 | 38 | #include "rx3270.h" |
| 39 | + #include <lib3270/actions.h> | |
| 40 | + | |
| 41 | +#ifdef HAVE_ICONV | |
| 42 | + #include <iconv.h> | |
| 43 | +#endif | |
| 44 | + | |
| 45 | + #include <string.h> | |
| 39 | 46 | |
| 40 | 47 | #if defined WIN32 |
| 48 | + | |
| 49 | + #define REXX_DEFAULT_CHARSET "CP1252" | |
| 50 | + | |
| 41 | 51 | BOOL WINAPI DllMain(HANDLE hinst, DWORD dwcallpurpose, LPVOID lpvResvd); |
| 42 | 52 | static int librx3270_loaded(void); |
| 43 | 53 | static int librx3270_unloaded(void); |
| 44 | 54 | #else |
| 55 | + | |
| 56 | + #define REXX_DEFAULT_CHARSET "UTF-8" | |
| 57 | + | |
| 45 | 58 | int librx3270_loaded(void) __attribute__((constructor)); |
| 46 | 59 | int librx3270_unloaded(void) __attribute__((destructor)); |
| 47 | 60 | #endif |
| 61 | + | |
| 48 | 62 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 49 | 63 | |
| 50 | 64 | #if defined WIN32 |
| ... | ... | @@ -68,44 +82,84 @@ BOOL WINAPI DllMain(HANDLE hinst, DWORD dwcallpurpose, LPVOID lpvResvd) |
| 68 | 82 | |
| 69 | 83 | int librx3270_loaded(void) |
| 70 | 84 | { |
| 71 | - trace("%s %04x %s %s",__FUNCTION__,REXX_CURRENT_INTERPRETER_VERSION,__DATE__,__TIME__); | |
| 85 | +#ifdef HAVE_ICONV | |
| 86 | + outputConv = iconv_open(REXX_DEFAULT_CHARSET, lib3270_get_default_charset()); | |
| 87 | + inputConv = iconv_open(lib3270_get_default_charset(), REXX_DEFAULT_CHARSET); | |
| 88 | +#endif | |
| 89 | + | |
| 72 | 90 | return 0; |
| 73 | 91 | } |
| 74 | 92 | |
| 75 | 93 | int librx3270_unloaded(void) |
| 76 | 94 | { |
| 77 | - trace("%s",__FUNCTION__); | |
| 78 | - return 0; | |
| 79 | -} | |
| 95 | +#ifdef HAVE_ICONV | |
| 80 | 96 | |
| 81 | -RexxRoutine0(CSTRING, rx3270version) | |
| 82 | -{ | |
| 83 | - return lib3270_get_version(); | |
| 84 | -} | |
| 97 | + if(outputConv != (iconv_t) (-1)) | |
| 98 | + iconv_close(outputConv); | |
| 85 | 99 | |
| 86 | -RexxRoutine0(CSTRING, rx3270QueryCState) | |
| 87 | -{ | |
| 88 | - return ""; | |
| 89 | -} | |
| 100 | + if(inputConv != (iconv_t) (-1)) | |
| 101 | + iconv_close(inputConv); | |
| 102 | +#endif | |
| 90 | 103 | |
| 91 | -RexxRoutine0(int, rx3270Disconnect) | |
| 92 | -{ | |
| 93 | 104 | return 0; |
| 94 | 105 | } |
| 95 | 106 | |
| 96 | -RexxRoutine2(int, rx3270Connect, CSTRING, hostname, int, timeout) | |
| 97 | -{ | |
| 98 | - return 0; | |
| 99 | -} | |
| 100 | 107 | |
| 108 | +/* | |
| 109 | +::method setStringAt | |
| 110 | + use arg row, col, str | |
| 111 | +return rx3270InputString(row,col,str) | |
| 112 | + | |
| 113 | +::method setCursorPosition | |
| 114 | + use arg row, col | |
| 115 | +return rx3270SetCursorPosition(row,col) | |
| 116 | + | |
| 117 | +::method RunMode | |
| 118 | +return rx3270QueryRunMode() | |
| 119 | + | |
| 120 | +::method 'encoding=' | |
| 121 | + use arg ptr | |
| 122 | +return rx3270SetCharset(ptr) | |
| 123 | + | |
| 124 | +::method sendfile | |
| 125 | + use arg from, tostrncasecmp | |
| 126 | + | |
| 127 | + status = rx3270BeginFileSend(from,to) | |
| 128 | + if status <> 0 | |
| 129 | + then return status | |
| 130 | + | |
| 131 | +return rx3270WaitForFTComplete() | |
| 132 | + | |
| 133 | +::method recvfile | |
| 134 | + use arg from, to | |
| 135 | + | |
| 136 | + status = rx3270BeginFileRecv(from,to) | |
| 137 | + if status <> 0 | |
| 138 | + then return status | |
| 139 | + | |
| 140 | +return rx3270WaitForFTComplete() | |
| 141 | +*/ | |
| 101 | 142 | |
| 102 | 143 | // now build the actual entry list |
| 103 | 144 | RexxRoutineEntry rx3270_functions[] = |
| 104 | 145 | { |
| 105 | - REXX_TYPED_ROUTINE(rx3270version, rx3270version), | |
| 106 | - REXX_TYPED_ROUTINE(rx3270QueryCState, rx3270QueryCState), | |
| 107 | - REXX_TYPED_ROUTINE(rx3270Disconnect, rx3270Disconnect), | |
| 108 | - REXX_TYPED_ROUTINE(rx3270Connect, rx3270Connect), | |
| 146 | + REXX_TYPED_ROUTINE(rx3270version, rx3270version), | |
| 147 | + REXX_TYPED_ROUTINE(rx3270QueryCState, rx3270QueryCState), | |
| 148 | + REXX_TYPED_ROUTINE(rx3270Disconnect, rx3270Disconnect), | |
| 149 | + REXX_TYPED_ROUTINE(rx3270Connect, rx3270Connect), | |
| 150 | + REXX_TYPED_ROUTINE(rx3270isConnected, rx3270isConnected), | |
| 151 | + REXX_TYPED_ROUTINE(rx3270WaitForEvents, rx3270WaitForEvents), | |
| 152 | + REXX_TYPED_ROUTINE(rx3270Sleep, rx3270Sleep), | |
| 153 | + REXX_TYPED_ROUTINE(rx3270SendENTERKey, rx3270SendENTERKey), | |
| 154 | + REXX_TYPED_ROUTINE(rx3270SendPFKey, rx3270SendPFKey), | |
| 155 | + REXX_TYPED_ROUTINE(rx3270SendPAKey, rx3270SendPAKey), | |
| 156 | + REXX_TYPED_ROUTINE(rx3270WaitForTerminalReady, rx3270WaitForTerminalReady), | |
| 157 | + REXX_TYPED_ROUTINE(rx3270WaitForStringAt, rx3270WaitForStringAt), | |
| 158 | + REXX_TYPED_ROUTINE(rx3270GetStringAt, rx3270GetStringAt), | |
| 159 | + REXX_TYPED_ROUTINE(rx3270IsTerminalReady, rx3270IsTerminalReady), | |
| 160 | + REXX_TYPED_ROUTINE(rx3270ReadScreen, rx3270ReadScreen), | |
| 161 | + REXX_TYPED_ROUTINE(rx3270queryStringAt, rx3270queryStringAt), | |
| 162 | + | |
| 109 | 163 | REXX_LAST_METHOD() |
| 110 | 164 | }; |
| 111 | 165 | ... | ... |
| ... | ... | @@ -0,0 +1,81 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | + * | |
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | + * | |
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | + * Free Software Foundation. | |
| 11 | + * | |
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | + * obter mais detalhes. | |
| 16 | + * | |
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | |
| 19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | |
| 20 | + * | |
| 21 | + * Este programa está nomeado como text.cc e possui - linhas de código. | |
| 22 | + * | |
| 23 | + * Contatos: | |
| 24 | + * | |
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 27 | + * | |
| 28 | + */ | |
| 29 | + | |
| 30 | + #include "rx3270.h" | |
| 31 | + #include <lib3270/actions.h> | |
| 32 | + | |
| 33 | + #include <string.h> | |
| 34 | + | |
| 35 | + | |
| 36 | +/*--[ Globals ]--------------------------------------------------------------------------------------*/ | |
| 37 | + | |
| 38 | +#ifdef HAVE_ICONV | |
| 39 | + iconv_t outputConv = (iconv_t) (-1); | |
| 40 | + iconv_t inputConv = (iconv_t) (-1); | |
| 41 | +#endif | |
| 42 | + | |
| 43 | +/*--[ Implement ]------------------------------------------------------------------------------------*/ | |
| 44 | + | |
| 45 | +char * get_contents(H3270 *hSession, int start, int sz) | |
| 46 | +{ | |
| 47 | + unsigned char str[sz+1]; | |
| 48 | + unsigned short attr[sz+1]; | |
| 49 | + | |
| 50 | + if(!lib3270_get_contents(hSession,start,start+sz,str,attr)) | |
| 51 | + return NULL; | |
| 52 | + | |
| 53 | +#ifdef HAVE_ICONV | |
| 54 | + // Convert received string to rexx encoding | |
| 55 | + if(outputConv != (iconv_t)(-1)) | |
| 56 | + { | |
| 57 | + size_t in = strlen((char *) str); | |
| 58 | + size_t out = (in << 1); | |
| 59 | + char *ptr; | |
| 60 | + char *buffer = (char *) malloc(out); | |
| 61 | + char *ret; | |
| 62 | + | |
| 63 | + memset(ptr=buffer,0,out); | |
| 64 | + | |
| 65 | + iconv(outputConv,NULL,NULL,NULL,NULL); // Reset state | |
| 66 | + | |
| 67 | + if(iconv(outputConv,(char **) &str,&in,&ptr,&out) == ((size_t) -1)) | |
| 68 | + ret = strdup((char *) str); | |
| 69 | + else | |
| 70 | + ret = strdup(buffer); | |
| 71 | + | |
| 72 | + free(buffer); | |
| 73 | + | |
| 74 | + return ret; | |
| 75 | + } | |
| 76 | + | |
| 77 | +#endif // HAVE_ICONV | |
| 78 | + | |
| 79 | + return strdup((char *) str); | |
| 80 | +} | |
| 81 | + | ... | ... |
| ... | ... | @@ -0,0 +1,244 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | + * | |
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | + * | |
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | + * Free Software Foundation. | |
| 11 | + * | |
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | + * obter mais detalhes. | |
| 16 | + * | |
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | |
| 19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | |
| 20 | + * | |
| 21 | + * Este programa está nomeado como text.cc e possui - linhas de código. | |
| 22 | + * | |
| 23 | + * Contatos: | |
| 24 | + * | |
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 27 | + * | |
| 28 | + */ | |
| 29 | + | |
| 30 | + #include "rx3270.h" | |
| 31 | + #include <lib3270/actions.h> | |
| 32 | + | |
| 33 | + #include <string.h> | |
| 34 | + | |
| 35 | +/*--[ Implement ]------------------------------------------------------------------------------------*/ | |
| 36 | + | |
| 37 | +RexxRoutine0(CSTRING, rx3270version) | |
| 38 | +{ | |
| 39 | + return lib3270_get_version(); | |
| 40 | +} | |
| 41 | + | |
| 42 | +RexxRoutine0(CSTRING, rx3270QueryCState) | |
| 43 | +{ | |
| 44 | + #define DECLARE_XLAT_STATE( x ) { x, #x } | |
| 45 | + | |
| 46 | + static const struct _xlat_state | |
| 47 | + { | |
| 48 | + LIB3270_CSTATE state; | |
| 49 | + const char * ret; | |
| 50 | + } xlat_state[] = | |
| 51 | + { | |
| 52 | + { LIB3270_NOT_CONNECTED, "NOT_CONNECTED" }, | |
| 53 | + { LIB3270_RESOLVING, "RESOLVING" }, | |
| 54 | + { LIB3270_PENDING, "PENDING" }, | |
| 55 | + { LIB3270_CONNECTED_INITIAL, "CONNECTED_INITIAL" }, | |
| 56 | + { LIB3270_CONNECTED_ANSI, "CONNECTED_ANSI" }, | |
| 57 | + { LIB3270_CONNECTED_3270, "CONNECTED_3270" }, | |
| 58 | + { LIB3270_CONNECTED_INITIAL_E, "CONNECTED_INITIAL_E" }, | |
| 59 | + { LIB3270_CONNECTED_NVT, "CONNECTED_NVT" }, | |
| 60 | + { LIB3270_CONNECTED_SSCP, "CONNECTED_SSCP" }, | |
| 61 | + { LIB3270_CONNECTED_TN3270E, "CONNECTED_TN3270E" }, | |
| 62 | + }; | |
| 63 | + | |
| 64 | + size_t f; | |
| 65 | + LIB3270_CSTATE state; | |
| 66 | + | |
| 67 | + state = lib3270_get_connection_state(RX3270SESSION); | |
| 68 | + | |
| 69 | + for(f=0;f < (sizeof(xlat_state)/sizeof(struct _xlat_state)); f++) | |
| 70 | + { | |
| 71 | + if(state == xlat_state[f].state) | |
| 72 | + return xlat_state[f].ret; | |
| 73 | + } | |
| 74 | + | |
| 75 | + return "UNEXPECTED"; | |
| 76 | +} | |
| 77 | + | |
| 78 | +RexxRoutine0(int, rx3270Disconnect) | |
| 79 | +{ | |
| 80 | + lib3270_disconnect(RX3270SESSION); | |
| 81 | + return 0; | |
| 82 | +} | |
| 83 | + | |
| 84 | +RexxRoutine2(int, rx3270Connect, CSTRING, hostname, int, wait) | |
| 85 | +{ | |
| 86 | + return lib3270_connect(RX3270SESSION, hostname, wait); | |
| 87 | +} | |
| 88 | + | |
| 89 | +RexxRoutine0(int, rx3270isConnected) | |
| 90 | +{ | |
| 91 | + return lib3270_is_connected(RX3270SESSION) ? 1 : 0; | |
| 92 | +} | |
| 93 | + | |
| 94 | +RexxRoutine0(int, rx3270WaitForEvents) | |
| 95 | +{ | |
| 96 | + H3270 * hSession = RX3270SESSION; | |
| 97 | + | |
| 98 | + if(!lib3270_is_connected(hSession)) | |
| 99 | + return ENOTCONN; | |
| 100 | + | |
| 101 | + lib3270_main_iterate(hSession,1); | |
| 102 | + | |
| 103 | + return 0; | |
| 104 | +} | |
| 105 | + | |
| 106 | +RexxRoutine1(int, rx3270Sleep, int, seconds) | |
| 107 | +{ | |
| 108 | + return lib3270_wait(RX3270SESSION,seconds); | |
| 109 | +} | |
| 110 | + | |
| 111 | +RexxRoutine0(int, rx3270SendENTERKey) | |
| 112 | +{ | |
| 113 | + return lib3270_enter(RX3270SESSION); | |
| 114 | +} | |
| 115 | + | |
| 116 | +RexxRoutine1(int, rx3270SendPFKey, int, key) | |
| 117 | +{ | |
| 118 | + return lib3270_pfkey(RX3270SESSION,key); | |
| 119 | +} | |
| 120 | + | |
| 121 | +RexxRoutine1(int, rx3270SendPAKey, int, key) | |
| 122 | +{ | |
| 123 | + return lib3270_pakey(RX3270SESSION,key); | |
| 124 | +} | |
| 125 | + | |
| 126 | +RexxRoutine1(int, rx3270WaitForTerminalReady, int, seconds) | |
| 127 | +{ | |
| 128 | + return lib3270_wait_for_ready(RX3270SESSION,seconds); | |
| 129 | +} | |
| 130 | + | |
| 131 | +RexxRoutine4(int, rx3270WaitForStringAt, int, row, int, col, CSTRING, key, int, timeout) | |
| 132 | +{ | |
| 133 | + H3270 * hSession = RX3270SESSION; | |
| 134 | + time_t end = time(0) + timeout; | |
| 135 | + int sz = strlen(key); | |
| 136 | + int rows; | |
| 137 | + int cols; | |
| 138 | + int start; | |
| 139 | + | |
| 140 | + lib3270_get_screen_size(hSession,&rows,&cols); | |
| 141 | + | |
| 142 | + if(row < 0 || row > rows || col < 0 || col > cols) | |
| 143 | + return EINVAL; | |
| 144 | + | |
| 145 | + start = ((row) * cols) + col; | |
| 146 | + | |
| 147 | + while(time(0) < end) | |
| 148 | + { | |
| 149 | + if(!lib3270_is_connected(hSession)) | |
| 150 | + { | |
| 151 | + return ENOTCONN; | |
| 152 | + } | |
| 153 | + else if(lib3270_is_ready(hSession)) | |
| 154 | + { | |
| 155 | + char *buffer = get_contents(hSession, start, start+sz); | |
| 156 | + if(buffer) | |
| 157 | + { | |
| 158 | + int rc = strncasecmp((const char *) buffer,key,sz); | |
| 159 | + free(buffer); | |
| 160 | + if(rc == 0) | |
| 161 | + return 0; | |
| 162 | + } | |
| 163 | + } | |
| 164 | + | |
| 165 | + lib3270_main_iterate(hSession,1); | |
| 166 | + | |
| 167 | + } | |
| 168 | + | |
| 169 | + return ETIMEDOUT; | |
| 170 | + | |
| 171 | +} | |
| 172 | + | |
| 173 | +RexxRoutine3(RexxStringObject, rx3270GetStringAt, int, row, int, col, int, sz) | |
| 174 | +{ | |
| 175 | + H3270 * hSession = RX3270SESSION; | |
| 176 | + int rows; | |
| 177 | + int cols; | |
| 178 | + char * text; | |
| 179 | + | |
| 180 | + lib3270_get_screen_size(hSession,&rows,&cols); | |
| 181 | + | |
| 182 | + text = get_contents(hSession, ((row) * cols) + col, sz); | |
| 183 | + if(text) | |
| 184 | + { | |
| 185 | + RexxStringObject ret = context->String((CSTRING) text); | |
| 186 | + free(text); | |
| 187 | + return ret; | |
| 188 | + } | |
| 189 | + | |
| 190 | + return context->String(""); | |
| 191 | +} | |
| 192 | + | |
| 193 | +RexxRoutine0(int, rx3270IsTerminalReady) | |
| 194 | +{ | |
| 195 | + return lib3270_is_ready(RX3270SESSION); | |
| 196 | +} | |
| 197 | + | |
| 198 | +RexxRoutine3(RexxStringObject, rx3270ReadScreen, OPTIONAL_int, row, OPTIONAL_int, col, OPTIONAL_int, sz) | |
| 199 | +{ | |
| 200 | + H3270 * hSession = RX3270SESSION; | |
| 201 | + int rows; | |
| 202 | + int cols; | |
| 203 | + char * text; | |
| 204 | + int start; | |
| 205 | + | |
| 206 | + lib3270_get_screen_size(hSession,&rows,&cols); | |
| 207 | + | |
| 208 | + start = (row * cols) + col; | |
| 209 | + | |
| 210 | + if(sz == 0) | |
| 211 | + sz = (rows*cols) - start; | |
| 212 | + | |
| 213 | + text = get_contents(hSession, start, sz); | |
| 214 | + if(text) | |
| 215 | + { | |
| 216 | + RexxStringObject ret = context->String((CSTRING) text); | |
| 217 | + free(text); | |
| 218 | + return ret; | |
| 219 | + } | |
| 220 | + | |
| 221 | + return context->String(""); | |
| 222 | +} | |
| 223 | + | |
| 224 | +RexxRoutine3(int, rx3270queryStringAt, int, row, int, col, CSTRING, key) | |
| 225 | +{ | |
| 226 | + H3270 * hSession = RX3270SESSION; | |
| 227 | + int rows; | |
| 228 | + int cols; | |
| 229 | + char * text; | |
| 230 | + size_t sz = strlen(key); | |
| 231 | + | |
| 232 | + lib3270_get_screen_size(hSession,&rows,&cols); | |
| 233 | + | |
| 234 | + text = get_contents(hSession, (row * cols) + col, sz); | |
| 235 | + if(text) | |
| 236 | + { | |
| 237 | + int rc = strncasecmp(text,key,sz); | |
| 238 | + free(text); | |
| 239 | + return rc; | |
| 240 | + } | |
| 241 | + | |
| 242 | + return 0; | |
| 243 | +} | |
| 244 | + | ... | ... |