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 | -*/ | ... | ... |