Commit 8deeb7f38bbaa1fddefd6571957f6560d64dc010
1 parent
5408e656
Exists in
master
and in
5 other branches
Implementando conversão ebcdic<->ascii no objeto remoto
Showing
11 changed files
with
154 additions
and
21 deletions
Show diff stats
src/classlib/local.cc
... | ... | @@ -307,8 +307,8 @@ |
307 | 307 | const char * (*_get_host_charset)(H3270 *hSession); |
308 | 308 | int (*_print)(H3270 *hSession); |
309 | 309 | int (*_erase_eof)(H3270 *hSession); |
310 | - const char * (*_ebc2asc)(H3270 *hSession, unsigned char *buffer, size_t sz); | |
311 | - const char * (*_asc2ebc)(H3270 *hSession, unsigned char *buffer, size_t sz); | |
310 | + const char * (*_ebc2asc)(H3270 *hSession, unsigned char *buffer, int sz); | |
311 | + const char * (*_asc2ebc)(H3270 *hSession, unsigned char *buffer, int sz); | |
312 | 312 | |
313 | 313 | public: |
314 | 314 | |
... | ... | @@ -580,12 +580,12 @@ |
580 | 580 | } |
581 | 581 | |
582 | 582 | |
583 | - const char * asc2ebc(unsigned char *str, size_t sz) | |
583 | + const char * asc2ebc(unsigned char *str, int sz) | |
584 | 584 | { |
585 | 585 | return _asc2ebc(hSession,str,sz); |
586 | 586 | } |
587 | 587 | |
588 | - const char * ebc2asc(unsigned char *str, size_t sz) | |
588 | + const char * ebc2asc(unsigned char *str, int sz) | |
589 | 589 | { |
590 | 590 | return _ebc2asc(hSession,str,sz); |
591 | 591 | } | ... | ... |
src/classlib/remote.cc
... | ... | @@ -57,6 +57,8 @@ |
57 | 57 | #define HLLAPI_PACKET_QUIT "quit" |
58 | 58 | #define HLLAPI_PACKET_ERASE_EOF "eraseEOF" |
59 | 59 | #define HLLAPI_PACKET_PRINT "print" |
60 | + #define HLLAPI_PACKET_ASC2EBC "asc2ebc" | |
61 | + #define HLLAPI_PACKET_EBC2ASC "ebc2asc" | |
60 | 62 | #endif // WIN32 |
61 | 63 | |
62 | 64 | #include <pw3270/class.h> |
... | ... | @@ -91,6 +93,41 @@ |
91 | 93 | throw exception(GetLastError(),"%s","Transaction error"); |
92 | 94 | } |
93 | 95 | |
96 | + int query_strval(HLLAPI_PACKET id, unsigned char *buffer, size_t sz) | |
97 | + { | |
98 | + DWORD cbSize = sizeof(struct hllapi_packet_text)+sz; | |
99 | + struct hllapi_packet_text * query; | |
100 | + struct hllapi_packet_text * response; | |
101 | + int rc = -1; | |
102 | + | |
103 | + query = (struct hllapi_packet_text *) malloc(cbSize+2); | |
104 | + memset(query,0,cbSize+2); | |
105 | + query->packet_id = id; | |
106 | + memcpy(query->text,buffer,sz); | |
107 | + | |
108 | + response = (struct hllapi_packet_text *) malloc(cbSize+2); | |
109 | + memset(response,0,cbSize+2); | |
110 | + | |
111 | + if(TransactNamedPipe(hPipe,(LPVOID) query, cbSize, &response, cbSize, &cbSize,NULL)) | |
112 | + { | |
113 | + if(response->packet_id) | |
114 | + { | |
115 | + rc = response->packet_id; | |
116 | + } | |
117 | + else | |
118 | + { | |
119 | + rc = 0; | |
120 | + strncpy((char *) buffer,response->text,sz); | |
121 | + } | |
122 | + } | |
123 | + | |
124 | + free(response); | |
125 | + free(query); | |
126 | + | |
127 | + return rc; | |
128 | + | |
129 | + } | |
130 | + | |
94 | 131 | string * query_string(void *query, size_t szQuery, size_t len) |
95 | 132 | { |
96 | 133 | struct hllapi_packet_text * response; |
... | ... | @@ -264,6 +301,41 @@ |
264 | 301 | return get_intval(call(msg)); |
265 | 302 | } |
266 | 303 | |
304 | + int query_strval(const char *method, unsigned char *buffer, size_t sz) | |
305 | + { | |
306 | + DBusMessage * outMsg = create_message(const char *method); | |
307 | + | |
308 | + if(outMsg) | |
309 | + { | |
310 | + dbus_message_append_args(outMsg, DBUS_TYPE_STRING, &buffer, DBUS_TYPE_INVALID); | |
311 | + | |
312 | + DBusMessage * rspMsg = call(outMsg); | |
313 | + if(rspMsg) | |
314 | + { | |
315 | + if(dbus_message_iter_init(rspMsg, &iter)) | |
316 | + { | |
317 | + if(dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_STRING) | |
318 | + { | |
319 | + const char * str; | |
320 | + dbus_message_iter_get_basic(&iter, &str); | |
321 | + trace("Response: [%s]",str); | |
322 | + strncpy(buffer,str,sz); | |
323 | + dbus_message_unref(msg); | |
324 | + return 0; | |
325 | + } | |
326 | + | |
327 | + exception e = exception("DBUS Return type was %c, expecting %c",dbus_message_iter_get_arg_type(&iter),DBUS_TYPE_INT32); | |
328 | + dbus_message_unref(msg); | |
329 | + | |
330 | + throw e; | |
331 | + | |
332 | + } | |
333 | + } | |
334 | + } | |
335 | + | |
336 | + return -1; | |
337 | + } | |
338 | + | |
267 | 339 | #else |
268 | 340 | |
269 | 341 | |
... | ... | @@ -1188,19 +1260,18 @@ |
1188 | 1260 | return query_intval(HLLAPI_PACKET_PRINT); |
1189 | 1261 | } |
1190 | 1262 | |
1191 | - const char * asc2ebc(unsigned char *str, size_t sz) | |
1263 | + const char * asc2ebc(unsigned char *text, int sz) | |
1192 | 1264 | { |
1193 | - #warning Incomplete | |
1194 | - return (const char *) str; | |
1265 | + query_strval(HLLAPI_PACKET_ASC2EBC,text,sz); | |
1266 | + return (const char *) text; | |
1195 | 1267 | } |
1196 | 1268 | |
1197 | - const char * ebc2asc(unsigned char *str, size_t sz) | |
1269 | + const char * ebc2asc(unsigned char *text, int sz) | |
1198 | 1270 | { |
1199 | - #warning Incomplete | |
1200 | - return (const char *) str; | |
1271 | + query_strval(HLLAPI_PACKET_EBC2ASC,text,sz); | |
1272 | + return (const char *) text; | |
1201 | 1273 | } |
1202 | 1274 | |
1203 | - | |
1204 | 1275 | }; |
1205 | 1276 | |
1206 | 1277 | session * session::create_remote(const char *session) | ... | ... |
src/include/lib3270/charset.h
... | ... | @@ -64,8 +64,8 @@ |
64 | 64 | LIB3270_EXPORT int lib3270_set_host_charset(H3270 *hSession, const char *name); |
65 | 65 | LIB3270_EXPORT const char * lib3270_get_host_charset(H3270 *hSession); |
66 | 66 | LIB3270_EXPORT void lib3270_remap(H3270 *hSession, unsigned short ebc, unsigned short iso, lib3270_remap_scope scope, unsigned char one_way); |
67 | - LIB3270_EXPORT const char * lib3270_ebc2asc(H3270 *hSession, unsigned char *buffer, size_t sz); | |
68 | - LIB3270_EXPORT const char * lib3270_asc2ebc(H3270 *hSession, unsigned char *buffer, size_t sz); | |
67 | + LIB3270_EXPORT const char * lib3270_ebc2asc(H3270 *hSession, unsigned char *buffer, int sz); | |
68 | + LIB3270_EXPORT const char * lib3270_asc2ebc(H3270 *hSession, unsigned char *buffer, int sz); | |
69 | 69 | |
70 | 70 | |
71 | 71 | #ifdef __cplusplus | ... | ... |
src/include/pw3270/class.h
... | ... | @@ -141,8 +141,8 @@ |
141 | 141 | virtual int emulate_input(const char *str) = 0; |
142 | 142 | |
143 | 143 | // Ascii<->EBCDIC translation |
144 | - virtual const char * asc2ebc(unsigned char *str, size_t sz = -1) = 0; | |
145 | - virtual const char * ebc2asc(unsigned char *str, size_t sz = -1) = 0; | |
144 | + virtual const char * asc2ebc(unsigned char *str, int sz = -1) = 0; | |
145 | + virtual const char * ebc2asc(unsigned char *str, int sz = -1) = 0; | |
146 | 146 | string asc2ebc(string &str); |
147 | 147 | string ebc2asc(string &str); |
148 | 148 | ... | ... |
src/include/pw3270/ipcpackets.h
src/lib3270/charset.c
... | ... | @@ -406,7 +406,7 @@ LIB3270_ACTION( charsettable ) |
406 | 406 | return 0; |
407 | 407 | } |
408 | 408 | |
409 | -LIB3270_EXPORT const char * lib3270_asc2ebc(H3270 *hSession, unsigned char *buffer, size_t sz) | |
409 | +LIB3270_EXPORT const char * lib3270_asc2ebc(H3270 *hSession, unsigned char *buffer, int sz) | |
410 | 410 | { |
411 | 411 | int f; |
412 | 412 | if(sz < 0) |
... | ... | @@ -421,7 +421,7 @@ LIB3270_EXPORT const char * lib3270_asc2ebc(H3270 *hSession, unsigned char *buff |
421 | 421 | return (const char *) buffer; |
422 | 422 | } |
423 | 423 | |
424 | -LIB3270_EXPORT const char * lib3270_ebc2asc(H3270 *hSession, unsigned char *buffer, size_t sz) | |
424 | +LIB3270_EXPORT const char * lib3270_ebc2asc(H3270 *hSession, unsigned char *buffer, int sz) | |
425 | 425 | { |
426 | 426 | int f; |
427 | 427 | if(sz < 0) | ... | ... |
src/plugins/dbus3270/gobject.c
... | ... | @@ -479,3 +479,35 @@ void pw3270_dbus_print(PW3270Dbus *object, DBusGMethodInvocation *context) |
479 | 479 | { |
480 | 480 | dbus_g_method_return(context,lib3270_print(pw3270_dbus_get_session_handle(object))); |
481 | 481 | } |
482 | + | |
483 | +void pw3270_dbus_ebc2asc(PW3270Dbus *object, const gchar *from, DBusGMethodInvocation *context) | |
484 | +{ | |
485 | + int sz = strlen(from); | |
486 | + | |
487 | + if(sz > 0) | |
488 | + { | |
489 | + unsigned char buffer[sz+1]; | |
490 | + memcpy(buffer,from,sz); | |
491 | + dbus_g_method_return(context,lib3270_ebc2asc(pw3270_dbus_get_session_handle(object),buffer,sz)); | |
492 | + return; | |
493 | + } | |
494 | + | |
495 | + dbus_g_method_return(context,""); | |
496 | + | |
497 | +} | |
498 | + | |
499 | +void pw3270_dbus_asc2ebc(PW3270Dbus *object, const gchar *from, DBusGMethodInvocation *context) | |
500 | +{ | |
501 | + int sz = strlen(from); | |
502 | + | |
503 | + if(sz > 0) | |
504 | + { | |
505 | + unsigned char buffer[sz+1]; | |
506 | + memcpy(buffer,from,sz); | |
507 | + dbus_g_method_return(context,lib3270_asc2ebc(pw3270_dbus_get_session_handle(object),buffer,sz)); | |
508 | + return; | |
509 | + } | |
510 | + | |
511 | + dbus_g_method_return(context,""); | |
512 | + | |
513 | +} | ... | ... |
src/plugins/dbus3270/pw3270dbus.xml
... | ... | @@ -170,6 +170,16 @@ |
170 | 170 | <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> |
171 | 171 | <arg type="i" name="result" direction="out" /> |
172 | 172 | </method> |
173 | + <method name="ebc2asc"> | |
174 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | |
175 | + <arg type="s" name="from" direction="in" /> | |
176 | + <arg type="s" name="to" direction="out" /> | |
177 | + </method> | |
178 | + <method name="asc2ebc"> | |
179 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | |
180 | + <arg type="s" name="from" direction="in" /> | |
181 | + <arg type="s" name="to" direction="out" /> | |
182 | + </method> | |
173 | 183 | |
174 | 184 | </interface> |
175 | 185 | ... | ... |
src/plugins/dbus3270/service.h
... | ... | @@ -112,6 +112,9 @@ |
112 | 112 | void pw3270_dbus_erase_eof(PW3270Dbus *object, DBusGMethodInvocation *context); |
113 | 113 | void pw3270_dbus_print(PW3270Dbus *object, DBusGMethodInvocation *context); |
114 | 114 | |
115 | + void pw3270_dbus_asc2ebc(PW3270Dbus *object, const gchar *from, DBusGMethodInvocation *context); | |
116 | + void pw3270_dbus_ebc2asc(PW3270Dbus *object, const gchar *from, DBusGMethodInvocation *context); | |
117 | + | |
115 | 118 | G_END_DECLS |
116 | 119 | |
117 | 120 | #endif // _PW3270_DBUS_SERVICE_H | ... | ... |
src/plugins/hllapi/pluginmain.c
... | ... | @@ -313,6 +313,20 @@ |
313 | 313 | (const char *) ((struct hllapi_packet_set_text *) source->buffer)->text)); |
314 | 314 | break; |
315 | 315 | |
316 | + case HLLAPI_PACKET_ASC2EBC: | |
317 | + send_text(source,(char *) lib3270_asc2ebc( | |
318 | + lib3270_get_default_session_handle(), | |
319 | + (unsigned char *) ((struct hllapi_packet_set_text *) source->buffer)->text,-1 | |
320 | + )); | |
321 | + break; | |
322 | + | |
323 | + case HLLAPI_PACKET_EBC2ASC: | |
324 | + send_text(source,(char *) lib3270_ebc2asc( | |
325 | + lib3270_get_default_session_handle(), | |
326 | + (unsigned char *) ((struct hllapi_packet_set_text *) source->buffer)->text,-1 | |
327 | + )); | |
328 | + break; | |
329 | + | |
316 | 330 | case HLLAPI_PACKET_GET_HOST_CHARSET: |
317 | 331 | send_text(source,(char *) lib3270_get_host_charset(lib3270_get_default_session_handle())); |
318 | 332 | break; | ... | ... |
src/plugins/rx3270/pluginmain.cc
... | ... | @@ -135,8 +135,8 @@ |
135 | 135 | string * get_host_charset(void); |
136 | 136 | string * get_display_charset(void); |
137 | 137 | |
138 | - const char * asc2ebc(unsigned char *str, size_t sz = -1); | |
139 | - const char * ebc2asc(unsigned char *str, size_t sz = -1); | |
138 | + const char * asc2ebc(unsigned char *str, int sz = -1); | |
139 | + const char * ebc2asc(unsigned char *str, int sz = -1); | |
140 | 140 | |
141 | 141 | int quit(void); |
142 | 142 | |
... | ... | @@ -761,12 +761,12 @@ int plugin::print(void) |
761 | 761 | return lib3270_print(hSession); |
762 | 762 | } |
763 | 763 | |
764 | -const char * plugin::asc2ebc(unsigned char *str, size_t sz) | |
764 | +const char * plugin::asc2ebc(unsigned char *str, int sz) | |
765 | 765 | { |
766 | 766 | return lib3270_asc2ebc(hSession,str,sz); |
767 | 767 | } |
768 | 768 | |
769 | -const char * plugin::ebc2asc(unsigned char *str, size_t sz) | |
769 | +const char * plugin::ebc2asc(unsigned char *str, int sz) | |
770 | 770 | { |
771 | 771 | return lib3270_ebc2asc(hSession,str,sz); |
772 | 772 | } | ... | ... |