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,8 +307,8 @@ | ||
307 | const char * (*_get_host_charset)(H3270 *hSession); | 307 | const char * (*_get_host_charset)(H3270 *hSession); |
308 | int (*_print)(H3270 *hSession); | 308 | int (*_print)(H3270 *hSession); |
309 | int (*_erase_eof)(H3270 *hSession); | 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 | public: | 313 | public: |
314 | 314 | ||
@@ -580,12 +580,12 @@ | @@ -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 | return _asc2ebc(hSession,str,sz); | 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 | return _ebc2asc(hSession,str,sz); | 590 | return _ebc2asc(hSession,str,sz); |
591 | } | 591 | } |
src/classlib/remote.cc
@@ -57,6 +57,8 @@ | @@ -57,6 +57,8 @@ | ||
57 | #define HLLAPI_PACKET_QUIT "quit" | 57 | #define HLLAPI_PACKET_QUIT "quit" |
58 | #define HLLAPI_PACKET_ERASE_EOF "eraseEOF" | 58 | #define HLLAPI_PACKET_ERASE_EOF "eraseEOF" |
59 | #define HLLAPI_PACKET_PRINT "print" | 59 | #define HLLAPI_PACKET_PRINT "print" |
60 | + #define HLLAPI_PACKET_ASC2EBC "asc2ebc" | ||
61 | + #define HLLAPI_PACKET_EBC2ASC "ebc2asc" | ||
60 | #endif // WIN32 | 62 | #endif // WIN32 |
61 | 63 | ||
62 | #include <pw3270/class.h> | 64 | #include <pw3270/class.h> |
@@ -91,6 +93,41 @@ | @@ -91,6 +93,41 @@ | ||
91 | throw exception(GetLastError(),"%s","Transaction error"); | 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 | string * query_string(void *query, size_t szQuery, size_t len) | 131 | string * query_string(void *query, size_t szQuery, size_t len) |
95 | { | 132 | { |
96 | struct hllapi_packet_text * response; | 133 | struct hllapi_packet_text * response; |
@@ -264,6 +301,41 @@ | @@ -264,6 +301,41 @@ | ||
264 | return get_intval(call(msg)); | 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 | #else | 339 | #else |
268 | 340 | ||
269 | 341 | ||
@@ -1188,19 +1260,18 @@ | @@ -1188,19 +1260,18 @@ | ||
1188 | return query_intval(HLLAPI_PACKET_PRINT); | 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 | session * session::create_remote(const char *session) | 1277 | session * session::create_remote(const char *session) |
src/include/lib3270/charset.h
@@ -64,8 +64,8 @@ | @@ -64,8 +64,8 @@ | ||
64 | LIB3270_EXPORT int lib3270_set_host_charset(H3270 *hSession, const char *name); | 64 | LIB3270_EXPORT int lib3270_set_host_charset(H3270 *hSession, const char *name); |
65 | LIB3270_EXPORT const char * lib3270_get_host_charset(H3270 *hSession); | 65 | LIB3270_EXPORT const char * lib3270_get_host_charset(H3270 *hSession); |
66 | LIB3270_EXPORT void lib3270_remap(H3270 *hSession, unsigned short ebc, unsigned short iso, lib3270_remap_scope scope, unsigned char one_way); | 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 | #ifdef __cplusplus | 71 | #ifdef __cplusplus |
src/include/pw3270/class.h
@@ -141,8 +141,8 @@ | @@ -141,8 +141,8 @@ | ||
141 | virtual int emulate_input(const char *str) = 0; | 141 | virtual int emulate_input(const char *str) = 0; |
142 | 142 | ||
143 | // Ascii<->EBCDIC translation | 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 | string asc2ebc(string &str); | 146 | string asc2ebc(string &str); |
147 | string ebc2asc(string &str); | 147 | string ebc2asc(string &str); |
148 | 148 |
src/include/pw3270/ipcpackets.h
@@ -59,6 +59,9 @@ | @@ -59,6 +59,9 @@ | ||
59 | HLLAPI_PACKET_SET_HOST_CHARSET, | 59 | HLLAPI_PACKET_SET_HOST_CHARSET, |
60 | HLLAPI_PACKET_GET_HOST_CHARSET, | 60 | HLLAPI_PACKET_GET_HOST_CHARSET, |
61 | 61 | ||
62 | + HLLAPI_PACKET_ASC2EBC, | ||
63 | + HLLAPI_PACKET_EBC2ASC, | ||
64 | + | ||
62 | HLLAPI_PACKET_INVALID | 65 | HLLAPI_PACKET_INVALID |
63 | 66 | ||
64 | } HLLAPI_PACKET; | 67 | } HLLAPI_PACKET; |
src/lib3270/charset.c
@@ -406,7 +406,7 @@ LIB3270_ACTION( charsettable ) | @@ -406,7 +406,7 @@ LIB3270_ACTION( charsettable ) | ||
406 | return 0; | 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 | int f; | 411 | int f; |
412 | if(sz < 0) | 412 | if(sz < 0) |
@@ -421,7 +421,7 @@ LIB3270_EXPORT const char * lib3270_asc2ebc(H3270 *hSession, unsigned char *buff | @@ -421,7 +421,7 @@ LIB3270_EXPORT const char * lib3270_asc2ebc(H3270 *hSession, unsigned char *buff | ||
421 | return (const char *) buffer; | 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 | int f; | 426 | int f; |
427 | if(sz < 0) | 427 | if(sz < 0) |
src/plugins/dbus3270/gobject.c
@@ -479,3 +479,35 @@ void pw3270_dbus_print(PW3270Dbus *object, DBusGMethodInvocation *context) | @@ -479,3 +479,35 @@ void pw3270_dbus_print(PW3270Dbus *object, DBusGMethodInvocation *context) | ||
479 | { | 479 | { |
480 | dbus_g_method_return(context,lib3270_print(pw3270_dbus_get_session_handle(object))); | 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,6 +170,16 @@ | ||
170 | <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | 170 | <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> |
171 | <arg type="i" name="result" direction="out" /> | 171 | <arg type="i" name="result" direction="out" /> |
172 | </method> | 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 | </interface> | 184 | </interface> |
175 | 185 |
src/plugins/dbus3270/service.h
@@ -112,6 +112,9 @@ | @@ -112,6 +112,9 @@ | ||
112 | void pw3270_dbus_erase_eof(PW3270Dbus *object, DBusGMethodInvocation *context); | 112 | void pw3270_dbus_erase_eof(PW3270Dbus *object, DBusGMethodInvocation *context); |
113 | void pw3270_dbus_print(PW3270Dbus *object, DBusGMethodInvocation *context); | 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 | G_END_DECLS | 118 | G_END_DECLS |
116 | 119 | ||
117 | #endif // _PW3270_DBUS_SERVICE_H | 120 | #endif // _PW3270_DBUS_SERVICE_H |
src/plugins/hllapi/pluginmain.c
@@ -313,6 +313,20 @@ | @@ -313,6 +313,20 @@ | ||
313 | (const char *) ((struct hllapi_packet_set_text *) source->buffer)->text)); | 313 | (const char *) ((struct hllapi_packet_set_text *) source->buffer)->text)); |
314 | break; | 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 | case HLLAPI_PACKET_GET_HOST_CHARSET: | 330 | case HLLAPI_PACKET_GET_HOST_CHARSET: |
317 | send_text(source,(char *) lib3270_get_host_charset(lib3270_get_default_session_handle())); | 331 | send_text(source,(char *) lib3270_get_host_charset(lib3270_get_default_session_handle())); |
318 | break; | 332 | break; |
src/plugins/rx3270/pluginmain.cc
@@ -135,8 +135,8 @@ | @@ -135,8 +135,8 @@ | ||
135 | string * get_host_charset(void); | 135 | string * get_host_charset(void); |
136 | string * get_display_charset(void); | 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 | int quit(void); | 141 | int quit(void); |
142 | 142 | ||
@@ -761,12 +761,12 @@ int plugin::print(void) | @@ -761,12 +761,12 @@ int plugin::print(void) | ||
761 | return lib3270_print(hSession); | 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 | return lib3270_asc2ebc(hSession,str,sz); | 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 | return lib3270_ebc2asc(hSession,str,sz); | 771 | return lib3270_ebc2asc(hSession,str,sz); |
772 | } | 772 | } |