Commit 00e98f6ee3f76b8b894d779aeed2eab59aeb989d
1 parent
d5cf098d
Exists in
master
and in
5 other branches
Reimplementando HLLAPI no novo formato
Showing
7 changed files
with
112 additions
and
21 deletions
Show diff stats
src/include/pw3270/hllapi.h
| ... | ... | @@ -78,6 +78,7 @@ extern "C" { |
| 78 | 78 | __declspec (dllexport) DWORD __stdcall hllapi_get_message_id(void); |
| 79 | 79 | __declspec (dllexport) DWORD __stdcall hllapi_is_connected(void); |
| 80 | 80 | __declspec (dllexport) DWORD __stdcall hllapi_get_screen_at(WORD row, WORD col, LPSTR buffer); |
| 81 | + __declspec (dllexport) DWORD __stdcall hllapi_get_screen(WORD pos, LPSTR buffer, WORD len); | |
| 81 | 82 | __declspec (dllexport) DWORD __stdcall hllapi_enter(void); |
| 82 | 83 | __declspec (dllexport) DWORD __stdcall hllapi_set_text_at(WORD row, WORD col, LPSTR text); |
| 83 | 84 | __declspec (dllexport) DWORD __stdcall hllapi_cmp_text_at(WORD row, WORD col, LPSTR text); | ... | ... |
src/plugins/remotectl/calls.c
| ... | ... | @@ -55,6 +55,8 @@ |
| 55 | 55 | static int (*script_sleep)(void *h, int seconds) = NULL; |
| 56 | 56 | static LIB3270_MESSAGE (*get_message)(void *h) = NULL; |
| 57 | 57 | static char * (*get_text)(void *h, int row, int col, int len) = NULL; |
| 58 | + static char * (*get_text_at_offset)(void *h, int offset, int len) = NULL; | |
| 59 | + | |
| 58 | 60 | static void * (*release_memory)(void *p) = NULL; |
| 59 | 61 | static int (*action_enter)(void *h) = NULL; |
| 60 | 62 | static int (*set_text_at)(void *h, int row, int col, const unsigned char *str) = NULL; |
| ... | ... | @@ -71,25 +73,25 @@ |
| 71 | 73 | const char * name; |
| 72 | 74 | } entry_point[] = |
| 73 | 75 | { |
| 74 | - { (void **) &session_new, (void *) hllapi_pipe_init, "lib3270_session_new" }, | |
| 75 | - { (void **) &session_free, (void *) hllapi_pipe_deinit, "lib3270_session_free" }, | |
| 76 | - { (void **) &get_revision, (void *) hllapi_pipe_get_revision, "lib3270_get_revision" }, | |
| 77 | - { (void **) &host_connect, (void *) hllapi_pipe_connect, "lib3270_connect" }, | |
| 78 | - { (void **) &host_disconnect, (void *) hllapi_pipe_disconnect, "lib3270_disconnect" }, | |
| 79 | - { (void **) &host_is_connected, (void *) hllapi_pipe_is_connected, "lib3270_in_tn3270e" }, | |
| 80 | - { (void **) &wait_for_ready, (void *) hllapi_pipe_wait_for_ready, "lib3270_wait_for_ready" }, | |
| 81 | - { (void **) &script_sleep, (void *) hllapi_pipe_sleep, "lib3270_wait" }, | |
| 82 | - { (void **) &get_message, (void *) hllapi_pipe_get_message, "lib3270_get_program_message" }, | |
| 83 | - { (void **) &get_text, (void *) hllapi_pipe_get_text_at, "lib3270_get_text_at" }, | |
| 84 | - { (void **) &release_memory, (void *) hllapi_pipe_release_memory, "lib3270_free" }, | |
| 85 | - { (void **) &action_enter, (void *) hllapi_pipe_enter, "lib3270_enter" }, | |
| 86 | - { (void **) &set_text_at, (void *) hllapi_pipe_set_text_at, "lib3270_set_string_at" }, | |
| 87 | - { (void **) &cmp_text_at, (void *) hllapi_pipe_cmp_text_at, "lib3270_cmp_text_at" }, | |
| 88 | - { (void **) &pfkey, (void *) hllapi_pipe_pfkey, "lib3270_pfkey" }, | |
| 89 | - { (void **) &pakey, (void *) hllapi_pipe_pakey, "lib3270_pakey" }, | |
| 90 | - { (void **) &setcursor, (void *) hllapi_pipe_setcursor, "lib3270_set_cursor_address" }, | |
| 91 | - { (void **) &getcursor, (void *) hllapi_pipe_getcursor, "lib3270_get_cursor_address" }, | |
| 92 | - | |
| 76 | + { (void **) &session_new, (void *) hllapi_pipe_init, "lib3270_session_new" }, | |
| 77 | + { (void **) &session_free, (void *) hllapi_pipe_deinit, "lib3270_session_free" }, | |
| 78 | + { (void **) &get_revision, (void *) hllapi_pipe_get_revision, "lib3270_get_revision" }, | |
| 79 | + { (void **) &host_connect, (void *) hllapi_pipe_connect, "lib3270_connect" }, | |
| 80 | + { (void **) &host_disconnect, (void *) hllapi_pipe_disconnect, "lib3270_disconnect" }, | |
| 81 | + { (void **) &host_is_connected, (void *) hllapi_pipe_is_connected, "lib3270_in_tn3270e" }, | |
| 82 | + { (void **) &wait_for_ready, (void *) hllapi_pipe_wait_for_ready, "lib3270_wait_for_ready" }, | |
| 83 | + { (void **) &script_sleep, (void *) hllapi_pipe_sleep, "lib3270_wait" }, | |
| 84 | + { (void **) &get_message, (void *) hllapi_pipe_get_message, "lib3270_get_program_message" }, | |
| 85 | + { (void **) &get_text, (void *) hllapi_pipe_get_text_at, "lib3270_get_text_at" }, | |
| 86 | + { (void **) &release_memory, (void *) hllapi_pipe_release_memory, "lib3270_free" }, | |
| 87 | + { (void **) &action_enter, (void *) hllapi_pipe_enter, "lib3270_enter" }, | |
| 88 | + { (void **) &set_text_at, (void *) hllapi_pipe_set_text_at, "lib3270_set_string_at" }, | |
| 89 | + { (void **) &cmp_text_at, (void *) hllapi_pipe_cmp_text_at, "lib3270_cmp_text_at" }, | |
| 90 | + { (void **) &pfkey, (void *) hllapi_pipe_pfkey, "lib3270_pfkey" }, | |
| 91 | + { (void **) &pakey, (void *) hllapi_pipe_pakey, "lib3270_pakey" }, | |
| 92 | + { (void **) &setcursor, (void *) hllapi_pipe_setcursor, "lib3270_set_cursor_address" }, | |
| 93 | + { (void **) &getcursor, (void *) hllapi_pipe_getcursor, "lib3270_get_cursor_address" }, | |
| 94 | + { (void **) &get_text_at_offset, (void *) hllapi_pipe_get_text, "lib3270_get_text" }, | |
| 93 | 95 | { NULL, NULL } |
| 94 | 96 | }; |
| 95 | 97 | |
| ... | ... | @@ -402,3 +404,33 @@ |
| 402 | 404 | return -EINVAL; |
| 403 | 405 | return getcursor(hSession)+1; |
| 404 | 406 | } |
| 407 | + | |
| 408 | + __declspec (dllexport) DWORD __stdcall hllapi_get_screen(WORD pos, LPSTR buffer, WORD len) | |
| 409 | + { | |
| 410 | + char *text; | |
| 411 | + | |
| 412 | + trace("%s(%d,%d)",__FUNCTION__,pos,len); | |
| 413 | + | |
| 414 | + if(len < 0) | |
| 415 | + len = strlen(buffer); | |
| 416 | + | |
| 417 | + if(!(get_text_at_offset && hSession)) | |
| 418 | + return EINVAL; | |
| 419 | + | |
| 420 | + if(len > strlen(buffer)) | |
| 421 | + len = strlen(buffer); | |
| 422 | + | |
| 423 | + trace("len=%d",len); | |
| 424 | + text = get_text_at_offset(hSession,pos-1,len); | |
| 425 | + | |
| 426 | + trace("text=\n%s\n",text); | |
| 427 | + | |
| 428 | + if(!text) | |
| 429 | + return -1; | |
| 430 | + | |
| 431 | + memcpy(buffer,text,len); | |
| 432 | + | |
| 433 | + release_memory(text); | |
| 434 | + | |
| 435 | + return 0; | |
| 436 | + } | ... | ... |
src/plugins/remotectl/client.h
| ... | ... | @@ -46,6 +46,7 @@ |
| 46 | 46 | void hllapi_pipe_disconnect(void *h); |
| 47 | 47 | LIB3270_MESSAGE hllapi_pipe_get_message(void *h); |
| 48 | 48 | char * hllapi_pipe_get_text_at(void *h, int row, int col, int len); |
| 49 | + char * hllapi_pipe_get_text(void *h, int offset, int len); | |
| 49 | 50 | int hllapi_pipe_enter(void *h); |
| 50 | 51 | int hllapi_pipe_set_text_at(void *h, int row, int col, const unsigned char *str); |
| 51 | 52 | int hllapi_pipe_cmp_text_at(void *h, int row, int col, const char *text); | ... | ... |
src/plugins/remotectl/hllapi.c
| ... | ... | @@ -43,6 +43,7 @@ |
| 43 | 43 | static int connect_ps(char *buffer, unsigned short *length, unsigned short *rc); |
| 44 | 44 | static int disconnect_ps(char *buffer, unsigned short *length, unsigned short *rc); |
| 45 | 45 | static int get_library_revision(char *buffer, unsigned short *length, unsigned short *rc); |
| 46 | + static int copy_ps_to_str(char *buffer, unsigned short *length, unsigned short *rc); | |
| 46 | 47 | |
| 47 | 48 | static int get_cursor_position(char *buffer, unsigned short *length, unsigned short *rc); |
| 48 | 49 | static int set_cursor_position(char *buffer, unsigned short *length, unsigned short *rc); |
| ... | ... | @@ -59,7 +60,8 @@ |
| 59 | 60 | { HLLAPI_CMD_DISCONNECTPS, disconnect_ps }, |
| 60 | 61 | { HLLAPI_CMD_GETREVISION, get_library_revision }, |
| 61 | 62 | { HLLAPI_CMD_QUERYCURSOR, get_cursor_position }, |
| 62 | - { HLLAPI_CMD_SETCURSOR, set_cursor_position }, | |
| 63 | + { HLLAPI_CMD_SETCURSOR, set_cursor_position }, | |
| 64 | + { HLLAPI_CMD_COPYPSTOSTR, copy_ps_to_str }, | |
| 63 | 65 | }; |
| 64 | 66 | |
| 65 | 67 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| ... | ... | @@ -149,6 +151,12 @@ static int set_cursor_position(char *buffer, unsigned short *length, unsigned sh |
| 149 | 151 | return 0; |
| 150 | 152 | } |
| 151 | 153 | |
| 154 | +static int copy_ps_to_str(char *buffer, unsigned short *length, unsigned short *rc) | |
| 155 | +{ | |
| 156 | + // Length Length of the target data string. | |
| 157 | + // PS Position Position within the host presentation space of the first byte in your target data string. | |
| 158 | + return hllapi_get_screen(*rc,buffer,*length); | |
| 159 | +} | |
| 152 | 160 | |
| 153 | 161 | /* |
| 154 | 162 | static int cmd_connect_ps(const char *name) | ... | ... |
src/plugins/remotectl/packets.h
| ... | ... | @@ -32,6 +32,7 @@ |
| 32 | 32 | HLLAPI_PACKET_CONNECT, |
| 33 | 33 | HLLAPI_PACKET_DISCONNECT, |
| 34 | 34 | HLLAPI_PACKET_GET_PROGRAM_MESSAGE, |
| 35 | + HLLAPI_PACKET_GET_TEXT_AT_OFFSET, | |
| 35 | 36 | HLLAPI_PACKET_GET_TEXT_AT, |
| 36 | 37 | HLLAPI_PACKET_SET_TEXT_AT, |
| 37 | 38 | HLLAPI_PACKET_CMP_TEXT_AT, |
| ... | ... | @@ -56,6 +57,12 @@ struct hllapi_packet_result |
| 56 | 57 | int rc; |
| 57 | 58 | }; |
| 58 | 59 | |
| 60 | +struct hllapi_packet_text_result | |
| 61 | +{ | |
| 62 | + int rc; | |
| 63 | + char text[1]; | |
| 64 | +}; | |
| 65 | + | |
| 59 | 66 | struct hllapi_packet_query |
| 60 | 67 | { |
| 61 | 68 | unsigned char packet_id; |
| ... | ... | @@ -123,6 +130,14 @@ struct hllapi_packet_addr |
| 123 | 130 | unsigned short addr; |
| 124 | 131 | }; |
| 125 | 132 | |
| 133 | +struct hllapi_packet_query_offset | |
| 134 | +{ | |
| 135 | + unsigned char packet_id; | |
| 136 | + unsigned short addr; | |
| 137 | + unsigned short len; | |
| 138 | +}; | |
| 139 | + | |
| 140 | + | |
| 126 | 141 | |
| 127 | 142 | #pragma pack() |
| 128 | 143 | ... | ... |
src/plugins/remotectl/pluginmain.c
| ... | ... | @@ -154,7 +154,9 @@ |
| 154 | 154 | pkt->packet_id = errno ? errno : -1; |
| 155 | 155 | } |
| 156 | 156 | |
| 157 | - WriteFile(source->hPipe,&pkt,szBlock,&szBlock,NULL); | |
| 157 | + WriteFile(source->hPipe,pkt,szBlock,&szBlock,NULL); | |
| 158 | + | |
| 159 | + g_free(pkt); | |
| 158 | 160 | } |
| 159 | 161 | |
| 160 | 162 | static void send_result(pipe_source *source, int rc) |
| ... | ... | @@ -223,6 +225,12 @@ |
| 223 | 225 | ((struct hllapi_packet_at *) source->buffer)->len)); |
| 224 | 226 | break; |
| 225 | 227 | |
| 228 | + case HLLAPI_PACKET_GET_TEXT_AT_OFFSET: | |
| 229 | + send_text(source,lib3270_get_text( lib3270_get_default_session_handle(), | |
| 230 | + ((struct hllapi_packet_query_offset *) source->buffer)->addr, | |
| 231 | + ((struct hllapi_packet_query_offset *) source->buffer)->len)); | |
| 232 | + break; | |
| 233 | + | |
| 226 | 234 | case HLLAPI_PACKET_CMP_TEXT_AT: |
| 227 | 235 | send_result(source,lib3270_cmp_text_at( lib3270_get_default_session_handle(), |
| 228 | 236 | ((struct hllapi_packet_text_at *) source->buffer)->row, | ... | ... |
src/plugins/remotectl/remote.c
| ... | ... | @@ -306,3 +306,29 @@ |
| 306 | 306 | TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); |
| 307 | 307 | return response.rc; |
| 308 | 308 | } |
| 309 | + | |
| 310 | + char * hllapi_pipe_get_text(void *h, int offset, int len) | |
| 311 | + { | |
| 312 | + struct hllapi_packet_query_offset query = { HLLAPI_PACKET_GET_TEXT_AT_OFFSET, offset, len }; | |
| 313 | + struct hllapi_packet_text * response; | |
| 314 | + DWORD cbSize = sizeof(struct hllapi_packet_text)+len; | |
| 315 | + char * text = NULL; | |
| 316 | + | |
| 317 | + trace("cbSize=%d",(int) cbSize); | |
| 318 | + | |
| 319 | + response = malloc(cbSize+2); | |
| 320 | + memset(response,0,cbSize+2); | |
| 321 | + | |
| 322 | + if(!TransactNamedPipe((HANDLE) h,(LPVOID) &query, sizeof(query), response, cbSize, &cbSize,NULL)) | |
| 323 | + return NULL; | |
| 324 | + | |
| 325 | + trace("rc=%d",response->packet_id); | |
| 326 | + | |
| 327 | + if(response->packet_id) | |
| 328 | + errno = response->packet_id; | |
| 329 | + else | |
| 330 | + text = strdup(response->text); | |
| 331 | + | |
| 332 | + free(response); | |
| 333 | + return text; | |
| 334 | + } | ... | ... |