Commit 00e98f6ee3f76b8b894d779aeed2eab59aeb989d

Authored by perry.werneck@gmail.com
1 parent d5cf098d

Reimplementando HLLAPI no novo formato

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