Commit 1fdad013c2f68c3336295b2f1df2ee3751745cca
1 parent
70442604
Exists in
master
and in
5 other branches
HLLAPI passa a converter o charset do terminal, funcao lib3270_get_text estava a…
…ceitando gets maiores que o tamanho do terminal, implementacao da funcao HLLAPI para obter o buffer do terminal, HLLAPI estava fechando a pipe de comunicacao logo apos a conexao
Showing
5 changed files
with
89 additions
and
16 deletions
Show diff stats
src/lib3270/selection.c
... | ... | @@ -464,11 +464,9 @@ LIB3270_EXPORT char * lib3270_get_text(H3270 *h, int offset, int len) |
464 | 464 | if(!lib3270_connected(h)) |
465 | 465 | return NULL; |
466 | 466 | |
467 | - maxlen = h->rows * (h->cols+1); | |
467 | + maxlen = (h->rows * (h->cols+1)) - offset; | |
468 | 468 | |
469 | - if(len < 0) | |
470 | - len = (maxlen - offset); | |
471 | - else if(len > maxlen) | |
469 | + if(len < 0 || len > maxlen) | |
472 | 470 | len = maxlen; |
473 | 471 | |
474 | 472 | buffer = lib3270_malloc(len+1); | ... | ... |
src/plugins/remotectl/hllapi.c
... | ... | @@ -68,6 +68,7 @@ |
68 | 68 | if(!SetNamedPipeHandleState(hPipe,&dwMode,NULL,NULL)) |
69 | 69 | return GetLastError(); |
70 | 70 | |
71 | + trace("Pipe %ld open",(unsigned long) hPipe); | |
71 | 72 | #else |
72 | 73 | |
73 | 74 | #error Not implemented |
... | ... | @@ -89,6 +90,7 @@ |
89 | 90 | |
90 | 91 | if(hPipe == INVALID_HANDLE_VALUE) |
91 | 92 | { |
93 | + trace("Invalid pipe handle %ld",(unsigned long) hPipe); | |
92 | 94 | result = EPERM; |
93 | 95 | } |
94 | 96 | else |
... | ... | @@ -180,8 +182,9 @@ |
180 | 182 | if(!result) |
181 | 183 | { |
182 | 184 | result = run_query(*func, arg, str, *length, rc); |
183 | - if(result || rc) | |
185 | + if(result || *rc) | |
184 | 186 | { |
187 | + trace("Closing pipe rc=%d result=%d ",*rc,result); | |
185 | 188 | CloseHandle(hPipe); |
186 | 189 | hPipe = INVALID_HANDLE_VALUE; |
187 | 190 | } | ... | ... |
src/plugins/remotectl/remotectl.c
... | ... | @@ -162,15 +162,36 @@ |
162 | 162 | return 0; |
163 | 163 | } |
164 | 164 | |
165 | - static int cmd_sendstring(H3270 *hSession, unsigned short rc, char *text, unsigned short length) | |
165 | + static int cmd_sendstring(H3270 *hSession, unsigned short dunno, char *buffer, unsigned short length) | |
166 | 166 | { |
167 | + gchar * text; | |
168 | + GError * error = NULL; | |
169 | + gsize bytes_read; | |
170 | + gsize bytes_written; | |
171 | + const gchar * charset; | |
172 | + int rc = -1; | |
173 | + | |
167 | 174 | if(!lib3270_connected(hSession)) |
168 | 175 | return ENOTCONN; |
169 | 176 | |
170 | - #warning Converter formato da string | |
171 | - lib3270_emulate_input(hSession,text,strlen(text),0); | |
177 | + g_get_charset(&charset); | |
172 | 178 | |
173 | - return 0; | |
179 | + text = g_convert(buffer,-1,lib3270_get_charset(hSession),charset,&bytes_read,&bytes_written,&error); | |
180 | + if(text) | |
181 | + { | |
182 | + #warning Converter "@" em "\\" | |
183 | + lib3270_emulate_input(hSession,text,strlen(text),0); | |
184 | + g_free(text); | |
185 | + rc = 0; | |
186 | + } | |
187 | + else | |
188 | + { | |
189 | + strncpy(buffer,error->message,length); | |
190 | + rc = error->code; | |
191 | + g_error_free(error); | |
192 | + } | |
193 | + | |
194 | + return rc; | |
174 | 195 | } |
175 | 196 | |
176 | 197 | static int cmd_wait(H3270 *hSession, unsigned short rc, char *text, unsigned short length) |
... | ... | @@ -178,6 +199,39 @@ |
178 | 199 | return lib3270_wait_for_ready(hSession,60); |
179 | 200 | } |
180 | 201 | |
202 | + static int cmd_copypstostr(H3270 *hSession, unsigned short pos, char *buffer, unsigned short length) | |
203 | + { | |
204 | + char * text = lib3270_get_text(hSession, (int) pos, (int) length); | |
205 | + gchar * local; | |
206 | + GError * error = NULL; | |
207 | + gsize bytes_read; | |
208 | + gsize bytes_written; | |
209 | + int rc = 0; | |
210 | + const gchar * charset; | |
211 | + | |
212 | + if(!text) | |
213 | + return -1; | |
214 | + | |
215 | + g_get_charset(&charset); | |
216 | + | |
217 | + local = g_convert((const gchar *) text,-1,charset,lib3270_get_charset(hSession),&bytes_read,&bytes_written,&error); | |
218 | + | |
219 | + if(local) | |
220 | + { | |
221 | + strncpy(buffer,local,length); | |
222 | + g_free(local); | |
223 | + } | |
224 | + else | |
225 | + { | |
226 | + strncpy(buffer,error->message,length); | |
227 | + rc = error->code; | |
228 | + g_error_free(error); | |
229 | + } | |
230 | + | |
231 | + lib3270_free(text); | |
232 | + return rc; | |
233 | + } | |
234 | + | |
181 | 235 | int run_hllapi(unsigned long function, char *string, unsigned short length, unsigned short rc) |
182 | 236 | { |
183 | 237 | static const struct _cmd |
... | ... | @@ -191,7 +245,8 @@ |
191 | 245 | { HLLAPI_CMD_INPUTSTRING, cmd_sendstring }, |
192 | 246 | { HLLAPI_CMD_WAIT, cmd_wait }, |
193 | 247 | { HLLAPI_CMD_SETCURSOR, cmd_setcursor }, |
194 | - { HLLAPI_CMD_GETREVISION, cmd_getrevision } | |
248 | + { HLLAPI_CMD_GETREVISION, cmd_getrevision }, | |
249 | + { HLLAPI_CMD_COPYPSTOSTR, cmd_copypstostr } | |
195 | 250 | }; |
196 | 251 | int f; |
197 | 252 | ... | ... |
src/plugins/remotectl/remotectl.h
src/plugins/remotectl/testprogram.c
... | ... | @@ -31,12 +31,17 @@ |
31 | 31 | #include <stdio.h> |
32 | 32 | #include <pw3270/hllapi.h> |
33 | 33 | |
34 | + #define BUFFER_LENGTH 4096 | |
35 | + | |
34 | 36 | /*---[ Implement ]--------------------------------------------------------------------------------*/ |
35 | 37 | |
36 | 38 | int main(int numpar, char *param[]) |
37 | 39 | { |
38 | - char buffer[1024]; | |
40 | + char buffer[BUFFER_LENGTH]; | |
39 | 41 | unsigned short rc; |
42 | + unsigned short len; | |
43 | + int result; | |
44 | + unsigned long fn; | |
40 | 45 | |
41 | 46 | static const struct _cmd |
42 | 47 | { |
... | ... | @@ -49,7 +54,6 @@ |
49 | 54 | { "GetRevision", HLLAPI_CMD_GETREVISION, "" }, |
50 | 55 | { "InputString", HLLAPI_CMD_INPUTSTRING, "test" }, |
51 | 56 | |
52 | - { "DisconnectPS", HLLAPI_CMD_DISCONNECTPS, "" }, | |
53 | 57 | }; |
54 | 58 | |
55 | 59 | int f; |
... | ... | @@ -57,14 +61,27 @@ |
57 | 61 | |
58 | 62 | for(f=0;f< (sizeof(cmd)/sizeof(struct _cmd)); f++) |
59 | 63 | { |
60 | - unsigned short len = 1024; | |
61 | - int result; | |
62 | - | |
64 | + len = BUFFER_LENGTH; | |
63 | 65 | strcpy(buffer,cmd[f].arg); |
64 | 66 | result = hllapi(&cmd[f].fn,buffer,&len,&rc); |
65 | 67 | printf("%s exits with %d\n[%s]\n",cmd[f].name,result,buffer); |
66 | 68 | |
67 | 69 | } |
68 | 70 | |
71 | + len = BUFFER_LENGTH; | |
72 | + rc = 1; | |
73 | + fn = HLLAPI_CMD_COPYPSTOSTR; | |
74 | + result = hllapi(&fn,buffer,&len,&rc); | |
75 | + printf("%s exits with %d\n%s\n","HLLAPI_CMD_COPYPSTOSTR",result,buffer); | |
76 | + | |
77 | + | |
78 | + // Disconnect | |
79 | + len = BUFFER_LENGTH; | |
80 | + rc = 1; | |
81 | + fn = HLLAPI_CMD_DISCONNECTPS; | |
82 | + *buffer = 0; | |
83 | + result = hllapi(&fn,buffer,&len,&rc); | |
84 | + printf("%s exits with %d [%s]\n","HLLAPI_CMD_DISCONNECTPS",result,buffer); | |
85 | + | |
69 | 86 | return 0; |
70 | 87 | } | ... | ... |