Commit ad49222c0ad6be2bb5c9fb7c0ef01cf5a58f854c
1 parent
c56038e1
Exists in
master
and in
1 other branch
Implementando remapeamento de caracteres por arquivo .xml
Showing
1 changed file
with
50 additions
and
11 deletions
Show diff stats
charset.c
| ... | ... | @@ -45,10 +45,10 @@ |
| 45 | 45 | size_t len; |
| 46 | 46 | |
| 47 | 47 | struct { |
| 48 | - unsigned short ebc; | |
| 49 | - unsigned short iso; | |
| 50 | - unsigned char scope; | |
| 51 | - unsigned char oneway; | |
| 48 | + unsigned short ebc; | |
| 49 | + unsigned short iso; | |
| 50 | + lib3270_remap_scope scope; | |
| 51 | + unsigned char oneway; | |
| 52 | 52 | } map[256]; |
| 53 | 53 | |
| 54 | 54 | }; |
| ... | ... | @@ -303,6 +303,25 @@ |
| 303 | 303 | return (unsigned short) *id; |
| 304 | 304 | } |
| 305 | 305 | |
| 306 | + static lib3270_remap_scope getRemapScope(const gchar *str, GError **error) { | |
| 307 | + | |
| 308 | + static const char *text[] = { "CS_ONLY","FT_ONLY", "BOTH" }; | |
| 309 | + int i; | |
| 310 | + | |
| 311 | + if(!error) | |
| 312 | + { | |
| 313 | + for(i=0;i < N_ELEMENTS(text);i++) | |
| 314 | + { | |
| 315 | + if(!g_ascii_strcasecmp(str,text[i])) | |
| 316 | + return (lib3270_remap_scope) i; | |
| 317 | + } | |
| 318 | + | |
| 319 | + *error = g_error_new(ERROR_DOMAIN,EINVAL,"%s",_( "Invalid remap scope" )); | |
| 320 | + } | |
| 321 | + | |
| 322 | + return BOTH; | |
| 323 | + } | |
| 324 | + | |
| 306 | 325 | static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, struct parse *info, GError **error) |
| 307 | 326 | { |
| 308 | 327 | trace("%s(%s)",__FUNCTION__,element_name); |
| ... | ... | @@ -385,8 +404,9 @@ |
| 385 | 404 | oneway = "no"; |
| 386 | 405 | } |
| 387 | 406 | |
| 388 | - info->map[info->len].ebc = getChar(ebc,error); | |
| 389 | - info->map[info->len].iso = getChar(iso,error); | |
| 407 | + info->map[info->len].ebc = getChar(ebc,error); | |
| 408 | + info->map[info->len].iso = getChar(iso,error); | |
| 409 | + info->map[info->len].scope = getRemapScope(scope,error); | |
| 390 | 410 | |
| 391 | 411 | trace("%u: ebc=%04x iso=%04x %c",(unsigned int) info->len,info->map[info->len].ebc,info->map[info->len].iso,info->map[info->len].iso); |
| 392 | 412 | |
| ... | ... | @@ -424,7 +444,6 @@ |
| 424 | 444 | GError * error = NULL; |
| 425 | 445 | gchar * text = NULL; |
| 426 | 446 | struct parse cfg; |
| 427 | - v3270 * terminal = GTK_V3270(widget); | |
| 428 | 447 | |
| 429 | 448 | memset(&cfg,0,sizeof(cfg)); |
| 430 | 449 | |
| ... | ... | @@ -462,12 +481,32 @@ |
| 462 | 481 | gtk_dialog_run(GTK_DIALOG (dialog)); |
| 463 | 482 | gtk_widget_destroy(dialog); |
| 464 | 483 | |
| 484 | + } else { | |
| 485 | + | |
| 486 | + H3270 * hSession = v3270_get_session(widget); | |
| 487 | + | |
| 488 | + | |
| 489 | + if(hSession) | |
| 490 | + { | |
| 491 | + unsigned int i; | |
| 492 | + | |
| 493 | + trace("cgcsgid = %lx",cfg.cgcsgid); | |
| 494 | + trace("display = %s",cfg.display); | |
| 495 | + trace("host = %s",cfg.host); | |
| 496 | + trace("length = %u",(unsigned int) cfg.len); | |
| 497 | + | |
| 498 | + lib3270_reset_charset(hSession, cfg.host, cfg.display, cfg.cgcsgid); | |
| 499 | + | |
| 500 | + for(i=0;i < cfg.len; i++) | |
| 501 | + { | |
| 502 | + lib3270_remap_char(hSession,cfg.map[i].ebc,cfg.map[i].iso, BOTH, 0); | |
| 503 | + } | |
| 504 | + | |
| 505 | + } | |
| 506 | + | |
| 507 | + | |
| 465 | 508 | } |
| 466 | 509 | |
| 467 | - trace("cgcsgid = %lx",cfg.cgcsgid); | |
| 468 | - trace("display = %s",cfg.display); | |
| 469 | - trace("host = %s",cfg.host); | |
| 470 | - trace("length = %u",(unsigned int) cfg.len); | |
| 471 | 510 | |
| 472 | 511 | g_free(text); |
| 473 | 512 | g_free(cfg.host); | ... | ... |