From 3cba5f2a1480bca480fb47c253620852fab2d04a Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Wed, 20 Apr 2016 10:23:50 -0300 Subject: [PATCH] Ajustes na HLLAPI. --- src/include/pw3270/hllapi.h | 6 ++++-- src/plugins/hllapi/calls.cc | 353 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- src/plugins/hllapi/hllapi.c | 197 +++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 3 files changed, 371 insertions(+), 185 deletions(-) diff --git a/src/include/pw3270/hllapi.h b/src/include/pw3270/hllapi.h index acd7fef..a620976 100644 --- a/src/include/pw3270/hllapi.h +++ b/src/include/pw3270/hllapi.h @@ -167,7 +167,8 @@ extern "C" { HLLAPI_API_CALL hllapi_enter(void); HLLAPI_API_CALL hllapi_set_text_at(WORD row, WORD col, LPSTR text); HLLAPI_API_CALL hllapi_cmp_text_at(WORD row, WORD col, LPSTR text); - HLLAPI_API_CALL hllapi_emulate_input(LPSTR buffer, WORD len, WORD pasting); + HLLAPI_API_CALL hllapi_emulate_input(const LPSTR buffer, WORD len, WORD pasting); + HLLAPI_API_CALL hllapi_input_string(LPSTR buffer, WORD len); HLLAPI_API_CALL hllapi_wait_for_ready(WORD seconds); HLLAPI_API_CALL hllapi_wait_for_change(WORD seconds); HLLAPI_API_CALL hllapi_wait(WORD seconds); @@ -176,6 +177,8 @@ extern "C" { HLLAPI_API_CALL hllapi_setcursor(WORD key); HLLAPI_API_CALL hllapi_getcursor(); + HLLAPI_API_CALL hllapi_set_session_parameter(LPSTR param, WORD len, WORD value); + HLLAPI_API_CALL hllapi_erase(void); HLLAPI_API_CALL hllapi_erase_eof(void); HLLAPI_API_CALL hllapi_erase_eol(void); @@ -201,7 +204,6 @@ extern "C" { HLLAPI_API_CALL hllapi_enter(void); HLLAPI_API_CALL hllapi_set_text_at(WORD row, WORD col, LPSTR text); HLLAPI_API_CALL hllapi_cmp_text_at(WORD row, WORD col, LPSTR text); - HLLAPI_API_CALL hllapi_emulate_input(LPSTR buffer, WORD len, WORD pasting); HLLAPI_API_CALL hllapi_wait_for_ready(WORD seconds); HLLAPI_API_CALL hllapi_wait(WORD seconds); HLLAPI_API_CALL hllapi_pfkey(WORD key); diff --git a/src/plugins/hllapi/calls.cc b/src/plugins/hllapi/calls.cc index 5bfa6e9..b8e3f23 100644 --- a/src/plugins/hllapi/calls.cc +++ b/src/plugins/hllapi/calls.cc @@ -327,38 +327,81 @@ return rc; } - HLLAPI_API_CALL hllapi_emulate_input(LPSTR buffer, WORD len, WORD pasting) + HLLAPI_API_CALL hllapi_emulate_input(const LPSTR buffer, WORD len, WORD pasting) { - session::get_default()->emulate_input(buffer); + try + { + session::get_default()->emulate_input(buffer); + } + catch(std::exception &e) + { + return HLLAPI_STATUS_SYSTEM_ERROR; + } + return HLLAPI_STATUS_SUCCESS; } HLLAPI_API_CALL hllapi_erase(void) { - session::get_default()->erase(); + try + { + session::get_default()->erase(); + } + catch(std::exception &e) + { + return HLLAPI_STATUS_SYSTEM_ERROR; + } return HLLAPI_STATUS_SUCCESS; } HLLAPI_API_CALL hllapi_erase_eof(void) { - session::get_default()->erase_eof(); + try + { + session::get_default()->erase_eof(); + } + catch(std::exception &e) + { + return HLLAPI_STATUS_SYSTEM_ERROR; + } return HLLAPI_STATUS_SUCCESS; } HLLAPI_API_CALL hllapi_erase_eol(void) { - session::get_default()->erase_eol(); + try + { + session::get_default()->erase_eol(); + } + catch(std::exception &e) + { + return HLLAPI_STATUS_SYSTEM_ERROR; + } return HLLAPI_STATUS_SUCCESS; } HLLAPI_API_CALL hllapi_erase_input(void) { - session::get_default()->erase_input(); + try + { + session::get_default()->erase_input(); + } + catch(std::exception &e) + { + return HLLAPI_STATUS_SYSTEM_ERROR; + } return HLLAPI_STATUS_SUCCESS; } HLLAPI_API_CALL hllapi_action(LPSTR buffer) { - session::get_default()->action((const char *) buffer); + try + { + session::get_default()->action((const char *) buffer); + } + catch(std::exception &e) + { + return HLLAPI_STATUS_SYSTEM_ERROR; + } return HLLAPI_STATUS_SUCCESS; } @@ -389,9 +432,301 @@ HLLAPI_API_CALL hllapi_reset(void) { - - return HLLAPI_STATUS_SUCCESS; } + HLLAPI_API_CALL hllapi_input_string(LPSTR input, WORD length) + { + static const char control_char = '@'; + + size_t szText; + char * text; + int rc = 0; + + if(!hllapi_is_connected()) { + return HLLAPI_STATUS_DISCONNECTED; + } + + if(!input) + { + return HLLAPI_STATUS_BAD_PARAMETER; + } + + if(length > 0 ) + szText = length; + else + szText = strlen(input); + + text = (char *) malloc(szText+2); + memcpy(text,input,szText); + text[szText] = 0; + + trace("input[%s]",text); + + if(strchr(text,control_char)) + { + // Convert control char + char * buffer = text; + char * ptr; + + for(ptr = strchr(text,control_char);ptr;ptr = strchr(buffer,control_char)) + { + *(ptr++) = 0; + + trace("input[%s]",buffer); + hllapi_emulate_input(buffer,-1,0); + + switch(*(ptr++)) + { + case 'P': // Print + rc = hllapi_print(); + break; + + case 'E': // Enter + hllapi_enter(); + break; + + case 'F': // Erase EOF + hllapi_erase_eof(); + break; + + case '1': // PF1 + hllapi_pfkey(1); + break; + + case '2': // PF2 + hllapi_pfkey(2); + break; + + case '3': // PF3 + hllapi_pfkey(3); + break; + + case '4': // PF4 + hllapi_pfkey(4); + break; + + case '5': // PF5 + hllapi_pfkey(5); + break; + + case '6': // PF6 + hllapi_pfkey(6); + break; + + case '7': // PF7 + hllapi_pfkey(7); + break; + + case '8': // PF8 + hllapi_pfkey(8); + break; + + case '9': // PF9 + hllapi_pfkey(9); + break; + + case 'a': // PF10 + hllapi_pfkey(10); + break; + + case 'b': // PF11 + hllapi_pfkey(11); + break; + + case 'c': // PF12 + hllapi_pfkey(12); + break; + + case 'd': // PF13 + hllapi_pfkey(13); + break; + + case 'e': // PF14 + hllapi_pfkey(14); + break; + + case 'f': // PF15 + hllapi_pfkey(15); + break; + + case 'g': // PF16 + hllapi_pfkey(16); + break; + + case 'h': // PF17 + hllapi_pfkey(17); + break; + + case 'i': // PF18 + hllapi_pfkey(18); + break; + + case 'j': // PF19 + hllapi_pfkey(19); + break; + + case 'k': // PF20 + hllapi_pfkey(20); + break; + + case 'l': // PF21 + hllapi_pfkey(21); + break; + + case 'm': // PF22 + hllapi_pfkey(22); + break; + + case 'n': // PF23 + hllapi_pfkey(23); + break; + + case 'o': // PF24 + hllapi_pfkey(24); + break; + + case '@': // Send '@' character + hllapi_emulate_input("@",-1,0); + break; + + case 'x': // PA1 + hllapi_pakey(1); + break; + + case 'y': // PA2 + hllapi_pakey(2); + break; + + case 'z': // PA3 + hllapi_pakey(3); + break; + + case 'B': // PC_LEFTTAB = "@B" + break; + + case 'T': // PC_RIGHTTAB = "@T" + break; + + case 'N': // PC_NEWLINE = "@N" + break; + + case 'C': // PC_CLEAR = "@C" + hllapi_erase_input(); + break; + + case 'D': // PC_DELETE = "@D" + break; + + case 'H': // PC_HELP = "@H" + break; + + case 'I': // PC_INSERT = "@I" + break; + + case 'L': // PC_CURSORLEFT = "@L" + break; + + case 'R': // PC_RESET = "@R" + hllapi_reset(); + break; + + case 'U': // PC_CURSORUP = "@U" + break; + + case 'V': // PC_CURSORDOWN = "@V" + break; + + case 'Z': // PC_CURSORRIGHT = "@Z" + break; + + case '0': // PC_HOME = "@0" + break; + + case 'p': // PC_PLUSKEY = "@p" + break; + + case 'q': // PC_END = "@q" + break; + + case 's': // PC_SCRLK = "@s" + break; + + case 't': // PC_NUMLOCK = "@t" + break; + + case 'u': // PC_PAGEUP = "@u" + break; + + case 'v': // PC_PAGEDOWN = "@v" + break; + + case '/': // PC_OVERRUNOFQUEUE = "@/" ' Queue overflow, used in Get Key only + break; + + case '$': // PC_ALTCURSOR = "@$" ' Presentation Manager only, unused in VB environment + break; + + case '<': // PC_BACKSPACE = "@<" + break; + + +/* + +Global Const PC_TEST = "@A@C" +Global Const PC_WORDDELETE = "@A@D" +Global Const PC_FIELDEXIT = "@A@E" +Global Const PC_ERASEINPUT = "@A@F" +Global Const PC_SYSTEMREQUEST = "@A@H" +Global Const PC_INSERTTOGGLE = "@A@I" +Global Const PC_CURSORSELECT = "@A@J" +Global Const PC_CURSLEFTFAST = "@A@L" +Global Const PC_GETCURSOR = "@A@N" +Global Const PC_LOCATECURSOR = "@A@O" +Global Const PC_ATTENTION = "@A@Q" +Global Const PC_DEVICECANCEL = "@A@R" +Global Const PC_PRINTPS = "@A@T" +Global Const PC_CURSUPFAST = "@A@U" +Global Const PC_CURSDOWNFAST = "@A@V" +Global Const PC_HEX = "@A@X" +Global Const PC_FUNCTIONKEY = "@A@Y" +Global Const PC_CURSRIGHTFAST = "@A@Z" + +Global Const PC_REVERSEVIDEO = "@A@9" +Global Const PC_UNDERSCORE = "@A@b" +Global Const PC_BLINK = "@A@c" +Global Const PC_RED = "@A@d" +Global Const PC_PINK = "@A@e" +Global Const PC_GREEN = "@A@f" +Global Const PC_YELLOW = "@A@g" +Global Const PC_BLUE = "@A@h" +Global Const PC_TURQOISE = "@A@i" +Global Const PC_WHITE = "@A@j" +Global Const PC_RSTHOSTCOLORS = "@A@l" +Global Const PC_PRINTPC = "@A@t" + +Global Const PC_FIELDMINUS = "@A@-" +Global Const PC_FIELDPLUS = "@A@+" + +*/ + + } + + buffer = ptr; + + } + + if(*buffer) + hllapi_emulate_input(buffer,-1,0); + + } + else + { + hllapi_emulate_input(text,szText,0); + } + + free(text); + + return rc; + } diff --git a/src/plugins/hllapi/hllapi.c b/src/plugins/hllapi/hllapi.c index e461dd7..738eb90 100644 --- a/src/plugins/hllapi/hllapi.c +++ b/src/plugins/hllapi/hllapi.c @@ -90,8 +90,6 @@ PAUSE_MODE_FPAUSE ///< @brief A full-duration pause lasts for however long you specified in the Pause (18) function. } pause_mode = PAUSE_MODE_IPAUSE; - static const char control_char = '@'; - /*--[ Implement ]------------------------------------------------------------------------------------*/ HLLAPI_API_CALL hllapi(const LPWORD func, LPSTR buffer, LPWORD length, LPWORD rc) @@ -194,174 +192,9 @@ static int copy_ps_to_str(char *buffer, unsigned short *length, unsigned short * return 0; } -static int input_string(char *input, unsigned short *length, unsigned short *rc) +static int input_string(char *buffer, unsigned short *length, unsigned short *rc) { - size_t szText; - char * text; - - if(!hllapi_is_connected()) { - *rc = HLLAPI_STATUS_DISCONNECTED; - return HLLAPI_STATUS_DISCONNECTED; - } - - if(!input) - { - *rc = HLLAPI_STATUS_BAD_PARAMETER; - return HLLAPI_STATUS_BAD_PARAMETER; - } - - szText = strlen(input); - - if(*length > 0 && *length < szText) - szText = *length; - - text = (char *) malloc(szText+2); - memcpy(text,input,szText); - text[szText] = 0; - - *rc = 0; - - trace("input[%s]",text); - - if(strchr(text,control_char)) - { - // Convert control char - char * buffer = text; - char * ptr; - - for(ptr = strchr(text,control_char);ptr;ptr = strchr(buffer,control_char)) - { - *(ptr++) = 0; - - trace("input[%s]",buffer); - hllapi_emulate_input(buffer,-1,0); - - switch(*(ptr++)) - { - case 'P': // Print - *rc = hllapi_print(); - break; - - case 'E': // Enter - hllapi_enter(); - break; - - case 'F': // Erase EOF - hllapi_erase_eof(); - break; - - case '1': // PF1 - hllapi_pfkey(1); - break; - - case '2': // PF2 - hllapi_pfkey(2); - break; - - case '3': // PF3 - hllapi_pfkey(3); - break; - - case '4': // PF4 - hllapi_pfkey(4); - break; - - case '5': // PF5 - hllapi_pfkey(5); - break; - - case '6': // PF6 - hllapi_pfkey(6); - break; - - case '7': // PF7 - hllapi_pfkey(7); - break; - - case '8': // PF8 - hllapi_pfkey(8); - break; - - case '9': // PF9 - hllapi_pfkey(9); - break; - - case 'a': // PF10 - hllapi_pfkey(10); - break; - - case 'b': // PF11 - hllapi_pfkey(11); - break; - - case 'c': // PF12 - hllapi_pfkey(12); - break; - - case 'd': // PF13 - hllapi_pfkey(13); - break; - - case 'e': // PF14 - hllapi_pfkey(14); - break; - - case 'f': // PF15 - hllapi_pfkey(15); - break; - - case 'g': // PF16 - hllapi_pfkey(16); - break; - - case 'h': // PF17 - hllapi_pfkey(17); - break; - - case 'i': // PF18 - hllapi_pfkey(18); - break; - - case 'j': // PF19 - hllapi_pfkey(19); - break; - - case 'k': // PF20 - hllapi_pfkey(20); - break; - - case 'l': // PF21 - hllapi_pfkey(21); - break; - - case 'm': // PF22 - hllapi_pfkey(22); - break; - - case 'n': // PF23 - hllapi_pfkey(23); - break; - - case 'o': // PF24 - hllapi_pfkey(24); - break; - } - - buffer = ptr; - - } - - if(*buffer) - hllapi_emulate_input(buffer,-1,0); - - } - else - { - hllapi_emulate_input(text,szText,0); - } - - free(text); - + *rc = hllapi_input_string(buffer,*length); return 0; } @@ -592,20 +425,37 @@ static int set_session_parameters(char *buffer, unsigned short *length, unsigned return HLLAPI_STATUS_BAD_PARAMETER; } - if(!strncasecmp(buffer,"IPAUSE",*length)) + *rc = hllapi_set_session_parameter(buffer, *length, *rc); + + return 0; +} + +HLLAPI_API_CALL hllapi_set_session_parameter(LPSTR param, WORD len, WORD value) +{ + if(!param) + { + return HLLAPI_STATUS_BAD_PARAMETER; + } + + if(!len) + { + len = strlen(param); + } + + if(!strncasecmp(param,"IPAUSE",len)) { // IPAUSE pause_mode = PAUSE_MODE_IPAUSE; } - else if(!strncasecmp(buffer,"FPAUSE",*length)) + else if(!strncasecmp(param,"FPAUSE",len)) { // FPAUSE pause_mode = PAUSE_MODE_FPAUSE; } - else if(!strncasecmp(buffer,"UNLOCKDELAY",*length)) + else if(!strncasecmp(param,"UNLOCKDELAY",len)) { // UNLOCKDELAY - hllapi_set_unlock_delay((WORD) *rc); + hllapi_set_unlock_delay(value); } else { @@ -613,5 +463,4 @@ static int set_session_parameters(char *buffer, unsigned short *length, unsigned } return HLLAPI_STATUS_SUCCESS; - } -- libgit2 0.21.2