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 | + | ... | ... |