From 5a66c3882044ef002d241b0bdc6084e07128056e Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Wed, 20 Apr 2016 14:38:58 -0300 Subject: [PATCH] Isolando estrutura de sessão para evitar que alterações na biblioteca causem quebra de compatibilidade binária com o aplicativo principal ou plugins. --- src/include/lib3270.h | 10 ++++------ src/include/lib3270/session.h | 399 ++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/lib3270/host.c | 23 +++++++++++++++++++++++ src/lib3270/private.h | 370 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------ src/pw3270/v3270/draw.c | 2 +- src/pw3270/v3270/oia.c | 8 +++----- src/pw3270/v3270/widget.c | 72 +++++++++++++++++++++++++++++++++++++++--------------------------------- 7 files changed, 418 insertions(+), 466 deletions(-) diff --git a/src/include/lib3270.h b/src/include/lib3270.h index 6da6122..366da42 100644 --- a/src/include/lib3270.h +++ b/src/include/lib3270.h @@ -745,12 +745,10 @@ */ LIB3270_EXPORT const char * lib3270_get_luname(H3270 *h); -// #define lib3270_has_printer_session(h) (h->oia_flag[LIB3270_FLAG_PRINTER] != 0) - #define lib3270_has_active_script(h) (h->oia_flag[LIB3270_FLAG_SCRIPT] != 0) - #define lib3270_get_typeahead(h) (h->oia_flag[LIB3270_FLAG_TYPEAHEAD] != 0) - #define lib3270_get_undera(h) (h->oia_flag[LIB3270_FLAG_UNDERA] != 0) - #define lib3270_get_oia_box_solid(h) (h->oia_flag[LIB3270_FLAG_BOXSOLID] != 0) - + LIB3270_EXPORT int lib3270_has_active_script(H3270 *h); + LIB3270_EXPORT int lib3270_get_typeahead(H3270 *h); + LIB3270_EXPORT int lib3270_get_undera(H3270 *h); + LIB3270_EXPORT int lib3270_get_oia_box_solid(H3270 *h); LIB3270_EXPORT int lib3270_pconnected(H3270 *h); LIB3270_EXPORT int lib3270_half_connected(H3270 *h); LIB3270_EXPORT int lib3270_connected(H3270 *h); diff --git a/src/include/lib3270/session.h b/src/include/lib3270/session.h index 57f8da6..4525276 100644 --- a/src/include/lib3270/session.h +++ b/src/include/lib3270/session.h @@ -24,62 +24,16 @@ * * 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) * */ #ifndef LIB3270_SESSION_H_INCLUDED #define LIB3270_SESSION_H_INCLUDED 1 - #include +// #include #include - #include - - #define LIB3270_LUNAME_LENGTH 16 - #define LIB3270_FULL_MODEL_NAME_LENGTH 13 - #define LIB3270_LU_MAX 32 - - #define LIB3270_TELNET_N_OPTS 256 - - /** extended attributes */ - struct lib3270_ea; - struct lib3270_text; - - /* - struct lib3270_ea - { - unsigned char cc; ///< @brief EBCDIC or ASCII character code - unsigned char fa; ///< @brief field attribute, it nonzero - unsigned char fg; ///< @brief foreground color (0x00 or 0xf) - unsigned char bg; ///< @brief background color (0x00 or 0xf) - unsigned char gr; ///< @brief ANSI graphics rendition bits - unsigned char cs; ///< @brief character set (GE flag, or 0..2) - unsigned char ic; ///< @brief input control (DBCS) - unsigned char db; ///< @brief DBCS state - }; - */ - - /* - struct lib3270_text - { - unsigned char chr; ///< ASCII character code - unsigned short attr; ///< Converted character attribute (color & etc) - }; - */ - - #ifndef HEADER_SSL_H - #define SSL void - #endif // !HEADER_SSL_H - - #ifndef LIB3270_TA - #define LIB3270_TA void - #endif // !LIB3270_TA - - #define LIB3270_MB_MAX 16 - #define LIB3270_DEFAULT_CGEN 0x02b90000 - #define LIB3270_DEFAULT_CSET 0x00000025 +// #include struct lib3270_session_callbacks { @@ -116,357 +70,8 @@ }; - LIB3270_EXPORT struct lib3270_session_callbacks * lib3270_get_session_callbacks(H3270 *session, unsigned short sz); - struct _h3270 - { - unsigned short sz; /**< Struct size */ - - // Connection info - int sock; /**< Network socket */ - LIB3270_CSTATE cstate; /**< Connection state */ - - // flags - LIB3270_OPTION options; /**< Session options */ - - int bgthread : 1; /**< Running on a background thread ? */ - int selected : 1; /**< Has selected region? */ - int rectsel : 1; /**< Selected region is a rectangle ? */ - int vcontrol : 1; /**< Visible control ? */ - int modified_sel : 1; - int mono : 1; /**< Forces monochrome display */ - int m3279 : 1; - int extended : 1; - int typeahead : 1; - int numeric_lock : 1; - int oerr_lock : 1; - int unlock_delay : 1; - int auto_reconnect_inprogress : 1; - unsigned int colors : 5; - int apl_mode : 1; - int icrnl : 1; - int inlcr : 1; - int onlcr : 1; - int bsd_tm : 1; - int syncing : 1; - int reverse : 1; /**< reverse-input mode */ - int dbcs : 1; - int linemode : 1; - int trace_skipping : 1; - int need_tls_follows : 1; - int cut_xfer_in_progress : 1; -// int auto_keymap : 1; - int formatted : 1; /**< Formatted screen flag */ - int starting : 1; /**< Is starting (no first screen)? */ - - char * oversize; - - LIB3270_SSL_STATE secure; - - struct lib3270_toggle - { - char value; /**< toggle value */ - void (*upcall)(H3270 *, struct lib3270_toggle *, LIB3270_TOGGLE_TYPE); /**< change value */ - } toggle[LIB3270_TOGGLE_COUNT]; - - // Network & Termtype - char * connected_type; - char * connected_lu; - char luname[LIB3270_LUNAME_LENGTH+1]; - - char full_model_name[LIB3270_FULL_MODEL_NAME_LENGTH+1]; - char * model_name; - int model_num; - char * termtype; - - struct - { - char * current; /**< The hostname part, stripped of qualifiers, luname and port number */ - char * full; /**< The entire string, for use in reconnecting */ - char * srvc; /**< The service name */ - char * qualified; - } host; - - char * proxy; /**< Proxy server (type:host[:port]) */ - char * termname; - - struct lib3270_charset charset; - - LIB3270_MESSAGE oia_status; - - unsigned char oia_flag[LIB3270_FLAG_COUNT]; - - unsigned short current_port; - - // Misc - void * ft; /**< Active file transfer data */ - - // screen info - int ov_rows; - int ov_cols; - int maxROWS; - int maxCOLS; - unsigned short rows; - unsigned short cols; - int cursor_addr; - int buffer_addr; - char flipped; - int screen_alt; /**< alternate screen? */ - int is_altbuffer; - - // Screen contents - void * buffer[2]; /**< Internal buffers */ - struct lib3270_ea * ea_buf; /**< 3270 device buffer. ea_buf[-1] is the dummy default field attribute */ - struct lib3270_ea * aea_buf; /**< alternate 3270 extended attribute buffer */ - struct lib3270_text * text; /**< Converted 3270 chars */ - - // host.c - char std_ds_host; - char no_login_host; - char non_tn3270e_host; - char passthru_host; - char ssl_host; - char ever_3270; - - // ctlr.c - int sscp_start; - unsigned char default_fg; - unsigned char default_bg; - unsigned char default_gr; - unsigned char default_cs; - unsigned char default_ic; - char reply_mode; - int trace_primed : 1; - int ticking : 1; - int mticking : 1; - int crm_nattr; - unsigned char crm_attr[16]; - unsigned char * zero_buf; /**< empty buffer, for area clears */ - - struct timeval t_start; - void * tick_id; - struct timeval t_want; - - // Telnet.c - unsigned char * ibuf; - int ibuf_size; /**< size of ibuf */ - unsigned char * obuf; /**< 3270 output buffer */ - unsigned char * obptr; - time_t ns_time; - int ns_brcvd; - int ns_rrcvd; - int ns_bsent; - int ns_rsent; - struct timeval ds_ts; - unsigned long e_funcs; /**< negotiated TN3270E functions */ - unsigned short e_xmit_seq; /**< transmit sequence number */ - int response_required; - int tn3270e_bound; - int tn3270e_negotiated; - int ansi_data; - int lnext; - int backslashed; - char plu_name[LIB3270_BIND_PLU_NAME_MAX+1]; - char **lus; - char **curr_lu; - char * try_lu; - int proxy_type; - char * proxy_host; - char * proxy_portname; - unsigned short proxy_port; - char reported_lu[LIB3270_LU_MAX+1]; - char reported_type[LIB3270_LU_MAX+1]; - - enum - { - E_NONE, - E_3270, - E_NVT, - E_SSCP - } tn3270e_submode; - - unsigned char * lbuf; /**< line-mode input buffer */ - unsigned char * lbptr; - - - // 3270 input buffer - unsigned char * ibptr; - unsigned char * obuf_base; - int obuf_size; -// unsigned char * netrbuf; - - // network input buffer - unsigned char * sbbuf; - - // telnet sub-option buffer - unsigned char * sbptr; - unsigned char telnet_state; -// char ttype_tmpval[13]; - - unsigned char myopts[LIB3270_TELNET_N_OPTS]; - unsigned char hisopts[LIB3270_TELNET_N_OPTS]; - - // kybd.c - unsigned int kybdlock; ///< @brief keyboard lock state - unsigned char aid; ///< @brief current attention ID - void * unlock_id; - time_t unlock_delay_time; - unsigned long unlock_delay_ms; ///< @brief Delay before actually unlocking the keyboard after the host permits it. - LIB3270_TA * ta_head; - LIB3270_TA * ta_tail; - - // ft_dft.c - int dft_buffersize; ///< @brief Buffer size (LIMIN, LIMOUT) - - // rpq.c - int rpq_complained : 1; -#if !defined(_WIN32) - int omit_due_space_limit : 1; -#endif - - char * rpq_warnbuf; - int rpq_wbcnt; - - // User data (Usually points to session's widget) - void * user_data; - - // selection - char * paste_buffer; - struct - { - int start; - int end; - } select; - - // ansi.c - int scroll_top; - int scroll_bottom; - int once_cset; - int saved_cursor; - - int held_wrap : 1; - - int insert_mode : 1; - int auto_newline_mode : 1; - - int appl_cursor : 1; - int saved_appl_cursor : 1; - - int wraparound_mode : 1; - int saved_wraparound_mode : 1; - - int rev_wraparound_mode : 1; - int saved_rev_wraparound_mode : 1; - - int allow_wide_mode : 1; - int saved_allow_wide_mode : 1; - - int wide_mode : 1; - int saved_wide_mode : 1; - - int saved_altbuffer : 1; - int ansi_reset : 1; /**< Non zero if the ansi_reset() was called in this session */ - - int ansi_ch; - int cs_to_change; - - /** ANSI Character sets. */ - enum lib3270_ansi_cs - { - LIB3270_ANSI_CS_G0 = 0, - LIB3270_ANSI_CS_G1 = 1, - LIB3270_ANSI_CS_G2 = 2, - LIB3270_ANSI_CS_G3 = 3 - } cset; - enum lib3270_ansi_cs saved_cset; - - /** Character set designations. */ - enum lib3270_ansi_csd - { - LIB3270_ANSI_CSD_LD = 0, - LIB3270_ANSI_CSD_UK = 1, - LIB3270_ANSI_CSD_US = 2 - } csd[4]; - enum lib3270_ansi_csd saved_csd[4]; - - enum lib3270_ansi_state - { - LIB3270_ANSI_STATE_DATA = 0, - LIB3270_ANSI_STATE_ESC = 1, - LIB3270_ANSI_STATE_CSDES = 2, - LIB3270_ANSI_STATE_N1 = 3, - LIB3270_ANSI_STATE_DECP = 4, - LIB3270_ANSI_STATE_TEXT = 5, - LIB3270_ANSI_STATE_TEXT2 = 6, - LIB3270_ANSI_STATE_MBPEND = 7 - } state; - - unsigned char * tabs; - - int pmi; - char pending_mbs[LIB3270_MB_MAX]; - - unsigned char gr; - unsigned char saved_gr; - - unsigned char fg; - unsigned char saved_fg; - - unsigned char bg; - unsigned char saved_bg; - - // xio - void * ns_read_id; - void * ns_write_id; - void * ns_exception_id; - - // SSL Data (Always defined to mantain the same structure size) - unsigned long ssl_error; - SSL * ssl_con; - - // Callbacks. - struct lib3270_state_callback * st_callbacks[LIB3270_STATE_USER]; - struct lib3270_state_callback * st_last[LIB3270_STATE_USER]; - struct lib3270_session_callbacks cbk; - - // Session based callbacks - /* - int (*write)(H3270 *hSession, unsigned const char *buf, int len); - void (*disconnect)(H3270 *hSession); - - void (*configure)(H3270 *session, unsigned short rows, unsigned short cols); - void (*update)(H3270 *session, int baddr, unsigned char c, unsigned short attr, unsigned char cursor); - void (*changed)(H3270 *session, int offset, int len); - void (*display)(H3270 *session); - void (*set_width)(H3270 *session, int width); - - void (*update_cursor)(H3270 *session, unsigned short row, unsigned short col, unsigned char c, unsigned short attr); - void (*update_oia)(H3270 *session, LIB3270_FLAG id, unsigned char on); - void (*update_toggle)(H3270 *session, LIB3270_TOGGLE ix, unsigned char value, LIB3270_TOGGLE_TYPE reason, const char *name); - void (*update_luname)(H3270 *session, const char *name); - void (*update_status)(H3270 *session, LIB3270_MESSAGE id); - void (*update_connect)(H3270 *session, unsigned char connected); - void (*update_model)(H3270 *session, const char *name, int model, int rows, int cols); - void (*update_selection)(H3270 *session, int start, int end); - void (*update_ssl)(H3270 *session, LIB3270_SSL_STATE state); - - void (*set_timer)(H3270 *session, unsigned char on); - void (*erase)(H3270 *session); - void (*suspend)(H3270 *session); - void (*resume)(H3270 *session); - void (*cursor)(H3270 *session, LIB3270_CURSOR id); - void (*set_selection)(H3270 *session, unsigned char on); - void (*ctlr_done)(H3270 *session); - void (*autostart)(H3270 *session); - int (*print)(H3270 *session); - - void (*message)(H3270 *session, LIB3270_NOTIFY id , const char *title, const char *message, const char *text); - */ - - }; - - #endif // LIB3270_SESSION_H_INCLUDED diff --git a/src/lib3270/host.c b/src/lib3270/host.c index b371c54..992fe19 100644 --- a/src/lib3270/host.c +++ b/src/lib3270/host.c @@ -375,3 +375,26 @@ LIB3270_EXPORT const char * lib3270_get_luname(H3270 *h) return h->connected_lu; } +LIB3270_EXPORT int lib3270_has_active_script(H3270 *h) +{ + CHECK_SESSION_HANDLE(h); + 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); +} + +LIB3270_EXPORT int lib3270_get_undera(H3270 *h) +{ + CHECK_SESSION_HANDLE(h); + 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); +} diff --git a/src/lib3270/private.h b/src/lib3270/private.h index 1c6ec61..cb2edf7 100644 --- a/src/lib3270/private.h +++ b/src/lib3270/private.h @@ -24,15 +24,13 @@ * * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) * erico.mendonca@gmail.com (Erico Mascarenhas de 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) * */ /* Autoconf settings. */ #include /* autoconf settings */ #include /* lib3270 API calls and defs */ +#include #include "api.h" #if defined(X3270_TN3270E) && !defined(X3270_ANSI) /*[*/ @@ -148,20 +146,19 @@ struct toggle_name { /* Naming convention for private actions. */ #define PA_PFX "PA-" -/* Shorthand macros */ - +/// @brief Shorthand macros #define CN ((char *) NULL) #define PN ((XtPointer) NULL) #define Replace(var, value) { lib3270_free(var); var = (value); }; -/* Configuration change masks. */ -#define NO_CHANGE 0x0000 /* no change */ -#define MODEL_CHANGE 0x0001 /* screen dimensions changed */ -#define FONT_CHANGE 0x0002 /* emulator font changed */ -#define COLOR_CHANGE 0x0004 /* color scheme or 3278/9 mode changed */ -#define SCROLL_CHANGE 0x0008 /* scrollbar snapped on or off */ -#define CHARSET_CHANGE 0x0010 /* character set changed */ -#define ALL_CHANGE 0xffff /* everything changed */ +/// @brief Configuration change masks. +#define NO_CHANGE 0x0000 /// @brief no change +#define MODEL_CHANGE 0x0001 /// @brief screen dimensions changed +#define FONT_CHANGE 0x0002 /// @brief emulator font changed +#define COLOR_CHANGE 0x0004 /// @brief color scheme or 3278/9 mode changed +#define SCROLL_CHANGE 0x0008 /// @brief scrollbar snapped on or off +#define CHARSET_CHANGE 0x0010 /// @brief character set changed +#define ALL_CHANGE 0xffff /// @brief everything changed /* Portability macros */ @@ -186,7 +183,7 @@ struct toggle_name { /* DBCS Preedit Types */ #if defined(X3270_DBCS) /*[*/ - #define PT_ROOT "Root" + #define PT_ROOT "Root" #define PT_OVER_THE_SPOT "OverTheSpot" #define PT_OFF_THE_SPOT "OffTheSpot" #define PT_ON_THE_SPOT "OnTheSpot" @@ -211,7 +208,7 @@ LIB3270_INTERNAL struct _ansictl char vlnext; } ansictl; -/** extended attributes */ +/** @brief Extended attributes */ struct lib3270_ea { unsigned char cc; ///< @brief EBCDIC or ASCII character code @@ -230,21 +227,346 @@ struct lib3270_text unsigned short attr; ///< @brief Converted character attribute (color & etc) }; +#ifndef HEADER_SSL_H + #define SSL void +#endif // !HEADER_SSL_H + +#ifndef LIB3270_TA + #define LIB3270_TA void +#endif // !LIB3270_TA + +#define LIB3270_MB_MAX 16 +#define LIB3270_DEFAULT_CGEN 0x02b90000 +#define LIB3270_DEFAULT_CSET 0x00000025 + +#define LIB3270_LUNAME_LENGTH 16 +#define LIB3270_FULL_MODEL_NAME_LENGTH 13 +#define LIB3270_LU_MAX 32 +#define LIB3270_TELNET_N_OPTS 256 -/* default charset translation tables */ -// LIB3270_INTERNAL const unsigned short ebc2asc0[256]; -// LIB3270_INTERNAL const unsigned short asc2ft0[256]; +/** @brief lib3270 session data */ +struct _h3270 +{ + unsigned short sz; /**< Struct size */ + + // Connection info + int sock; /**< Network socket */ + LIB3270_CSTATE cstate; /**< Connection state */ + + // flags + LIB3270_OPTION options; /**< Session options */ + + int bgthread : 1; /**< Running on a background thread ? */ + int selected : 1; /**< Has selected region? */ + int rectsel : 1; /**< Selected region is a rectangle ? */ + int vcontrol : 1; /**< Visible control ? */ + int modified_sel : 1; + int mono : 1; /**< Forces monochrome display */ + int m3279 : 1; + int extended : 1; + int typeahead : 1; + int numeric_lock : 1; + int oerr_lock : 1; + int unlock_delay : 1; + int auto_reconnect_inprogress : 1; + unsigned int colors : 5; + int apl_mode : 1; + int icrnl : 1; + int inlcr : 1; + int onlcr : 1; + int bsd_tm : 1; + int syncing : 1; + int reverse : 1; /**< reverse-input mode */ + int dbcs : 1; + int linemode : 1; + int trace_skipping : 1; + int need_tls_follows : 1; + int cut_xfer_in_progress : 1; +// int auto_keymap : 1; + int formatted : 1; /**< Formatted screen flag */ + int starting : 1; /**< Is starting (no first screen)? */ + + char * oversize; + + LIB3270_SSL_STATE secure; + + struct lib3270_toggle + { + char value; /**< toggle value */ + void (*upcall)(H3270 *, struct lib3270_toggle *, LIB3270_TOGGLE_TYPE); /**< change value */ + } toggle[LIB3270_TOGGLE_COUNT]; + + // Network & Termtype + char * connected_type; + char * connected_lu; + char luname[LIB3270_LUNAME_LENGTH+1]; + + char full_model_name[LIB3270_FULL_MODEL_NAME_LENGTH+1]; + char * model_name; + int model_num; + char * termtype; + + struct + { + char * current; /**< The hostname part, stripped of qualifiers, luname and port number */ + char * full; /**< The entire string, for use in reconnecting */ + char * srvc; /**< The service name */ + char * qualified; + } host; + + char * proxy; /**< Proxy server (type:host[:port]) */ + char * termname; + + struct lib3270_charset charset; + + LIB3270_MESSAGE oia_status; + + unsigned char oia_flag[LIB3270_FLAG_COUNT]; + + unsigned short current_port; + + // Misc + void * ft; /**< Active file transfer data */ + + // screen info + int ov_rows; + int ov_cols; + int maxROWS; + int maxCOLS; + unsigned short rows; + unsigned short cols; + int cursor_addr; + int buffer_addr; + char flipped; + int screen_alt; /**< alternate screen? */ + int is_altbuffer; + + // Screen contents + void * buffer[2]; /**< Internal buffers */ + struct lib3270_ea * ea_buf; /**< 3270 device buffer. ea_buf[-1] is the dummy default field attribute */ + struct lib3270_ea * aea_buf; /**< alternate 3270 extended attribute buffer */ + struct lib3270_text * text; /**< Converted 3270 chars */ + + // host.c + char std_ds_host; + char no_login_host; + char non_tn3270e_host; + char passthru_host; + char ssl_host; + char ever_3270; + + // ctlr.c + int sscp_start; + unsigned char default_fg; + unsigned char default_bg; + unsigned char default_gr; + unsigned char default_cs; + unsigned char default_ic; + char reply_mode; + int trace_primed : 1; + int ticking : 1; + int mticking : 1; + int crm_nattr; + unsigned char crm_attr[16]; + unsigned char * zero_buf; /**< empty buffer, for area clears */ + + struct timeval t_start; + void * tick_id; + struct timeval t_want; + + // Telnet.c + unsigned char * ibuf; + int ibuf_size; /**< size of ibuf */ + unsigned char * obuf; /**< 3270 output buffer */ + unsigned char * obptr; + time_t ns_time; + int ns_brcvd; + int ns_rrcvd; + int ns_bsent; + int ns_rsent; + struct timeval ds_ts; + unsigned long e_funcs; /**< negotiated TN3270E functions */ + unsigned short e_xmit_seq; /**< transmit sequence number */ + int response_required; + int tn3270e_bound; + int tn3270e_negotiated; + int ansi_data; + int lnext; + int backslashed; + char plu_name[LIB3270_BIND_PLU_NAME_MAX+1]; + char **lus; + char **curr_lu; + char * try_lu; + int proxy_type; + char * proxy_host; + char * proxy_portname; + unsigned short proxy_port; + char reported_lu[LIB3270_LU_MAX+1]; + char reported_type[LIB3270_LU_MAX+1]; + + enum + { + E_NONE, + E_3270, + E_NVT, + E_SSCP + } tn3270e_submode; + + unsigned char * lbuf; /**< line-mode input buffer */ + unsigned char * lbptr; + + + // 3270 input buffer + unsigned char * ibptr; + unsigned char * obuf_base; + int obuf_size; +// unsigned char * netrbuf; + + // network input buffer + unsigned char * sbbuf; + + // telnet sub-option buffer + unsigned char * sbptr; + unsigned char telnet_state; +// char ttype_tmpval[13]; + + unsigned char myopts[LIB3270_TELNET_N_OPTS]; + unsigned char hisopts[LIB3270_TELNET_N_OPTS]; + + // kybd.c + unsigned int kybdlock; ///< @brief keyboard lock state + unsigned char aid; ///< @brief current attention ID + void * unlock_id; + time_t unlock_delay_time; + unsigned long unlock_delay_ms; ///< @brief Delay before actually unlocking the keyboard after the host permits it. + LIB3270_TA * ta_head; + LIB3270_TA * ta_tail; + + // ft_dft.c + int dft_buffersize; ///< @brief Buffer size (LIMIN, LIMOUT) + + // rpq.c + int rpq_complained : 1; +#if !defined(_WIN32) + int omit_due_space_limit : 1; +#endif + char * rpq_warnbuf; + int rpq_wbcnt; + + // User data (Usually points to session's widget) + void * user_data; + + // selection + char * paste_buffer; + struct + { + int start; + int end; + } select; + + // ansi.c + int scroll_top; + int scroll_bottom; + int once_cset; + int saved_cursor; + + int held_wrap : 1; + + int insert_mode : 1; + int auto_newline_mode : 1; + + int appl_cursor : 1; + int saved_appl_cursor : 1; + + int wraparound_mode : 1; + int saved_wraparound_mode : 1; + + int rev_wraparound_mode : 1; + int saved_rev_wraparound_mode : 1; + + int allow_wide_mode : 1; + int saved_allow_wide_mode : 1; + + int wide_mode : 1; + int saved_wide_mode : 1; + + int saved_altbuffer : 1; + int ansi_reset : 1; /**< Non zero if the ansi_reset() was called in this session */ + + int ansi_ch; + int cs_to_change; + + /** ANSI Character sets. */ + enum lib3270_ansi_cs + { + LIB3270_ANSI_CS_G0 = 0, + LIB3270_ANSI_CS_G1 = 1, + LIB3270_ANSI_CS_G2 = 2, + LIB3270_ANSI_CS_G3 = 3 + } cset; + enum lib3270_ansi_cs saved_cset; + + /** Character set designations. */ + enum lib3270_ansi_csd + { + LIB3270_ANSI_CSD_LD = 0, + LIB3270_ANSI_CSD_UK = 1, + LIB3270_ANSI_CSD_US = 2 + } csd[4]; + enum lib3270_ansi_csd saved_csd[4]; + + enum lib3270_ansi_state + { + LIB3270_ANSI_STATE_DATA = 0, + LIB3270_ANSI_STATE_ESC = 1, + LIB3270_ANSI_STATE_CSDES = 2, + LIB3270_ANSI_STATE_N1 = 3, + LIB3270_ANSI_STATE_DECP = 4, + LIB3270_ANSI_STATE_TEXT = 5, + LIB3270_ANSI_STATE_TEXT2 = 6, + LIB3270_ANSI_STATE_MBPEND = 7 + } state; + + unsigned char * tabs; + + int pmi; + char pending_mbs[LIB3270_MB_MAX]; + + unsigned char gr; + unsigned char saved_gr; + + unsigned char fg; + unsigned char saved_fg; + + unsigned char bg; + unsigned char saved_bg; + + // xio + void * ns_read_id; + void * ns_write_id; + void * ns_exception_id; + + // SSL Data (Always defined to mantain the same structure size) + unsigned long ssl_error; + SSL * ssl_con; + + // Callbacks. + struct lib3270_state_callback * st_callbacks[LIB3270_STATE_USER]; + struct lib3270_state_callback * st_last[LIB3270_STATE_USER]; + struct lib3270_session_callbacks cbk; + +}; /* Library internal calls */ -LIB3270_INTERNAL void key_ACharacter(H3270 *hSession, unsigned char c, enum keytype keytype, enum iaction cause,Boolean *skipped); -LIB3270_INTERNAL void lib3270_initialize(void); -LIB3270_INTERNAL int cursor_move(H3270 *session, int baddr); +LIB3270_INTERNAL void key_ACharacter(H3270 *hSession, unsigned char c, enum keytype keytype, enum iaction cause,Boolean *skipped); +LIB3270_INTERNAL void lib3270_initialize(void); +LIB3270_INTERNAL int cursor_move(H3270 *session, int baddr); -LIB3270_INTERNAL void toggle_rectselect(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE tt); -LIB3270_INTERNAL void remove_input_calls(H3270 *session); +LIB3270_INTERNAL void toggle_rectselect(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE tt); +LIB3270_INTERNAL void remove_input_calls(H3270 *session); LIB3270_INTERNAL int lib3270_sock_send(H3270 *hSession, unsigned const char *buf, int len); LIB3270_INTERNAL void lib3270_sock_disconnect(H3270 *hSession); @@ -259,7 +581,7 @@ LIB3270_INTERNAL int lib3270_default_event_dispatcher(H3270 *hSession, int block LIB3270_INTERNAL void check_session_handle(H3270 **hSession); #endif // DEBUG -LIB3270_INTERNAL int non_blocking(H3270 *session, Boolean on); +LIB3270_INTERNAL int non_blocking(H3270 *session, Boolean on); #if defined(HAVE_LIBSSL) /*[*/ diff --git a/src/pw3270/v3270/draw.c b/src/pw3270/v3270/draw.c index 20e9adf..1e1a363 100644 --- a/src/pw3270/v3270/draw.c +++ b/src/pw3270/v3270/draw.c @@ -400,7 +400,7 @@ void v3270_reload(GtkWidget *widget) void v3270_update_char(H3270 *session, int addr, unsigned char chr, unsigned short attr, unsigned char cursor) { - v3270 * terminal = GTK_V3270(session->user_data); + v3270 * terminal = GTK_V3270(lib3270_get_user_data(session)); cairo_t * cr; GdkRectangle rect; int rows,cols; diff --git a/src/pw3270/v3270/oia.c b/src/pw3270/v3270/oia.c index 213e80f..6d340cb 100644 --- a/src/pw3270/v3270/oia.c +++ b/src/pw3270/v3270/oia.c @@ -765,7 +765,7 @@ static void draw_cursor_position(cairo_t *cr, GdkRectangle *rect, v3270FontInfo void v3270_update_cursor(H3270 *session, unsigned short row, unsigned short col, unsigned char c, unsigned short attr) { - v3270 * terminal = GTK_V3270(session->user_data); + v3270 * terminal = GTK_V3270(lib3270_get_user_data(session)); GdkRectangle saved; if(!terminal->surface) @@ -1081,9 +1081,7 @@ void v3270_stop_timer(GtkWidget *widget) void v3270_update_ssl(H3270 *session, LIB3270_SSL_STATE state) { - debug("%s **************************************** %d",__FUNCTION__,(int) state); - - v3270 * terminal = GTK_V3270(session->user_data); + v3270 * terminal = GTK_V3270(lib3270_get_user_data(session)); cairo_t * cr; GdkRectangle * r; @@ -1102,7 +1100,7 @@ void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on) cairo_t *cr; GdkRectangle *r; - v3270 *terminal = GTK_V3270(session->user_data); + v3270 *terminal = GTK_V3270(lib3270_get_user_data(session)); if(!(terminal->surface && terminal->drawing)) return; diff --git a/src/pw3270/v3270/widget.c b/src/pw3270/v3270/widget.c index 82f6562..6f4d626 100644 --- a/src/pw3270/v3270/widget.c +++ b/src/pw3270/v3270/widget.c @@ -639,7 +639,7 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int heig static void set_timer(H3270 *session, unsigned char on) { - GtkWidget *widget = GTK_WIDGET(session->user_data); + GtkWidget *widget = GTK_WIDGET(lib3270_get_user_data(session)); if(on) v3270_start_timer(widget); @@ -650,6 +650,8 @@ static void set_timer(H3270 *session, unsigned char on) static void update_toggle(H3270 *session, LIB3270_TOGGLE ix, unsigned char value, LIB3270_TOGGLE_TYPE reason, const char *name) { + GtkWidget *widget = GTK_WIDGET(lib3270_get_user_data(session)); + trace("Toggle %s is %s",name,value ? "ON" : "OFF"); switch(ix) @@ -665,29 +667,29 @@ static void update_toggle(H3270 *session, LIB3270_TOGGLE ix, unsigned char value case LIB3270_TOGGLE_UNDERLINE: case LIB3270_TOGGLE_VIEW_FIELD: case LIB3270_TOGGLE_ALTSCREEN: - v3270_reload(GTK_WIDGET(session->user_data)); - gtk_widget_queue_draw(GTK_WIDGET(session->user_data)); + v3270_reload(widget); + gtk_widget_queue_draw(widget); break; case LIB3270_TOGGLE_CURSOR_BLINK: - GTK_V3270(session->user_data)->cursor.show |= 1; + GTK_V3270(widget)->cursor.show |= 1; break; case LIB3270_TOGGLE_INSERT: - v3270_draw_ins_status(GTK_V3270(session->user_data)); - v3270_cursor_draw(GTK_V3270(session->user_data)); + v3270_draw_ins_status(GTK_V3270(widget)); + v3270_cursor_draw(GTK_V3270(widget)); break; case LIB3270_TOGGLE_BOLD: - v3270_reload(GTK_WIDGET(session->user_data)); - gtk_widget_queue_draw(GTK_WIDGET(session->user_data)); + v3270_reload(widget); + gtk_widget_queue_draw(widget); break; case LIB3270_TOGGLE_FULL_SCREEN: if(value) - gtk_window_fullscreen(GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(session->user_data)))); + gtk_window_fullscreen(GTK_WINDOW(gtk_widget_get_toplevel(widget))); else - gtk_window_unfullscreen(GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(session->user_data)))); + gtk_window_unfullscreen(GTK_WINDOW(gtk_widget_get_toplevel(widget))); break; @@ -709,27 +711,27 @@ static void update_toggle(H3270 *session, LIB3270_TOGGLE ix, unsigned char value } #if GTK_CHECK_VERSION(2,26,0) - g_object_notify_by_pspec(G_OBJECT(session->user_data), v3270_properties[PROP_TOGGLE+ix]); + g_object_notify_by_pspec(G_OBJECT(widget), v3270_properties[PROP_TOGGLE+ix]); #else - g_object_notify(G_OBJECT(session->user_data),name); + g_object_notify(G_OBJECT(widget),name); #endif // GTK_CHECK_VERSION - g_signal_emit(GTK_WIDGET(session->user_data), v3270_widget_signal[SIGNAL_TOGGLE_CHANGED], 0, (guint) ix, (gboolean) (value != 0), (gchar *) name); + g_signal_emit(widget, v3270_widget_signal[SIGNAL_TOGGLE_CHANGED], 0, (guint) ix, (gboolean) (value != 0), (gchar *) name); } static void update_message(H3270 *session, LIB3270_MESSAGE id) { - g_signal_emit(GTK_WIDGET(session->user_data), v3270_widget_signal[SIGNAL_MESSAGE_CHANGED], 0, (gint) id); + g_signal_emit(GTK_WIDGET(lib3270_get_user_data(session)), v3270_widget_signal[SIGNAL_MESSAGE_CHANGED], 0, (gint) id); } static void update_luname(H3270 *session, const char *name) { - v3270_update_luname(GTK_WIDGET(session->user_data),name); + v3270_update_luname(GTK_WIDGET(lib3270_get_user_data(session)),name); } static void select_cursor(H3270 *session, LIB3270_CURSOR id) { - GtkWidget *widget = GTK_WIDGET(session->user_data); + GtkWidget *widget = GTK_WIDGET(lib3270_get_user_data(session)); #if GTK_CHECK_VERSION(2,20,0) if(gtk_widget_get_realized(widget) && gtk_widget_get_has_window(widget)) @@ -744,7 +746,7 @@ static void select_cursor(H3270 *session, LIB3270_CURSOR id) static void ctlr_done(H3270 *session) { - GtkWidget *widget = GTK_WIDGET(session->user_data); + GtkWidget *widget = GTK_WIDGET(lib3270_get_user_data(session)); #if GTK_CHECK_VERSION(2,20,0) if(gtk_widget_get_realized(widget) && gtk_widget_get_has_window(widget)) @@ -759,14 +761,14 @@ static void ctlr_done(H3270 *session) static void update_connect(H3270 *session, unsigned char connected) { - v3270 *widget = GTK_V3270(session->user_data); + v3270 *widget = GTK_V3270(lib3270_get_user_data(session)); trace("%s - %s",__FUNCTION__,connected ? "Connected" : "Disconnected"); if(connected) { widget->cursor.show |= 2; - g_signal_emit(GTK_WIDGET(widget), v3270_widget_signal[SIGNAL_CONNECTED], 0, session->host.full); + g_signal_emit(GTK_WIDGET(widget), v3270_widget_signal[SIGNAL_CONNECTED], 0, lib3270_get_host(session)); } else { @@ -788,23 +790,23 @@ static void update_connect(H3270 *session, unsigned char connected) static void update_screen_size(H3270 *session,unsigned short rows, unsigned short cols) { // trace("Widget %p changes to %dx%d",session->widget,cols,rows); - v3270_reload(GTK_WIDGET(session->user_data)); - gtk_widget_queue_draw(GTK_WIDGET(session->user_data)); + v3270_reload(GTK_WIDGET(lib3270_get_user_data(session))); + gtk_widget_queue_draw(GTK_WIDGET(lib3270_get_user_data(session))); } static void update_model(H3270 *session, const char *name, int model, int rows, int cols) { #if GTK_CHECK_VERSION(2,26,0) - g_object_notify_by_pspec(G_OBJECT(session->user_data), v3270_properties[PROP_MODEL]); + g_object_notify_by_pspec(G_OBJECT(lib3270_get_user_data(session)), v3270_properties[PROP_MODEL]); #else - g_object_notify(G_OBJECT(session->user_data),"model"); + g_object_notify(G_OBJECT(lib3270_get_user_data(session)),"model"); #endif // GTK_CHECK_VERSION - g_signal_emit(GTK_WIDGET(session->user_data),v3270_widget_signal[SIGNAL_MODEL_CHANGED], 0, (guint) model, name); + g_signal_emit(GTK_WIDGET(lib3270_get_user_data(session)),v3270_widget_signal[SIGNAL_MODEL_CHANGED], 0, (guint) model, name); } static void changed(H3270 *session, int offset, int len) { - GtkWidget * widget = session->user_data; + GtkWidget * widget = lib3270_get_user_data(session); GtkAccessible * obj = GTK_V3270(widget)->accessible; #ifdef WIN32 @@ -863,7 +865,7 @@ static void changed(H3270 *session, int offset, int len) static void set_selection(H3270 *session, unsigned char status) { - GtkWidget * widget = GTK_WIDGET(session->user_data); + GtkWidget * widget = GTK_WIDGET(lib3270_get_user_data(session)); #if GTK_CHECK_VERSION(2,26,0) g_object_notify_by_pspec(G_OBJECT(widget), v3270_properties[PROP_SELECTION]); @@ -877,7 +879,7 @@ static void set_selection(H3270 *session, unsigned char status) static void update_selection(H3270 *session, int start, int end) { // Selected region changed - GtkWidget * widget = GTK_WIDGET(session->user_data); + GtkWidget * widget = GTK_WIDGET(lib3270_get_user_data(session)); GtkAccessible * atk_obj = GTK_V3270(widget)->accessible; if(atk_obj) @@ -887,7 +889,7 @@ static void update_selection(H3270 *session, int start, int end) static void message(H3270 *session, LIB3270_NOTIFY id , const char *title, const char *message, const char *text) { - g_signal_emit( GTK_WIDGET(session->user_data), v3270_widget_signal[SIGNAL_MESSAGE], 0, + g_signal_emit( GTK_WIDGET(lib3270_get_user_data(session)), v3270_widget_signal[SIGNAL_MESSAGE], 0, (int) id, (gchar *) title, (gchar *) message, @@ -897,7 +899,7 @@ static void message(H3270 *session, LIB3270_NOTIFY id , const char *title, const static int emit_print_signal(H3270 *session) { - g_signal_emit(GTK_WIDGET(session->user_data), v3270_widget_signal[SIGNAL_PRINT], 0); + g_signal_emit(GTK_WIDGET(lib3270_get_user_data(session)), v3270_widget_signal[SIGNAL_PRINT], 0); return 0; } @@ -920,10 +922,11 @@ static void v3270_init(v3270 *widget) { struct lib3270_session_callbacks *cbk; - widget->host = lib3270_session_new(""); - widget->host->user_data = widget; + widget->host = lib3270_session_new(""); + lib3270_set_user_data(widget->host,widget); + /* trace("%s host->sz=%d expected=%d revision=%s expected=%s",__FUNCTION__,widget->host->sz,(int) sizeof(H3270),lib3270_get_revision(),PACKAGE_REVISION); if(widget->host->sz != sizeof(H3270)) @@ -931,6 +934,7 @@ static void v3270_init(v3270 *widget) g_error( _( "Unexpected signature in H3270 object, possible version mismatch in lib3270") ); return; } + */ cbk = lib3270_get_session_callbacks(widget->host,sizeof(struct lib3270_session_callbacks)); if(!cbk) @@ -1689,13 +1693,15 @@ GtkWidget * v3270_get_default_widget(void) return NULL; } - if(!(hSession->user_data && GTK_IS_V3270(hSession->user_data))) + GtkWidget *widget = lib3270_get_user_data(hSession); + + if(!(widget && GTK_IS_V3270(widget))) { g_warning("No widget on default session on %s",__FUNCTION__); return NULL; } - return GTK_WIDGET(hSession->user_data); + return GTK_WIDGET(widget); } void v3270_disable_updates(GtkWidget *widget) -- libgit2 0.21.2