Commit 2fd2b75ac77c25cc01b459ea832c25591b3a1129
1 parent
6c280698
Exists in
master
and in
5 other branches
Implementando conversao de charset
Showing
4 changed files
with
139 additions
and
8 deletions
Show diff stats
android/jni/main.cpp
| ... | ... | @@ -281,7 +281,7 @@ static void autostart(H3270 *session) |
| 281 | 281 | |
| 282 | 282 | jint JNI_OnLoad(JavaVM *vm, void *reserved) |
| 283 | 283 | { |
| 284 | - H3270 * session = lib3270_session_new(""); | |
| 284 | + H3270 * session = lib3270_session_new("","bracket"); | |
| 285 | 285 | |
| 286 | 286 | __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, "Initializing %s",PACKAGE_NAME); |
| 287 | 287 | ... | ... |
src/include/lib3270/session.h
| ... | ... | @@ -112,7 +112,7 @@ |
| 112 | 112 | int trace_skipping : 1; |
| 113 | 113 | int need_tls_follows : 1; |
| 114 | 114 | int cut_xfer_in_progress : 1; |
| 115 | - int auto_keymap : 1; | |
| 115 | +// int auto_keymap : 1; | |
| 116 | 116 | int formatted : 1; /**< Formatted screen flag */ |
| 117 | 117 | int starting : 1; /**< Is starting (no first screen)? */ |
| 118 | 118 | ... | ... |
src/lib3270/charset.c
| ... | ... | @@ -35,6 +35,16 @@ |
| 35 | 35 | */ |
| 36 | 36 | |
| 37 | 37 | #include "globals.h" |
| 38 | +#include "X11keysym.h" | |
| 39 | + | |
| 40 | +typedef enum | |
| 41 | +{ | |
| 42 | + CS_ONLY, | |
| 43 | + FT_ONLY, | |
| 44 | + BOTH | |
| 45 | +} remap_scope; | |
| 46 | + | |
| 47 | +static void remap_char(H3270 *hSession, unsigned short ebc, unsigned short iso, remap_scope scope, unsigned char one_way); | |
| 38 | 48 | |
| 39 | 49 | /* |
| 40 | 50 | * EBCDIC-to-Unicode translation tables. |
| ... | ... | @@ -44,6 +54,7 @@ |
| 44 | 54 | #define UT_SIZE 190 |
| 45 | 55 | #define UT_OFFSET 0x41 |
| 46 | 56 | |
| 57 | +/* | |
| 47 | 58 | typedef struct |
| 48 | 59 | { |
| 49 | 60 | const char * name; |
| ... | ... | @@ -52,6 +63,7 @@ typedef struct |
| 52 | 63 | const char * display_charset; |
| 53 | 64 | unsigned short code[UT_SIZE]; |
| 54 | 65 | } charset_table; |
| 66 | +*/ | |
| 55 | 67 | |
| 56 | 68 | |
| 57 | 69 | /*---[ Statics ]--------------------------------------------------------------------------------------------------------------*/ |
| ... | ... | @@ -197,6 +209,16 @@ static const unsigned short asc2uc[UT_SIZE] = |
| 197 | 209 | }; |
| 198 | 210 | |
| 199 | 211 | |
| 212 | + | |
| 213 | +// | |
| 214 | +// bracket: "0xad: [ \n 0xba: XK_Yacute \n0xbd: ] \n 0xbb: XK_diaeresis \n" | |
| 215 | +// | |
| 216 | +// remap_char(hSession,0xad, '[', BOTH, 0); | |
| 217 | +// remap_char(hSession,0xba, XK_Yacute, BOTH, 0); | |
| 218 | +// remap_char(hSession,0xbd, ']', BOTH, 0); | |
| 219 | +// remap_char(hSession,0xbb, XK_diaeresis, remap_scope scope,0); | |
| 220 | +// | |
| 221 | + | |
| 200 | 222 | /*---[ Implement ]------------------------------------------------------------------------------------------------------------*/ |
| 201 | 223 | |
| 202 | 224 | static void copy_charset(const unsigned short *from, unsigned short *to) |
| ... | ... | @@ -210,11 +232,11 @@ LIB3270_EXPORT struct lib3270_charset * lib3270_load_charset(H3270 *hSession, co |
| 210 | 232 | { |
| 211 | 233 | int f; |
| 212 | 234 | |
| 213 | - hSession->charset.host = "bracket"; | |
| 235 | + hSession->charset.host = "us"; | |
| 214 | 236 | hSession->charset.display = "ISO-8859-1"; |
| 215 | 237 | |
| 216 | - lib3270_write_log(hSession,"charset","host.charset=%s display.charset=%s", | |
| 217 | - hSession->charset.host,hSession->charset.display); | |
| 238 | +// lib3270_write_log(hSession,"charset","host.charset=%s display.charset=%s", | |
| 239 | +// hSession->charset.host,hSession->charset.display); | |
| 218 | 240 | |
| 219 | 241 | memcpy(hSession->charset.ebc2asc, ebc2asc0, sizeof(hSession->charset.ebc2asc)); |
| 220 | 242 | memcpy(hSession->charset.asc2ebc, asc2ebc0, sizeof(hSession->charset.asc2ebc)); |
| ... | ... | @@ -228,6 +250,16 @@ LIB3270_EXPORT struct lib3270_charset * lib3270_load_charset(H3270 *hSession, co |
| 228 | 250 | memcpy(hSession->charset.asc2ft, asc2ft, sizeof(hSession->charset.asc2ft)); |
| 229 | 251 | #endif |
| 230 | 252 | |
| 253 | + //if(!(name && strcasecmp(name,hSession->charset.host))) | |
| 254 | + // return &hSession->charset; | |
| 255 | + | |
| 256 | + // Bracket | |
| 257 | + remap_char(hSession,0xad, '[', BOTH, 0); | |
| 258 | + remap_char(hSession,0xba, XK_Yacute, BOTH, 0); | |
| 259 | + remap_char(hSession,0xbd, ']', BOTH, 0); | |
| 260 | + remap_char(hSession,0xbb, XK_diaeresis, BOTH, 0); | |
| 261 | + | |
| 262 | + | |
| 231 | 263 | return &hSession->charset; |
| 232 | 264 | } |
| 233 | 265 | |
| ... | ... | @@ -303,6 +335,105 @@ LIB3270_ACTION( charsettable ) |
| 303 | 335 | return 0; |
| 304 | 336 | } |
| 305 | 337 | |
| 338 | +// Process a single character definition. | |
| 339 | +static void remap_char(H3270 *hSession, unsigned short ebc, unsigned short iso, remap_scope scope, unsigned char one_way) | |
| 340 | +{ | |
| 341 | +// unsigned char cg; | |
| 342 | + | |
| 343 | + // Ignore mappings of EBCDIC control codes and the space character. | |
| 344 | + if (ebc <= 0x40) | |
| 345 | + return; | |
| 346 | + | |
| 347 | + // If they want to map to a NULL or a blank, make it a one-way blank. | |
| 348 | + if (iso == 0x0) | |
| 349 | + iso = 0x20; | |
| 350 | + if (iso == 0x20) | |
| 351 | + one_way = True; | |
| 352 | + | |
| 353 | + if (iso <= 0xff) | |
| 354 | + { | |
| 355 | +#if defined(X3270_FT) | |
| 356 | + unsigned char aa; | |
| 357 | +#endif | |
| 358 | + | |
| 359 | + if (scope == BOTH || scope == CS_ONLY) | |
| 360 | + { | |
| 361 | + /* | |
| 362 | + if (iso <= 0xff) | |
| 363 | + { | |
| 364 | + cg = hSession->charset.asc2cg[iso]; | |
| 365 | + | |
| 366 | + if (hSession->charset.cg2asc[cg] == iso || iso == 0) | |
| 367 | + { | |
| 368 | + // well-defined | |
| 369 | + hSession->charset.ebc2cg[ebc] = cg; | |
| 370 | + if (!one_way) | |
| 371 | + hSession->charset.cg2ebc[cg] = ebc; | |
| 372 | + } | |
| 373 | + else | |
| 374 | + { | |
| 375 | + // into a hole | |
| 376 | + hSession->charset.ebc2cg[ebc] = CG_boxsolid; | |
| 377 | + } | |
| 378 | + } | |
| 379 | + */ | |
| 380 | + | |
| 381 | + if (ebc > 0x40) | |
| 382 | + { | |
| 383 | + hSession->charset.ebc2asc[ebc] = iso; | |
| 384 | + if (!one_way) | |
| 385 | + hSession->charset.asc2ebc[iso] = ebc; | |
| 386 | + } | |
| 387 | + } | |
| 388 | +#if defined(X3270_FT) | |
| 389 | + if (iso <= 0xff && ebc > 0x40) | |
| 390 | + { | |
| 391 | + // Change the file transfer translation table. | |
| 392 | + if (scope == BOTH) | |
| 393 | + { | |
| 394 | + // | |
| 395 | + // We have an alternate mapping of an EBCDIC | |
| 396 | + // code to an ASCII code. Modify the existing | |
| 397 | + // ASCII(ft)-to-ASCII(desired) maps. | |
| 398 | + // | |
| 399 | + // This is done by figuring out which ASCII | |
| 400 | + // code the host usually translates the given | |
| 401 | + // EBCDIC code to (asc2ft0[ebc2asc0[ebc]]). | |
| 402 | + // Now we want to translate that code to the | |
| 403 | + // given ISO code, and vice-versa. | |
| 404 | + // | |
| 405 | + aa = asc2ft[ebc2asc0[ebc]]; | |
| 406 | + if (aa != ' ') | |
| 407 | + { | |
| 408 | + hSession->charset.ft2asc[aa] = iso; | |
| 409 | + hSession->charset.asc2ft[iso] = aa; | |
| 410 | + } | |
| 411 | + } | |
| 412 | + else if (scope == FT_ONLY) | |
| 413 | + { | |
| 414 | + // | |
| 415 | + // We have a map of how the host translates | |
| 416 | + // the given EBCDIC code to an ASCII code. | |
| 417 | + // Generate the translation between that code | |
| 418 | + // and the ISO code that we would normally | |
| 419 | + // use to display that EBCDIC code. | |
| 420 | + // | |
| 421 | + hSession->charset.ft2asc[iso] = hSession->charset.ebc2asc[ebc]; | |
| 422 | + hSession->charset.asc2ft[hSession->charset.ebc2asc[ebc]] = iso; | |
| 423 | + } | |
| 424 | + } | |
| 425 | +#endif | |
| 426 | + } | |
| 427 | +/* | |
| 428 | + else | |
| 429 | + { | |
| 430 | + // Auto-keymap. | |
| 431 | + add_xk(iso, (KeySym)hSession->charset.ebc2asc[ebc]); | |
| 432 | + } | |
| 433 | +*/ | |
| 434 | +} | |
| 435 | + | |
| 436 | + | |
| 306 | 437 | /*ISO-8859-1 |
| 307 | 438 | |
| 308 | 439 | #include "resources.h" | ... | ... |
src/lib3270/session.c
| ... | ... | @@ -177,7 +177,7 @@ static void nop_int(H3270 *session, int width) |
| 177 | 177 | return; |
| 178 | 178 | } |
| 179 | 179 | |
| 180 | -static void lib3270_session_init(H3270 *hSession, const char *model) | |
| 180 | +static void lib3270_session_init(H3270 *hSession, const char *model, const char *charset) | |
| 181 | 181 | { |
| 182 | 182 | int ovc, ovr; |
| 183 | 183 | char junk; |
| ... | ... | @@ -187,7 +187,7 @@ static void lib3270_session_init(H3270 *hSession, const char *model) |
| 187 | 187 | memset(hSession,0,sizeof(H3270)); |
| 188 | 188 | hSession->sz = sizeof(H3270); |
| 189 | 189 | |
| 190 | - lib3270_load_charset(hSession,NULL); | |
| 190 | + lib3270_load_charset(hSession,charset); | |
| 191 | 191 | |
| 192 | 192 | // Default calls |
| 193 | 193 | hSession->write = lib3270_sock_send; |
| ... | ... | @@ -321,7 +321,7 @@ H3270 * lib3270_session_new(const char *model) |
| 321 | 321 | |
| 322 | 322 | hSession = default_session = lib3270_malloc(sizeof(H3270)); |
| 323 | 323 | |
| 324 | - lib3270_session_init(hSession, model); | |
| 324 | + lib3270_session_init(hSession, model, "bracket"); | |
| 325 | 325 | |
| 326 | 326 | if(screen_init(hSession)) |
| 327 | 327 | return NULL; | ... | ... |