Commit 2fd2b75ac77c25cc01b459ea832c25591b3a1129

Authored by perry.werneck@gmail.com
1 parent 6c280698

Implementando conversao de charset

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;
... ...