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