Commit cb78e38cc7b83e685ce8b5ef2e2d2f103212dfa8

Authored by perry.werneck@gmail.com
1 parent 3061a0da

Implementando funções rexx

src/include/lib3270.h
@@ -468,6 +468,7 @@ @@ -468,6 +468,7 @@
468 */ 468 */
469 LIB3270_EXPORT int lib3270_set_string(H3270 *h, const unsigned char *str); 469 LIB3270_EXPORT int lib3270_set_string(H3270 *h, const unsigned char *str);
470 470
  471 + LIB3270_EXPORT int lib3270_set_string_at(H3270 *h, int row, int col, const unsigned char *str);
471 LIB3270_EXPORT void lib3270_input_string(H3270 *hSession, const unsigned char *str); 472 LIB3270_EXPORT void lib3270_input_string(H3270 *hSession, const unsigned char *str);
472 473
473 /** 474 /**
@@ -481,6 +482,8 @@ @@ -481,6 +482,8 @@
481 */ 482 */
482 LIB3270_EXPORT int lib3270_set_cursor_address(H3270 *h, int baddr); 483 LIB3270_EXPORT int lib3270_set_cursor_address(H3270 *h, int baddr);
483 484
  485 + LIB3270_EXPORT int lib3270_set_cursor_position(H3270 *h, int row, int col);
  486 +
484 /** 487 /**
485 * Move cursor 488 * Move cursor
486 * 489 *
src/lib3270/paste.c
@@ -161,34 +161,18 @@ @@ -161,34 +161,18 @@
161 } 161 }
162 162
163 return c; 163 return c;
164 - } 164 +}
165 165
166 -/**  
167 - * Set string at cursor position.  
168 - *  
169 - * @param hSession Session handle.  
170 - * @param str String to set  
171 - *  
172 - * @return Number of characters inserted; <0 in case of error.  
173 - *  
174 - */  
175 -LIB3270_EXPORT int lib3270_set_string(H3270 *hSession, const unsigned char *str) 166 +static int set_string(H3270 *hSession, const unsigned char *str)
176 { 167 {
177 PASTE_DATA data; 168 PASTE_DATA data;
178 unsigned char last = 1; 169 unsigned char last = 1;
179 170
180 - CHECK_SESSION_HANDLE(hSession);  
181 -  
182 memset(&data,0,sizeof(data)); 171 memset(&data,0,sizeof(data));
183 data.row = BA_TO_ROW(hSession->cursor_addr); 172 data.row = BA_TO_ROW(hSession->cursor_addr);
184 data.orig_addr = hSession->cursor_addr; 173 data.orig_addr = hSession->cursor_addr;
185 data.orig_col = BA_TO_COL(hSession->cursor_addr); 174 data.orig_col = BA_TO_COL(hSession->cursor_addr);
186 175
187 - if(hSession->kybdlock)  
188 - return -EINVAL;  
189 -  
190 - hSession->suspend(hSession);  
191 -  
192 while(*str && last && !hSession->kybdlock && hSession->cursor_addr >= data.orig_addr) 176 while(*str && last && !hSession->kybdlock && hSession->cursor_addr >= data.orig_addr)
193 { 177 {
194 switch(*str) 178 switch(*str)
@@ -234,9 +218,61 @@ LIB3270_EXPORT int lib3270_set_string(H3270 *hSession, const unsigned char *str) @@ -234,9 +218,61 @@ LIB3270_EXPORT int lib3270_set_string(H3270 *hSession, const unsigned char *str)
234 break; 218 break;
235 } 219 }
236 220
  221 + return data.qtd;
  222 +}
  223 +
  224 +LIB3270_EXPORT int lib3270_set_string_at(H3270 *hSession, int row, int col, const unsigned char *str)
  225 +{
  226 + int rc = -1;
  227 +
  228 + CHECK_SESSION_HANDLE(hSession);
  229 +
  230 + if(hSession->kybdlock)
  231 + return -EINVAL;
  232 +
  233 + if(hSession->selected && !lib3270_get_toggle(hSession,LIB3270_TOGGLE_KEEP_SELECTED))
  234 + lib3270_unselect(hSession);
  235 +
  236 + row--;
  237 + col--;
  238 +
  239 + if(row >= 0 && col >= 0 && row <= hSession->rows && col <= hSession->cols)
  240 + {
  241 + hSession->suspend(hSession);
  242 +
  243 + hSession->cursor_addr = (row * hSession->cols) + col;
  244 + rc = set_string(hSession, str);
  245 +
  246 + hSession->resume(hSession);
  247 + }
  248 +
  249 + return rc;
  250 +}
  251 +
  252 +
  253 +/**
  254 + * Set string at cursor position.
  255 + *
  256 + * @param hSession Session handle.
  257 + * @param str String to set
  258 + *
  259 + * @return Number of characters inserted; <0 in case of error.
  260 + *
  261 + */
  262 +LIB3270_EXPORT int lib3270_set_string(H3270 *hSession, const unsigned char *str)
  263 +{
  264 + int rc;
  265 +
  266 + CHECK_SESSION_HANDLE(hSession);
  267 +
  268 + if(hSession->kybdlock)
  269 + return -EINVAL;
  270 +
  271 + hSession->suspend(hSession);
  272 + rc = set_string(hSession, str);
237 hSession->resume(hSession); 273 hSession->resume(hSession);
238 274
239 - return data.qtd; 275 + return rc;
240 } 276 }
241 277
242 LIB3270_EXPORT int lib3270_paste(H3270 *h, const unsigned char *str) 278 LIB3270_EXPORT int lib3270_paste(H3270 *h, const unsigned char *str)
src/lib3270/screen.c
@@ -398,11 +398,36 @@ LIB3270_EXPORT int lib3270_set_cursor_address(H3270 *h, int baddr) @@ -398,11 +398,36 @@ LIB3270_EXPORT int lib3270_set_cursor_address(H3270 *h, int baddr)
398 return cursor_move(h,baddr); 398 return cursor_move(h,baddr);
399 } 399 }
400 400
401 -int cursor_move(H3270 *h, int baddr) 401 +LIB3270_EXPORT int lib3270_set_cursor_position(H3270 *h, int row, int col)
402 { 402 {
403 - int ret; 403 + int baddr = -1;
  404 +
  405 + CHECK_SESSION_HANDLE(h);
  406 +
  407 + if(h->selected && !lib3270_get_toggle(h,LIB3270_TOGGLE_KEEP_SELECTED))
  408 + lib3270_unselect(h);
  409 +
  410 + row--;
  411 + col--;
  412 +
  413 + if(row >= 0 && col >= 0 && row <= h->rows && col <= h->cols)
  414 + {
  415 + baddr = (row * h->cols) + col;
404 416
405 - ret = h->cursor_addr; 417 + if(baddr != h->cursor_addr)
  418 + {
  419 + h->cursor_addr = baddr;
  420 + h->update_cursor(h,(unsigned short) row,(unsigned short) col,h->text[baddr].chr,h->text[baddr].attr);
  421 + }
  422 + }
  423 +
  424 + return baddr;
  425 +}
  426 +
  427 +
  428 +int cursor_move(H3270 *h, int baddr)
  429 +{
  430 + int ret = h->cursor_addr;
406 431
407 if(ret == baddr) 432 if(ret == baddr)
408 return ret; 433 return ret;
src/plugins/rx3270/pluginmain.cc
@@ -34,10 +34,12 @@ @@ -34,10 +34,12 @@
34 34
35 LIB3270_EXPORT int pw3270_plugin_init(GtkWidget *window) 35 LIB3270_EXPORT int pw3270_plugin_init(GtkWidget *window)
36 { 36 {
  37 + rx3270_set_mode(RX3270_MODE_PLUGIN);
37 return 0; 38 return 0;
38 } 39 }
39 40
40 LIB3270_EXPORT int pw3270_plugin_deinit(GtkWidget *window) 41 LIB3270_EXPORT int pw3270_plugin_deinit(GtkWidget *window)
41 { 42 {
  43 + rx3270_set_mode(RX3270_MODE_UNDEFINED);
42 return 0; 44 return 0;
43 } 45 }
src/plugins/rx3270/rx3270.h
@@ -66,12 +66,19 @@ @@ -66,12 +66,19 @@
66 REXX_TYPED_ROUTINE_PROTOTYPE(rx3270IsTerminalReady); 66 REXX_TYPED_ROUTINE_PROTOTYPE(rx3270IsTerminalReady);
67 REXX_TYPED_ROUTINE_PROTOTYPE(rx3270ReadScreen); 67 REXX_TYPED_ROUTINE_PROTOTYPE(rx3270ReadScreen);
68 REXX_TYPED_ROUTINE_PROTOTYPE(rx3270queryStringAt); 68 REXX_TYPED_ROUTINE_PROTOTYPE(rx3270queryStringAt);
  69 + REXX_TYPED_ROUTINE_PROTOTYPE(rx3270SetStringAt);
69 70
70 /*---[ Globals ]---------------------------------------------------------------------------------------------*/ 71 /*---[ Globals ]---------------------------------------------------------------------------------------------*/
71 72
72 - #define RX3270SESSION lib3270_get_default_session_handle() 73 + enum rx3270mode
  74 + {
  75 + RX3270_MODE_STANDALONE, /**< Running outside pw3270's main process */
  76 + RX3270_MODE_PLUGIN, /**< Running inside pw3270's main process */
  77 +
  78 + RX3270_MODE_UNDEFINED
  79 + };
73 80
74 - char * get_contents(H3270 *hSession, int start, int sz); 81 + #define RX3270SESSION lib3270_get_default_session_handle()
75 82
76 #ifdef HAVE_ICONV 83 #ifdef HAVE_ICONV
77 extern iconv_t outputConv; 84 extern iconv_t outputConv;
@@ -80,4 +87,9 @@ @@ -80,4 +87,9 @@
80 87
81 /*--[ Prototipes ]-------------------------------------------------------------------------------------------*/ 88 /*--[ Prototipes ]-------------------------------------------------------------------------------------------*/
82 89
  90 + char * get_contents(H3270 *hSession, int start, int sz);
  91 + char * set_contents(H3270 *hSession, const char *text);
  92 +
  93 + LIB3270_EXPORT void rx3270_set_mode(enum rx3270mode mode);
  94 +
83 #endif // RX3270_H_INCLUDED 95 #endif // RX3270_H_INCLUDED
src/plugins/rx3270/rxapimain.cc
@@ -59,6 +59,8 @@ @@ -59,6 +59,8 @@
59 int librx3270_unloaded(void) __attribute__((destructor)); 59 int librx3270_unloaded(void) __attribute__((destructor));
60 #endif 60 #endif
61 61
  62 + static enum rx3270mode active_mode = RX3270_MODE_UNDEFINED;
  63 +
62 /*--[ Implement ]------------------------------------------------------------------------------------*/ 64 /*--[ Implement ]------------------------------------------------------------------------------------*/
63 65
64 #if defined WIN32 66 #if defined WIN32
@@ -80,8 +82,15 @@ BOOL WINAPI DllMain(HANDLE hinst, DWORD dwcallpurpose, LPVOID lpvResvd) @@ -80,8 +82,15 @@ BOOL WINAPI DllMain(HANDLE hinst, DWORD dwcallpurpose, LPVOID lpvResvd)
80 } 82 }
81 #endif 83 #endif
82 84
  85 +void rx3270_set_mode(enum rx3270mode mode)
  86 +{
  87 + active_mode = mode;
  88 +}
  89 +
83 int librx3270_loaded(void) 90 int librx3270_loaded(void)
84 { 91 {
  92 + active_mode = RX3270_MODE_STANDALONE;
  93 +
85 #ifdef HAVE_ICONV 94 #ifdef HAVE_ICONV
86 outputConv = iconv_open(REXX_DEFAULT_CHARSET, lib3270_get_default_charset()); 95 outputConv = iconv_open(REXX_DEFAULT_CHARSET, lib3270_get_default_charset());
87 inputConv = iconv_open(lib3270_get_default_charset(), REXX_DEFAULT_CHARSET); 96 inputConv = iconv_open(lib3270_get_default_charset(), REXX_DEFAULT_CHARSET);
@@ -92,6 +101,8 @@ int librx3270_loaded(void) @@ -92,6 +101,8 @@ int librx3270_loaded(void)
92 101
93 int librx3270_unloaded(void) 102 int librx3270_unloaded(void)
94 { 103 {
  104 + active_mode = RX3270_MODE_UNDEFINED;
  105 +
95 #ifdef HAVE_ICONV 106 #ifdef HAVE_ICONV
96 107
97 if(outputConv != (iconv_t) (-1)) 108 if(outputConv != (iconv_t) (-1))
@@ -104,42 +115,6 @@ int librx3270_unloaded(void) @@ -104,42 +115,6 @@ int librx3270_unloaded(void)
104 return 0; 115 return 0;
105 } 116 }
106 117
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 -*/  
142 -  
143 // now build the actual entry list 118 // now build the actual entry list
144 RexxRoutineEntry rx3270_functions[] = 119 RexxRoutineEntry rx3270_functions[] =
145 { 120 {
@@ -159,6 +134,7 @@ RexxRoutineEntry rx3270_functions[] = @@ -159,6 +134,7 @@ RexxRoutineEntry rx3270_functions[] =
159 REXX_TYPED_ROUTINE(rx3270IsTerminalReady, rx3270IsTerminalReady), 134 REXX_TYPED_ROUTINE(rx3270IsTerminalReady, rx3270IsTerminalReady),
160 REXX_TYPED_ROUTINE(rx3270ReadScreen, rx3270ReadScreen), 135 REXX_TYPED_ROUTINE(rx3270ReadScreen, rx3270ReadScreen),
161 REXX_TYPED_ROUTINE(rx3270queryStringAt, rx3270queryStringAt), 136 REXX_TYPED_ROUTINE(rx3270queryStringAt, rx3270queryStringAt),
  137 + REXX_TYPED_ROUTINE(rx3270SetStringAt, rx3270SetStringAt),
162 138
163 REXX_LAST_METHOD() 139 REXX_LAST_METHOD()
164 }; 140 };
src/plugins/rx3270/text.cc
@@ -79,3 +79,35 @@ char * get_contents(H3270 *hSession, int start, int sz) @@ -79,3 +79,35 @@ char * get_contents(H3270 *hSession, int start, int sz)
79 return strdup((char *) str); 79 return strdup((char *) str);
80 } 80 }
81 81
  82 +char * set_contents(H3270 *hSession, const char *str)
  83 +{
  84 +#ifdef HAVE_ICONV
  85 + // Convert received string to 3270 encoding
  86 + if(inputConv != (iconv_t)(-1))
  87 + {
  88 + size_t in = strlen(str);
  89 + size_t out = (in << 1);
  90 + char * ptr;
  91 + char * buffer = (char *) malloc(out);
  92 + char * ret;
  93 +
  94 + memset(ptr=buffer,0,out);
  95 +
  96 + iconv(inputConv,NULL,NULL,NULL,NULL); // Reset state
  97 +
  98 + if(iconv(inputConv,(char **) &str,&in,&ptr,&out) == ((size_t) -1))
  99 + ret = strdup(str);
  100 + else
  101 + ret = strdup(buffer);
  102 +
  103 + free(buffer);
  104 +
  105 + return ret;
  106 + }
  107 +#endif // HAVE_ICONV
  108 +
  109 + return strdup((char *) str);
  110 +
  111 +}
  112 +
  113 +
src/plugins/rx3270/typed_routines.cc
@@ -242,3 +242,52 @@ RexxRoutine3(int, rx3270queryStringAt, int, row, int, col, CSTRING, key) @@ -242,3 +242,52 @@ RexxRoutine3(int, rx3270queryStringAt, int, row, int, col, CSTRING, key)
242 return 0; 242 return 0;
243 } 243 }
244 244
  245 +RexxRoutine2(int, rx3270SetCursorPosition, int, row, int, col)
  246 +{
  247 + return lib3270_set_cursor_position(RX3270SESSION,row,col);
  248 +}
  249 +
  250 +RexxRoutine3(int, rx3270SetStringAt, int, row, int, col, CSTRING, text)
  251 +{
  252 + int rc;
  253 + H3270 * hSession = RX3270SESSION;
  254 + char * str = set_contents(hSession,text);
  255 +
  256 + if(str)
  257 + rc = lib3270_set_string_at(hSession,row,col,(const unsigned char *) str);
  258 + else
  259 + rc = -1;
  260 +
  261 + free(str);
  262 +
  263 + return rc;
  264 +}
  265 +
  266 +/*
  267 +::method RunMode
  268 +return rx3270QueryRunMode()
  269 +
  270 +::method 'encoding='
  271 + use arg ptr
  272 +return rx3270SetCharset(ptr)
  273 +
  274 +::method sendfile
  275 + use arg from, tostrncasecmp
  276 +
  277 + status = rx3270BeginFileSend(from,to)
  278 + if status <> 0
  279 + then return status
  280 +
  281 +return rx3270WaitForFTComplete()
  282 +
  283 +::method recvfile
  284 + use arg from, to
  285 +
  286 + status = rx3270BeginFileRecv(from,to)
  287 + if status <> 0
  288 + then return status
  289 +
  290 +return rx3270WaitForFTComplete()
  291 +*/
  292 +
  293 +