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,6 +78,7 @@ extern "C" {
78 __declspec (dllexport) DWORD __stdcall hllapi_get_message_id(void); 78 __declspec (dllexport) DWORD __stdcall hllapi_get_message_id(void);
79 __declspec (dllexport) DWORD __stdcall hllapi_is_connected(void); 79 __declspec (dllexport) DWORD __stdcall hllapi_is_connected(void);
80 __declspec (dllexport) DWORD __stdcall hllapi_get_screen_at(WORD row, WORD col, LPSTR buffer); 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 __declspec (dllexport) DWORD __stdcall hllapi_enter(void); 82 __declspec (dllexport) DWORD __stdcall hllapi_enter(void);
82 __declspec (dllexport) DWORD __stdcall hllapi_set_text_at(WORD row, WORD col, LPSTR text); 83 __declspec (dllexport) DWORD __stdcall hllapi_set_text_at(WORD row, WORD col, LPSTR text);
83 __declspec (dllexport) DWORD __stdcall hllapi_cmp_text_at(WORD row, WORD col, LPSTR text); 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,6 +55,8 @@
55 static int (*script_sleep)(void *h, int seconds) = NULL; 55 static int (*script_sleep)(void *h, int seconds) = NULL;
56 static LIB3270_MESSAGE (*get_message)(void *h) = NULL; 56 static LIB3270_MESSAGE (*get_message)(void *h) = NULL;
57 static char * (*get_text)(void *h, int row, int col, int len) = NULL; 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 static void * (*release_memory)(void *p) = NULL; 60 static void * (*release_memory)(void *p) = NULL;
59 static int (*action_enter)(void *h) = NULL; 61 static int (*action_enter)(void *h) = NULL;
60 static int (*set_text_at)(void *h, int row, int col, const unsigned char *str) = NULL; 62 static int (*set_text_at)(void *h, int row, int col, const unsigned char *str) = NULL;
@@ -71,25 +73,25 @@ @@ -71,25 +73,25 @@
71 const char * name; 73 const char * name;
72 } entry_point[] = 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 { NULL, NULL } 95 { NULL, NULL }
94 }; 96 };
95 97
@@ -402,3 +404,33 @@ @@ -402,3 +404,33 @@
402 return -EINVAL; 404 return -EINVAL;
403 return getcursor(hSession)+1; 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,6 +46,7 @@
46 void hllapi_pipe_disconnect(void *h); 46 void hllapi_pipe_disconnect(void *h);
47 LIB3270_MESSAGE hllapi_pipe_get_message(void *h); 47 LIB3270_MESSAGE hllapi_pipe_get_message(void *h);
48 char * hllapi_pipe_get_text_at(void *h, int row, int col, int len); 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 int hllapi_pipe_enter(void *h); 50 int hllapi_pipe_enter(void *h);
50 int hllapi_pipe_set_text_at(void *h, int row, int col, const unsigned char *str); 51 int hllapi_pipe_set_text_at(void *h, int row, int col, const unsigned char *str);
51 int hllapi_pipe_cmp_text_at(void *h, int row, int col, const char *text); 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,6 +43,7 @@
43 static int connect_ps(char *buffer, unsigned short *length, unsigned short *rc); 43 static int connect_ps(char *buffer, unsigned short *length, unsigned short *rc);
44 static int disconnect_ps(char *buffer, unsigned short *length, unsigned short *rc); 44 static int disconnect_ps(char *buffer, unsigned short *length, unsigned short *rc);
45 static int get_library_revision(char *buffer, unsigned short *length, unsigned short *rc); 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 static int get_cursor_position(char *buffer, unsigned short *length, unsigned short *rc); 48 static int get_cursor_position(char *buffer, unsigned short *length, unsigned short *rc);
48 static int set_cursor_position(char *buffer, unsigned short *length, unsigned short *rc); 49 static int set_cursor_position(char *buffer, unsigned short *length, unsigned short *rc);
@@ -59,7 +60,8 @@ @@ -59,7 +60,8 @@
59 { HLLAPI_CMD_DISCONNECTPS, disconnect_ps }, 60 { HLLAPI_CMD_DISCONNECTPS, disconnect_ps },
60 { HLLAPI_CMD_GETREVISION, get_library_revision }, 61 { HLLAPI_CMD_GETREVISION, get_library_revision },
61 { HLLAPI_CMD_QUERYCURSOR, get_cursor_position }, 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 /*--[ Implement ]------------------------------------------------------------------------------------*/ 67 /*--[ Implement ]------------------------------------------------------------------------------------*/
@@ -149,6 +151,12 @@ static int set_cursor_position(char *buffer, unsigned short *length, unsigned sh @@ -149,6 +151,12 @@ static int set_cursor_position(char *buffer, unsigned short *length, unsigned sh
149 return 0; 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 static int cmd_connect_ps(const char *name) 162 static int cmd_connect_ps(const char *name)
src/plugins/remotectl/packets.h
@@ -32,6 +32,7 @@ @@ -32,6 +32,7 @@
32 HLLAPI_PACKET_CONNECT, 32 HLLAPI_PACKET_CONNECT,
33 HLLAPI_PACKET_DISCONNECT, 33 HLLAPI_PACKET_DISCONNECT,
34 HLLAPI_PACKET_GET_PROGRAM_MESSAGE, 34 HLLAPI_PACKET_GET_PROGRAM_MESSAGE,
  35 + HLLAPI_PACKET_GET_TEXT_AT_OFFSET,
35 HLLAPI_PACKET_GET_TEXT_AT, 36 HLLAPI_PACKET_GET_TEXT_AT,
36 HLLAPI_PACKET_SET_TEXT_AT, 37 HLLAPI_PACKET_SET_TEXT_AT,
37 HLLAPI_PACKET_CMP_TEXT_AT, 38 HLLAPI_PACKET_CMP_TEXT_AT,
@@ -56,6 +57,12 @@ struct hllapi_packet_result @@ -56,6 +57,12 @@ struct hllapi_packet_result
56 int rc; 57 int rc;
57 }; 58 };
58 59
  60 +struct hllapi_packet_text_result
  61 +{
  62 + int rc;
  63 + char text[1];
  64 +};
  65 +
59 struct hllapi_packet_query 66 struct hllapi_packet_query
60 { 67 {
61 unsigned char packet_id; 68 unsigned char packet_id;
@@ -123,6 +130,14 @@ struct hllapi_packet_addr @@ -123,6 +130,14 @@ struct hllapi_packet_addr
123 unsigned short addr; 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 #pragma pack() 142 #pragma pack()
128 143
src/plugins/remotectl/pluginmain.c
@@ -154,7 +154,9 @@ @@ -154,7 +154,9 @@
154 pkt->packet_id = errno ? errno : -1; 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 static void send_result(pipe_source *source, int rc) 162 static void send_result(pipe_source *source, int rc)
@@ -223,6 +225,12 @@ @@ -223,6 +225,12 @@
223 ((struct hllapi_packet_at *) source->buffer)->len)); 225 ((struct hllapi_packet_at *) source->buffer)->len));
224 break; 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 case HLLAPI_PACKET_CMP_TEXT_AT: 234 case HLLAPI_PACKET_CMP_TEXT_AT:
227 send_result(source,lib3270_cmp_text_at( lib3270_get_default_session_handle(), 235 send_result(source,lib3270_cmp_text_at( lib3270_get_default_session_handle(),
228 ((struct hllapi_packet_text_at *) source->buffer)->row, 236 ((struct hllapi_packet_text_at *) source->buffer)->row,
src/plugins/remotectl/remote.c
@@ -306,3 +306,29 @@ @@ -306,3 +306,29 @@
306 TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL); 306 TransactNamedPipe((HANDLE) h,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL);
307 return response.rc; 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 + }