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