diff --git a/src/include/lib3270.h b/src/include/lib3270.h index c8184f9..0f245b0 100644 --- a/src/include/lib3270.h +++ b/src/include/lib3270.h @@ -454,13 +454,26 @@ /** * @brief Register a function interested in a state change. * - * @param h Session handle. - * @param tx State ID - * @param func Callback - * @param data Data + * @param hSession Session handle. + * @param tx State ID + * @param func Callback + * @param data Data + * + * @return State change identifier. + * + */ + LIB3270_EXPORT const void * lib3270_register_schange(H3270 *hSession, LIB3270_STATE tx, void (*func)(H3270 *, int, void *),void *data); + + /** + * @brief Unregister a function interested in a state change. + * + * @param hSession Session handle. + * @param id State change identifier. + * + * @return 0 if suceeds, non zero if fails (sets errno). * */ - LIB3270_EXPORT void lib3270_register_schange(H3270 *h,LIB3270_STATE tx, void (*func)(H3270 *, int, void *),void *data); + LIB3270_EXPORT int lib3270_unregister_schange(H3270 *hSession, LIB3270_STATE tx, void * id); LIB3270_EXPORT void lib3270_reset_callbacks(H3270 *hSession); diff --git a/src/lib3270/host.c b/src/lib3270/host.c index 53d5f5b..c834051 100644 --- a/src/lib3270/host.c +++ b/src/lib3270/host.c @@ -167,26 +167,66 @@ void lib3270_set_disconnected(H3270 *hSession) /** * @brief Register a function interested in a state change. + * + * @param hSession Session handle. + * @param tx State ID + * @param func Callback + * @param data Data + * + * @return State change identifier. + * */ -LIB3270_EXPORT void lib3270_register_schange(H3270 *h, LIB3270_STATE tx, void (*func)(H3270 *, int, void *),void *data) +LIB3270_EXPORT const void * lib3270_register_schange(H3270 *hSession, LIB3270_STATE tx, void (*func)(H3270 *, int, void *),void *data) { struct lib3270_state_callback *st; - CHECK_SESSION_HANDLE(h); + CHECK_SESSION_HANDLE(hSession); st = (struct lib3270_state_callback *) lib3270_malloc(sizeof(struct lib3270_state_callback)); st->func = func; st->data = data; - if (h->st_last[tx]) - h->st_last[tx]->next = st; + if (hSession->st.last[tx]) + hSession->st.last[tx]->next = st; else - h->st_callbacks[tx] = st; + hSession->st.callbacks[tx] = st; + + hSession->st.last[tx] = st; - h->st_last[tx] = st; + return (void *) st; } +LIB3270_EXPORT int lib3270_unregister_schange(H3270 *hSession, LIB3270_STATE tx, void * id) +{ + struct lib3270_state_callback *st; + struct lib3270_state_callback *prev = (struct lib3270_state_callback *) NULL; + + for (st = hSession->st.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next) + { + if (st == (struct lib3270_state_callback *)id) + break; + + prev = st; + } + + if (st == (struct lib3270_state_callback *)NULL) + { + lib3270_write_log(hSession,"lib3270","Invalid call to (%s): %p wasnt found in the list",__FUNCTION__,id); + return errno = ENOENT; + } + + if (prev != (struct lib3270_state_callback *) NULL) + prev->next = st->next; + else + hSession->st.callbacks[tx] = (struct lib3270_state_callback *) st->next; + + lib3270_free(id); + + return 0; +} + + /** * @brief Signal a state change. */ @@ -214,7 +254,7 @@ void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode) trace("%s is %d on session %p",state_name[tx],mode,h); - for (st = h->st_callbacks[tx];st;st = st->next) + for(st = h->st.callbacks[tx];st;st = st->next) { st->func(h,mode,st->data); } @@ -449,23 +489,23 @@ LIB3270_EXPORT const char * lib3270_get_luname(H3270 *h) LIB3270_EXPORT int lib3270_has_active_script(H3270 *h) { CHECK_SESSION_HANDLE(h); - return (h->oia_flag[LIB3270_FLAG_SCRIPT] != 0); + return (h->oia.flag[LIB3270_FLAG_SCRIPT] != 0); } LIB3270_EXPORT int lib3270_get_typeahead(H3270 *h) { CHECK_SESSION_HANDLE(h); - return (h->oia_flag[LIB3270_FLAG_TYPEAHEAD] != 0); + return (h->oia.flag[LIB3270_FLAG_TYPEAHEAD] != 0); } LIB3270_EXPORT int lib3270_get_undera(H3270 *h) { CHECK_SESSION_HANDLE(h); - return (h->oia_flag[LIB3270_FLAG_UNDERA] != 0); + return (h->oia.flag[LIB3270_FLAG_UNDERA] != 0); } LIB3270_EXPORT int lib3270_get_oia_box_solid(H3270 *h) { CHECK_SESSION_HANDLE(h); - return (h->oia_flag[LIB3270_FLAG_BOXSOLID] != 0); + return (h->oia.flag[LIB3270_FLAG_BOXSOLID] != 0); } diff --git a/src/lib3270/private.h b/src/lib3270/private.h index 72ecca3..25267e2 100644 --- a/src/lib3270/private.h +++ b/src/lib3270/private.h @@ -366,14 +366,16 @@ struct _h3270 char * qualified; } host; - char * proxy; /**< Proxy server (type:host[:port]) */ + // char * proxy; /**< Proxy server (type:host[:port]) */ char * termname; struct lib3270_charset charset; - LIB3270_MESSAGE oia_status; - - unsigned char oia_flag[LIB3270_FLAG_COUNT]; + struct + { + LIB3270_MESSAGE status; + unsigned char flag[LIB3270_FLAG_COUNT]; + } oia; unsigned short current_port; @@ -630,9 +632,11 @@ struct _h3270 void *userdata; } trace; - // Callbacks. - struct lib3270_state_callback * st_callbacks[LIB3270_STATE_USER]; - struct lib3270_state_callback * st_last[LIB3270_STATE_USER]; + // State change listeners. + struct { + struct lib3270_state_callback * callbacks[LIB3270_STATE_USER]; + struct lib3270_state_callback * last[LIB3270_STATE_USER]; + } st; }; diff --git a/src/lib3270/properties.c b/src/lib3270/properties.c index d51b06a..24c45e9 100644 --- a/src/lib3270/properties.c +++ b/src/lib3270/properties.c @@ -641,9 +641,9 @@ LIB3270_EXPORT int lib3270_get_secure_host(H3270 *hSession) } +#ifdef SSL_ENABLE_CRL_CHECK LIB3270_EXPORT char * lib3270_get_ssl_crl_text(H3270 *hSession) { -#ifdef SSL_ENABLE_CRL_CHECK if(hSession->ssl.crl.cert) { @@ -666,11 +666,16 @@ LIB3270_EXPORT char * lib3270_get_ssl_crl_text(H3270 *hSession) } + return NULL; -#endif // SSL_ENABLE_CRL_CHECK - +} +#else +LIB3270_EXPORT char * lib3270_get_ssl_crl_text(H3270 *hSession unused) +{ return NULL; } +#endif // SSL_ENABLE_CRL_CHECK + LIB3270_EXPORT char * lib3270_get_ssl_peer_certificate_text(H3270 *hSession) { diff --git a/src/lib3270/screen.c b/src/lib3270/screen.c index 049e4e8..af21e99 100644 --- a/src/lib3270/screen.c +++ b/src/lib3270/screen.c @@ -545,8 +545,8 @@ void set_status(H3270 *session, LIB3270_FLAG id, Boolean on) { CHECK_SESSION_HANDLE(session); - session->oia_flag[id] = (on != 0); - session->cbk.update_oia(session,id,session->oia_flag[id]); + session->oia.flag[id] = (on != 0); + session->cbk.update_oia(session,id,session->oia.flag[id]); } @@ -640,7 +640,7 @@ void status_reset(H3270 *session) LIB3270_EXPORT LIB3270_MESSAGE lib3270_get_program_message(H3270 *session) { CHECK_SESSION_HANDLE(session); - return session->oia_status; + return session->oia.status; } /** @@ -655,8 +655,8 @@ LIB3270_EXPORT LIB3270_MESSAGE lib3270_lock_status(H3270 *hSession) { CHECK_SESSION_HANDLE(hSession); - if(hSession->oia_status) - return hSession->oia_status; + if(hSession->oia.status) + return hSession->oia.status; if(hSession->kybdlock) return LIB3270_MESSAGE_KYBDLOCK; @@ -683,10 +683,10 @@ void status_changed(H3270 *session, LIB3270_MESSAGE id) { CHECK_SESSION_HANDLE(session); - if(id == session->oia_status || id < 0) + if(id == session->oia.status || id < 0) return; - session->oia_status = id; + session->oia.status = id; session->cbk.update_status(session,id); } diff --git a/src/lib3270/session.c b/src/lib3270/session.c index 0e22cb5..212c676 100644 --- a/src/lib3270/session.c +++ b/src/lib3270/session.c @@ -91,11 +91,11 @@ void lib3270_session_free(H3270 *h) // Release state change callbacks for(f=0;fst_callbacks[f]) + while(h->st.callbacks[f]) { - struct lib3270_state_callback *next = h->st_callbacks[f]->next; - lib3270_free(h->st_callbacks[f]); - h->st_callbacks[f] = next; + struct lib3270_state_callback *next = h->st.callbacks[f]->next; + lib3270_free(h->st.callbacks[f]); + h->st.callbacks[f] = next; } } @@ -321,7 +321,7 @@ static void lib3270_session_init(H3270 *hSession, const char *model, const char hSession->sock = -1; hSession->model_num = -1; hSession->cstate = LIB3270_NOT_CONNECTED; - hSession->oia_status = -1; + hSession->oia.status = -1; hSession->kybdlock = KL_NOT_CONNECTED; hSession->aid = AID_NO; hSession->reply_mode = SF_SRM_FIELD; -- libgit2 0.21.2