Commit 42c42795771fa64b338a173ffdf9ecdb97c3604f
1 parent
da6da894
Exists in
master
and in
3 other branches
Android: Movendo funções de rede para um bloco separado visando a futura transfe…
…rência da parte de rede em android para a java.net.socket, substituindo chamadas de log e trace por similares da API android
Showing
16 changed files
with
1224 additions
and
1380 deletions
Show diff stats
XtGlue.c
| ... | ... | @@ -18,7 +18,7 @@ |
| 18 | 18 | * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple |
| 19 | 19 | * Place, Suite 330, Boston, MA, 02111-1307, USA |
| 20 | 20 | * |
| 21 | - * Este programa está nomeado como XtGlue.c e possui 896 linhas de código. | |
| 21 | + * Este programa está nomeado como XtGlue.c e possui - linhas de código. | |
| 22 | 22 | * |
| 23 | 23 | * Contatos: |
| 24 | 24 | * |
| ... | ... | @@ -79,482 +79,6 @@ |
| 79 | 79 | |
| 80 | 80 | #include "resolverc.h" |
| 81 | 81 | |
| 82 | -#define InputReadMask 0x1 | |
| 83 | -#define InputExceptMask 0x2 | |
| 84 | -#define InputWriteMask 0x4 | |
| 85 | - | |
| 86 | -#define MILLION 1000000L | |
| 87 | - | |
| 88 | -/*---[ Globals ]--------------------------------------------------------------------------------------------------------------*/ | |
| 89 | - | |
| 90 | - H3270 h3270; | |
| 91 | - | |
| 92 | -/*---[ Callbacks ]------------------------------------------------------------------------------------------*/ | |
| 93 | - | |
| 94 | -static void DefaultRemoveTimeOut(void *timer); | |
| 95 | -static void * DefaultAddTimeOut(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)); | |
| 96 | - | |
| 97 | -static void * DefaultAddInput(int source, H3270 *session, void (*fn)(H3270 *session)); | |
| 98 | -static void * DefaultAddExcept(int source, H3270 *session, void (*fn)(H3270 *session)); | |
| 99 | - | |
| 100 | -#if !defined(_WIN32) /*[*/ | |
| 101 | -static void * DefaultAddOutput(int source, H3270 *session, void (*fn)(H3270 *session)); | |
| 102 | -#endif | |
| 103 | - | |
| 104 | -static void DefaultRemoveInput(void *id); | |
| 105 | - | |
| 106 | -static int DefaultProcessEvents(int block); | |
| 107 | - | |
| 108 | -static void dunno(H3270 *session) | |
| 109 | -{ | |
| 110 | - | |
| 111 | -} | |
| 112 | - | |
| 113 | -static const struct lib3270_callbacks default_callbacks = | |
| 114 | -{ | |
| 115 | - sizeof(struct lib3270_callbacks), | |
| 116 | - | |
| 117 | - DefaultAddTimeOut, // unsigned long (*AddTimeOut)(unsigned long interval_ms, void (*proc)(void)); | |
| 118 | - DefaultRemoveTimeOut, // void (*RemoveTimeOut)(unsigned long timer); | |
| 119 | - | |
| 120 | - DefaultAddInput, // unsigned long (*AddInput)(int source, void (*fn)(void)); | |
| 121 | - DefaultRemoveInput, // void (*RemoveInput)(unsigned long id); | |
| 122 | - | |
| 123 | - DefaultAddExcept, // unsigned long (*AddExcept)(int source, void (*fn)(void)); | |
| 124 | - | |
| 125 | - #if !defined(_WIN32) /*[*/ | |
| 126 | - DefaultAddOutput, // unsigned long (*AddOutput)(int source, void (*fn)(void)); | |
| 127 | - #endif /*]*/ | |
| 128 | - | |
| 129 | - NULL, // int (*CallAndWait)(int(*callback)(void *), void *parm); | |
| 130 | - | |
| 131 | - NULL, // int (*Wait)(int seconds); | |
| 132 | - DefaultProcessEvents, // int (*RunPendingEvents)(int wait); | |
| 133 | - dunno | |
| 134 | - | |
| 135 | - | |
| 136 | -}; | |
| 137 | - | |
| 138 | -static const struct lib3270_callbacks *callbacks = &default_callbacks; | |
| 139 | - | |
| 140 | -/*---[ Implement default calls ]----------------------------------------------------------------------------*/ | |
| 141 | - | |
| 142 | -/* Timeouts. */ | |
| 143 | - | |
| 144 | -#if defined(_WIN32) /*[*/ | |
| 145 | -static void ms_ts(unsigned long long *u) | |
| 146 | -{ | |
| 147 | - FILETIME t; | |
| 148 | - | |
| 149 | - /* Get the system time, in 100ns units. */ | |
| 150 | - GetSystemTimeAsFileTime(&t); | |
| 151 | - memcpy(u, &t, sizeof(unsigned long long)); | |
| 152 | - | |
| 153 | - /* Divide by 10,000 to get ms. */ | |
| 154 | - *u /= 10000ULL; | |
| 155 | -} | |
| 156 | -#endif /*]*/ | |
| 157 | - | |
| 158 | -typedef struct timeout | |
| 159 | -{ | |
| 160 | - struct timeout *next; | |
| 161 | -#if defined(_WIN32) /*[*/ | |
| 162 | - unsigned long long ts; | |
| 163 | -#else /*][*/ | |
| 164 | - struct timeval tv; | |
| 165 | -#endif /*]*/ | |
| 166 | - void (*proc)(H3270 *session); | |
| 167 | - H3270 *session; | |
| 168 | - Boolean in_play; | |
| 169 | -} timeout_t; | |
| 170 | - | |
| 171 | -#define TN (timeout_t *)NULL | |
| 172 | -static timeout_t *timeouts = TN; | |
| 173 | - | |
| 174 | -static void * DefaultAddTimeOut(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)) | |
| 175 | -{ | |
| 176 | - timeout_t *t_new; | |
| 177 | - timeout_t *t; | |
| 178 | - timeout_t *prev = TN; | |
| 179 | - | |
| 180 | - Trace("%s session=%p proc=%p",__FUNCTION__,session,proc); | |
| 181 | - | |
| 182 | - t_new = (timeout_t *) lib3270_malloc(sizeof(timeout_t)); | |
| 183 | - | |
| 184 | - t_new->proc = proc; | |
| 185 | - t_new->session = session; | |
| 186 | - t_new->in_play = False; | |
| 187 | -#if defined(_WIN32) /*[*/ | |
| 188 | - ms_ts(&t_new->ts); | |
| 189 | - t_new->ts += interval_ms; | |
| 190 | -#else /*][*/ | |
| 191 | - (void) gettimeofday(&t_new->tv, NULL); | |
| 192 | - t_new->tv.tv_sec += interval_ms / 1000L; | |
| 193 | - t_new->tv.tv_usec += (interval_ms % 1000L) * 1000L; | |
| 194 | - if (t_new->tv.tv_usec > MILLION) { | |
| 195 | - t_new->tv.tv_sec += t_new->tv.tv_usec / MILLION; | |
| 196 | - t_new->tv.tv_usec %= MILLION; | |
| 197 | - } | |
| 198 | -#endif /*]*/ | |
| 199 | - | |
| 200 | - /* Find where to insert this item. */ | |
| 201 | - for (t = timeouts; t != TN; t = t->next) { | |
| 202 | -#if defined(_WIN32) /*[*/ | |
| 203 | - if (t->ts > t_new->ts) | |
| 204 | -#else /*][*/ | |
| 205 | - if (t->tv.tv_sec > t_new->tv.tv_sec || | |
| 206 | - (t->tv.tv_sec == t_new->tv.tv_sec && | |
| 207 | - t->tv.tv_usec > t_new->tv.tv_usec)) | |
| 208 | -#endif /*]*/ | |
| 209 | - break; | |
| 210 | - prev = t; | |
| 211 | - } | |
| 212 | - | |
| 213 | - /* Insert it. */ | |
| 214 | - if (prev == TN) { /* Front. */ | |
| 215 | - t_new->next = timeouts; | |
| 216 | - timeouts = t_new; | |
| 217 | - } else if (t == TN) { /* Rear. */ | |
| 218 | - t_new->next = TN; | |
| 219 | - prev->next = t_new; | |
| 220 | - } else { /* Middle. */ | |
| 221 | - t_new->next = t; | |
| 222 | - prev->next = t_new; | |
| 223 | - } | |
| 224 | - | |
| 225 | - trace("Timeout added: %p",t_new); | |
| 226 | - | |
| 227 | - return t_new; | |
| 228 | -} | |
| 229 | - | |
| 230 | -static void DefaultRemoveTimeOut(void * timer) | |
| 231 | -{ | |
| 232 | - timeout_t *st = (timeout_t *)timer; | |
| 233 | - timeout_t *t; | |
| 234 | - timeout_t *prev = TN; | |
| 235 | - | |
| 236 | - Trace("Removing timeout: %p",st); | |
| 237 | - | |
| 238 | - if (st->in_play) | |
| 239 | - return; | |
| 240 | - for (t = timeouts; t != TN; t = t->next) { | |
| 241 | - if (t == st) { | |
| 242 | - if (prev != TN) | |
| 243 | - prev->next = t->next; | |
| 244 | - else | |
| 245 | - timeouts = t->next; | |
| 246 | - lib3270_free(t); | |
| 247 | - return; | |
| 248 | - } | |
| 249 | - prev = t; | |
| 250 | - } | |
| 251 | -} | |
| 252 | - | |
| 253 | -/* Input events. */ | |
| 254 | -typedef struct input { | |
| 255 | - struct input *next; | |
| 256 | - int source; | |
| 257 | - int condition; | |
| 258 | - void (*proc)(H3270 *session); | |
| 259 | - H3270 *session; | |
| 260 | -} input_t; | |
| 261 | -static input_t *inputs = (input_t *)NULL; | |
| 262 | -static Boolean inputs_changed = False; | |
| 263 | - | |
| 264 | -static void * DefaultAddInput(int source, H3270 *session, void (*fn)(H3270 *session)) | |
| 265 | -{ | |
| 266 | - input_t *ip; | |
| 267 | - | |
| 268 | - Trace("%s session=%p proc=%p",__FUNCTION__,session,fn); | |
| 269 | - | |
| 270 | - ip = (input_t *) lib3270_malloc(sizeof(input_t)); | |
| 271 | - | |
| 272 | - ip->source = source; | |
| 273 | - ip->condition = InputReadMask; | |
| 274 | - ip->proc = fn; | |
| 275 | - ip->session = session; | |
| 276 | - ip->next = inputs; | |
| 277 | - inputs = ip; | |
| 278 | - inputs_changed = True; | |
| 279 | - | |
| 280 | - Trace("%s: fd=%d callback=%p handle=%p",__FUNCTION__,source,fn,ip); | |
| 281 | - | |
| 282 | - return ip; | |
| 283 | -} | |
| 284 | - | |
| 285 | -static void * DefaultAddExcept(int source, H3270 *session, void (*fn)(H3270 *session)) | |
| 286 | -{ | |
| 287 | -#if defined(_WIN32) /*[*/ | |
| 288 | - return 0; | |
| 289 | -#else /*][*/ | |
| 290 | - input_t *ip; | |
| 291 | - | |
| 292 | - Trace("%s session=%p proc=%p",__FUNCTION__,session,fn); | |
| 293 | - | |
| 294 | - ip = (input_t *) lib3270_malloc(sizeof(input_t)); | |
| 295 | - | |
| 296 | - ip->source = source; | |
| 297 | - ip->condition = InputExceptMask; | |
| 298 | - ip->proc = fn; | |
| 299 | - ip->session = session; | |
| 300 | - ip->next = inputs; | |
| 301 | - inputs = ip; | |
| 302 | - inputs_changed = True; | |
| 303 | - | |
| 304 | - Trace("%s: fd=%d callback=%p handle=%p",__FUNCTION__,source,fn,ip); | |
| 305 | - | |
| 306 | - return ip; | |
| 307 | -#endif /*]*/ | |
| 308 | -} | |
| 309 | - | |
| 310 | -#if !defined(_WIN32) /*[*/ | |
| 311 | -static void * DefaultAddOutput(int source, H3270 *session, void (*fn)(H3270 *session)) | |
| 312 | -{ | |
| 313 | - input_t *ip; | |
| 314 | - | |
| 315 | - Trace("%s session=%p proc=%p",__FUNCTION__,session,fn); | |
| 316 | - | |
| 317 | - ip = (input_t *)lib3270_malloc(sizeof(input_t)); | |
| 318 | - memset(ip,0,sizeof(input_t)); | |
| 319 | - | |
| 320 | - ip->source = source; | |
| 321 | - ip->condition = InputWriteMask; | |
| 322 | - ip->proc = fn; | |
| 323 | - ip->session = session; | |
| 324 | - ip->next = inputs; | |
| 325 | - inputs = ip; | |
| 326 | - inputs_changed = True; | |
| 327 | - | |
| 328 | - Trace("%s: fd=%d callback=%p handle=%p",__FUNCTION__,source,fn,ip); | |
| 329 | - | |
| 330 | - return ip; | |
| 331 | -} | |
| 332 | -#endif /*]*/ | |
| 333 | - | |
| 334 | -static void DefaultRemoveInput(void *id) | |
| 335 | -{ | |
| 336 | - input_t *ip; | |
| 337 | - input_t *prev = (input_t *)NULL; | |
| 338 | - | |
| 339 | - Trace("%s: fhandle=%p",__FUNCTION__,(input_t *) id); | |
| 340 | - | |
| 341 | - for (ip = inputs; ip != (input_t *)NULL; ip = ip->next) | |
| 342 | - { | |
| 343 | - if (ip == (input_t *)id) | |
| 344 | - break; | |
| 345 | - | |
| 346 | - prev = ip; | |
| 347 | - } | |
| 348 | - if (ip == (input_t *)NULL) | |
| 349 | - return; | |
| 350 | - | |
| 351 | - if (prev != (input_t *)NULL) | |
| 352 | - prev->next = ip->next; | |
| 353 | - else | |
| 354 | - inputs = ip->next; | |
| 355 | - | |
| 356 | - lib3270_free(ip); | |
| 357 | - inputs_changed = True; | |
| 358 | -} | |
| 359 | - | |
| 360 | -#if defined(_WIN32) /*[*/ | |
| 361 | -#define MAX_HA 256 | |
| 362 | -#endif /*]*/ | |
| 363 | - | |
| 364 | -/* Event dispatcher. */ | |
| 365 | -static int DefaultProcessEvents(int block) | |
| 366 | -{ | |
| 367 | -#if defined(_WIN32) | |
| 368 | - HANDLE ha[MAX_HA]; | |
| 369 | - DWORD nha; | |
| 370 | - DWORD tmo; | |
| 371 | - DWORD ret; | |
| 372 | - unsigned long long now; | |
| 373 | - int i; | |
| 374 | -#else | |
| 375 | - fd_set rfds, wfds, xfds; | |
| 376 | - int ns; | |
| 377 | - struct timeval now, twait, *tp; | |
| 378 | -#endif | |
| 379 | - input_t *ip, *ip_next; | |
| 380 | - struct timeout *t; | |
| 381 | - Boolean any_events; | |
| 382 | - int processed_any = 0; | |
| 383 | - | |
| 384 | - retry: | |
| 385 | - | |
| 386 | - // If we've processed any input, then don't block again. | |
| 387 | - | |
| 388 | - if(processed_any) | |
| 389 | - block = 0; | |
| 390 | - any_events = False; | |
| 391 | -#if defined(_WIN32) | |
| 392 | - nha = 0; | |
| 393 | -#else | |
| 394 | - FD_ZERO(&rfds); | |
| 395 | - FD_ZERO(&wfds); | |
| 396 | - FD_ZERO(&xfds); | |
| 397 | -#endif | |
| 398 | - | |
| 399 | - for (ip = inputs; ip != (input_t *)NULL; ip = ip->next) | |
| 400 | - { | |
| 401 | - if ((unsigned long)ip->condition & InputReadMask) | |
| 402 | - { | |
| 403 | -#if defined(_WIN32) | |
| 404 | - ha[nha++] = (HANDLE) ip->source; | |
| 405 | -#else | |
| 406 | - FD_SET(ip->source, &rfds); | |
| 407 | -#endif | |
| 408 | - any_events = True; | |
| 409 | - } | |
| 410 | -#if !defined(_WIN32) | |
| 411 | - if ((unsigned long)ip->condition & InputWriteMask) | |
| 412 | - { | |
| 413 | - FD_SET(ip->source, &wfds); | |
| 414 | - any_events = True; | |
| 415 | - } | |
| 416 | - if ((unsigned long)ip->condition & InputExceptMask) | |
| 417 | - { | |
| 418 | - FD_SET(ip->source, &xfds); | |
| 419 | - any_events = True; | |
| 420 | - } | |
| 421 | -#endif | |
| 422 | - } | |
| 423 | - | |
| 424 | - if (block) | |
| 425 | - { | |
| 426 | - if (timeouts != TN) { | |
| 427 | -#if defined(_WIN32) | |
| 428 | - ms_ts(&now); | |
| 429 | - if (now > timeouts->ts) | |
| 430 | - tmo = 0; | |
| 431 | - else | |
| 432 | - tmo = timeouts->ts - now; | |
| 433 | -#else | |
| 434 | - (void) gettimeofday(&now, (void *)NULL); | |
| 435 | - twait.tv_sec = timeouts->tv.tv_sec - now.tv_sec; | |
| 436 | - twait.tv_usec = timeouts->tv.tv_usec - now.tv_usec; | |
| 437 | - if (twait.tv_usec < 0L) { | |
| 438 | - twait.tv_sec--; | |
| 439 | - twait.tv_usec += MILLION; | |
| 440 | - } | |
| 441 | - if (twait.tv_sec < 0L) | |
| 442 | - twait.tv_sec = twait.tv_usec = 0L; | |
| 443 | - tp = &twait; | |
| 444 | -#endif | |
| 445 | - any_events = True; | |
| 446 | - } else { | |
| 447 | - // Block for 1 second (at maximal) | |
| 448 | -#if defined(_WIN32) | |
| 449 | - tmo = 1; | |
| 450 | -#else | |
| 451 | - twait.tv_sec = 1; | |
| 452 | - twait.tv_usec = 0L; | |
| 453 | - tp = &twait; | |
| 454 | -#endif | |
| 455 | - } | |
| 456 | - } | |
| 457 | - else | |
| 458 | - { | |
| 459 | -#if defined(_WIN32) | |
| 460 | - tmo = 1; | |
| 461 | -#else | |
| 462 | - twait.tv_sec = twait.tv_usec = 0L; | |
| 463 | - tp = &twait; | |
| 464 | -#endif | |
| 465 | - } | |
| 466 | - | |
| 467 | - if (!any_events) | |
| 468 | - return processed_any; | |
| 469 | - | |
| 470 | -#if defined(_WIN32) | |
| 471 | - ret = WaitForMultipleObjects(nha, ha, FALSE, tmo); | |
| 472 | - if (ret == WAIT_FAILED) | |
| 473 | - { | |
| 474 | -#else | |
| 475 | - ns = select(FD_SETSIZE, &rfds, &wfds, &xfds, tp); | |
| 476 | - if (ns < 0) | |
| 477 | - { | |
| 478 | - if (errno != EINTR) | |
| 479 | - Warning(NULL, "process_events: select() failed" ); | |
| 480 | -#endif | |
| 481 | - return processed_any; | |
| 482 | - } | |
| 483 | - | |
| 484 | - inputs_changed = False; | |
| 485 | - | |
| 486 | -#if defined(_WIN32) | |
| 487 | - for (i = 0, ip = inputs; ip != (input_t *)NULL; ip = ip_next, i++) | |
| 488 | - { | |
| 489 | -#else | |
| 490 | - for (ip = inputs; ip != (input_t *) NULL; ip = ip_next) | |
| 491 | - { | |
| 492 | -#endif | |
| 493 | - ip_next = ip->next; | |
| 494 | - if (((unsigned long)ip->condition & InputReadMask) && | |
| 495 | -#if defined(_WIN32) | |
| 496 | - ret == WAIT_OBJECT_0 + i) | |
| 497 | - { | |
| 498 | -#else | |
| 499 | - FD_ISSET(ip->source, &rfds)) | |
| 500 | - { | |
| 501 | -#endif | |
| 502 | - (*ip->proc)(ip->session); | |
| 503 | - processed_any = True; | |
| 504 | - if (inputs_changed) | |
| 505 | - goto retry; | |
| 506 | - } | |
| 507 | - | |
| 508 | -#if !defined(_WIN32) | |
| 509 | - if (((unsigned long)ip->condition & InputWriteMask) && FD_ISSET(ip->source, &wfds)) | |
| 510 | - { | |
| 511 | - (*ip->proc)(ip->session); | |
| 512 | - processed_any = True; | |
| 513 | - if (inputs_changed) | |
| 514 | - goto retry; | |
| 515 | - } | |
| 516 | - if (((unsigned long)ip->condition & InputExceptMask) && FD_ISSET(ip->source, &xfds)) | |
| 517 | - { | |
| 518 | - (*ip->proc)(ip->session); | |
| 519 | - processed_any = True; | |
| 520 | - if (inputs_changed) | |
| 521 | - goto retry; | |
| 522 | - } | |
| 523 | -#endif | |
| 524 | - } | |
| 525 | - | |
| 526 | - // See what's expired. | |
| 527 | - if (timeouts != TN) { | |
| 528 | -#if defined(_WIN32) | |
| 529 | - ms_ts(&now); | |
| 530 | -#else | |
| 531 | - (void) gettimeofday(&now, (void *)NULL); | |
| 532 | -#endif | |
| 533 | - while ((t = timeouts) != TN) { | |
| 534 | -#if defined(_WIN32) | |
| 535 | - if (t->ts <= now) { | |
| 536 | -#else | |
| 537 | - if (t->tv.tv_sec < now.tv_sec || | |
| 538 | - (t->tv.tv_sec == now.tv_sec && | |
| 539 | - t->tv.tv_usec < now.tv_usec)) { | |
| 540 | -#endif | |
| 541 | - timeouts = t->next; | |
| 542 | - t->in_play = True; | |
| 543 | - (*t->proc)(t->session); | |
| 544 | - processed_any = True; | |
| 545 | - lib3270_free(t); | |
| 546 | - } else | |
| 547 | - break; | |
| 548 | - } | |
| 549 | - } | |
| 550 | - | |
| 551 | - if (inputs_changed) | |
| 552 | - goto retry; | |
| 553 | - | |
| 554 | - return processed_any; | |
| 555 | - | |
| 556 | -} | |
| 557 | - | |
| 558 | 82 | /*---[ Implement external calls ]---------------------------------------------------------------------------*/ |
| 559 | 83 | |
| 560 | 84 | static struct { |
| ... | ... | @@ -784,6 +308,7 @@ KeySym StringToKeysym(char *s) |
| 784 | 308 | return NoSymbol; |
| 785 | 309 | } |
| 786 | 310 | |
| 311 | +/* | |
| 787 | 312 | const char * KeysymToString(KeySym k) |
| 788 | 313 | { |
| 789 | 314 | int i; |
| ... | ... | @@ -794,202 +319,4 @@ const char * KeysymToString(KeySym k) |
| 794 | 319 | } |
| 795 | 320 | return (char *)NULL; |
| 796 | 321 | } |
| 797 | - | |
| 798 | - | |
| 799 | -/* Timeouts. */ | |
| 800 | - | |
| 801 | -void * AddTimeOut(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)) | |
| 802 | -{ | |
| 803 | - CHECK_SESSION_HANDLE(session); | |
| 804 | - if(callbacks->AddTimeOut) | |
| 805 | - return callbacks->AddTimeOut(interval_ms,session,proc); | |
| 806 | - return 0; | |
| 807 | -} | |
| 808 | - | |
| 809 | -void RemoveTimeOut(void * timer) | |
| 810 | -{ | |
| 811 | - if(callbacks->RemoveTimeOut) | |
| 812 | - return callbacks->RemoveTimeOut(timer); | |
| 813 | -} | |
| 814 | - | |
| 815 | -void * AddInput(int source, H3270 *session, void (*fn)(H3270 *session)) | |
| 816 | -{ | |
| 817 | - CHECK_SESSION_HANDLE(session); | |
| 818 | - | |
| 819 | - trace("Adding input %d",source); | |
| 820 | - | |
| 821 | - if(callbacks->AddInput) | |
| 822 | - return callbacks->AddInput(source,session,fn); | |
| 823 | - return 0; | |
| 824 | -} | |
| 825 | - | |
| 826 | -void * AddExcept(int source, H3270 *session, void (*fn)(H3270 *session)) | |
| 827 | -{ | |
| 828 | - CHECK_SESSION_HANDLE(session); | |
| 829 | - if(callbacks->AddExcept) | |
| 830 | - return callbacks->AddExcept(source,session,fn); | |
| 831 | - return 0; | |
| 832 | -} | |
| 833 | - | |
| 834 | -#if !defined(_WIN32) /*[*/ | |
| 835 | -void * AddOutput(int source, H3270 *session, void (*fn)(H3270 *session)) | |
| 836 | -{ | |
| 837 | - CHECK_SESSION_HANDLE(session); | |
| 838 | - if(callbacks->AddOutput) | |
| 839 | - return callbacks->AddOutput(source,session,fn); | |
| 840 | - return 0; | |
| 841 | -} | |
| 842 | -#endif /*]*/ | |
| 843 | - | |
| 844 | -void RemoveInput(void * id) | |
| 845 | -{ | |
| 846 | - if(callbacks->RemoveInput) | |
| 847 | - callbacks->RemoveInput(id); | |
| 848 | -} | |
| 849 | - | |
| 850 | -LIB3270_EXPORT H3270 * lib3270_get_default_session_handle(void) | |
| 851 | -{ | |
| 852 | - return &h3270; | |
| 853 | -} | |
| 854 | - | |
| 855 | -LIB3270_EXPORT int lib3270_register_handlers(const struct lib3270_callbacks *cbk) | |
| 856 | -{ | |
| 857 | - if(!cbk) | |
| 858 | - return EINVAL; | |
| 859 | - | |
| 860 | - if(cbk->sz != sizeof(struct lib3270_callbacks)) | |
| 861 | - return EINVAL; | |
| 862 | - | |
| 863 | - callbacks = cbk; | |
| 864 | - return 0; | |
| 865 | - | |
| 866 | -} | |
| 867 | - | |
| 868 | -LIB3270_EXPORT LIB3270_CSTATE lib3270_get_connection_state(H3270 *h) | |
| 869 | -{ | |
| 870 | - CHECK_SESSION_HANDLE(h); | |
| 871 | - return h->cstate; | |
| 872 | -} | |
| 873 | - | |
| 874 | -LIB3270_EXPORT int lib3270_pconnected(H3270 *h) | |
| 875 | -{ | |
| 876 | - CHECK_SESSION_HANDLE(h); | |
| 877 | - return (((int) h->cstate) >= (int)RESOLVING); | |
| 878 | -} | |
| 879 | - | |
| 880 | -LIB3270_EXPORT int lib3270_half_connected(H3270 *h) | |
| 881 | -{ | |
| 882 | - CHECK_SESSION_HANDLE(h); | |
| 883 | - return (h->cstate == RESOLVING || h->cstate == PENDING); | |
| 884 | -} | |
| 885 | - | |
| 886 | -LIB3270_EXPORT int lib3270_connected(H3270 *h) | |
| 887 | -{ | |
| 888 | - CHECK_SESSION_HANDLE(h); | |
| 889 | - return ((int) h->cstate >= (int)CONNECTED_INITIAL); | |
| 890 | -} | |
| 891 | - | |
| 892 | -LIB3270_EXPORT int lib3270_in_neither(H3270 *h) | |
| 893 | -{ | |
| 894 | - CHECK_SESSION_HANDLE(h); | |
| 895 | - return (h->cstate == CONNECTED_INITIAL); | |
| 896 | -} | |
| 897 | - | |
| 898 | -LIB3270_EXPORT int lib3270_in_ansi(H3270 *h) | |
| 899 | -{ | |
| 900 | - CHECK_SESSION_HANDLE(h); | |
| 901 | - return (h->cstate == CONNECTED_ANSI || h->cstate == CONNECTED_NVT); | |
| 902 | -} | |
| 903 | - | |
| 904 | -LIB3270_EXPORT int lib3270_in_3270(H3270 *h) | |
| 905 | -{ | |
| 906 | - CHECK_SESSION_HANDLE(h); | |
| 907 | - return (h->cstate == CONNECTED_3270 || h->cstate == CONNECTED_TN3270E || h->cstate == CONNECTED_SSCP); | |
| 908 | -} | |
| 909 | - | |
| 910 | -LIB3270_EXPORT int lib3270_in_sscp(H3270 *h) | |
| 911 | -{ | |
| 912 | - CHECK_SESSION_HANDLE(h); | |
| 913 | - return (h->cstate == CONNECTED_SSCP); | |
| 914 | -} | |
| 915 | - | |
| 916 | -LIB3270_EXPORT int lib3270_in_tn3270e(H3270 *h) | |
| 917 | -{ | |
| 918 | - CHECK_SESSION_HANDLE(h); | |
| 919 | - return (h->cstate == CONNECTED_TN3270E); | |
| 920 | -} | |
| 921 | - | |
| 922 | -LIB3270_EXPORT int lib3270_in_e(H3270 *h) | |
| 923 | -{ | |
| 924 | - CHECK_SESSION_HANDLE(h); | |
| 925 | - return (h->cstate >= CONNECTED_INITIAL_E); | |
| 926 | -} | |
| 927 | - | |
| 928 | -LIB3270_EXPORT void * lib3270_get_widget(H3270 *h) | |
| 929 | -{ | |
| 930 | - CHECK_SESSION_HANDLE(h); | |
| 931 | - return h->widget; | |
| 932 | -} | |
| 933 | - | |
| 934 | -LIB3270_EXPORT int lib3270_call_thread(int(*callback)(H3270 *h, void *), H3270 *h, void *parm) | |
| 935 | -{ | |
| 936 | - int rc; | |
| 937 | - CHECK_SESSION_HANDLE(h); | |
| 938 | - | |
| 939 | - if(h->set_timer) | |
| 940 | - h->set_timer(h,1); | |
| 941 | - | |
| 942 | - lib3270_main_iterate(h,0); | |
| 943 | - if(callbacks->callthread) | |
| 944 | - { | |
| 945 | - h->bgthread = 1; | |
| 946 | - trace("%s: background thread for %p starts",__FUNCTION__,h); | |
| 947 | - rc = callbacks->callthread(callback,h,parm); | |
| 948 | - trace("%s: background thread for %p ends",__FUNCTION__,h); | |
| 949 | - h->bgthread = 0; | |
| 950 | - } | |
| 951 | - else | |
| 952 | - { | |
| 953 | - rc = callback(h,parm); | |
| 954 | - } | |
| 955 | - lib3270_main_iterate(h,0); | |
| 956 | - | |
| 957 | - if(h->set_timer) | |
| 958 | - h->set_timer(h,0); | |
| 959 | - | |
| 960 | - return rc; | |
| 961 | -} | |
| 962 | - | |
| 963 | -LIB3270_EXPORT void lib3270_main_iterate(H3270 *session, int wait) | |
| 964 | -{ | |
| 965 | - if(callbacks->RunPendingEvents) | |
| 966 | - callbacks->RunPendingEvents(wait); | |
| 967 | -} | |
| 968 | - | |
| 969 | -LIB3270_EXPORT int lib3270_wait(seconds) | |
| 970 | -{ | |
| 971 | - time_t end; | |
| 972 | - | |
| 973 | - if(callbacks->Wait) | |
| 974 | - return callbacks->Wait(seconds); | |
| 975 | - | |
| 976 | - // Alternative wait call | |
| 977 | - end = time(0) + seconds; | |
| 978 | - | |
| 979 | - while(time(0) < end) | |
| 980 | - { | |
| 981 | - lib3270_main_iterate(&h3270,1); | |
| 982 | - } | |
| 983 | - | |
| 984 | - return 0; | |
| 985 | -} | |
| 986 | - | |
| 987 | -LIB3270_EXPORT void lib3270_ring_bell(H3270 *session) | |
| 988 | -{ | |
| 989 | - CHECK_SESSION_HANDLE(session); | |
| 990 | - | |
| 991 | - if(lib3270_get_toggle(session,LIB3270_TOGGLE_BEEP)) | |
| 992 | - callbacks->ring_bell(session); | |
| 993 | -} | |
| 994 | - | |
| 995 | - | |
| 322 | +*/ | ... | ... |
| ... | ... | @@ -88,25 +88,28 @@ |
| 88 | 88 | #define CN ((char *) NULL) |
| 89 | 89 | #endif |
| 90 | 90 | |
| 91 | - /* Debug & log */ | |
| 91 | + /* Debug & log */ /* | |
| 92 | 92 | #if defined( DEBUG ) |
| 93 | 93 | #define Trace( fmt, ... ) fprintf(stderr, "%s(%d) " fmt "\n", __FILE__, __LINE__, __VA_ARGS__ ); fflush(stderr); |
| 94 | 94 | #define trace( fmt, ... ) fprintf(stderr, "%s(%d) " fmt "\n", __FILE__, __LINE__, __VA_ARGS__ ); fflush(stderr); |
| 95 | - #else | |
| 96 | - #define Trace( fmt, ... ) /* __VA_ARGS__ */ | |
| 97 | - #define trace( fmt, ... ) /* __VA_ARGS__ */ | |
| 95 | + #elif !defined(Trace) | |
| 96 | + #define Trace( fmt, ... ) // __VA_ARGS__ | |
| 97 | + #define trace( fmt, ... ) // __VA_ARGS__ | |
| 98 | 98 | #endif |
| 99 | - | |
| 99 | +*/ | |
| 100 | 100 | |
| 101 | 101 | #include <lib3270/log.h> |
| 102 | + | |
| 102 | 103 | // #define WriteLog(module,fmt, ...) lib3270_write_log(NULL,module,fmt,__VA_ARGS__) |
| 103 | 104 | // #define WriteRCLog(module,rc,fmt, ...) lib3270_write_rc(NULL,module,fmt,__VA_ARGS__) |
| 104 | 105 | |
| 106 | +/* | |
| 105 | 107 | #ifdef LIB3270_MODULE_NAME |
| 106 | 108 | #define Log(fmt, ...) lib3270_write_log(NULL,LIB3270_MODULE_NAME,fmt,__VA_ARGS__) |
| 107 | 109 | #else |
| 108 | 110 | #define Log(fmt, ...) lib3270_write_log(NULL,"MSG",fmt,__VA_ARGS__) |
| 109 | 111 | #endif |
| 112 | +*/ | |
| 110 | 113 | |
| 111 | 114 | /** 3270 connection handle */ |
| 112 | 115 | // #define LUNAME_SIZE 16 | ... | ... |
globals.h
| ... | ... | @@ -371,3 +371,4 @@ LIB3270_INTERNAL void key_ACharacter(unsigned char c, enum keytype keytype, enum |
| 371 | 371 | LIB3270_INTERNAL void lib3270_initialize(void); |
| 372 | 372 | LIB3270_INTERNAL int cursor_move(H3270 *session, int baddr); |
| 373 | 373 | |
| 374 | +LIB3270_INTERNAL void add_input_calls(H3270 *, void (*)(H3270 *), void (*)(H3270 *)); | ... | ... |
host.c
| ... | ... | @@ -565,25 +565,8 @@ static int do_connect(H3270 *hSession, const char *n) |
| 565 | 565 | |
| 566 | 566 | /* Success. */ |
| 567 | 567 | |
| 568 | - /* Set pending string. */ | |
| 569 | -// if (ps == CN) | |
| 570 | -// ps = appres.login_macro; | |
| 571 | - | |
| 572 | -// if (ps != CN) | |
| 573 | -// login_macro(ps); | |
| 574 | - | |
| 575 | - /* Prepare Xt for I/O. */ | |
| 576 | -// x_add_input(hSession); | |
| 577 | -#ifdef _WIN32 | |
| 578 | - hSession->ns_exception_id = AddExcept((int) hSession->sockEvent, hSession, net_exception); | |
| 579 | - hSession->ns_read_id = AddInput((int) hSession->sockEvent, hSession, net_input); | |
| 580 | -#else | |
| 581 | - hSession->ns_exception_id = AddExcept(hSession->sock, hSession, net_exception); | |
| 582 | - hSession->ns_read_id = AddInput(hSession->sock, hSession, net_input); | |
| 583 | -#endif // WIN32 | |
| 584 | - | |
| 585 | - hSession->excepting = True; | |
| 586 | - hSession->reading = True; | |
| 568 | + /* Setup socket I/O. */ | |
| 569 | + add_input_calls(hSession,net_input,net_exception); | |
| 587 | 570 | |
| 588 | 571 | /* Set state and tell the world. */ |
| 589 | 572 | if (pending) |
| ... | ... | @@ -672,18 +655,7 @@ void host_disconnect(H3270 *h, int failed) |
| 672 | 655 | if (CONNECTED || HALF_CONNECTED) |
| 673 | 656 | { |
| 674 | 657 | // Disconecting, disable input |
| 675 | - if(h->reading) | |
| 676 | - { | |
| 677 | - RemoveInput(h->ns_read_id); | |
| 678 | - h->reading = False; | |
| 679 | - } | |
| 680 | - if(h->excepting) | |
| 681 | - { | |
| 682 | - RemoveInput(h->ns_exception_id); | |
| 683 | - h->excepting = False; | |
| 684 | - } | |
| 685 | -// x_remove_input(h); | |
| 686 | - | |
| 658 | + remove_input_calls(h); | |
| 687 | 659 | net_disconnect(h); |
| 688 | 660 | |
| 689 | 661 | trace("Disconnected (Failed: %d Reconnect: %d in_progress: %d)",failed,lib3270_get_toggle(h,LIB3270_TOGGLE_RECONNECT),h->auto_reconnect_inprogress); |
| ... | ... | @@ -759,7 +731,7 @@ LIB3270_EXPORT void lib3270_register_schange(H3270 *h, LIB3270_STATE_CHANGE tx, |
| 759 | 731 | /* Signal a state change. */ |
| 760 | 732 | void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode) |
| 761 | 733 | { |
| 762 | -#if defined(DEBUG) | |
| 734 | +#if defined(DEBUG) || defined(ANDROID) | |
| 763 | 735 | |
| 764 | 736 | static const char * state_name[LIB3270_STATE_USER] = |
| 765 | 737 | { | ... | ... |
init.c
| ... | ... | @@ -1,371 +0,0 @@ |
| 1 | -/* | |
| 2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270. | |
| 5 | - * | |
| 6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | - * | |
| 8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | - * Free Software Foundation. | |
| 11 | - * | |
| 12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | - * obter mais detalhes. | |
| 16 | - * | |
| 17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | |
| 19 | - * Place, Suite 330, Boston, MA, 02111-1307, USA | |
| 20 | - * | |
| 21 | - * Este programa está nomeado como init.c e possui - linhas de código. | |
| 22 | - * | |
| 23 | - * Contatos: | |
| 24 | - * | |
| 25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 27 | - * licinio@bb.com.br (Licínio Luis Branco) | |
| 28 | - * kraucer@bb.com.br (Kraucer Fernandes Mazuco) | |
| 29 | - * macmiranda@bb.com.br (Marco Aurélio Caldas Miranda) | |
| 30 | - * | |
| 31 | - */ | |
| 32 | - | |
| 33 | - | |
| 34 | -#include "globals.h" | |
| 35 | -// #include "appres.h" | |
| 36 | -#include "charsetc.h" | |
| 37 | -#include "kybdc.h" | |
| 38 | -#include "ansic.h" | |
| 39 | - | |
| 40 | -#include <malloc.h> | |
| 41 | - | |
| 42 | -/*---[ Statics ]--------------------------------------------------------------------------------------------------------------*/ | |
| 43 | - | |
| 44 | - static int parse_model_number(H3270 *session, const char *m); | |
| 45 | - | |
| 46 | -/*---[ Implement ]------------------------------------------------------------------------------------------------------------*/ | |
| 47 | - | |
| 48 | -void lib3270_session_free(H3270 *h) | |
| 49 | -{ | |
| 50 | - int f; | |
| 51 | - | |
| 52 | - // Terminate session | |
| 53 | - if(lib3270_connected(h)) | |
| 54 | - lib3270_disconnect(h); | |
| 55 | - | |
| 56 | - shutdown_toggles(h); | |
| 57 | - | |
| 58 | - // Release state change callbacks | |
| 59 | - for(f=0;f<N_ST;f++) | |
| 60 | - { | |
| 61 | - while(h->st_callbacks[f]) | |
| 62 | - { | |
| 63 | - struct lib3270_state_callback *next = h->st_callbacks[f]->next; | |
| 64 | - lib3270_free(h->st_callbacks[f]); | |
| 65 | - h->st_callbacks[f] = next; | |
| 66 | - } | |
| 67 | - } | |
| 68 | - | |
| 69 | - // Release memory | |
| 70 | - #define RELEASE_BUFFER(x) if(x) { free(x); x = NULL; } | |
| 71 | - | |
| 72 | - RELEASE_BUFFER(h->charset); | |
| 73 | - RELEASE_BUFFER(h->paste_buffer); | |
| 74 | - | |
| 75 | - for(f=0;f<(sizeof(h->buffer)/sizeof(h->buffer[0]));f++) | |
| 76 | - { | |
| 77 | - RELEASE_BUFFER(h->buffer[f]); | |
| 78 | - } | |
| 79 | - | |
| 80 | -} | |
| 81 | - | |
| 82 | -static void update_char(H3270 *session, int addr, unsigned char chr, unsigned short attr, unsigned char cursor) | |
| 83 | -{ | |
| 84 | -} | |
| 85 | - | |
| 86 | -static void nop_char(H3270 *session, unsigned char chr) | |
| 87 | -{ | |
| 88 | -} | |
| 89 | - | |
| 90 | -static void nop(H3270 *session) | |
| 91 | -{ | |
| 92 | -} | |
| 93 | - | |
| 94 | -static void update_model(H3270 *session, const char *name, int model, int rows, int cols) | |
| 95 | -{ | |
| 96 | -} | |
| 97 | - | |
| 98 | -static void changed(H3270 *session, int bstart, int bend) | |
| 99 | -{ | |
| 100 | -} | |
| 101 | - | |
| 102 | -static void update_cursor(H3270 *session, unsigned short row, unsigned short col, unsigned char c, unsigned short attr) | |
| 103 | -{ | |
| 104 | -} | |
| 105 | - | |
| 106 | -static void update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) | |
| 107 | -{ | |
| 108 | -} | |
| 109 | - | |
| 110 | -static void update_selection(H3270 *session, int start, int end) | |
| 111 | -{ | |
| 112 | -} | |
| 113 | - | |
| 114 | -static void set_cursor(H3270 *session, LIB3270_CURSOR id) | |
| 115 | -{ | |
| 116 | -} | |
| 117 | - | |
| 118 | -static void message(H3270 *session, LIB3270_NOTIFY id , const char *title, const char *message, const char *text) | |
| 119 | -{ | |
| 120 | - lib3270_write_log(session,"%s",title); | |
| 121 | - lib3270_write_log(session,"%s",message); | |
| 122 | - lib3270_write_log(session,"%s",text); | |
| 123 | -} | |
| 124 | - | |
| 125 | -static void update_ssl(H3270 *session, LIB3270_SSL_STATE state) | |
| 126 | -{ | |
| 127 | -} | |
| 128 | - | |
| 129 | -static void lib3270_session_init(H3270 *hSession, const char *model) | |
| 130 | -{ | |
| 131 | - int ovc, ovr; | |
| 132 | - char junk; | |
| 133 | - int model_number; | |
| 134 | - | |
| 135 | - memset(hSession,0,sizeof(H3270)); | |
| 136 | - hSession->sz = sizeof(H3270); | |
| 137 | - | |
| 138 | - // Set the defaults. | |
| 139 | - hSession->extended = 1; | |
| 140 | - hSession->typeahead = 1; | |
| 141 | - hSession->oerr_lock = 1; | |
| 142 | - hSession->unlock_delay = 1; | |
| 143 | - hSession->icrnl = 1; | |
| 144 | - hSession->onlcr = 1; | |
| 145 | - hSession->host_charset = "bracket"; | |
| 146 | - | |
| 147 | -/* | |
| 148 | -#if !defined(_WIN32) | |
| 149 | - hSession->host_charset = "bracket"; | |
| 150 | -#else | |
| 151 | - | |
| 152 | - if (is_nt) | |
| 153 | - hSession->host_charset = "bracket"; | |
| 154 | - else | |
| 155 | - hSession->host_charset = "bracket437"; | |
| 156 | -#endif | |
| 157 | -*/ | |
| 158 | - | |
| 159 | - | |
| 160 | - // Initialize toggles | |
| 161 | - initialize_toggles(hSession); | |
| 162 | - | |
| 163 | - // Dummy calls to avoid "ifs" | |
| 164 | - hSession->update = update_char; | |
| 165 | - hSession->update_model = update_model; | |
| 166 | - hSession->update_cursor = update_cursor; | |
| 167 | - hSession->set_selection = nop_char; | |
| 168 | - hSession->ctlr_done = nop; | |
| 169 | - hSession->changed = changed; | |
| 170 | - hSession->erase = screen_disp; | |
| 171 | - hSession->suspend = nop; | |
| 172 | - hSession->resume = screen_disp; | |
| 173 | - hSession->update_oia = update_oia; | |
| 174 | - hSession->update_selection = update_selection; | |
| 175 | - hSession->cursor = set_cursor; | |
| 176 | - hSession->message = message; | |
| 177 | - hSession->update_ssl = update_ssl; | |
| 178 | - hSession->sock = -1; | |
| 179 | - | |
| 180 | -#ifdef _WIN32 | |
| 181 | - hSession->sockEvent = NULL; | |
| 182 | -#endif // _WIN32 | |
| 183 | - | |
| 184 | - hSession->model_num = -1; | |
| 185 | - hSession->cstate = NOT_CONNECTED; | |
| 186 | - hSession->oia_status = -1; | |
| 187 | - | |
| 188 | - strncpy(hSession->full_model_name,"IBM-",LIB3270_FULL_MODEL_NAME_LENGTH); | |
| 189 | - hSession->model_name = &hSession->full_model_name[4]; | |
| 190 | - | |
| 191 | - if(!*model) | |
| 192 | - model = "2"; // No model, use the default one | |
| 193 | - | |
| 194 | - model_number = parse_model_number(hSession,model); | |
| 195 | - if (model_number < 0) | |
| 196 | - { | |
| 197 | - popup_an_error(hSession,"Invalid model number: %s", model); | |
| 198 | - model_number = 0; | |
| 199 | - } | |
| 200 | - | |
| 201 | - if (!model_number) | |
| 202 | - { | |
| 203 | -#if defined(RESTRICT_3279) | |
| 204 | - model_number = 3; | |
| 205 | -#else | |
| 206 | - model_number = 4; | |
| 207 | -#endif | |
| 208 | - } | |
| 209 | - | |
| 210 | - if(hSession->mono) | |
| 211 | - hSession->m3279 = 0; | |
| 212 | - else | |
| 213 | - hSession->m3279 = 1; | |
| 214 | - | |
| 215 | - if(!hSession->extended) | |
| 216 | - hSession->oversize = CN; | |
| 217 | - | |
| 218 | -#if defined(RESTRICT_3279) | |
| 219 | - if (hSession->m3279 && model_number == 4) | |
| 220 | - model_number = 3; | |
| 221 | -#endif | |
| 222 | - | |
| 223 | - Trace("Model_number: %d",model_number); | |
| 224 | - | |
| 225 | - if (!hSession->extended || hSession->oversize == CN || sscanf(hSession->oversize, "%dx%d%c", &ovc, &ovr, &junk) != 2) | |
| 226 | - { | |
| 227 | - ovc = 0; | |
| 228 | - ovr = 0; | |
| 229 | - } | |
| 230 | - ctlr_set_rows_cols(hSession, model_number, ovc, ovr); | |
| 231 | - | |
| 232 | - if (hSession->termname != CN) | |
| 233 | - hSession->termtype = hSession->termname; | |
| 234 | - else | |
| 235 | - hSession->termtype = hSession->full_model_name; | |
| 236 | - | |
| 237 | - Trace("Termtype: %s",hSession->termtype); | |
| 238 | - | |
| 239 | - if (hSession->apl_mode) | |
| 240 | - hSession->host_charset = "apl"; | |
| 241 | - | |
| 242 | -} | |
| 243 | - | |
| 244 | -H3270 * lib3270_session_new(const char *model) | |
| 245 | -{ | |
| 246 | - static int configured = 0; | |
| 247 | - | |
| 248 | - H3270 *hSession = &h3270; | |
| 249 | - | |
| 250 | - Trace("%s - configured=%d",__FUNCTION__,configured); | |
| 251 | - | |
| 252 | - if(configured) | |
| 253 | - { | |
| 254 | - // TODO (perry#5#): Allocate a new structure. | |
| 255 | - errno = EBUSY; | |
| 256 | - return hSession; | |
| 257 | - } | |
| 258 | - | |
| 259 | - configured = 1; | |
| 260 | - | |
| 261 | - | |
| 262 | - lib3270_session_init(hSession, model); | |
| 263 | - | |
| 264 | - if(screen_init(hSession)) | |
| 265 | - return NULL; | |
| 266 | - | |
| 267 | - Trace("Charset: %s",hSession->host_charset); | |
| 268 | - if (charset_init(hSession,hSession->host_charset) != CS_OKAY) | |
| 269 | - { | |
| 270 | - Warning(hSession, _( "Cannot find charset \"%s\", using defaults" ), hSession->host_charset); | |
| 271 | - (void) charset_init(hSession,CN); | |
| 272 | - } | |
| 273 | - | |
| 274 | - trace("%s: Initializing KYBD",__FUNCTION__); | |
| 275 | - lib3270_register_schange(hSession,LIB3270_STATE_CONNECT,kybd_connect,NULL); | |
| 276 | - lib3270_register_schange(hSession,LIB3270_STATE_3270_MODE,kybd_in3270,NULL); | |
| 277 | - | |
| 278 | -#if defined(X3270_ANSI) | |
| 279 | - trace("%s: Initializing ANSI",__FUNCTION__); | |
| 280 | - lib3270_register_schange(hSession,LIB3270_STATE_3270_MODE,ansi_in3270,NULL); | |
| 281 | -#endif // X3270_ANSI | |
| 282 | - | |
| 283 | - | |
| 284 | -#if defined(X3270_FT) | |
| 285 | - ft_init(hSession); | |
| 286 | -#endif | |
| 287 | - | |
| 288 | -/* | |
| 289 | -#if defined(X3270_PRINTER) | |
| 290 | - printer_init(); | |
| 291 | -#endif | |
| 292 | -*/ | |
| 293 | - Trace("%s finished",__FUNCTION__); | |
| 294 | - | |
| 295 | - errno = 0; | |
| 296 | - return hSession; | |
| 297 | -} | |
| 298 | - | |
| 299 | - /* | |
| 300 | -- * Parse the model number. | |
| 301 | -- * Returns -1 (error), 0 (default), or the specified number. | |
| 302 | -- */ | |
| 303 | -static int parse_model_number(H3270 *session, const char *m) | |
| 304 | -{ | |
| 305 | - int sl; | |
| 306 | - int n; | |
| 307 | - | |
| 308 | - if(!m) | |
| 309 | - return 0; | |
| 310 | - | |
| 311 | - sl = strlen(m); | |
| 312 | - | |
| 313 | - /* An empty model number is no good. */ | |
| 314 | - if (!sl) | |
| 315 | - return 0; | |
| 316 | - | |
| 317 | - if (sl > 1) { | |
| 318 | - /* | |
| 319 | - * If it's longer than one character, it needs to start with | |
| 320 | - * '327[89]', and it sets the m3279 resource. | |
| 321 | - */ | |
| 322 | - if (!strncmp(m, "3278", 4)) | |
| 323 | - { | |
| 324 | - session->m3279 = 0; | |
| 325 | - } | |
| 326 | - else if (!strncmp(m, "3279", 4)) | |
| 327 | - { | |
| 328 | - session->m3279 = 1; | |
| 329 | - } | |
| 330 | - else | |
| 331 | - { | |
| 332 | - return -1; | |
| 333 | - } | |
| 334 | - m += 4; | |
| 335 | - sl -= 4; | |
| 336 | - | |
| 337 | - /* Check more syntax. -E is allowed, but ignored. */ | |
| 338 | - switch (m[0]) { | |
| 339 | - case '\0': | |
| 340 | - /* Use default model number. */ | |
| 341 | - return 0; | |
| 342 | - case '-': | |
| 343 | - /* Model number specified. */ | |
| 344 | - m++; | |
| 345 | - sl--; | |
| 346 | - break; | |
| 347 | - default: | |
| 348 | - return -1; | |
| 349 | - } | |
| 350 | - switch (sl) { | |
| 351 | - case 1: /* n */ | |
| 352 | - break; | |
| 353 | - case 3: /* n-E */ | |
| 354 | - if (strcasecmp(m + 1, "-E")) { | |
| 355 | - return -1; | |
| 356 | - } | |
| 357 | - break; | |
| 358 | - default: | |
| 359 | - return -1; | |
| 360 | - } | |
| 361 | - } | |
| 362 | - | |
| 363 | - /* Check the numeric model number. */ | |
| 364 | - n = atoi(m); | |
| 365 | - if (n >= 2 && n <= 5) { | |
| 366 | - return n; | |
| 367 | - } else { | |
| 368 | - return -1; | |
| 369 | - } | |
| 370 | - | |
| 371 | -} |
| ... | ... | @@ -0,0 +1,689 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | + * | |
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | + * | |
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | + * Free Software Foundation. | |
| 11 | + * | |
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | + * obter mais detalhes. | |
| 16 | + * | |
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | |
| 19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | |
| 20 | + * | |
| 21 | + * Este programa está nomeado como iocalls.c e possui - linhas de código. | |
| 22 | + * | |
| 23 | + * Contatos: | |
| 24 | + * | |
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 27 | + * licinio@bb.com.br (Licínio Luis Branco) | |
| 28 | + * kraucer@bb.com.br (Kraucer Fernandes Mazuco) | |
| 29 | + * | |
| 30 | + */ | |
| 31 | + | |
| 32 | +#include "globals.h" | |
| 33 | +#include <sys/time.h> | |
| 34 | +#include <sys/types.h> | |
| 35 | +#include "xioc.h" | |
| 36 | +#include "telnetc.h" | |
| 37 | + | |
| 38 | +#define MILLION 1000000L | |
| 39 | +#define InputReadMask 0x1 | |
| 40 | +#define InputExceptMask 0x2 | |
| 41 | +#define InputWriteMask 0x4 | |
| 42 | + | |
| 43 | +#if defined(_WIN32) | |
| 44 | + #define MAX_HA 256 | |
| 45 | +#endif | |
| 46 | + | |
| 47 | +/*---[ Standard calls ]-------------------------------------------------------------------------------------*/ | |
| 48 | + | |
| 49 | +static void internal_remove_timeout(void *timer); | |
| 50 | +static void * internal_add_timeout(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)); | |
| 51 | + | |
| 52 | +static void * internal_add_input(int source, H3270 *session, void (*fn)(H3270 *session)); | |
| 53 | +static void * internal_add_except(int source, H3270 *session, void (*fn)(H3270 *session)); | |
| 54 | + | |
| 55 | +static void internal_remove_input(void *id); | |
| 56 | + | |
| 57 | +static int internal_process_events(int block); | |
| 58 | + | |
| 59 | +static int internal_callthread(int(*callback)(H3270 *, void *), H3270 *session, void *parm); | |
| 60 | +static int internal_wait(int seconds); | |
| 61 | + | |
| 62 | +static int internal_event_dispatcher(int block); | |
| 63 | +static void internal_ring_bell(H3270 *); | |
| 64 | + | |
| 65 | +/*---[ Active callbacks ]-----------------------------------------------------------------------------------*/ | |
| 66 | + | |
| 67 | + static void * (*add_timeout)(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)) | |
| 68 | + = internal_add_timeout; | |
| 69 | + | |
| 70 | + static void (*remove_timeout)(void *timer) | |
| 71 | + = internal_remove_timeout; | |
| 72 | + | |
| 73 | + static void * (*add_input)(int source, H3270 *session, void (*fn)(H3270 *session)) | |
| 74 | + = internal_add_input; | |
| 75 | + | |
| 76 | + static void (*remove_input)(void *id) | |
| 77 | + = internal_remove_input; | |
| 78 | + | |
| 79 | + static void * (*add_except)(int source, H3270 *session, void (*fn)(H3270 *session)) | |
| 80 | + = internal_add_except; | |
| 81 | + | |
| 82 | + static int (*callthread)(int(*callback)(H3270 *, void *), H3270 *session, void *parm) | |
| 83 | + = internal_callthread; | |
| 84 | + | |
| 85 | + static int (*wait)(int seconds) | |
| 86 | + = internal_wait; | |
| 87 | + | |
| 88 | + static int (*event_dispatcher)(int wait) | |
| 89 | + = internal_event_dispatcher; | |
| 90 | + | |
| 91 | + static void (*ring_bell)(H3270 *) | |
| 92 | + = internal_ring_bell; | |
| 93 | + | |
| 94 | +/*---[ Typedefs ]-------------------------------------------------------------------------------------------*/ | |
| 95 | + | |
| 96 | + typedef struct timeout | |
| 97 | + { | |
| 98 | + struct timeout *next; | |
| 99 | +#if defined(_WIN32) /*[*/ | |
| 100 | + unsigned long long ts; | |
| 101 | +#else /*][*/ | |
| 102 | + struct timeval tv; | |
| 103 | +#endif /*]*/ | |
| 104 | + void (*proc)(H3270 *session); | |
| 105 | + H3270 *session; | |
| 106 | + Boolean in_play; | |
| 107 | + } timeout_t; | |
| 108 | + | |
| 109 | + #define TN (timeout_t *)NULL | |
| 110 | + | |
| 111 | + /* Input events. */ | |
| 112 | +typedef struct input | |
| 113 | +{ | |
| 114 | + struct input *next; | |
| 115 | + int source; | |
| 116 | + int condition; | |
| 117 | + void (*proc)(H3270 *session); | |
| 118 | + H3270 *session; | |
| 119 | +} input_t; | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | +/*---[ Statics ]--------------------------------------------------------------------------------------------*/ | |
| 124 | + | |
| 125 | + static timeout_t * timeouts = NULL; | |
| 126 | + static input_t * inputs = NULL; | |
| 127 | + static Boolean inputs_changed = False; | |
| 128 | + | |
| 129 | +/*---[ Implement ]------------------------------------------------------------------------------------------*/ | |
| 130 | + | |
| 131 | + | |
| 132 | +/* Timeouts */ | |
| 133 | + | |
| 134 | +#if defined(_WIN32) | |
| 135 | +static void ms_ts(unsigned long long *u) | |
| 136 | +{ | |
| 137 | + FILETIME t; | |
| 138 | + | |
| 139 | + /* Get the system time, in 100ns units. */ | |
| 140 | + GetSystemTimeAsFileTime(&t); | |
| 141 | + memcpy(u, &t, sizeof(unsigned long long)); | |
| 142 | + | |
| 143 | + /* Divide by 10,000 to get ms. */ | |
| 144 | + *u /= 10000ULL; | |
| 145 | +} | |
| 146 | +#endif | |
| 147 | + | |
| 148 | +static void * internal_add_timeout(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)) | |
| 149 | +{ | |
| 150 | + timeout_t *t_new; | |
| 151 | + timeout_t *t; | |
| 152 | + timeout_t *prev = TN; | |
| 153 | + | |
| 154 | + trace("%s session=%p proc=%p",__FUNCTION__,session,proc); | |
| 155 | + | |
| 156 | + t_new = (timeout_t *) lib3270_malloc(sizeof(timeout_t)); | |
| 157 | + | |
| 158 | + t_new->proc = proc; | |
| 159 | + t_new->session = session; | |
| 160 | + t_new->in_play = False; | |
| 161 | + | |
| 162 | +#if defined(_WIN32) | |
| 163 | + ms_ts(&t_new->ts); | |
| 164 | + t_new->ts += interval_ms; | |
| 165 | +#else | |
| 166 | + | |
| 167 | + gettimeofday(&t_new->tv, NULL); | |
| 168 | + t_new->tv.tv_sec += interval_ms / 1000L; | |
| 169 | + t_new->tv.tv_usec += (interval_ms % 1000L) * 1000L; | |
| 170 | + | |
| 171 | + if (t_new->tv.tv_usec > MILLION) | |
| 172 | + { | |
| 173 | + t_new->tv.tv_sec += t_new->tv.tv_usec / MILLION; | |
| 174 | + t_new->tv.tv_usec %= MILLION; | |
| 175 | + } | |
| 176 | +#endif /*]*/ | |
| 177 | + | |
| 178 | + /* Find where to insert this item. */ | |
| 179 | + for (t = timeouts; t != TN; t = t->next) | |
| 180 | + { | |
| 181 | +#if defined(_WIN32) | |
| 182 | + if (t->ts > t_new->ts) | |
| 183 | +#else | |
| 184 | + if (t->tv.tv_sec > t_new->tv.tv_sec || (t->tv.tv_sec == t_new->tv.tv_sec && t->tv.tv_usec > t_new->tv.tv_usec)) | |
| 185 | +#endif | |
| 186 | + break; | |
| 187 | + | |
| 188 | + prev = t; | |
| 189 | + } | |
| 190 | + | |
| 191 | + // Insert it. | |
| 192 | + if (prev == TN) | |
| 193 | + { // Front. | |
| 194 | + t_new->next = timeouts; | |
| 195 | + timeouts = t_new; | |
| 196 | + } | |
| 197 | + else if (t == TN) | |
| 198 | + { // Rear. | |
| 199 | + t_new->next = TN; | |
| 200 | + prev->next = t_new; | |
| 201 | + } | |
| 202 | + else | |
| 203 | + { // Middle. | |
| 204 | + t_new->next = t; | |
| 205 | + prev->next = t_new; | |
| 206 | + } | |
| 207 | + | |
| 208 | + trace("Timeout %p added with value %ld",t_new,interval_ms); | |
| 209 | + | |
| 210 | + return t_new; | |
| 211 | +} | |
| 212 | + | |
| 213 | +static void internal_remove_timeout(void * timer) | |
| 214 | +{ | |
| 215 | + timeout_t *st = (timeout_t *)timer; | |
| 216 | + timeout_t *t; | |
| 217 | + timeout_t *prev = TN; | |
| 218 | + | |
| 219 | + trace("Removing timeout: %p",st); | |
| 220 | + | |
| 221 | + if (st->in_play) | |
| 222 | + return; | |
| 223 | + | |
| 224 | + for (t = timeouts; t != TN; t = t->next) | |
| 225 | + { | |
| 226 | + if (t == st) | |
| 227 | + { | |
| 228 | + if (prev != TN) | |
| 229 | + prev->next = t->next; | |
| 230 | + else | |
| 231 | + timeouts = t->next; | |
| 232 | + lib3270_free(t); | |
| 233 | + return; | |
| 234 | + } | |
| 235 | + prev = t; | |
| 236 | + } | |
| 237 | +} | |
| 238 | + | |
| 239 | +/* Input events. */ | |
| 240 | + | |
| 241 | +static void * internal_add_input(int source, H3270 *session, void (*fn)(H3270 *session)) | |
| 242 | +{ | |
| 243 | + input_t *ip = (input_t *) lib3270_malloc(sizeof(input_t)); | |
| 244 | + | |
| 245 | + trace("%s session=%p proc=%p",__FUNCTION__,session,fn); | |
| 246 | + | |
| 247 | + ip->source = source; | |
| 248 | + ip->condition = InputReadMask; | |
| 249 | + ip->proc = fn; | |
| 250 | + ip->session = session; | |
| 251 | + ip->next = inputs; | |
| 252 | + inputs = ip; | |
| 253 | + inputs_changed = True; | |
| 254 | + | |
| 255 | + trace("%s: fd=%d callback=%p handle=%p",__FUNCTION__,source,fn,ip); | |
| 256 | + | |
| 257 | + return ip; | |
| 258 | +} | |
| 259 | + | |
| 260 | +static void * internal_add_except(int source, H3270 *session, void (*fn)(H3270 *session)) | |
| 261 | +{ | |
| 262 | +#if defined(_WIN32) | |
| 263 | + return 0; | |
| 264 | +#else | |
| 265 | + input_t *ip = (input_t *) lib3270_malloc(sizeof(input_t)); | |
| 266 | + | |
| 267 | + trace("%s session=%p proc=%p",__FUNCTION__,session,fn); | |
| 268 | + | |
| 269 | + ip->source = source; | |
| 270 | + ip->condition = InputExceptMask; | |
| 271 | + ip->proc = fn; | |
| 272 | + ip->session = session; | |
| 273 | + ip->next = inputs; | |
| 274 | + inputs = ip; | |
| 275 | + inputs_changed = True; | |
| 276 | + | |
| 277 | + trace("%s: fd=%d callback=%p handle=%p",__FUNCTION__,source,fn,ip); | |
| 278 | + | |
| 279 | + return ip; | |
| 280 | +#endif | |
| 281 | +} | |
| 282 | + | |
| 283 | +static void internal_remove_input(void *id) | |
| 284 | +{ | |
| 285 | + input_t *ip; | |
| 286 | + input_t *prev = (input_t *)NULL; | |
| 287 | + | |
| 288 | + trace("%s: fhandle=%p",__FUNCTION__,(input_t *) id); | |
| 289 | + | |
| 290 | + for (ip = inputs; ip != (input_t *)NULL; ip = ip->next) | |
| 291 | + { | |
| 292 | + if (ip == (input_t *)id) | |
| 293 | + break; | |
| 294 | + | |
| 295 | + prev = ip; | |
| 296 | + } | |
| 297 | + | |
| 298 | + if (ip == (input_t *)NULL) | |
| 299 | + return; | |
| 300 | + | |
| 301 | + if (prev != (input_t *)NULL) | |
| 302 | + prev->next = ip->next; | |
| 303 | + else | |
| 304 | + inputs = ip->next; | |
| 305 | + | |
| 306 | + lib3270_free(ip); | |
| 307 | + inputs_changed = True; | |
| 308 | +} | |
| 309 | + | |
| 310 | +/* Event dispatcher. */ | |
| 311 | +static int internal_event_dispatcher(int block) | |
| 312 | +{ | |
| 313 | +#if defined(_WIN32) | |
| 314 | + HANDLE ha[MAX_HA]; | |
| 315 | + DWORD nha; | |
| 316 | + DWORD tmo; | |
| 317 | + DWORD ret; | |
| 318 | + unsigned long long now; | |
| 319 | + int i; | |
| 320 | +#else | |
| 321 | + fd_set rfds, wfds, xfds; | |
| 322 | + int ns; | |
| 323 | + struct timeval now, twait, *tp; | |
| 324 | +#endif | |
| 325 | + input_t *ip, *ip_next; | |
| 326 | + struct timeout *t; | |
| 327 | + Boolean any_events; | |
| 328 | + int processed_any = 0; | |
| 329 | + | |
| 330 | + retry: | |
| 331 | + | |
| 332 | + // If we've processed any input, then don't block again. | |
| 333 | + | |
| 334 | + if(processed_any) | |
| 335 | + block = 0; | |
| 336 | + any_events = False; | |
| 337 | +#if defined(_WIN32) | |
| 338 | + nha = 0; | |
| 339 | +#else | |
| 340 | + FD_ZERO(&rfds); | |
| 341 | + FD_ZERO(&wfds); | |
| 342 | + FD_ZERO(&xfds); | |
| 343 | +#endif | |
| 344 | + | |
| 345 | + for (ip = inputs; ip != (input_t *)NULL; ip = ip->next) | |
| 346 | + { | |
| 347 | + if ((unsigned long)ip->condition & InputReadMask) | |
| 348 | + { | |
| 349 | +#if defined(_WIN32) | |
| 350 | + ha[nha++] = (HANDLE) ip->source; | |
| 351 | +#else | |
| 352 | + FD_SET(ip->source, &rfds); | |
| 353 | +#endif | |
| 354 | + any_events = True; | |
| 355 | + } | |
| 356 | +#if !defined(_WIN32) | |
| 357 | + if ((unsigned long)ip->condition & InputWriteMask) | |
| 358 | + { | |
| 359 | + FD_SET(ip->source, &wfds); | |
| 360 | + any_events = True; | |
| 361 | + } | |
| 362 | + if ((unsigned long)ip->condition & InputExceptMask) | |
| 363 | + { | |
| 364 | + FD_SET(ip->source, &xfds); | |
| 365 | + any_events = True; | |
| 366 | + } | |
| 367 | +#endif | |
| 368 | + } | |
| 369 | + | |
| 370 | + if (block) | |
| 371 | + { | |
| 372 | + if (timeouts != TN) { | |
| 373 | +#if defined(_WIN32) | |
| 374 | + ms_ts(&now); | |
| 375 | + if (now > timeouts->ts) | |
| 376 | + tmo = 0; | |
| 377 | + else | |
| 378 | + tmo = timeouts->ts - now; | |
| 379 | +#else | |
| 380 | + (void) gettimeofday(&now, (void *)NULL); | |
| 381 | + twait.tv_sec = timeouts->tv.tv_sec - now.tv_sec; | |
| 382 | + twait.tv_usec = timeouts->tv.tv_usec - now.tv_usec; | |
| 383 | + if (twait.tv_usec < 0L) { | |
| 384 | + twait.tv_sec--; | |
| 385 | + twait.tv_usec += MILLION; | |
| 386 | + } | |
| 387 | + if (twait.tv_sec < 0L) | |
| 388 | + twait.tv_sec = twait.tv_usec = 0L; | |
| 389 | + tp = &twait; | |
| 390 | +#endif | |
| 391 | + any_events = True; | |
| 392 | + } else { | |
| 393 | + // Block for 1 second (at maximal) | |
| 394 | +#if defined(_WIN32) | |
| 395 | + tmo = 1; | |
| 396 | +#else | |
| 397 | + twait.tv_sec = 1; | |
| 398 | + twait.tv_usec = 0L; | |
| 399 | + tp = &twait; | |
| 400 | +#endif | |
| 401 | + } | |
| 402 | + } | |
| 403 | + else | |
| 404 | + { | |
| 405 | +#if defined(_WIN32) | |
| 406 | + tmo = 1; | |
| 407 | +#else | |
| 408 | + twait.tv_sec = twait.tv_usec = 0L; | |
| 409 | + tp = &twait; | |
| 410 | +#endif | |
| 411 | + } | |
| 412 | + | |
| 413 | + if (!any_events) | |
| 414 | + return processed_any; | |
| 415 | + | |
| 416 | +#if defined(_WIN32) | |
| 417 | + ret = WaitForMultipleObjects(nha, ha, FALSE, tmo); | |
| 418 | + if (ret == WAIT_FAILED) | |
| 419 | + { | |
| 420 | +#else | |
| 421 | + ns = select(FD_SETSIZE, &rfds, &wfds, &xfds, tp); | |
| 422 | + if (ns < 0) | |
| 423 | + { | |
| 424 | + if (errno != EINTR) | |
| 425 | + Warning(NULL, "process_events: select() failed" ); | |
| 426 | +#endif | |
| 427 | + return processed_any; | |
| 428 | + } | |
| 429 | + | |
| 430 | + inputs_changed = False; | |
| 431 | + | |
| 432 | +#if defined(_WIN32) | |
| 433 | + for (i = 0, ip = inputs; ip != (input_t *)NULL; ip = ip_next, i++) | |
| 434 | + { | |
| 435 | +#else | |
| 436 | + for (ip = inputs; ip != (input_t *) NULL; ip = ip_next) | |
| 437 | + { | |
| 438 | +#endif | |
| 439 | + ip_next = ip->next; | |
| 440 | + if (((unsigned long)ip->condition & InputReadMask) && | |
| 441 | +#if defined(_WIN32) | |
| 442 | + ret == WAIT_OBJECT_0 + i) | |
| 443 | + { | |
| 444 | +#else | |
| 445 | + FD_ISSET(ip->source, &rfds)) | |
| 446 | + { | |
| 447 | +#endif | |
| 448 | + (*ip->proc)(ip->session); | |
| 449 | + processed_any = True; | |
| 450 | + if (inputs_changed) | |
| 451 | + goto retry; | |
| 452 | + } | |
| 453 | + | |
| 454 | +#if !defined(_WIN32) | |
| 455 | + if (((unsigned long)ip->condition & InputWriteMask) && FD_ISSET(ip->source, &wfds)) | |
| 456 | + { | |
| 457 | + (*ip->proc)(ip->session); | |
| 458 | + processed_any = True; | |
| 459 | + if (inputs_changed) | |
| 460 | + goto retry; | |
| 461 | + } | |
| 462 | + if (((unsigned long)ip->condition & InputExceptMask) && FD_ISSET(ip->source, &xfds)) | |
| 463 | + { | |
| 464 | + (*ip->proc)(ip->session); | |
| 465 | + processed_any = True; | |
| 466 | + if (inputs_changed) | |
| 467 | + goto retry; | |
| 468 | + } | |
| 469 | +#endif | |
| 470 | + } | |
| 471 | + | |
| 472 | + // See what's expired. | |
| 473 | + if (timeouts != TN) { | |
| 474 | +#if defined(_WIN32) | |
| 475 | + ms_ts(&now); | |
| 476 | +#else | |
| 477 | + (void) gettimeofday(&now, (void *)NULL); | |
| 478 | +#endif | |
| 479 | + | |
| 480 | + while ((t = timeouts) != TN) | |
| 481 | + { | |
| 482 | +#if defined(_WIN32) | |
| 483 | + if (t->ts <= now) { | |
| 484 | +#else | |
| 485 | + if (t->tv.tv_sec < now.tv_sec ||(t->tv.tv_sec == now.tv_sec && t->tv.tv_usec < now.tv_usec)) | |
| 486 | + { | |
| 487 | +#endif | |
| 488 | + timeouts = t->next; | |
| 489 | + t->in_play = True; | |
| 490 | + (*t->proc)(t->session); | |
| 491 | + processed_any = True; | |
| 492 | + lib3270_free(t); | |
| 493 | + } else | |
| 494 | + break; | |
| 495 | + } | |
| 496 | + } | |
| 497 | + | |
| 498 | + if (inputs_changed) | |
| 499 | + goto retry; | |
| 500 | + | |
| 501 | + return processed_any; | |
| 502 | + | |
| 503 | +} | |
| 504 | + | |
| 505 | +static int internal_callthread(int(*callback)(H3270 *, void *), H3270 *session, void *parm) | |
| 506 | +{ | |
| 507 | + callback(session,parm); | |
| 508 | +} | |
| 509 | + | |
| 510 | +static int internal_wait(int seconds) | |
| 511 | +{ | |
| 512 | + time_t end; | |
| 513 | + | |
| 514 | + // Alternative wait call | |
| 515 | + end = time(0) + seconds; | |
| 516 | + | |
| 517 | + while(time(0) < end) | |
| 518 | + { | |
| 519 | + lib3270_main_iterate(&h3270,1); | |
| 520 | + } | |
| 521 | + | |
| 522 | + return 0; | |
| 523 | +} | |
| 524 | + | |
| 525 | +static void internal_ring_bell(H3270 *session) | |
| 526 | +{ | |
| 527 | + return; | |
| 528 | +} | |
| 529 | + | |
| 530 | +/* External entry points */ | |
| 531 | + | |
| 532 | +void * AddTimeOut(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)) | |
| 533 | +{ | |
| 534 | + CHECK_SESSION_HANDLE(session); | |
| 535 | + return add_timeout(interval_ms,session,proc); | |
| 536 | +} | |
| 537 | + | |
| 538 | +void RemoveTimeOut(void * timer) | |
| 539 | +{ | |
| 540 | + return remove_timeout(timer); | |
| 541 | +} | |
| 542 | + | |
| 543 | +void * AddInput(int source, H3270 *session, void (*fn)(H3270 *session)) | |
| 544 | +{ | |
| 545 | + CHECK_SESSION_HANDLE(session); | |
| 546 | + return add_input(source,session,fn); | |
| 547 | +} | |
| 548 | + | |
| 549 | +void * AddExcept(int source, H3270 *session, void (*fn)(H3270 *session)) | |
| 550 | +{ | |
| 551 | + CHECK_SESSION_HANDLE(session); | |
| 552 | + return add_except(source,session,fn); | |
| 553 | +} | |
| 554 | + | |
| 555 | +void RemoveInput(void * id) | |
| 556 | +{ | |
| 557 | + remove_input(id); | |
| 558 | +} | |
| 559 | + | |
| 560 | +void x_except_on(H3270 *h) | |
| 561 | +{ | |
| 562 | + if(h->excepting) | |
| 563 | + return; | |
| 564 | + | |
| 565 | + if(h->reading) | |
| 566 | + RemoveInput(h->ns_read_id); | |
| 567 | + | |
| 568 | +#ifdef WIN32 | |
| 569 | + h->ns_exception_id = AddExcept((int) h->sockEvent, h, net_exception); | |
| 570 | + h->excepting = 1; | |
| 571 | + | |
| 572 | + if(h->reading) | |
| 573 | + h->ns_read_id = AddInput( (int) h->sockEvent, h, net_input); | |
| 574 | +#else | |
| 575 | + h->ns_exception_id = AddExcept(h->sock, h, net_exception); | |
| 576 | + h->excepting = 1; | |
| 577 | + | |
| 578 | + if(h->reading) | |
| 579 | + h->ns_read_id = AddInput(h->sock, h, net_input); | |
| 580 | +#endif // WIN32 | |
| 581 | +} | |
| 582 | + | |
| 583 | +void add_input_calls(H3270 *session, void (*in)(H3270 *session), void (*exc)(H3270 *session)) | |
| 584 | +{ | |
| 585 | +#ifdef _WIN32 | |
| 586 | + session->ns_exception_id = AddExcept((int) session->sockEvent, session, exc); | |
| 587 | + session->ns_read_id = AddInput((int) session->sockEvent, session, in); | |
| 588 | +#else | |
| 589 | + session->ns_exception_id = AddExcept(session->sock, session, exc); | |
| 590 | + session->ns_read_id = AddInput(session->sock, session, in); | |
| 591 | +#endif // WIN32 | |
| 592 | + | |
| 593 | + session->excepting = 1; | |
| 594 | + session->reading = 1; | |
| 595 | +} | |
| 596 | + | |
| 597 | +void remove_input_calls(H3270 *session) | |
| 598 | +{ | |
| 599 | + if(session->ns_read_id) | |
| 600 | + { | |
| 601 | + RemoveInput(session->ns_read_id); | |
| 602 | + session->ns_read_id = NULL; | |
| 603 | + session->reading = 0; | |
| 604 | + } | |
| 605 | + if(session->ns_exception_id) | |
| 606 | + { | |
| 607 | + RemoveInput(session->ns_exception_id); | |
| 608 | + session->ns_exception_id = NULL; | |
| 609 | + session->excepting = 0; | |
| 610 | + } | |
| 611 | +} | |
| 612 | + | |
| 613 | +LIB3270_EXPORT int lib3270_register_handlers(const struct lib3270_callbacks *cbk) | |
| 614 | +{ | |
| 615 | + if(!cbk) | |
| 616 | + return EINVAL; | |
| 617 | + | |
| 618 | + if(cbk->sz != sizeof(struct lib3270_callbacks)) | |
| 619 | + return EINVAL; | |
| 620 | + | |
| 621 | + if(cbk->AddTimeOut) | |
| 622 | + add_timeout = cbk->AddTimeOut; | |
| 623 | + | |
| 624 | + if(cbk->RemoveTimeOut) | |
| 625 | + remove_timeout = cbk->RemoveTimeOut; | |
| 626 | + | |
| 627 | + if(cbk->AddInput) | |
| 628 | + add_input = cbk->AddInput; | |
| 629 | + | |
| 630 | + if(cbk->RemoveInput) | |
| 631 | + remove_input = cbk->RemoveInput; | |
| 632 | + | |
| 633 | + if(cbk->AddExcept) | |
| 634 | + add_except = cbk->AddExcept; | |
| 635 | + | |
| 636 | + if(cbk->callthread) | |
| 637 | + callthread = cbk->callthread; | |
| 638 | + | |
| 639 | + if(cbk->Wait) | |
| 640 | + wait = cbk->Wait; | |
| 641 | + | |
| 642 | + if(cbk->event_dispatcher) | |
| 643 | + event_dispatcher = cbk->event_dispatcher; | |
| 644 | + | |
| 645 | + if(cbk->ring_bell) | |
| 646 | + ring_bell = cbk->ring_bell; | |
| 647 | + | |
| 648 | + return 0; | |
| 649 | + | |
| 650 | +} | |
| 651 | + | |
| 652 | +LIB3270_EXPORT int lib3270_call_thread(int(*callback)(H3270 *h, void *), H3270 *h, void *parm) | |
| 653 | +{ | |
| 654 | + int rc; | |
| 655 | + CHECK_SESSION_HANDLE(h); | |
| 656 | + | |
| 657 | + if(h->set_timer) | |
| 658 | + h->set_timer(h,1); | |
| 659 | + | |
| 660 | + lib3270_main_iterate(h,0); | |
| 661 | + callthread(callback,h,parm); | |
| 662 | + lib3270_main_iterate(h,0); | |
| 663 | + | |
| 664 | + if(h->set_timer) | |
| 665 | + h->set_timer(h,0); | |
| 666 | + | |
| 667 | + return rc; | |
| 668 | +} | |
| 669 | + | |
| 670 | +LIB3270_EXPORT void lib3270_main_iterate(H3270 *session, int block) | |
| 671 | +{ | |
| 672 | + CHECK_SESSION_HANDLE(session); | |
| 673 | + event_dispatcher(block); | |
| 674 | +} | |
| 675 | + | |
| 676 | +LIB3270_EXPORT int lib3270_wait(seconds) | |
| 677 | +{ | |
| 678 | + wait(seconds); | |
| 679 | +} | |
| 680 | + | |
| 681 | +LIB3270_EXPORT void lib3270_ring_bell(H3270 *session) | |
| 682 | +{ | |
| 683 | + CHECK_SESSION_HANDLE(session); | |
| 684 | + if(lib3270_get_toggle(session,LIB3270_TOGGLE_BEEP)) | |
| 685 | + ring_bell(session); | |
| 686 | +} | |
| 687 | + | |
| 688 | + | |
| 689 | + | ... | ... |
kybd.c
| ... | ... | @@ -492,7 +492,7 @@ static void key_AID(H3270 *session, unsigned char aid_code) |
| 492 | 492 | if (IN_ANSI) { |
| 493 | 493 | register unsigned i; |
| 494 | 494 | |
| 495 | - Trace("aid_code: %02x IN_ANSI: %d",aid_code,IN_ANSI); | |
| 495 | + trace("aid_code: %02x IN_ANSI: %d",aid_code,IN_ANSI); | |
| 496 | 496 | |
| 497 | 497 | if (aid_code == AID_ENTER) { |
| 498 | 498 | net_sendc('\r'); |
| ... | ... | @@ -516,7 +516,7 @@ static void key_AID(H3270 *session, unsigned char aid_code) |
| 516 | 516 | plugin_aid(aid_code); |
| 517 | 517 | #endif /*]*/ |
| 518 | 518 | |
| 519 | - Trace("IN_SSCP: %d cursor_addr: %d",IN_SSCP,h3270.cursor_addr); | |
| 519 | + trace("IN_SSCP: %d cursor_addr: %d",IN_SSCP,h3270.cursor_addr); | |
| 520 | 520 | |
| 521 | 521 | if (IN_SSCP) { |
| 522 | 522 | if (kybdlock & KL_OIA_MINUS) |
| ... | ... | @@ -2295,7 +2295,7 @@ LIB3270_KEY_ACTION( enter ) |
| 2295 | 2295 | { |
| 2296 | 2296 | // reset_idle_timer(); |
| 2297 | 2297 | |
| 2298 | - Trace("%s (kybdlock & KL_OIA_MINUS): %d kybdlock: %d",__FUNCTION__,(kybdlock & KL_OIA_MINUS),kybdlock); | |
| 2298 | + trace("%s (kybdlock & KL_OIA_MINUS): %d kybdlock: %d",__FUNCTION__,(kybdlock & KL_OIA_MINUS),kybdlock); | |
| 2299 | 2299 | |
| 2300 | 2300 | if (kybdlock & KL_OIA_MINUS) |
| 2301 | 2301 | return -1; | ... | ... |
screen.c
| ... | ... | @@ -622,7 +622,21 @@ void show_3270_popup_dialog(H3270 *session, LIB3270_NOTIFY type, const char *tit |
| 622 | 622 | |
| 623 | 623 | static int logpopup(H3270 *session, void *widget, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list arg) |
| 624 | 624 | { |
| 625 | +#ifdef ANDROID | |
| 626 | + | |
| 627 | + char len = strlen(fmt); | |
| 628 | + char * mask = malloc(len+5); | |
| 629 | + strncpy(mask,fmt,len); | |
| 630 | + mask[len] = '\n'; | |
| 631 | + mask[len+1] = 0; | |
| 632 | + __android_log_vprint(ANDROID_LOG_VERBOSE, PACKAGE_NAME, mask, arg); | |
| 633 | + | |
| 634 | +#else | |
| 635 | + | |
| 625 | 636 | lib3270_write_va_log(session,"lib3270",fmt,arg); |
| 637 | + | |
| 638 | +#endif // ANDROID | |
| 639 | + | |
| 626 | 640 | return 0; |
| 627 | 641 | } |
| 628 | 642 | ... | ... |
| ... | ... | @@ -0,0 +1,395 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270. | |
| 5 | + * | |
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | + * | |
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | + * Free Software Foundation. | |
| 11 | + * | |
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | + * obter mais detalhes. | |
| 16 | + * | |
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | |
| 19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | |
| 20 | + * | |
| 21 | + * Este programa está nomeado como session.c e possui - linhas de código. | |
| 22 | + * | |
| 23 | + * Contatos: | |
| 24 | + * | |
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 27 | + * licinio@bb.com.br (Licínio Luis Branco) | |
| 28 | + * kraucer@bb.com.br (Kraucer Fernandes Mazuco) | |
| 29 | + * macmiranda@bb.com.br (Marco Aurélio Caldas Miranda) | |
| 30 | + * | |
| 31 | + */ | |
| 32 | + | |
| 33 | + | |
| 34 | +#include "globals.h" | |
| 35 | +#include "charsetc.h" | |
| 36 | +#include "kybdc.h" | |
| 37 | +#include "ansic.h" | |
| 38 | + | |
| 39 | +/*---[ Globals ]--------------------------------------------------------------------------------------------------------------*/ | |
| 40 | + | |
| 41 | + H3270 h3270; | |
| 42 | + | |
| 43 | +/*---[ Statics ]--------------------------------------------------------------------------------------------------------------*/ | |
| 44 | + | |
| 45 | + static int parse_model_number(H3270 *session, const char *m); | |
| 46 | + | |
| 47 | +/*---[ Implement ]------------------------------------------------------------------------------------------------------------*/ | |
| 48 | + | |
| 49 | +void lib3270_session_free(H3270 *h) | |
| 50 | +{ | |
| 51 | + int f; | |
| 52 | + | |
| 53 | + // Terminate session | |
| 54 | + if(lib3270_connected(h)) | |
| 55 | + lib3270_disconnect(h); | |
| 56 | + | |
| 57 | + shutdown_toggles(h); | |
| 58 | + | |
| 59 | + // Release state change callbacks | |
| 60 | + for(f=0;f<N_ST;f++) | |
| 61 | + { | |
| 62 | + while(h->st_callbacks[f]) | |
| 63 | + { | |
| 64 | + struct lib3270_state_callback *next = h->st_callbacks[f]->next; | |
| 65 | + lib3270_free(h->st_callbacks[f]); | |
| 66 | + h->st_callbacks[f] = next; | |
| 67 | + } | |
| 68 | + } | |
| 69 | + | |
| 70 | + // Release memory | |
| 71 | + lib3270_free(h->charset); | |
| 72 | + lib3270_free(h->paste_buffer); | |
| 73 | + h->charset = NULL; | |
| 74 | + h->paste_buffer = NULL; | |
| 75 | + | |
| 76 | + for(f=0;f<(sizeof(h->buffer)/sizeof(h->buffer[0]));f++) | |
| 77 | + { | |
| 78 | + lib3270_free(h->buffer[f]); | |
| 79 | + h->buffer[f] = NULL; | |
| 80 | + } | |
| 81 | + | |
| 82 | +} | |
| 83 | + | |
| 84 | +static void update_char(H3270 *session, int addr, unsigned char chr, unsigned short attr, unsigned char cursor) | |
| 85 | +{ | |
| 86 | +} | |
| 87 | + | |
| 88 | +static void nop_char(H3270 *session, unsigned char chr) | |
| 89 | +{ | |
| 90 | +} | |
| 91 | + | |
| 92 | +static void nop(H3270 *session) | |
| 93 | +{ | |
| 94 | +} | |
| 95 | + | |
| 96 | +static void update_model(H3270 *session, const char *name, int model, int rows, int cols) | |
| 97 | +{ | |
| 98 | +} | |
| 99 | + | |
| 100 | +static void changed(H3270 *session, int bstart, int bend) | |
| 101 | +{ | |
| 102 | +} | |
| 103 | + | |
| 104 | +static void update_cursor(H3270 *session, unsigned short row, unsigned short col, unsigned char c, unsigned short attr) | |
| 105 | +{ | |
| 106 | +} | |
| 107 | + | |
| 108 | +static void update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) | |
| 109 | +{ | |
| 110 | +} | |
| 111 | + | |
| 112 | +static void update_selection(H3270 *session, int start, int end) | |
| 113 | +{ | |
| 114 | +} | |
| 115 | + | |
| 116 | +static void set_cursor(H3270 *session, LIB3270_CURSOR id) | |
| 117 | +{ | |
| 118 | +} | |
| 119 | + | |
| 120 | +static void message(H3270 *session, LIB3270_NOTIFY id , const char *title, const char *message, const char *text) | |
| 121 | +{ | |
| 122 | +#ifdef ANDROID | |
| 123 | + | |
| 124 | + __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, "%s\n",title); | |
| 125 | + __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, "%s\n",message); | |
| 126 | + __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, "%s\n",text); | |
| 127 | + | |
| 128 | +#else | |
| 129 | + | |
| 130 | + lib3270_write_log(session,"%s",title); | |
| 131 | + lib3270_write_log(session,"%s",message); | |
| 132 | + lib3270_write_log(session,"%s",text); | |
| 133 | + | |
| 134 | +#endif // ANDROID | |
| 135 | + | |
| 136 | +} | |
| 137 | + | |
| 138 | +static void update_ssl(H3270 *session, LIB3270_SSL_STATE state) | |
| 139 | +{ | |
| 140 | +} | |
| 141 | + | |
| 142 | +static void lib3270_session_init(H3270 *hSession, const char *model) | |
| 143 | +{ | |
| 144 | + int ovc, ovr; | |
| 145 | + char junk; | |
| 146 | + int model_number; | |
| 147 | + | |
| 148 | + memset(hSession,0,sizeof(H3270)); | |
| 149 | + hSession->sz = sizeof(H3270); | |
| 150 | + | |
| 151 | + // Set the defaults. | |
| 152 | + hSession->extended = 1; | |
| 153 | + hSession->typeahead = 1; | |
| 154 | + hSession->oerr_lock = 1; | |
| 155 | + hSession->unlock_delay = 1; | |
| 156 | + hSession->icrnl = 1; | |
| 157 | + hSession->onlcr = 1; | |
| 158 | + hSession->host_charset = "bracket"; | |
| 159 | + | |
| 160 | +/* | |
| 161 | +#if !defined(_WIN32) | |
| 162 | + hSession->host_charset = "bracket"; | |
| 163 | +#else | |
| 164 | + | |
| 165 | + if (is_nt) | |
| 166 | + hSession->host_charset = "bracket"; | |
| 167 | + else | |
| 168 | + hSession->host_charset = "bracket437"; | |
| 169 | +#endif | |
| 170 | +*/ | |
| 171 | + | |
| 172 | + | |
| 173 | + // Initialize toggles | |
| 174 | + initialize_toggles(hSession); | |
| 175 | + | |
| 176 | + // Dummy calls to avoid "ifs" | |
| 177 | + hSession->update = update_char; | |
| 178 | + hSession->update_model = update_model; | |
| 179 | + hSession->update_cursor = update_cursor; | |
| 180 | + hSession->set_selection = nop_char; | |
| 181 | + hSession->ctlr_done = nop; | |
| 182 | + hSession->changed = changed; | |
| 183 | + hSession->erase = screen_disp; | |
| 184 | + hSession->suspend = nop; | |
| 185 | + hSession->resume = screen_disp; | |
| 186 | + hSession->update_oia = update_oia; | |
| 187 | + hSession->update_selection = update_selection; | |
| 188 | + hSession->cursor = set_cursor; | |
| 189 | + hSession->message = message; | |
| 190 | + hSession->update_ssl = update_ssl; | |
| 191 | + hSession->sock = -1; | |
| 192 | + | |
| 193 | +#ifdef _WIN32 | |
| 194 | + hSession->sockEvent = NULL; | |
| 195 | +#endif // _WIN32 | |
| 196 | + | |
| 197 | + hSession->model_num = -1; | |
| 198 | + hSession->cstate = NOT_CONNECTED; | |
| 199 | + hSession->oia_status = -1; | |
| 200 | + | |
| 201 | + strncpy(hSession->full_model_name,"IBM-",LIB3270_FULL_MODEL_NAME_LENGTH); | |
| 202 | + hSession->model_name = &hSession->full_model_name[4]; | |
| 203 | + | |
| 204 | + if(!*model) | |
| 205 | + model = "2"; // No model, use the default one | |
| 206 | + | |
| 207 | + model_number = parse_model_number(hSession,model); | |
| 208 | + if (model_number < 0) | |
| 209 | + { | |
| 210 | + popup_an_error(hSession,"Invalid model number: %s", model); | |
| 211 | + model_number = 0; | |
| 212 | + } | |
| 213 | + | |
| 214 | + if (!model_number) | |
| 215 | + { | |
| 216 | +#if defined(RESTRICT_3279) | |
| 217 | + model_number = 3; | |
| 218 | +#else | |
| 219 | + model_number = 4; | |
| 220 | +#endif | |
| 221 | + } | |
| 222 | + | |
| 223 | + if(hSession->mono) | |
| 224 | + hSession->m3279 = 0; | |
| 225 | + else | |
| 226 | + hSession->m3279 = 1; | |
| 227 | + | |
| 228 | + if(!hSession->extended) | |
| 229 | + hSession->oversize = CN; | |
| 230 | + | |
| 231 | +#if defined(RESTRICT_3279) | |
| 232 | + if (hSession->m3279 && model_number == 4) | |
| 233 | + model_number = 3; | |
| 234 | +#endif | |
| 235 | + | |
| 236 | + trace("Model_number: %d",model_number); | |
| 237 | + | |
| 238 | + if (!hSession->extended || hSession->oversize == CN || sscanf(hSession->oversize, "%dx%d%c", &ovc, &ovr, &junk) != 2) | |
| 239 | + { | |
| 240 | + ovc = 0; | |
| 241 | + ovr = 0; | |
| 242 | + } | |
| 243 | + ctlr_set_rows_cols(hSession, model_number, ovc, ovr); | |
| 244 | + | |
| 245 | + if (hSession->termname != CN) | |
| 246 | + hSession->termtype = hSession->termname; | |
| 247 | + else | |
| 248 | + hSession->termtype = hSession->full_model_name; | |
| 249 | + | |
| 250 | + trace("Termtype: %s",hSession->termtype); | |
| 251 | + | |
| 252 | + if (hSession->apl_mode) | |
| 253 | + hSession->host_charset = "apl"; | |
| 254 | + | |
| 255 | +} | |
| 256 | + | |
| 257 | +H3270 * lib3270_session_new(const char *model) | |
| 258 | +{ | |
| 259 | + static int configured = 0; | |
| 260 | + | |
| 261 | + H3270 *hSession = &h3270; | |
| 262 | + | |
| 263 | + trace("%s - configured=%d",__FUNCTION__,configured); | |
| 264 | + | |
| 265 | + if(configured) | |
| 266 | + { | |
| 267 | + // TODO (perry#5#): Allocate a new structure. | |
| 268 | + errno = EBUSY; | |
| 269 | + return hSession; | |
| 270 | + } | |
| 271 | + | |
| 272 | + configured = 1; | |
| 273 | + | |
| 274 | + | |
| 275 | + lib3270_session_init(hSession, model); | |
| 276 | + | |
| 277 | + if(screen_init(hSession)) | |
| 278 | + return NULL; | |
| 279 | + | |
| 280 | + trace("Charset: %s",hSession->host_charset); | |
| 281 | + if (charset_init(hSession,hSession->host_charset) != CS_OKAY) | |
| 282 | + { | |
| 283 | + Warning(hSession, _( "Cannot find charset \"%s\", using defaults" ), hSession->host_charset); | |
| 284 | + (void) charset_init(hSession,CN); | |
| 285 | + } | |
| 286 | + | |
| 287 | + trace("%s: Initializing KYBD",__FUNCTION__); | |
| 288 | + lib3270_register_schange(hSession,LIB3270_STATE_CONNECT,kybd_connect,NULL); | |
| 289 | + lib3270_register_schange(hSession,LIB3270_STATE_3270_MODE,kybd_in3270,NULL); | |
| 290 | + | |
| 291 | +#if defined(X3270_ANSI) | |
| 292 | + trace("%s: Initializing ANSI",__FUNCTION__); | |
| 293 | + lib3270_register_schange(hSession,LIB3270_STATE_3270_MODE,ansi_in3270,NULL); | |
| 294 | +#endif // X3270_ANSI | |
| 295 | + | |
| 296 | + | |
| 297 | +#if defined(X3270_FT) | |
| 298 | + ft_init(hSession); | |
| 299 | +#endif | |
| 300 | + | |
| 301 | +/* | |
| 302 | +#if defined(X3270_PRINTER) | |
| 303 | + printer_init(); | |
| 304 | +#endif | |
| 305 | +*/ | |
| 306 | + trace("%s finished",__FUNCTION__); | |
| 307 | + | |
| 308 | + errno = 0; | |
| 309 | + return hSession; | |
| 310 | +} | |
| 311 | + | |
| 312 | + /* | |
| 313 | +- * Parse the model number. | |
| 314 | +- * Returns -1 (error), 0 (default), or the specified number. | |
| 315 | +- */ | |
| 316 | +static int parse_model_number(H3270 *session, const char *m) | |
| 317 | +{ | |
| 318 | + int sl; | |
| 319 | + int n; | |
| 320 | + | |
| 321 | + if(!m) | |
| 322 | + return 0; | |
| 323 | + | |
| 324 | + sl = strlen(m); | |
| 325 | + | |
| 326 | + /* An empty model number is no good. */ | |
| 327 | + if (!sl) | |
| 328 | + return 0; | |
| 329 | + | |
| 330 | + if (sl > 1) { | |
| 331 | + /* | |
| 332 | + * If it's longer than one character, it needs to start with | |
| 333 | + * '327[89]', and it sets the m3279 resource. | |
| 334 | + */ | |
| 335 | + if (!strncmp(m, "3278", 4)) | |
| 336 | + { | |
| 337 | + session->m3279 = 0; | |
| 338 | + } | |
| 339 | + else if (!strncmp(m, "3279", 4)) | |
| 340 | + { | |
| 341 | + session->m3279 = 1; | |
| 342 | + } | |
| 343 | + else | |
| 344 | + { | |
| 345 | + return -1; | |
| 346 | + } | |
| 347 | + m += 4; | |
| 348 | + sl -= 4; | |
| 349 | + | |
| 350 | + /* Check more syntax. -E is allowed, but ignored. */ | |
| 351 | + switch (m[0]) { | |
| 352 | + case '\0': | |
| 353 | + /* Use default model number. */ | |
| 354 | + return 0; | |
| 355 | + case '-': | |
| 356 | + /* Model number specified. */ | |
| 357 | + m++; | |
| 358 | + sl--; | |
| 359 | + break; | |
| 360 | + default: | |
| 361 | + return -1; | |
| 362 | + } | |
| 363 | + switch (sl) { | |
| 364 | + case 1: /* n */ | |
| 365 | + break; | |
| 366 | + case 3: /* n-E */ | |
| 367 | + if (strcasecmp(m + 1, "-E")) { | |
| 368 | + return -1; | |
| 369 | + } | |
| 370 | + break; | |
| 371 | + default: | |
| 372 | + return -1; | |
| 373 | + } | |
| 374 | + } | |
| 375 | + | |
| 376 | + /* Check the numeric model number. */ | |
| 377 | + n = atoi(m); | |
| 378 | + if (n >= 2 && n <= 5) { | |
| 379 | + return n; | |
| 380 | + } else { | |
| 381 | + return -1; | |
| 382 | + } | |
| 383 | + | |
| 384 | +} | |
| 385 | + | |
| 386 | +LIB3270_EXPORT H3270 * lib3270_get_default_session_handle(void) | |
| 387 | +{ | |
| 388 | + return &h3270; | |
| 389 | +} | |
| 390 | + | |
| 391 | +LIB3270_EXPORT void * lib3270_get_widget(H3270 *h) | |
| 392 | +{ | |
| 393 | + CHECK_SESSION_HANDLE(h); | |
| 394 | + return h->widget; | |
| 395 | +} | ... | ... |
sources.mak
| ... | ... | @@ -26,10 +26,13 @@ |
| 26 | 26 | |
| 27 | 27 | # Terminal only sources |
| 28 | 28 | TERMINAL_SOURCES = bounds.c XtGlue.c ctlr.c util.c toggles.c screen.c selection.c kybd.c telnet.c \ |
| 29 | - host.c sf.c ansi.c log.c resolver.c xio.c tables.c proxy.c utf8.c charset.c \ | |
| 30 | - version.c init.c | |
| 29 | + host.c sf.c ansi.c resolver.c tables.c utf8.c charset.c \ | |
| 30 | + version.c session.c state.c | |
| 31 | + | |
| 32 | +# Network I/O Sources | |
| 33 | +NETWORK_SOURCES = iocalls.c proxy.c | |
| 31 | 34 | |
| 32 | 35 | # Full library sources |
| 33 | -SOURCES = $(TERMINAL_SOURCES) actions.c ft.c ft_cut.c ft_dft.c glue.c resources.c \ | |
| 34 | - rpq.c see.c trace_ds.c paste.c macros.c fallbacks.c | |
| 36 | +SOURCES = $(TERMINAL_SOURCES) $(NETWORK_SOURCES) actions.c ft.c ft_cut.c ft_dft.c glue.c resources.c \ | |
| 37 | + rpq.c see.c trace_ds.c paste.c macros.c fallbacks.c log.c | |
| 35 | 38 | ... | ... |
| ... | ... | @@ -0,0 +1,94 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | + * | |
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | + * | |
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | + * Free Software Foundation. | |
| 11 | + * | |
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | + * obter mais detalhes. | |
| 16 | + * | |
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | |
| 19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | |
| 20 | + * | |
| 21 | + * Este programa está nomeado como state.c e possui - linhas de código. | |
| 22 | + * | |
| 23 | + * Contatos: | |
| 24 | + * | |
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 27 | + * | |
| 28 | + */ | |
| 29 | + | |
| 30 | +#include "globals.h" | |
| 31 | + | |
| 32 | +/*---[ Implement ]------------------------------------------------------------------------------------------------------------*/ | |
| 33 | + | |
| 34 | +LIB3270_EXPORT LIB3270_CSTATE lib3270_get_connection_state(H3270 *h) | |
| 35 | +{ | |
| 36 | + CHECK_SESSION_HANDLE(h); | |
| 37 | + return h->cstate; | |
| 38 | +} | |
| 39 | + | |
| 40 | +LIB3270_EXPORT int lib3270_pconnected(H3270 *h) | |
| 41 | +{ | |
| 42 | + CHECK_SESSION_HANDLE(h); | |
| 43 | + return (((int) h->cstate) >= (int)RESOLVING); | |
| 44 | +} | |
| 45 | + | |
| 46 | +LIB3270_EXPORT int lib3270_half_connected(H3270 *h) | |
| 47 | +{ | |
| 48 | + CHECK_SESSION_HANDLE(h); | |
| 49 | + return (h->cstate == RESOLVING || h->cstate == PENDING); | |
| 50 | +} | |
| 51 | + | |
| 52 | +LIB3270_EXPORT int lib3270_connected(H3270 *h) | |
| 53 | +{ | |
| 54 | + CHECK_SESSION_HANDLE(h); | |
| 55 | + return ((int) h->cstate >= (int)CONNECTED_INITIAL); | |
| 56 | +} | |
| 57 | + | |
| 58 | +LIB3270_EXPORT int lib3270_in_neither(H3270 *h) | |
| 59 | +{ | |
| 60 | + CHECK_SESSION_HANDLE(h); | |
| 61 | + return (h->cstate == CONNECTED_INITIAL); | |
| 62 | +} | |
| 63 | + | |
| 64 | +LIB3270_EXPORT int lib3270_in_ansi(H3270 *h) | |
| 65 | +{ | |
| 66 | + CHECK_SESSION_HANDLE(h); | |
| 67 | + return (h->cstate == CONNECTED_ANSI || h->cstate == CONNECTED_NVT); | |
| 68 | +} | |
| 69 | + | |
| 70 | +LIB3270_EXPORT int lib3270_in_3270(H3270 *h) | |
| 71 | +{ | |
| 72 | + CHECK_SESSION_HANDLE(h); | |
| 73 | + return (h->cstate == CONNECTED_3270 || h->cstate == CONNECTED_TN3270E || h->cstate == CONNECTED_SSCP); | |
| 74 | +} | |
| 75 | + | |
| 76 | +LIB3270_EXPORT int lib3270_in_sscp(H3270 *h) | |
| 77 | +{ | |
| 78 | + CHECK_SESSION_HANDLE(h); | |
| 79 | + return (h->cstate == CONNECTED_SSCP); | |
| 80 | +} | |
| 81 | + | |
| 82 | +LIB3270_EXPORT int lib3270_in_tn3270e(H3270 *h) | |
| 83 | +{ | |
| 84 | + CHECK_SESSION_HANDLE(h); | |
| 85 | + return (h->cstate == CONNECTED_TN3270E); | |
| 86 | +} | |
| 87 | + | |
| 88 | +LIB3270_EXPORT int lib3270_in_e(H3270 *h) | |
| 89 | +{ | |
| 90 | + CHECK_SESSION_HANDLE(h); | |
| 91 | + return (h->cstate >= CONNECTED_INITIAL_E); | |
| 92 | +} | |
| 93 | + | |
| 94 | + | ... | ... |
telnet.c
| ... | ... | @@ -952,17 +952,6 @@ void net_disconnect(H3270 *session) |
| 952 | 952 | session->connected_lu = CN; |
| 953 | 953 | status_lu(&h3270,CN); |
| 954 | 954 | |
| 955 | -/* | |
| 956 | -#if !defined(_WIN32) | |
| 957 | - // We have no more interest in output buffer space. | |
| 958 | - if(session->output_id != NULL) | |
| 959 | - { | |
| 960 | - RemoveInput(session->output_id); | |
| 961 | - session->output_id = NULL; | |
| 962 | - } | |
| 963 | -#endif | |
| 964 | -*/ | |
| 965 | - | |
| 966 | 955 | } |
| 967 | 956 | |
| 968 | 957 | |
| ... | ... | @@ -1978,9 +1967,9 @@ void net_exception(H3270 *session) |
| 1978 | 1967 | if(session->excepting) |
| 1979 | 1968 | { |
| 1980 | 1969 | RemoveInput(session->ns_exception_id); |
| 1970 | + session->ns_exception_id = NULL; | |
| 1981 | 1971 | session->excepting = 0; |
| 1982 | 1972 | } |
| 1983 | -// x_except_off(session); | |
| 1984 | 1973 | } |
| 1985 | 1974 | } |
| 1986 | 1975 | ... | ... |
toggles.c
| ... | ... | @@ -93,7 +93,7 @@ LIB3270_EXPORT unsigned char lib3270_get_toggle(H3270 *session, LIB3270_TOGGLE i |
| 93 | 93 | */ |
| 94 | 94 | static void toggle_notify(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE ix) |
| 95 | 95 | { |
| 96 | - Trace("%s: ix=%d upcall=%p",__FUNCTION__,ix,t->upcall); | |
| 96 | + trace("%s: ix=%d upcall=%p",__FUNCTION__,ix,t->upcall); | |
| 97 | 97 | t->upcall(session, t, TT_INTERACTIVE); |
| 98 | 98 | |
| 99 | 99 | if(session->update_toggle) | ... | ... |
util.c
| ... | ... | @@ -881,217 +881,6 @@ rpf_free(rpf_t *r) |
| 881 | 881 | r->cur_len = 0; |
| 882 | 882 | } |
| 883 | 883 | |
| 884 | -/* | |
| 885 | -#if defined(X3270_DISPLAY) | |
| 886 | - | |
| 887 | -// Glue between x3270 and the X libraries. | |
| 888 | - | |
| 889 | -// | |
| 890 | -// A way to work around problems with Xt resources. It seems to be impossible | |
| 891 | -// to get arbitrarily named resources. Someday this should be hacked to | |
| 892 | -// add classes too. | |
| 893 | -// | |
| 894 | -char * get_resource(const char *name) | |
| 895 | -{ | |
| 896 | - XrmValue value; | |
| 897 | - char *type; | |
| 898 | - char *str; | |
| 899 | - char *r = CN; | |
| 900 | - | |
| 901 | - str = xs_buffer("%s.%s", XtName(toplevel), name); | |
| 902 | - if ((XrmGetResource(rdb, str, 0, &type, &value) == True) && *value.addr) | |
| 903 | - r = value.addr; | |
| 904 | - XtFree(str); | |
| 905 | - | |
| 906 | - lib3270_write_log(&h3270,"resource","%s=\"%s\"",name,r); | |
| 907 | - | |
| 908 | - return r; | |
| 909 | -} | |
| 910 | - | |
| 911 | -// | |
| 912 | -// Input callbacks. | |
| 913 | -// | |
| 914 | -typedef void voidfn(void); | |
| 915 | - | |
| 916 | -typedef struct iorec { | |
| 917 | - voidfn *fn; | |
| 918 | - XtInputId id; | |
| 919 | - struct iorec *next; | |
| 920 | -} iorec_t; | |
| 921 | - | |
| 922 | -static iorec_t *iorecs = NULL; | |
| 923 | - | |
| 924 | -static void | |
| 925 | -io_fn(XtPointer closure, int *source unused, XtInputId *id) | |
| 926 | -{ | |
| 927 | - iorec_t *iorec; | |
| 928 | - | |
| 929 | - for (iorec = iorecs; iorec != NULL; iorec = iorec->next) { | |
| 930 | - if (iorec->id == *id) { | |
| 931 | - (*iorec->fn)(); | |
| 932 | - break; | |
| 933 | - } | |
| 934 | - } | |
| 935 | -} | |
| 936 | - | |
| 937 | -unsigned long | |
| 938 | -AddInput(int sock, voidfn *fn) | |
| 939 | -{ | |
| 940 | - iorec_t *iorec; | |
| 941 | - | |
| 942 | - iorec = (iorec_t *)XtMalloc(sizeof(iorec_t)); | |
| 943 | - iorec->fn = fn; | |
| 944 | - iorec->id = XtAppAddInput(appcontext, sock, | |
| 945 | - (XtPointer) XtInputReadMask, io_fn, NULL); | |
| 946 | - | |
| 947 | - iorec->next = iorecs; | |
| 948 | - iorecs = iorec; | |
| 949 | - | |
| 950 | - return iorec->id; | |
| 951 | -} | |
| 952 | - | |
| 953 | -unsigned long | |
| 954 | -AddExcept(int sock, voidfn *fn) | |
| 955 | -{ | |
| 956 | - iorec_t *iorec; | |
| 957 | - | |
| 958 | - iorec = (iorec_t *)XtMalloc(sizeof(iorec_t)); | |
| 959 | - iorec->fn = fn; | |
| 960 | - iorec->id = XtAppAddInput(appcontext, sock, | |
| 961 | - (XtPointer) XtInputExceptMask, io_fn, NULL); | |
| 962 | - iorec->next = iorecs; | |
| 963 | - iorecs = iorec; | |
| 964 | - | |
| 965 | - return iorec->id; | |
| 966 | -} | |
| 967 | - | |
| 968 | -unsigned long | |
| 969 | -AddOutput(int sock, voidfn *fn) | |
| 970 | -{ | |
| 971 | - iorec_t *iorec; | |
| 972 | - | |
| 973 | - iorec = (iorec_t *)XtMalloc(sizeof(iorec_t)); | |
| 974 | - iorec->fn = fn; | |
| 975 | - iorec->id = XtAppAddInput(appcontext, sock, | |
| 976 | - (XtPointer) XtInputWriteMask, io_fn, NULL); | |
| 977 | - iorec->next = iorecs; | |
| 978 | - iorecs = iorec; | |
| 979 | - | |
| 980 | - return iorec->id; | |
| 981 | -} | |
| 982 | - | |
| 983 | -void | |
| 984 | -RemoveInput(unsigned long cookie) | |
| 985 | -{ | |
| 986 | - iorec_t *iorec; | |
| 987 | - iorec_t *prev = NULL; | |
| 988 | - | |
| 989 | - for (iorec = iorecs; iorec != NULL; iorec = iorec->next) { | |
| 990 | - if (iorec->id == (XtInputId)cookie) { | |
| 991 | - break; | |
| 992 | - } | |
| 993 | - prev = iorec; | |
| 994 | - } | |
| 995 | - | |
| 996 | - if (iorec != NULL) { | |
| 997 | - XtRemoveInput((XtInputId)cookie); | |
| 998 | - if (prev != NULL) | |
| 999 | - prev->next = iorec->next; | |
| 1000 | - else | |
| 1001 | - iorecs = iorec->next; | |
| 1002 | - XtFree((XtPointer)iorec); | |
| 1003 | - } | |
| 1004 | -} | |
| 1005 | - | |
| 1006 | -// | |
| 1007 | -/ Timer callbacks. | |
| 1008 | -// | |
| 1009 | - | |
| 1010 | -typedef struct torec { | |
| 1011 | - voidfn *fn; | |
| 1012 | - XtIntervalId id; | |
| 1013 | - struct torec *next; | |
| 1014 | -} torec_t; | |
| 1015 | - | |
| 1016 | -static torec_t *torecs = NULL; | |
| 1017 | - | |
| 1018 | -static void | |
| 1019 | -to_fn(XtPointer closure, XtIntervalId *id) | |
| 1020 | -{ | |
| 1021 | - torec_t *torec; | |
| 1022 | - torec_t *prev = NULL; | |
| 1023 | - voidfn *fn = NULL; | |
| 1024 | - | |
| 1025 | - for (torec = torecs; torec != NULL; torec = torec->next) { | |
| 1026 | - if (torec->id == *id) { | |
| 1027 | - break; | |
| 1028 | - } | |
| 1029 | - prev = torec; | |
| 1030 | - } | |
| 1031 | - | |
| 1032 | - if (torec != NULL) { | |
| 1033 | - | |
| 1034 | - // Remember the record. | |
| 1035 | - fn = torec->fn; | |
| 1036 | - | |
| 1037 | - // Free the record. | |
| 1038 | - if (prev != NULL) | |
| 1039 | - prev->next = torec->next; | |
| 1040 | - else | |
| 1041 | - torecs = torec->next; | |
| 1042 | - XtFree((XtPointer)torec); | |
| 1043 | - | |
| 1044 | - // Call the function. | |
| 1045 | - (*fn)(); | |
| 1046 | - } | |
| 1047 | -} | |
| 1048 | - | |
| 1049 | -unsigned long | |
| 1050 | -AddTimeOut(unsigned long msec, voidfn *fn) | |
| 1051 | -{ | |
| 1052 | - torec_t *torec; | |
| 1053 | - | |
| 1054 | - torec = (torec_t *)XtMalloc(sizeof(torec_t)); | |
| 1055 | - torec->fn = fn; | |
| 1056 | - torec->id = XtAppAddTimeOut(appcontext, msec, to_fn, NULL); | |
| 1057 | - torec->next = torecs; | |
| 1058 | - torecs = torec; | |
| 1059 | - return (unsigned long)torec->id; | |
| 1060 | -} | |
| 1061 | - | |
| 1062 | -void | |
| 1063 | -RemoveTimeOut(unsigned long cookie) | |
| 1064 | -{ | |
| 1065 | - torec_t *torec; | |
| 1066 | - torec_t *prev = NULL; | |
| 1067 | - | |
| 1068 | - for (torec = torecs; torec != NULL; torec = torec->next) { | |
| 1069 | - if (torec->id == (XtIntervalId)cookie) { | |
| 1070 | - break; | |
| 1071 | - } | |
| 1072 | - prev = torec; | |
| 1073 | - } | |
| 1074 | - | |
| 1075 | - if (torec != NULL) { | |
| 1076 | - XtRemoveTimeOut((XtIntervalId)cookie); | |
| 1077 | - if (prev != NULL) | |
| 1078 | - prev->next = torec->next; | |
| 1079 | - else | |
| 1080 | - torecs = torec->next; | |
| 1081 | - XtFree((XtPointer)torec); | |
| 1082 | - } else { | |
| 1083 | - Error("RemoveTimeOut: Can't find"); | |
| 1084 | - } | |
| 1085 | -} | |
| 1086 | - | |
| 1087 | -KeySym | |
| 1088 | -StringToKeysym(char *s) | |
| 1089 | -{ | |
| 1090 | - return XStringToKeysym(s); | |
| 1091 | -} | |
| 1092 | -#endif | |
| 1093 | -*/ | |
| 1094 | - | |
| 1095 | 884 | LIB3270_EXPORT void lib3270_free(void *p) |
| 1096 | 885 | { |
| 1097 | 886 | if(p) | ... | ... |
utilc.h
| ... | ... | @@ -38,7 +38,7 @@ LIB3270_INTERNAL void xs_warning(const char *fmt, ...) printflike(1, 2); |
| 38 | 38 | |
| 39 | 39 | LIB3270_INTERNAL void * AddInput(int, H3270 *session, void (*fn)(H3270 *session)); |
| 40 | 40 | LIB3270_INTERNAL void * AddExcept(int, H3270 *session, void (*fn)(H3270 *session)); |
| 41 | -LIB3270_INTERNAL void * AddOutput(int, H3270 *session, void (*fn)(H3270 *session)); | |
| 41 | +// LIB3270_INTERNAL void * AddOutput(int, H3270 *session, void (*fn)(H3270 *session)); | |
| 42 | 42 | LIB3270_INTERNAL void RemoveInput(void *); |
| 43 | 43 | LIB3270_INTERNAL void * AddTimeOut(unsigned long msec, H3270 *session, void (*fn)(H3270 *session)); |
| 44 | 44 | LIB3270_INTERNAL void RemoveTimeOut(void *cookie); | ... | ... |
| ... | ... | @@ -44,51 +44,8 @@ |
| 44 | 44 | #include "utilc.h" |
| 45 | 45 | #include "xioc.h" |
| 46 | 46 | |
| 47 | -/* Statics. */ | |
| 48 | -// static unsigned long ns_read_id; | |
| 49 | -// static unsigned long ns_exception_id; | |
| 50 | -// static Boolean reading = False; | |
| 51 | -// static Boolean excepting = False; | |
| 47 | +#error xio.c is deprecated, use iocalls.c | |
| 52 | 48 | |
| 53 | -/* | |
| 54 | - * Called to set up input on a new network connection. | |
| 55 | - */ | |
| 56 | -/* | |
| 57 | -void x_add_input(H3270 *h) | |
| 58 | -{ | |
| 59 | -#ifdef _WIN32 | |
| 60 | - h->ns_exception_id = AddExcept(h->sockEvent, h, net_exception); | |
| 61 | - h->excepting = True; | |
| 62 | - h->ns_read_id = AddInput(h->sockEvent, h, net_input); | |
| 63 | - h->reading = True; | |
| 64 | -#else | |
| 65 | - h->ns_exception_id = AddExcept(h->sock, h, net_exception); | |
| 66 | - h->excepting = True; | |
| 67 | - h->ns_read_id = AddInput(h->sock, h, net_input); | |
| 68 | - h->reading = True; | |
| 69 | -#endif // WIN32 | |
| 70 | -} | |
| 71 | -*/ | |
| 72 | -/* | |
| 73 | - * Called when an exception is received to disable further exceptions. | |
| 74 | - */ /* | |
| 75 | -void x_except_off(H3270 *h) | |
| 76 | -{ | |
| 77 | - CHECK_SESSION_HANDLE(h); | |
| 78 | - | |
| 79 | - if(h->excepting) | |
| 80 | - { | |
| 81 | - RemoveInput(h->ns_exception_id); | |
| 82 | - h->excepting = False; | |
| 83 | - } | |
| 84 | -} | |
| 85 | -*/ | |
| 86 | - | |
| 87 | -/* | |
| 88 | - * Called when exception processing is complete to re-enable exceptions. | |
| 89 | - * This includes removing and restoring reading, so the exceptions are always | |
| 90 | - * processed first. | |
| 91 | - */ | |
| 92 | 49 | void x_except_on(H3270 *h) |
| 93 | 50 | { |
| 94 | 51 | if(h->excepting) |
| ... | ... | @@ -99,33 +56,15 @@ void x_except_on(H3270 *h) |
| 99 | 56 | |
| 100 | 57 | #ifdef WIN32 |
| 101 | 58 | h->ns_exception_id = AddExcept((int) h->sockEvent, h, net_exception); |
| 102 | - h->excepting = True; | |
| 59 | + h->excepting = 1; | |
| 103 | 60 | |
| 104 | 61 | if(h->reading) |
| 105 | 62 | h->ns_read_id = AddInput( (int) h->sockEvent, h, net_input); |
| 106 | 63 | #else |
| 107 | 64 | h->ns_exception_id = AddExcept(h->sock, h, net_exception); |
| 108 | - h->excepting = True; | |
| 65 | + h->excepting = 1; | |
| 109 | 66 | |
| 110 | 67 | if(h->reading) |
| 111 | 68 | h->ns_read_id = AddInput(h->sock, h, net_input); |
| 112 | 69 | #endif // WIN32 |
| 113 | 70 | } |
| 114 | - | |
| 115 | -/* | |
| 116 | - * Called to disable input on a closing network connection. | |
| 117 | - */ /* | |
| 118 | -void x_remove_input(H3270 *h) | |
| 119 | -{ | |
| 120 | - if(h->reading) | |
| 121 | - { | |
| 122 | - RemoveInput(h->ns_read_id); | |
| 123 | - h->reading = False; | |
| 124 | - } | |
| 125 | - if(h->excepting) | |
| 126 | - { | |
| 127 | - RemoveInput(h->ns_exception_id); | |
| 128 | - h->excepting = False; | |
| 129 | - } | |
| 130 | -} | |
| 131 | -*/ | ... | ... |