Commit b88b5d23a6c7acd755a0901adbabb82645b0e1be

Authored by Perry Werneck
1 parent d2eea719

Adjustments on session structure.

src/include/lib3270.h
@@ -454,13 +454,26 @@ @@ -454,13 +454,26 @@
454 /** 454 /**
455 * @brief Register a function interested in a state change. 455 * @brief Register a function interested in a state change.
456 * 456 *
457 - * @param h Session handle.  
458 - * @param tx State ID  
459 - * @param func Callback  
460 - * @param data Data 457 + * @param hSession Session handle.
  458 + * @param tx State ID
  459 + * @param func Callback
  460 + * @param data Data
  461 + *
  462 + * @return State change identifier.
  463 + *
  464 + */
  465 + LIB3270_EXPORT const void * lib3270_register_schange(H3270 *hSession, LIB3270_STATE tx, void (*func)(H3270 *, int, void *),void *data);
  466 +
  467 + /**
  468 + * @brief Unregister a function interested in a state change.
  469 + *
  470 + * @param hSession Session handle.
  471 + * @param id State change identifier.
  472 + *
  473 + * @return 0 if suceeds, non zero if fails (sets errno).
461 * 474 *
462 */ 475 */
463 - LIB3270_EXPORT void lib3270_register_schange(H3270 *h,LIB3270_STATE tx, void (*func)(H3270 *, int, void *),void *data); 476 + LIB3270_EXPORT int lib3270_unregister_schange(H3270 *hSession, LIB3270_STATE tx, void * id);
464 477
465 LIB3270_EXPORT void lib3270_reset_callbacks(H3270 *hSession); 478 LIB3270_EXPORT void lib3270_reset_callbacks(H3270 *hSession);
466 479
src/lib3270/host.c
@@ -167,26 +167,66 @@ void lib3270_set_disconnected(H3270 *hSession) @@ -167,26 +167,66 @@ void lib3270_set_disconnected(H3270 *hSession)
167 167
168 /** 168 /**
169 * @brief Register a function interested in a state change. 169 * @brief Register a function interested in a state change.
  170 + *
  171 + * @param hSession Session handle.
  172 + * @param tx State ID
  173 + * @param func Callback
  174 + * @param data Data
  175 + *
  176 + * @return State change identifier.
  177 + *
170 */ 178 */
171 -LIB3270_EXPORT void lib3270_register_schange(H3270 *h, LIB3270_STATE tx, void (*func)(H3270 *, int, void *),void *data) 179 +LIB3270_EXPORT const void * lib3270_register_schange(H3270 *hSession, LIB3270_STATE tx, void (*func)(H3270 *, int, void *),void *data)
172 { 180 {
173 struct lib3270_state_callback *st; 181 struct lib3270_state_callback *st;
174 182
175 - CHECK_SESSION_HANDLE(h); 183 + CHECK_SESSION_HANDLE(hSession);
176 184
177 st = (struct lib3270_state_callback *) lib3270_malloc(sizeof(struct lib3270_state_callback)); 185 st = (struct lib3270_state_callback *) lib3270_malloc(sizeof(struct lib3270_state_callback));
178 st->func = func; 186 st->func = func;
179 st->data = data; 187 st->data = data;
180 188
181 - if (h->st_last[tx])  
182 - h->st_last[tx]->next = st; 189 + if (hSession->st.last[tx])
  190 + hSession->st.last[tx]->next = st;
183 else 191 else
184 - h->st_callbacks[tx] = st; 192 + hSession->st.callbacks[tx] = st;
  193 +
  194 + hSession->st.last[tx] = st;
185 195
186 - h->st_last[tx] = st; 196 + return (void *) st;
187 197
188 } 198 }
189 199
  200 +LIB3270_EXPORT int lib3270_unregister_schange(H3270 *hSession, LIB3270_STATE tx, void * id)
  201 +{
  202 + struct lib3270_state_callback *st;
  203 + struct lib3270_state_callback *prev = (struct lib3270_state_callback *) NULL;
  204 +
  205 + for (st = hSession->st.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next)
  206 + {
  207 + if (st == (struct lib3270_state_callback *)id)
  208 + break;
  209 +
  210 + prev = st;
  211 + }
  212 +
  213 + if (st == (struct lib3270_state_callback *)NULL)
  214 + {
  215 + lib3270_write_log(hSession,"lib3270","Invalid call to (%s): %p wasnt found in the list",__FUNCTION__,id);
  216 + return errno = ENOENT;
  217 + }
  218 +
  219 + if (prev != (struct lib3270_state_callback *) NULL)
  220 + prev->next = st->next;
  221 + else
  222 + hSession->st.callbacks[tx] = (struct lib3270_state_callback *) st->next;
  223 +
  224 + lib3270_free(id);
  225 +
  226 + return 0;
  227 +}
  228 +
  229 +
190 /** 230 /**
191 * @brief Signal a state change. 231 * @brief Signal a state change.
192 */ 232 */
@@ -214,7 +254,7 @@ void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode) @@ -214,7 +254,7 @@ void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode)
214 254
215 trace("%s is %d on session %p",state_name[tx],mode,h); 255 trace("%s is %d on session %p",state_name[tx],mode,h);
216 256
217 - for (st = h->st_callbacks[tx];st;st = st->next) 257 + for(st = h->st.callbacks[tx];st;st = st->next)
218 { 258 {
219 st->func(h,mode,st->data); 259 st->func(h,mode,st->data);
220 } 260 }
@@ -449,23 +489,23 @@ LIB3270_EXPORT const char * lib3270_get_luname(H3270 *h) @@ -449,23 +489,23 @@ LIB3270_EXPORT const char * lib3270_get_luname(H3270 *h)
449 LIB3270_EXPORT int lib3270_has_active_script(H3270 *h) 489 LIB3270_EXPORT int lib3270_has_active_script(H3270 *h)
450 { 490 {
451 CHECK_SESSION_HANDLE(h); 491 CHECK_SESSION_HANDLE(h);
452 - return (h->oia_flag[LIB3270_FLAG_SCRIPT] != 0); 492 + return (h->oia.flag[LIB3270_FLAG_SCRIPT] != 0);
453 } 493 }
454 494
455 LIB3270_EXPORT int lib3270_get_typeahead(H3270 *h) 495 LIB3270_EXPORT int lib3270_get_typeahead(H3270 *h)
456 { 496 {
457 CHECK_SESSION_HANDLE(h); 497 CHECK_SESSION_HANDLE(h);
458 - return (h->oia_flag[LIB3270_FLAG_TYPEAHEAD] != 0); 498 + return (h->oia.flag[LIB3270_FLAG_TYPEAHEAD] != 0);
459 } 499 }
460 500
461 LIB3270_EXPORT int lib3270_get_undera(H3270 *h) 501 LIB3270_EXPORT int lib3270_get_undera(H3270 *h)
462 { 502 {
463 CHECK_SESSION_HANDLE(h); 503 CHECK_SESSION_HANDLE(h);
464 - return (h->oia_flag[LIB3270_FLAG_UNDERA] != 0); 504 + return (h->oia.flag[LIB3270_FLAG_UNDERA] != 0);
465 } 505 }
466 506
467 LIB3270_EXPORT int lib3270_get_oia_box_solid(H3270 *h) 507 LIB3270_EXPORT int lib3270_get_oia_box_solid(H3270 *h)
468 { 508 {
469 CHECK_SESSION_HANDLE(h); 509 CHECK_SESSION_HANDLE(h);
470 - return (h->oia_flag[LIB3270_FLAG_BOXSOLID] != 0); 510 + return (h->oia.flag[LIB3270_FLAG_BOXSOLID] != 0);
471 } 511 }
src/lib3270/private.h
@@ -366,14 +366,16 @@ struct _h3270 @@ -366,14 +366,16 @@ struct _h3270
366 char * qualified; 366 char * qualified;
367 } host; 367 } host;
368 368
369 - char * proxy; /**< Proxy server (type:host[:port]) */ 369 + // char * proxy; /**< Proxy server (type:host[:port]) */
370 char * termname; 370 char * termname;
371 371
372 struct lib3270_charset charset; 372 struct lib3270_charset charset;
373 373
374 - LIB3270_MESSAGE oia_status;  
375 -  
376 - unsigned char oia_flag[LIB3270_FLAG_COUNT]; 374 + struct
  375 + {
  376 + LIB3270_MESSAGE status;
  377 + unsigned char flag[LIB3270_FLAG_COUNT];
  378 + } oia;
377 379
378 unsigned short current_port; 380 unsigned short current_port;
379 381
@@ -630,9 +632,11 @@ struct _h3270 @@ -630,9 +632,11 @@ struct _h3270
630 void *userdata; 632 void *userdata;
631 } trace; 633 } trace;
632 634
633 - // Callbacks.  
634 - struct lib3270_state_callback * st_callbacks[LIB3270_STATE_USER];  
635 - struct lib3270_state_callback * st_last[LIB3270_STATE_USER]; 635 + // State change listeners.
  636 + struct {
  637 + struct lib3270_state_callback * callbacks[LIB3270_STATE_USER];
  638 + struct lib3270_state_callback * last[LIB3270_STATE_USER];
  639 + } st;
636 640
637 }; 641 };
638 642
src/lib3270/properties.c
@@ -641,9 +641,9 @@ LIB3270_EXPORT int lib3270_get_secure_host(H3270 *hSession) @@ -641,9 +641,9 @@ LIB3270_EXPORT int lib3270_get_secure_host(H3270 *hSession)
641 641
642 } 642 }
643 643
  644 +#ifdef SSL_ENABLE_CRL_CHECK
644 LIB3270_EXPORT char * lib3270_get_ssl_crl_text(H3270 *hSession) 645 LIB3270_EXPORT char * lib3270_get_ssl_crl_text(H3270 *hSession)
645 { 646 {
646 -#ifdef SSL_ENABLE_CRL_CHECK  
647 647
648 if(hSession->ssl.crl.cert) 648 if(hSession->ssl.crl.cert)
649 { 649 {
@@ -666,11 +666,16 @@ LIB3270_EXPORT char * lib3270_get_ssl_crl_text(H3270 *hSession) @@ -666,11 +666,16 @@ LIB3270_EXPORT char * lib3270_get_ssl_crl_text(H3270 *hSession)
666 666
667 } 667 }
668 668
  669 + return NULL;
669 670
670 -#endif // SSL_ENABLE_CRL_CHECK  
671 - 671 +}
  672 +#else
  673 +LIB3270_EXPORT char * lib3270_get_ssl_crl_text(H3270 *hSession unused)
  674 +{
672 return NULL; 675 return NULL;
673 } 676 }
  677 +#endif // SSL_ENABLE_CRL_CHECK
  678 +
674 679
675 LIB3270_EXPORT char * lib3270_get_ssl_peer_certificate_text(H3270 *hSession) 680 LIB3270_EXPORT char * lib3270_get_ssl_peer_certificate_text(H3270 *hSession)
676 { 681 {
src/lib3270/screen.c
@@ -545,8 +545,8 @@ void set_status(H3270 *session, LIB3270_FLAG id, Boolean on) @@ -545,8 +545,8 @@ void set_status(H3270 *session, LIB3270_FLAG id, Boolean on)
545 { 545 {
546 CHECK_SESSION_HANDLE(session); 546 CHECK_SESSION_HANDLE(session);
547 547
548 - session->oia_flag[id] = (on != 0);  
549 - session->cbk.update_oia(session,id,session->oia_flag[id]); 548 + session->oia.flag[id] = (on != 0);
  549 + session->cbk.update_oia(session,id,session->oia.flag[id]);
550 550
551 } 551 }
552 552
@@ -640,7 +640,7 @@ void status_reset(H3270 *session) @@ -640,7 +640,7 @@ void status_reset(H3270 *session)
640 LIB3270_EXPORT LIB3270_MESSAGE lib3270_get_program_message(H3270 *session) 640 LIB3270_EXPORT LIB3270_MESSAGE lib3270_get_program_message(H3270 *session)
641 { 641 {
642 CHECK_SESSION_HANDLE(session); 642 CHECK_SESSION_HANDLE(session);
643 - return session->oia_status; 643 + return session->oia.status;
644 } 644 }
645 645
646 /** 646 /**
@@ -655,8 +655,8 @@ LIB3270_EXPORT LIB3270_MESSAGE lib3270_lock_status(H3270 *hSession) @@ -655,8 +655,8 @@ LIB3270_EXPORT LIB3270_MESSAGE lib3270_lock_status(H3270 *hSession)
655 { 655 {
656 CHECK_SESSION_HANDLE(hSession); 656 CHECK_SESSION_HANDLE(hSession);
657 657
658 - if(hSession->oia_status)  
659 - return hSession->oia_status; 658 + if(hSession->oia.status)
  659 + return hSession->oia.status;
660 660
661 if(hSession->kybdlock) 661 if(hSession->kybdlock)
662 return LIB3270_MESSAGE_KYBDLOCK; 662 return LIB3270_MESSAGE_KYBDLOCK;
@@ -683,10 +683,10 @@ void status_changed(H3270 *session, LIB3270_MESSAGE id) @@ -683,10 +683,10 @@ void status_changed(H3270 *session, LIB3270_MESSAGE id)
683 { 683 {
684 CHECK_SESSION_HANDLE(session); 684 CHECK_SESSION_HANDLE(session);
685 685
686 - if(id == session->oia_status || id < 0) 686 + if(id == session->oia.status || id < 0)
687 return; 687 return;
688 688
689 - session->oia_status = id; 689 + session->oia.status = id;
690 690
691 session->cbk.update_status(session,id); 691 session->cbk.update_status(session,id);
692 } 692 }
src/lib3270/session.c
@@ -91,11 +91,11 @@ void lib3270_session_free(H3270 *h) @@ -91,11 +91,11 @@ void lib3270_session_free(H3270 *h)
91 // Release state change callbacks 91 // Release state change callbacks
92 for(f=0;f<LIB3270_STATE_USER;f++) 92 for(f=0;f<LIB3270_STATE_USER;f++)
93 { 93 {
94 - while(h->st_callbacks[f]) 94 + while(h->st.callbacks[f])
95 { 95 {
96 - struct lib3270_state_callback *next = h->st_callbacks[f]->next;  
97 - lib3270_free(h->st_callbacks[f]);  
98 - h->st_callbacks[f] = next; 96 + struct lib3270_state_callback *next = h->st.callbacks[f]->next;
  97 + lib3270_free(h->st.callbacks[f]);
  98 + h->st.callbacks[f] = next;
99 } 99 }
100 } 100 }
101 101
@@ -321,7 +321,7 @@ static void lib3270_session_init(H3270 *hSession, const char *model, const char @@ -321,7 +321,7 @@ static void lib3270_session_init(H3270 *hSession, const char *model, const char
321 hSession->sock = -1; 321 hSession->sock = -1;
322 hSession->model_num = -1; 322 hSession->model_num = -1;
323 hSession->cstate = LIB3270_NOT_CONNECTED; 323 hSession->cstate = LIB3270_NOT_CONNECTED;
324 - hSession->oia_status = -1; 324 + hSession->oia.status = -1;
325 hSession->kybdlock = KL_NOT_CONNECTED; 325 hSession->kybdlock = KL_NOT_CONNECTED;
326 hSession->aid = AID_NO; 326 hSession->aid = AID_NO;
327 hSession->reply_mode = SF_SRM_FIELD; 327 hSession->reply_mode = SF_SRM_FIELD;