diff --git a/src/include/lib3270/session.h b/src/include/lib3270/session.h index dd1073c..10f147d 100644 --- a/src/include/lib3270/session.h +++ b/src/include/lib3270/session.h @@ -79,7 +79,6 @@ 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 0f337f9..eafedd8 100644 --- a/src/include/lib3270/trace.h +++ b/src/include/lib3270/trace.h @@ -42,18 +42,18 @@ #define LIB3270_AS_PRINTF(a,b) __attribute__((format(printf, a, b))) #endif - typedef void (*LIB3270_TRACE_HANDLER)(H3270 *, const char *, va_list); + typedef void (*LIB3270_TRACE_HANDLER)(H3270 *, void *, const char *, va_list); /** * Set trace handle callback. * - * @param handle Callback to write in trace file or show trace window (NULL send all trace to stdout/syslog). - * @param data User data to pass to the trace handler. + * @param hSession TN3270 Session handle. + * @param handler Callback to write in trace file or show trace window (NULL send all trace to stdout/syslog). + * @param userdata User data to pass to the trace handler. * - * @return Current trace handler */ - LIB3270_EXPORT LIB3270_TRACE_HANDLER lib3270_set_trace_handler(H3270 *session, LIB3270_TRACE_HANDLER handler); + LIB3270_EXPORT void lib3270_set_trace_handler(H3270 *hSession, LIB3270_TRACE_HANDLER handler, void *userdata); /** * Write on trace file. diff --git a/src/lib3270/private.h b/src/lib3270/private.h index 2cf7ba9..d276e86 100644 --- a/src/lib3270/private.h +++ b/src/lib3270/private.h @@ -618,6 +618,12 @@ struct _h3270 input_t * inputs; int inputs_changed : 1; + // Trace Window. + struct { + void (*handler)(H3270 *session, void *userdata, const char *fmt, va_list args); + void *userdata; + } trace; + // Callbacks. struct lib3270_state_callback * st_callbacks[LIB3270_STATE_USER]; struct lib3270_state_callback * st_last[LIB3270_STATE_USER]; diff --git a/src/lib3270/session.c b/src/lib3270/session.c index b126c29..ae0a0f4 100644 --- a/src/lib3270/session.c +++ b/src/lib3270/session.c @@ -209,7 +209,7 @@ static void def_popup(H3270 *session, LIB3270_NOTIFY type unused, const char *ti #endif // ANDROID } -static void def_trace(H3270 *session unused, const char *fmt, va_list args) +static void def_trace(H3270 *session unused, void *userdata unused, const char *fmt, va_list args) { vfprintf(stdout,fmt,args); fflush(stdout); @@ -271,7 +271,6 @@ 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.trace = def_trace; hSession->cbk.popup = def_popup; hSession->cbk.update_ssl = update_ssl; hSession->cbk.display = screen_disp; @@ -282,6 +281,9 @@ static void lib3270_session_init(H3270 *hSession, const char *model, const char hSession->cbk.print = print; hSession->cbk.set_peer_certificate = set_peer_certificate; + // Trace management. + hSession->trace.handler = def_trace; + // Set the defaults. hSession->extended = 1; hSession->typeahead = 1; @@ -321,11 +323,12 @@ 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) +LIB3270_EXPORT void lib3270_set_trace_handler(H3270 *hSession, LIB3270_TRACE_HANDLER handler, void *userdata) { - void (*ret)(H3270 *session, const char *fmt, va_list args) = session->cbk.trace; - session->cbk.trace = handler ? handler : def_trace; - return ret; + CHECK_SESSION_HANDLE(hSession); + + hSession->trace.handler = handler ? handler : def_trace; + hSession->trace.userdata = userdata; } LIB3270_EXPORT void lib3270_set_popup_handler(H3270 *session, void (*handler)(H3270 *, LIB3270_NOTIFY, const char *, const char *, const char *, va_list)) { diff --git a/src/lib3270/trace_ds.c b/src/lib3270/trace_ds.c index e3116c0..233b0b1 100644 --- a/src/lib3270/trace_ds.c +++ b/src/lib3270/trace_ds.c @@ -170,7 +170,7 @@ void trace_dsn(H3270 *session, const char *fmt, ...) /* print out message */ va_start(args, fmt); - session->cbk.trace(session,fmt, args); + session->trace.handler(session,session->trace.userdata,fmt, args); va_end(args); } @@ -179,7 +179,7 @@ static void wtrace(H3270 *session, const char *fmt, ...) { va_list args; va_start(args, fmt); - session->cbk.trace(session,fmt, args); + session->trace.handler(session,session->trace.userdata,fmt, args); va_end(args); } @@ -191,7 +191,7 @@ LIB3270_EXPORT void lib3270_write_dstrace(H3270 *session, const char *fmt, ...) return; va_start(args, fmt); - session->cbk.trace(session,fmt, args); + session->trace.handler(session,session->trace.userdata,fmt, args); va_end(args); } @@ -203,7 +203,7 @@ LIB3270_EXPORT void lib3270_write_nettrace(H3270 *session, const char *fmt, ...) return; va_start(args, fmt); - session->cbk.trace(session,fmt, args); + session->trace.handler(session,session->trace.userdata,fmt, args); va_end(args); } @@ -216,7 +216,7 @@ LIB3270_EXPORT void lib3270_trace_event(H3270 *session, const char *fmt, ...) return; va_start(args, fmt); - session->cbk.trace(session,fmt, args); + session->trace.handler(session,session->trace.userdata,fmt, args); va_end(args); } -- libgit2 0.21.2