From 953f5b57cde6ccc40574ec2e00a5587bfd3ccf74 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Wed, 21 Nov 2018 12:09:51 -0200 Subject: [PATCH] popup and trace handlers are now set by session instead of global. --- src/include/lib3270/popup.h | 2 ++ src/include/lib3270/session.h | 2 ++ src/include/lib3270/trace.h | 2 +- src/lib3270/session.c | 24 ++++++++++++++++++++++-- src/lib3270/trace_ds.c | 39 ++++++++++----------------------------- src/testprogram/testprogram.c | 2 +- 6 files changed, 38 insertions(+), 33 deletions(-) diff --git a/src/include/lib3270/popup.h b/src/include/lib3270/popup.h index 9e654ab..4db2a28 100644 --- a/src/include/lib3270/popup.h +++ b/src/include/lib3270/popup.h @@ -51,6 +51,8 @@ LIB3270_NOTIFY_USER /**< Reserved, always the last one */ } LIB3270_NOTIFY; + LIB3270_EXPORT void lib3270_set_popup_handler(H3270 *session, int (*handler)(H3270 *, LIB3270_NOTIFY, const char *, const char *, const char *, va_list)); + /** * Pop up an error dialog, based on an error number. * diff --git a/src/include/lib3270/session.h b/src/include/lib3270/session.h index e475a14..a0a22c5 100644 --- a/src/include/lib3270/session.h +++ b/src/include/lib3270/session.h @@ -76,8 +76,10 @@ void (*autostart)(H3270 *session); int (*print)(H3270 *session); + void (*message)(H3270 *session, LIB3270_NOTIFY id , const char *title, const char *message, const char *text); void (*popup)(H3270 *session, LIB3270_NOTIFY id, const char *title, const char *msg, const char *fmt, va_list); + void (*trace)(H3270 *session, const char *fmt, va_list args); #ifdef HAVE_LIBSSL void (*set_peer_certificate)(const X509 *cert); diff --git a/src/include/lib3270/trace.h b/src/include/lib3270/trace.h index 576c01a..0f337f9 100644 --- a/src/include/lib3270/trace.h +++ b/src/include/lib3270/trace.h @@ -53,7 +53,7 @@ * * @return Current trace handler */ - LIB3270_EXPORT LIB3270_TRACE_HANDLER lib3270_set_trace_handler( LIB3270_TRACE_HANDLER handler); + LIB3270_EXPORT LIB3270_TRACE_HANDLER lib3270_set_trace_handler(H3270 *session, LIB3270_TRACE_HANDLER handler); /** * Write on trace file. diff --git a/src/lib3270/session.c b/src/lib3270/session.c index 6f5a4d3..f1cfd32 100644 --- a/src/lib3270/session.c +++ b/src/lib3270/session.c @@ -44,6 +44,8 @@ #include "kybdc.h" #include "3270ds.h" #include "popupsc.h" +#include + /*---[ Globals ]--------------------------------------------------------------------------------------------------------------*/ @@ -163,7 +165,7 @@ static void message(H3270 *session, LIB3270_NOTIFY id , const char *title, const #endif // ANDROID } -static int popup(H3270 *session, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list arg) +static int def_popup(H3270 *session, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list arg) { #ifdef ANDROID char *mask = xs_buffer("%s\n",fmt); @@ -177,6 +179,12 @@ static int popup(H3270 *session, LIB3270_NOTIFY type, const char *title, const c return 0; } +static void def_trace(H3270 *session, const char *fmt, va_list args) +{ + vfprintf(stdout,fmt,args); + fflush(stdout); +} + static void update_ssl(H3270 *session, LIB3270_SSL_STATE state) { } @@ -233,7 +241,8 @@ static void lib3270_session_init(H3270 *hSession, const char *model, const char hSession->cbk.update_selection = update_selection; hSession->cbk.cursor = set_cursor; hSession->cbk.message = message; - hSession->cbk.popup = popup; + hSession->cbk.trace = def_trace; + hSession->cbk.popup = def_popup; hSession->cbk.update_ssl = update_ssl; hSession->cbk.display = screen_disp; hSession->cbk.set_width = nop_int; @@ -282,6 +291,17 @@ static void lib3270_session_init(H3270 *hSession, const char *model, const char } +LIB3270_EXPORT LIB3270_TRACE_HANDLER lib3270_set_trace_handler(H3270 *session, LIB3270_TRACE_HANDLER handler) +{ + void (*ret)(H3270 *session, const char *fmt, va_list args) = session->cbk.trace; + session->cbk.trace = handler ? handler : def_trace; + return ret; +} + +LIB3270_EXPORT void lib3270_set_popup_handler(H3270 *session, int (*handler)(H3270 *, LIB3270_NOTIFY, const char *, const char *, const char *, va_list)) { + session->cbk.popup = handler ? handler : def_popup; +} + H3270 * lib3270_session_new(const char *model) { H3270 * hSession; diff --git a/src/lib3270/trace_ds.c b/src/lib3270/trace_ds.c index 829136d..e3116c0 100644 --- a/src/lib3270/trace_ds.c +++ b/src/lib3270/trace_ds.c @@ -69,18 +69,10 @@ #define MAX_HEADER_SIZE (10*1024) +#undef trace + /* Statics */ -static void __vwtrace(H3270 *session, const char *fmt, va_list args); static void wtrace(H3270 *session, const char *fmt, ...); -static void (*vwtrace)(H3270 *session, const char *fmt, va_list args) = __vwtrace; - - -LIB3270_EXPORT LIB3270_TRACE_HANDLER lib3270_set_trace_handler( LIB3270_TRACE_HANDLER handler ) -{ - void (*ret)(H3270 *session, const char *fmt, va_list args) = vwtrace; - vwtrace = handler ? handler : __vwtrace; - return ret; -} /* display a (row,col) */ const char * rcba(H3270 *hSession, int baddr) @@ -169,36 +161,25 @@ void trace_ds_nb(H3270 *hSession, const char *fmt, ...) } /* Conditional data stream trace, without line splitting. */ -void trace_dsn(H3270 *hSession, const char *fmt, ...) +void trace_dsn(H3270 *session, const char *fmt, ...) { va_list args; - if (!lib3270_get_toggle(hSession,DS_TRACE)) + if (!lib3270_get_toggle(session,DS_TRACE)) return; /* print out message */ va_start(args, fmt); - vwtrace(hSession,fmt, args); + session->cbk.trace(session,fmt, args); va_end(args); } -/* - * Write to the trace file, varargs style. - * This is the only function that actually does output to the trace file -- - * all others are wrappers around this function. - */ -static void __vwtrace(H3270 *session, const char *fmt, va_list args) -{ - vfprintf(stdout,fmt,args); - fflush(stdout); -} - /* Write to the trace file. */ -static void wtrace(H3270 *hSession, const char *fmt, ...) +static void wtrace(H3270 *session, const char *fmt, ...) { va_list args; va_start(args, fmt); - vwtrace(hSession,fmt, args); + session->cbk.trace(session,fmt, args); va_end(args); } @@ -210,7 +191,7 @@ LIB3270_EXPORT void lib3270_write_dstrace(H3270 *session, const char *fmt, ...) return; va_start(args, fmt); - vwtrace(session,fmt, args); + session->cbk.trace(session,fmt, args); va_end(args); } @@ -222,7 +203,7 @@ LIB3270_EXPORT void lib3270_write_nettrace(H3270 *session, const char *fmt, ...) return; va_start(args, fmt); - vwtrace(session,fmt, args); + session->cbk.trace(session,fmt, args); va_end(args); } @@ -235,7 +216,7 @@ LIB3270_EXPORT void lib3270_trace_event(H3270 *session, const char *fmt, ...) return; va_start(args, fmt); - vwtrace(session,fmt, args); + session->cbk.trace(session,fmt, args); va_end(args); } diff --git a/src/testprogram/testprogram.c b/src/testprogram/testprogram.c index 0b32361..f1618d8 100644 --- a/src/testprogram/testprogram.c +++ b/src/testprogram/testprogram.c @@ -24,7 +24,7 @@ int main(int numpar, char *param[]) { H3270 * h; int rc = 0; - const char * url = getenv("LIB3270HOST"); + const char * url = getenv("TN3270URL"); // char line[4096]; // pthread_t thread; -- libgit2 0.21.2