From daecaf1e003d0a78e4148f02ce648fc7a4c68144 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Mon, 5 Aug 2019 10:40:20 -0300 Subject: [PATCH] Adding support for insert/remove of toggle listeners. --- lib3270.cbp | 1 - src/core/host.c | 26 +++++++++++++------------- src/core/linux/connect.c | 1 + src/core/session.c | 19 +++++++++++++++---- src/core/toggles.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- src/include/lib3270-internals.h | 40 +++++++++++++++++++++++++++++++--------- src/include/lib3270/toggle.h | 3 +++ src/ssl/linux/curl.c | 1 + 8 files changed, 128 insertions(+), 35 deletions(-) diff --git a/lib3270.cbp b/lib3270.cbp index 286c69b..6ac5bdd 100644 --- a/lib3270.cbp +++ b/lib3270.cbp @@ -243,7 +243,6 @@ - diff --git a/src/core/host.c b/src/core/host.c index de14f98..f89974b 100644 --- a/src/core/host.c +++ b/src/core/host.c @@ -189,12 +189,12 @@ LIB3270_EXPORT const void * lib3270_register_schange(H3270 *hSession, LIB3270_ST st->func = func; st->data = data; - if (hSession->st.last[tx]) - hSession->st.last[tx]->next = st; + if (hSession->listeners.state.last[tx]) + hSession->listeners.state.last[tx]->next = st; else - hSession->st.callbacks[tx] = st; + hSession->listeners.state.callbacks[tx] = st; - hSession->st.last[tx] = st; + hSession->listeners.state.last[tx] = st; return (void *) st; @@ -207,16 +207,16 @@ LIB3270_EXPORT int lib3270_unregister_schange(H3270 *hSession, LIB3270_STATE tx, #ifdef DEBUG { - debug("Before remove of %p (last=%p):",id,hSession->st.last[tx]); + debug("Before remove of %p (last=%p):",id,hSession->listeners.state.last[tx]); - for (st = hSession->st.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next) + for (st = hSession->listeners.state.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next) { debug("%p",st); } } #endif // DEBUG - for (st = hSession->st.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next) + for (st = hSession->listeners.state.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next) { if (st == (struct lib3270_state_callback *)id) break; @@ -233,18 +233,18 @@ LIB3270_EXPORT int lib3270_unregister_schange(H3270 *hSession, LIB3270_STATE tx, if (prev != (struct lib3270_state_callback *) NULL) prev->next = st->next; else - hSession->st.callbacks[tx] = (struct lib3270_state_callback *) st->next; + hSession->listeners.state.callbacks[tx] = (struct lib3270_state_callback *) st->next; - for(st = hSession->st.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next) - hSession->st.last[tx] = st; + for(st = hSession->listeners.state.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next) + hSession->listeners.state.last[tx] = st; lib3270_free((void *) id); #ifdef DEBUG { - debug("After Remove of %p (last=%p):",id,hSession->st.last[tx]); + debug("After Remove of %p (last=%p):",id,hSession->listeners.state.last[tx]); - for (st = hSession->st.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next) + for (st = hSession->listeners.state.callbacks[tx]; st != (struct lib3270_state_callback *) NULL; st = (struct lib3270_state_callback *) st->next) { debug("%p",st); } @@ -282,7 +282,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->listeners.state.callbacks[tx];st;st = st->next) { st->func(h,mode,st->data); } diff --git a/src/core/linux/connect.c b/src/core/linux/connect.c index ad623e6..1fc299b 100644 --- a/src/core/linux/connect.c +++ b/src/core/linux/connect.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include diff --git a/src/core/session.c b/src/core/session.c index 6c1f26a..0877175 100644 --- a/src/core/session.c +++ b/src/core/session.c @@ -92,11 +92,22 @@ void lib3270_session_free(H3270 *h) // Release state change callbacks for(f=0;fst.callbacks[f]) + while(h->listeners.state.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->listeners.state.callbacks[f]->next; + lib3270_free(h->listeners.state.callbacks[f]); + h->listeners.state.callbacks[f] = next; + } + } + + // Release toggle change listeners. + for(f=0;flisteners.toggle.callbacks[f]) + { + struct lib3270_toggle_callback *next = h->listeners.toggle.callbacks[f]->next; + lib3270_free(h->listeners.toggle.callbacks[f]); + h->listeners.toggle.callbacks[f] = next; } } diff --git a/src/core/toggles.c b/src/core/toggles.c index c9010d6..1170a44 100644 --- a/src/core/toggles.c +++ b/src/core/toggles.c @@ -24,9 +24,6 @@ * * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) - * licinio@bb.com.br (Licínio Luis Branco) - * kraucer@bb.com.br (Kraucer Fernandes Mazuco) - * macmiranda@bb.com.br (Marco Aurélio Caldas Miranda) * */ @@ -244,17 +241,24 @@ LIB3270_EXPORT unsigned char lib3270_get_toggle(H3270 *session, LIB3270_TOGGLE i return session->toggle[ix].value != 0; } -/* - * Call the internal update routine +/** + * @brief Call the internal update routine and listeners. */ static void toggle_notify(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE ix) { + struct lib3270_toggle_callback * st; + trace("%s: ix=%d upcall=%p",__FUNCTION__,ix,t->upcall); t->upcall(session, t, LIB3270_TOGGLE_TYPE_INTERACTIVE); if(session->cbk.update_toggle) session->cbk.update_toggle(session,ix,t->value,LIB3270_TOGGLE_TYPE_INTERACTIVE,toggle_info[ix].name); + for(st = session->listeners.toggle.callbacks[ix]; st != (struct lib3270_toggle_callback *) NULL; st = (struct lib3270_toggle_callback *) st->next) + { + st->func(session, ix, st->data); + } + } /** @@ -315,8 +319,8 @@ static void toggle_redraw(H3270 *session, struct lib3270_toggle GNUC_UNUSED(*t), session->cbk.display(session); } -/* - * No-op toggle. +/** + * @brief No-op toggle. */ static void toggle_nop(H3270 GNUC_UNUSED(*session), struct lib3270_toggle GNUC_UNUSED(*t), LIB3270_TOGGLE_TYPE GNUC_UNUSED(tt)) { @@ -356,7 +360,6 @@ void initialize_toggles(H3270 *session) session->toggle[LIB3270_TOGGLE_UNDERLINE].upcall = toggle_redraw; session->toggle[LIB3270_TOGGLE_ALTSCREEN].upcall = toggle_altscreen; session->toggle[LIB3270_TOGGLE_KEEP_ALIVE].upcall = toggle_keepalive; -// session->toggle[LIB3270_TOGGLE_RECONNECT].upcall = toggle_reconnect; for(f=0;ffunc = func; + st->data = data; + + if (hSession->listeners.toggle.last[tx]) + hSession->listeners.toggle.last[tx]->next = st; + else + hSession->listeners.toggle.callbacks[tx] = st; + + hSession->listeners.toggle.last[tx] = st; + + return (void *) st; + +} + +LIB3270_EXPORT int lib3270_unregister_toggle_listener(H3270 *hSession, LIB3270_TOGGLE tx, const void *id) +{ + struct lib3270_toggle_callback *st; + struct lib3270_toggle_callback *prev = (struct lib3270_toggle_callback *) NULL; + + for (st = hSession->listeners.toggle.callbacks[tx]; st != (struct lib3270_toggle_callback *) NULL; st = (struct lib3270_toggle_callback *) st->next) + { + if (st == (struct lib3270_toggle_callback *)id) + break; + + prev = st; + } + + if (st == (struct lib3270_toggle_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_toggle_callback *) NULL) + prev->next = st->next; + else + hSession->listeners.toggle.callbacks[tx] = (struct lib3270_toggle_callback *) st->next; + + for(st = hSession->listeners.toggle.callbacks[tx]; st != (struct lib3270_toggle_callback *) NULL; st = (struct lib3270_toggle_callback *) st->next) + hSession->listeners.toggle.last[tx] = st; + + lib3270_free((void *) id); + + return 0; + +} diff --git a/src/include/lib3270-internals.h b/src/include/lib3270-internals.h index 60ef59b..be8c33f 100644 --- a/src/include/lib3270-internals.h +++ b/src/include/lib3270-internals.h @@ -323,9 +323,16 @@ typedef struct _input_t struct lib3270_state_callback { - struct lib3270_state_callback * next; /**< Next callback in chain */ - void * data; /**< User data */ - void (*func)(H3270 *, int, void *); /**< Function to call */ + struct lib3270_state_callback * next; /**< @brief Next callback in chain */ + void * data; /**< @brief User data */ + void (*func)(H3270 *, int, void *); /**< @brief Function to call */ +}; + +struct lib3270_toggle_callback +{ + struct lib3270_toggle_callback * next; /**< @brief Next callback in chain */ + void * data; /**< @brief User data */ + void (*func)(H3270 *, LIB3270_TOGGLE, void *); /**< @brief Function to call */ }; /** @@ -663,16 +670,31 @@ struct _h3270 int inputs_changed : 1; // Trace methods. - struct { + struct + { void (*handler)(H3270 *session, void *userdata, const char *fmt, va_list args); void *userdata; } trace; - // State change listeners. - struct { - struct lib3270_state_callback * callbacks[LIB3270_STATE_USER]; - struct lib3270_state_callback * last[LIB3270_STATE_USER]; - } st; + // Listeners. + struct + { + // State. + struct + { + struct lib3270_state_callback * callbacks[LIB3270_STATE_USER]; + struct lib3270_state_callback * last[LIB3270_STATE_USER]; + } state; + + // Toggle change listeners + struct + { + struct lib3270_toggle_callback * callbacks[LIB3270_TOGGLE_COUNT]; + struct lib3270_toggle_callback * last[LIB3270_TOGGLE_COUNT]; + } toggle; + + } listeners; + }; diff --git a/src/include/lib3270/toggle.h b/src/include/lib3270/toggle.h index 2ee606e..aa5a001 100644 --- a/src/include/lib3270/toggle.h +++ b/src/include/lib3270/toggle.h @@ -104,4 +104,7 @@ LIB3270_EXPORT void lib3270_set_session_id(H3270 *hSession, char id); LIB3270_EXPORT char lib3270_get_session_id(H3270 *hSession); + LIB3270_EXPORT const void * lib3270_register_toggle_listener(H3270 *hSession, LIB3270_TOGGLE tx, void (*func)(H3270 *, LIB3270_TOGGLE, void *),void *data); + LIB3270_EXPORT int lib3270_unregister_toggle_listener(H3270 *hSession, LIB3270_TOGGLE tx, const void *id); + #endif /* LIB3270_TOGGLE_H_INCLUDED */ diff --git a/src/ssl/linux/curl.c b/src/ssl/linux/curl.c index 93ac9e1..505e26f 100644 --- a/src/ssl/linux/curl.c +++ b/src/ssl/linux/curl.c @@ -39,6 +39,7 @@ #include "private.h" #include +#include #define CRL_DATA_LENGTH 2048 -- libgit2 0.21.2