Commit 52892e7f008b05d18571bfb055b8d957728b6d84

Authored by Perry Werneck
1 parent 59e8fd70
Exists in master and in 1 other branch develop

Updating HLLAPI support library.

src/core/calls.cc
@@ -128,23 +128,15 @@ @@ -128,23 +128,15 @@
128 128
129 try { 129 try {
130 130
131 - TN3270::Host & session = getSession();  
132 -  
133 - if(!session.isConnected()) {  
134 - hllapi_lasterror = strerror(ENOTCONN);  
135 - return HLLAPI_STATUS_DISCONNECTED;  
136 - }  
137 -  
138 - return (DWORD) session.getProgramMessage(); 131 + return (DWORD) getSession().getProgramMessage();
139 132
140 } catch(std::exception &e) { 133 } catch(std::exception &e) {
141 134
142 hllapi_lasterror = e.what(); 135 hllapi_lasterror = e.what();
143 - return HLLAPI_STATUS_SYSTEM_ERROR;  
144 136
145 } 137 }
146 138
147 - return HLLAPI_STATUS_SUCCESS; 139 + return -1;
148 140
149 } 141 }
150 142
@@ -251,14 +243,7 @@ @@ -251,14 +243,7 @@
251 243
252 try { 244 try {
253 245
254 - TN3270::Host &host = getSession();  
255 -  
256 - if(!host.isConnected())  
257 - return HLLAPI_STATUS_DISCONNECTED;  
258 -  
259 - string contents = host.toString(row, col, strlen(text), 0);  
260 -  
261 - return strncmp(contents.c_str(),text,strlen(text)); 246 + return getSession().compare((unsigned int) row, (unsigned int) col, text);
262 247
263 } catch(std::exception &e) { 248 } catch(std::exception &e) {
264 249
@@ -270,27 +255,34 @@ @@ -270,27 +255,34 @@
270 255
271 } 256 }
272 257
273 - HLLAPI_API_CALL hllapi_find_text(LPSTR text) { 258 + HLLAPI_API_CALL hllapi_cmp_text_at_address(WORD addr, LPSTR text) {
274 259
275 try { 260 try {
276 261
277 - TN3270::Host &host = getSession(); 262 + return getSession().compare((int) addr, text);
278 263
279 - if(!host.isConnected()) {  
280 - hllapi_lasterror = "Not connected";  
281 - return -1;  
282 - } 264 + } catch(std::exception &e) {
283 265
284 - string contents = host.toString(0,-1,'\0'); 266 + hllapi_lasterror = e.what();
285 267
286 - size_t pos = contents.find(text); 268 + }
287 269
288 - if(pos == string::npos) {  
289 - hllapi_lasterror = "Not found";  
290 - return -1;  
291 - } 270 + return HLLAPI_STATUS_SYSTEM_ERROR;
  271 +
  272 + }
  273 +
  274 +
  275 + HLLAPI_API_CALL hllapi_find_text(const LPSTR text) {
  276 +
  277 + try {
  278 +
  279 + if(text && *text) {
  280 +
  281 + size_t pos = getSession().find(text);
  282 + if(pos != string::npos)
  283 + return pos;
292 284
293 - return pos; 285 + }
294 286
295 } catch(std::exception &e) { 287 } catch(std::exception &e) {
296 288
src/core/get.cc
@@ -167,36 +167,6 @@ @@ -167,36 +167,6 @@
167 167
168 }); 168 });
169 169
170 - /*  
171 - try {  
172 -  
173 - TN3270::Host &host = getSession();  
174 -  
175 - if(!host.isConnected())  
176 - return HLLAPI_STATUS_DISCONNECTED;  
177 -  
178 - if(!(buffer && *buffer))  
179 - return HLLAPI_STATUS_BAD_PARAMETER;  
180 -  
181 -  
182 - if(len == 0)  
183 - return HLLAPI_STATUS_BAD_PARAMETER;  
184 -  
185 - string luname = host.getLUName();  
186 - memset(buffer,' ',len);  
187 - strncpy((char *) buffer, luname.c_str(), std::min((size_t) len,luname.size()));  
188 -  
189 - } catch(std::exception &e) {  
190 -  
191 - hllapi_lasterror = e.what();  
192 - return HLLAPI_STATUS_SYSTEM_ERROR;  
193 -  
194 - }  
195 -  
196 - return HLLAPI_STATUS_SUCCESS;  
197 -  
198 - */  
199 -  
200 } 170 }
201 171
202 172
src/core/hllapi.cc
@@ -245,17 +245,17 @@ static int search_ps(char *buffer, unsigned short *length, unsigned short *ps) { @@ -245,17 +245,17 @@ static int search_ps(char *buffer, unsigned short *length, unsigned short *ps) {
245 245
246 try { 246 try {
247 247
248 - TN3270::Host &host = getSession(); 248 + size_t pos = string::npos;
249 249
250 - if(!host.isConnected())  
251 - return HLLAPI_STATUS_DISCONNECTED; 250 + if(length > 0) {
252 251
253 - string contents = host.toString(0,-1, '\0'); 252 + pos = getSession().find(string((const char *) buffer,(size_t) length).c_str());
254 253
255 - if( ((size_t) *ps) >= contents.size())  
256 - return HLLAPI_STATUS_BAD_POSITION; 254 + } else {
257 255
258 - size_t pos = contents.find(buffer, ((size_t) *ps)); 256 + pos = getSession().find(buffer);
  257 +
  258 + }
259 259
260 if(pos == string::npos) { 260 if(pos == string::npos) {
261 *ps = 0; 261 *ps = 0;
@@ -266,6 +266,10 @@ static int search_ps(char *buffer, unsigned short *length, unsigned short *ps) { @@ -266,6 +266,10 @@ static int search_ps(char *buffer, unsigned short *length, unsigned short *ps) {
266 266
267 return HLLAPI_STATUS_SUCCESS; 267 return HLLAPI_STATUS_SUCCESS;
268 268
  269 + } catch(const std::system_error &e) {
  270 +
  271 + return hllapi_translate_error(e);
  272 +
269 } catch(std::exception &e) { 273 } catch(std::exception &e) {
270 274
271 hllapi_lasterror = e.what(); 275 hllapi_lasterror = e.what();
@@ -323,6 +327,7 @@ static int copy_ps(char *buffer, unsigned short *length, unsigned short *rc) { @@ -323,6 +327,7 @@ static int copy_ps(char *buffer, unsigned short *length, unsigned short *rc) {
323 return HLLAPI_STATUS_SYSTEM_ERROR; 327 return HLLAPI_STATUS_SYSTEM_ERROR;
324 328
325 /* 329 /*
  330 +
326 size_t szBuffer = strlen(buffer); 331 size_t szBuffer = strlen(buffer);
327 char * text; 332 char * text;
328 333
@@ -339,9 +344,11 @@ static int copy_ps(char *buffer, unsigned short *length, unsigned short *rc) { @@ -339,9 +344,11 @@ static int copy_ps(char *buffer, unsigned short *length, unsigned short *rc) {
339 hllapi_free(text); 344 hllapi_free(text);
340 345
341 return hllapi_get_state(); 346 return hllapi_get_state();
342 - */  
343 347
344 return HLLAPI_STATUS_SYSTEM_ERROR; 348 return HLLAPI_STATUS_SYSTEM_ERROR;
  349 +
  350 + */
  351 +
345 } 352 }
346 353
347 static int wait_system(char *buffer, unsigned short *length, unsigned short *rc) { 354 static int wait_system(char *buffer, unsigned short *length, unsigned short *rc) {
@@ -388,35 +395,8 @@ static int copy_str_to_ps(char *text, unsigned short *length, unsigned short *ps @@ -388,35 +395,8 @@ static int copy_str_to_ps(char *text, unsigned short *length, unsigned short *ps
388 // HLLAPI_STATUS_SYSTEM_ERROR 9 A system error was encountered. 395 // HLLAPI_STATUS_SYSTEM_ERROR 9 A system error was encountered.
389 // 396 //
390 // 397 //
391 - size_t szText = strlen(text);  
392 -  
393 - if(*length < szText)  
394 - szText = *length;  
395 -  
396 - if(!szText)  
397 - return HLLAPI_STATUS_BAD_PARAMETER;  
398 -  
399 - switch(hllapi_get_message_id())  
400 - {  
401 - case LIB3270_MESSAGE_NONE:  
402 - break;  
403 -  
404 - case LIB3270_MESSAGE_DISCONNECTED:  
405 - return HLLAPI_STATUS_DISCONNECTED;  
406 -  
407 - case LIB3270_MESSAGE_MINUS:  
408 - case LIB3270_MESSAGE_PROTECTED:  
409 - case LIB3270_MESSAGE_NUMERIC:  
410 - case LIB3270_MESSAGE_OVERFLOW:  
411 - case LIB3270_MESSAGE_INHIBIT:  
412 - case LIB3270_MESSAGE_KYBDLOCK:  
413 - return HLLAPI_STATUS_KEYBOARD_LOCKED;  
414 -  
415 - default:  
416 - return HLLAPI_STATUS_SYSTEM_ERROR;  
417 - }  
418 -  
419 - return hllapi_emulate_input(text,szText,0); 398 + *ps = 0;
  399 + return hllapi_emulate_input(text,*length,0);
420 } 400 }
421 401
422 static int reset_system(char *buffer, unsigned short *length, unsigned short *rc) { 402 static int reset_system(char *buffer, unsigned short *length, unsigned short *rc) {
src/core/private.h
@@ -54,6 +54,7 @@ @@ -54,6 +54,7 @@
54 TN3270_PRIVATE TN3270::Host & getSession(); 54 TN3270_PRIVATE TN3270::Host & getSession();
55 55
56 TN3270_PRIVATE DWORD hllapi_translate_error(LIB3270_KEYBOARD_LOCK_STATE state); 56 TN3270_PRIVATE DWORD hllapi_translate_error(LIB3270_KEYBOARD_LOCK_STATE state);
  57 + TN3270_PRIVATE DWORD hllapi_translate_error(LIB3270_MESSAGE state);
57 TN3270_PRIVATE DWORD hllapi_translate_error(const std::system_error &error); 58 TN3270_PRIVATE DWORD hllapi_translate_error(const std::system_error &error);
58 59
59 #endif // PRIVATE_H_INCLUDED 60 #endif // PRIVATE_H_INCLUDED
src/core/set.cc
@@ -56,6 +56,7 @@ @@ -56,6 +56,7 @@
56 } catch(const std::exception &e) { 56 } catch(const std::exception &e) {
57 57
58 // Worker has failed! 58 // Worker has failed!
  59 +
59 hllapi_lasterror = e.what(); 60 hllapi_lasterror = e.what();
60 } 61 }
61 62
@@ -106,7 +107,7 @@ @@ -106,7 +107,7 @@
106 if(!(text && *text)) 107 if(!(text && *text))
107 return HLLAPI_STATUS_BAD_PARAMETER; 108 return HLLAPI_STATUS_BAD_PARAMETER;
108 109
109 - if(!length) 110 + if(length < 1)
110 length = strlen(text); 111 length = strlen(text);
111 112
112 return set([text,length](TN3270::Host &host) { 113 return set([text,length](TN3270::Host &host) {
src/core/tools.cc
@@ -107,3 +107,26 @@ @@ -107,3 +107,26 @@
107 107
108 } 108 }
109 109
  110 + DWORD hllapi_translate_error(LIB3270_MESSAGE state) {
  111 +
  112 + switch(state) {
  113 + case LIB3270_MESSAGE_NONE:
  114 + return HLLAPI_STATUS_SUCCESS;
  115 +
  116 + case LIB3270_MESSAGE_DISCONNECTED:
  117 + return HLLAPI_STATUS_DISCONNECTED;
  118 +
  119 + case LIB3270_MESSAGE_MINUS:
  120 + case LIB3270_MESSAGE_PROTECTED:
  121 + case LIB3270_MESSAGE_NUMERIC:
  122 + case LIB3270_MESSAGE_OVERFLOW:
  123 + case LIB3270_MESSAGE_INHIBIT:
  124 + case LIB3270_MESSAGE_KYBDLOCK:
  125 + return HLLAPI_STATUS_KEYBOARD_LOCKED;
  126 +
  127 + default:
  128 + return HLLAPI_STATUS_SYSTEM_ERROR;
  129 + }
  130 +
  131 + return HLLAPI_STATUS_SYSTEM_ERROR;
  132 + }
src/include/lib3270/hllapi.h
@@ -206,16 +206,122 @@ @@ -206,16 +206,122 @@
206 */ 206 */
207 HLLAPI_API_CALL hllapi_disconnect(void); 207 HLLAPI_API_CALL hllapi_disconnect(void);
208 208
  209 + /**
  210 + * @brief Get program message.
  211 + *
  212 + * @return Current program message or -1 on error.
  213 + *
  214 + */
209 HLLAPI_API_CALL hllapi_get_message_id(void); 215 HLLAPI_API_CALL hllapi_get_message_id(void);
  216 +
210 HLLAPI_API_CALL hllapi_is_connected(void); 217 HLLAPI_API_CALL hllapi_is_connected(void);
211 HLLAPI_API_CALL hllapi_get_state(void); 218 HLLAPI_API_CALL hllapi_get_state(void);
212 HLLAPI_API_CALL hllapi_get_screen_at(WORD row, WORD col, LPSTR buffer); 219 HLLAPI_API_CALL hllapi_get_screen_at(WORD row, WORD col, LPSTR buffer);
213 HLLAPI_API_CALL hllapi_get_screen(WORD pos, LPSTR buffer, WORD len); 220 HLLAPI_API_CALL hllapi_get_screen(WORD pos, LPSTR buffer, WORD len);
214 HLLAPI_API_CALL hllapi_set_text_at(WORD row, WORD col, LPSTR text); 221 HLLAPI_API_CALL hllapi_set_text_at(WORD row, WORD col, LPSTR text);
  222 +
  223 + /**
  224 + * @brief Compare contents at position.
  225 + *
  226 + * @param row
  227 + * @param col
  228 + * @param text
  229 + *
  230 + * @return Result of the strcmp of the string and the contents of position.
  231 + *
  232 + * @retval HLLAPI_STATUS_SYSTEM_ERROR The query has failed.
  233 + * @retval 0 The string at the position is the same.
  234 + * @retval -1
  235 + * @retval 1
  236 + *
  237 + */
215 HLLAPI_API_CALL hllapi_cmp_text_at(WORD row, WORD col, LPSTR text); 238 HLLAPI_API_CALL hllapi_cmp_text_at(WORD row, WORD col, LPSTR text);
216 - HLLAPI_API_CALL hllapi_find_text(LPSTR text); 239 +
  240 + /**
  241 + * @brief Compare contents at position.
  242 + *
  243 + * @param row
  244 + * @param col
  245 + * @param text
  246 + *
  247 + * @return Result of the strcmp of the string and the contents of position.
  248 + *
  249 + * @retval HLLAPI_STATUS_SYSTEM_ERROR The query has failed.
  250 + * @retval 0 The string at the position is the same.
  251 + * @retval -1
  252 + * @retval 1
  253 + *
  254 + */
  255 + HLLAPI_API_CALL hllapi_cmp_text_at_address(WORD addr, LPSTR text);
  256 +
  257 + /**
  258 + * @brief Find string in the screen.
  259 + *
  260 + * @return Position of the text inside the screen or -1 if failed.
  261 + *
  262 + */
  263 + HLLAPI_API_CALL hllapi_find_text(const LPSTR text);
  264 +
  265 + /**
  266 + * @brief Interpret string with action codes prefixed by '@'.
  267 + *
  268 + * Insert string parsing the action codes prefixed with '@' character.
  269 + *
  270 + * Value | Action | Description |
  271 + * :----:|:------------|:-----------------------------------------------------------|
  272 + * @@P | - | Print the screen contents (if available) |
  273 + * @@@@ | - | Input the @@ char. |
  274 + * @@E | ENTER | - |
  275 + * @@F | ERASE_EOF | - |
  276 + * @@1 | PF1 | Send the PF1 key. |
  277 + * @@2 | PF2 | Send the PF2 key. |
  278 + * @@3 | PF3 | Send the PF3 key. |
  279 + * @@4 | PF4 | Send the PF4 key. |
  280 + * @@5 | PF5 | Send the PF5 key. |
  281 + * @@6 | PF6 | Send the PF6 key. |
  282 + * @@7 | PF7 | Send the PF7 key. |
  283 + * @@8 | PF8 | Send the PF8 key. |
  284 + * @@9 | PF9 | Send the PF9 key. |
  285 + * @@a | PF10 | Send the PF10 key. |
  286 + * @@b | PF11 | Send the PF11 key. |
  287 + * @@c | PF12 | Send the PF12 key. |
  288 + * @@d | PF13 | Send the PF13 key. |
  289 + * @@e | PF14 | Send the PF14 key. |
  290 + * @@f | PF15 | Send the PF15 key. |
  291 + * @@g | PF16 | Send the PF16 key. |
  292 + * @@h | PF17 | Send the PF17 key. |
  293 + * @@u | PF18 | Send the PF18 key. |
  294 + * @@j | PF19 | Send the PF19 key. |
  295 + * @@k | PF20 | Send the PF20 key. |
  296 + * @@l | PF21 | Send the PF21 key. |
  297 + * @@m | PF22 | Send the PF22 key. |
  298 + * @@n | PF23 | Send the PF23 key. |
  299 + * @@o | PF24 | Send the PF24 key. |
  300 + * @@x | PA1 | Send the PA1 key. |
  301 + * @@y | PA2 | Send the PA2 key. |
  302 + * @@z | PA3 | Send the PA3 key. |
  303 + * @@D | CHAR_DELETE | |
  304 + * @@N | NEWLINE | |
  305 + * @@C | CLEAR | |
  306 + * @@R | KYBD_RESET | |
  307 + * @@< | BACKSPACE | |
  308 + *
  309 + * @param text Text to input.
  310 + * @param length Length of the text (-1 to use the string length).
  311 + * @param pasting Unused (kept for compatibility).
  312 + *
  313 + */
217 HLLAPI_API_CALL hllapi_emulate_input(const LPSTR text, WORD length, WORD pasting); 314 HLLAPI_API_CALL hllapi_emulate_input(const LPSTR text, WORD length, WORD pasting);
  315 +
  316 + /**
  317 + * @brief Input string.
  318 + *
  319 + * @param buffer String to input.
  320 + * @param length Length of the string (-1 ou 0 to auto detect).
  321 + *
  322 + */
218 HLLAPI_API_CALL hllapi_input_string(LPSTR buffer, WORD len); 323 HLLAPI_API_CALL hllapi_input_string(LPSTR buffer, WORD len);
  324 +
219 HLLAPI_API_CALL hllapi_wait_for_ready(WORD seconds); 325 HLLAPI_API_CALL hllapi_wait_for_ready(WORD seconds);
220 HLLAPI_API_CALL hllapi_wait_for_change(WORD seconds); 326 HLLAPI_API_CALL hllapi_wait_for_change(WORD seconds);
221 HLLAPI_API_CALL hllapi_wait(WORD seconds); 327 HLLAPI_API_CALL hllapi_wait(WORD seconds);
src/testprogram/testprogram.cc
@@ -192,6 +192,15 @@ @@ -192,6 +192,15 @@
192 192
193 rc = hllapi_input_string((LPSTR) cmdline.c_str()+6,0); 193 rc = hllapi_input_string((LPSTR) cmdline.c_str()+6,0);
194 194
  195 + } else if(strncasecmp(cmdline.c_str(),"wait ",5) == 0) {
  196 +
  197 + rc = hllapi_wait_for_ready(5);
  198 +
  199 + } else if(strncasecmp(cmdline.c_str(),"find ",5) == 0) {
  200 +
  201 + cout << "Searching for \"" << (cmdline.c_str()+5) << "\"" << endl;
  202 + rc = hllapi_find_text(cmdline.c_str()+5);
  203 +
195 } else { 204 } else {
196 205
197 cout << "Unknown command \"" << cmdline << "\""<< endl; 206 cout << "Unknown command \"" << cmdline << "\""<< endl;