api.h 18.9 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572
/*
 * "Software PW3270, desenvolvido com base nos códigos fontes do WC3270  e X3270
 * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
 * aplicativos mainframe. Registro no INPI sob o nome G3270.
 *
 * Copyright (C) <2008> <Banco do Brasil S.A.>
 *
 * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
 * os termos da GPL v.2 - Licença Pública Geral  GNU,  conforme  publicado  pela
 * Free Software Foundation.
 *
 * Este programa é distribuído na expectativa de  ser  útil,  mas  SEM  QUALQUER
 * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou  de  ADEQUAÇÃO
 * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
 * obter mais detalhes.
 *
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
 * programa;  se  não, escreva para a Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330, Boston, MA, 02111-1307, USA
 *
 * Este programa está nomeado como api.h e possui 444 linhas de código.
 *
 * Contatos:
 *
 * 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)
 *
 */


#ifndef LIB3270_API_INCLUDED

#ifdef __cplusplus
	extern "C" {
#endif

		#define LIB3270_API_INCLUDED "4.2"

		#include <errno.h>

		#if defined(_WIN32)
			#include <windows.h>

			#define LIB3270_EXPORT	__declspec (dllexport)

			#if defined (HAVE_GNUC_VISIBILITY)
					#define LOCAL_EXTERN	__attribute__((visibility("hidden"))) extern
			#else
					#define LOCAL_EXTERN extern
			#endif

		#else
			#include <stdarg.h>

			// http://gcc.gnu.org/wiki/Visibility
			#if defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
					#define LOCAL_EXTERN __hidden extern
					#define LIB3270_EXPORT
			#elif defined (HAVE_GNUC_VISIBILITY)
					#define LOCAL_EXTERN	__attribute__((visibility("hidden"))) extern
					#define LIB3270_EXPORT	__attribute__((visibility("default"))) extern
			#else
					#define LOCAL_EXTERN extern
					#define LIB3270_EXPORT
			#endif


		#endif

		#ifndef HCONSOLE
			#define HCONSOLE void *
		#endif

		#ifndef ETIMEDOUT
			#define ETIMEDOUT -1238
		#endif

		#ifndef ECANCELED
			#ifdef EINTR
				#define ECANCELED EINTR
			#else
				#define ECANCELED -1125
			#endif
		#endif

		#ifndef ENOTCONN
			#define ENOTCONN -1107
		#endif

		#ifndef CN
			#define CN ((char *) NULL)
		#endif

		/* Debug & log */
		#if defined( DEBUG )
			#define Trace( fmt, ... )		fprintf(stderr, "%s(%d) " fmt "\n", __FILE__, __LINE__, __VA_ARGS__ ); fflush(stderr); \
											WriteLog("TRACE", "%s(%d) " fmt , __FILE__, __LINE__, __VA_ARGS__ )
		#else
			#define Trace( fmt, ... )	/* __VA_ARGS__ */
		#endif


		LIB3270_EXPORT int Set3270Log(const char *filename);
		LIB3270_EXPORT int WriteLog(const char *module, const char *fmt, ...);
		LIB3270_EXPORT int WriteRCLog(const char *module, int rc, const char *fmt, ...);

		#ifdef LIB3270_MODULE_NAME
			#define Log(fmt, ...)		WriteLog(LIB3270_MODULE_NAME,fmt,__VA_ARGS__)
		#else
			#define Log(fmt, ...)		WriteLog("MSG",fmt,__VA_ARGS__)
		#endif

		/** 3270 connection handle */
		#define LUNAME_SIZE				16
		#define FULL_MODEL_NAME_SIZE	13

		#define ST_RESOLVING			LIB3270_STATE_RESOLVING
		#define ST_HALF_CONNECT			LIB3270_STATE_HALF_CONNECT
		#define ST_CONNECT				LIB3270_STATE_CONNECT
		#define ST_3270_MODE			LIB3270_STATE_3270_MODE
		#define ST_LINE_MODE			LIB3270_STATE_LINE_MODE
		#define ST_REMODEL				LIB3270_STATE_REMODEL
		#define ST_PRINTER				LIB3270_STATE_PRINTER
		#define ST_EXITING				LIB3270_STATE_EXITING
		#define ST_CHARSET				LIB3270_STATE_CHARSET
		#define N_ST					LIB3270_STATE_USER
		#define LIB3270_STATE_CHANGE	LIB3270_STATE

		/** connection state */
		#define cstate LIB3270_CSTATE
		#define NOT_CONNECTED	LIB3270_NOT_CONNECTED
		#define RESOLVING	LIB3270_RESOLVING
		#define PENDING	LIB3270_PENDING
		#define CONNECTED_INITIAL	LIB3270_CONNECTED_INITIAL
		#define CONNECTED_ANSI	LIB3270_CONNECTED_ANSI
		#define CONNECTED_3270	LIB3270_CONNECTED_3270
		#define CONNECTED_INITIAL_E	LIB3270_CONNECTED_INITIAL_E
		#define CONNECTED_NVT	LIB3270_CONNECTED_NVT
		#define CONNECTED_SSCP	LIB3270_CONNECTED_SSCP
		#define CONNECTED_TN3270E	LIB3270_CONNECTED_TN3270E

		#define LIB3270_STATUS					LIB3270_MESSAGE
		#define LIB3270_STATUS_BLANK			LIB3270_MESSAGE_NONE
		#define LIB3270_STATUS_SYSWAIT			LIB3270_MESSAGE_SYSWAIT
		#define LIB3270_STATUS_TWAIT			LIB3270_MESSAGE_TWAIT
		#define LIB3270_STATUS_CONNECTED		LIB3270_MESSAGE_CONNECTED
		#define LIB3270_STATUS_DISCONNECTED		LIB3270_MESSAGE_DISCONNECTED
		#define LIB3270_STATUS_AWAITING_FIRST	LIB3270_MESSAGE_AWAITING_FIRST
		#define LIB3270_STATUS_MINUS			LIB3270_MESSAGE_MINUS
		#define LIB3270_STATUS_PROTECTED		LIB3270_MESSAGE_PROTECTED
		#define LIB3270_STATUS_NUMERIC			LIB3270_MESSAGE_NUMERIC
		#define LIB3270_STATUS_OVERFLOW			LIB3270_MESSAGE_OVERFLOW
		#define LIB3270_STATUS_INHIBIT			LIB3270_MESSAGE_INHIBIT
		#define LIB3270_STATUS_KYBDLOCK			LIB3270_MESSAGE_KYBDLOCK
		#define LIB3270_STATUS_X				LIB3270_MESSAGE_X
		#define LIB3270_STATUS_RESOLVING		LIB3270_MESSAGE_RESOLVING
		#define LIB3270_STATUS_CONNECTING		LIB3270_MESSAGE_CONNECTING
		#define LIB3270_STATUS_USER				LIB3270_MESSAGE_USER

		#define OIA_FLAG_BOXSOLID	LIB3270_FLAG_BOXSOLID
		#define OIA_FLAG_UNDERA		LIB3270_FLAG_UNDERA
		#define OIA_FLAG_SECURE		LIB3270_FLAG_SECURE
		#define OIA_FLAG_TYPEAHEAD	LIB3270_FLAG_TYPEAHEAD
		#define OIA_FLAG_PRINTER	LIB3270_FLAG_PRINTER
		#define OIA_FLAG_REVERSE	LIB3270_FLAG_REVERSE
		#define OIA_FLAG_USER		LIB3270_FLAG_COUNT
		#define OIA_FLAG			LIB3270_FLAG

		struct lib3270_state_callback;

		typedef struct _h3270 H3270;

		struct _h3270
		{
			unsigned short 	  sz;				/**< Struct size */

			// Connection info
			int					  secure_connection;
			int      			  sock;					/**< Network socket */
			int					  net_sock;
			LIB3270_CSTATE		  cstate;				/**< Connection state */

			#if defined(_WIN32) /*[*/
			HANDLE				  sock_handle;
			#endif /*]*/

			char    			* hostname;
			char				* connected_type;
			char				* connected_lu;
			char				  luname[LUNAME_SIZE+1];

			char				  full_model_name[FULL_MODEL_NAME_SIZE+1];
			char				* model_name;
			int					  model_num;
			char       	    	* termtype;

			char				* current_host;			/**< the hostname part, stripped of qualifiers, luname and port number */
			char           		* full_current_host;	/**< the entire string, for use in reconnecting */
			char	       		* reconnect_host;
			char	       		* qualified_host;
			char	 			  auto_reconnect_inprogress;

			LIB3270_MESSAGE		  oia_status;

			unsigned char 		  oia_flag[LIB3270_FLAG_COUNT];

			unsigned short		  current_port;

			// screen info
			int					  ov_rows;
			int					  ov_cols;
//			int					  first_changed;
//			int					  last_changed;
			int					  maxROWS;
			int					  maxCOLS;
			unsigned short		  rows;
			unsigned short		  cols;
			int					  cursor_addr;
			char				  flipped;
			int					  screen_alt;			/**< alternate screen? */
			int					  is_altbuffer;

			int					  formatted;			/**< set in screen_disp */

			// host.c
			char 				  std_ds_host;
			char 				  no_login_host;
			char 				  non_tn3270e_host;
			char 				  passthru_host;
			char 				  ssl_host;
			char 				  ever_3270;

			// Widget info
			void				* widget;

			// xio
			unsigned long		  ns_read_id;
			unsigned long		  ns_exception_id;
			char				  reading;
			char				  excepting;

			/* State change callbacks. */
			struct lib3270_state_callback *st_callbacks[N_ST];
			struct lib3270_state_callback *st_last[N_ST];

			/* Session based callbacks */
			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 bstart, int bend);

			void (*update_cursor)(H3270 *session, unsigned short row, unsigned short col, unsigned char c, unsigned short attr);
			void (*update_oia)(H3270 *session, OIA_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_STATUS id);
			void (*update_connect)(H3270 *session, unsigned char connected);
			void (*update_model)(H3270 *session, const char *name, int model, int rows, int cols);

			void (*set_timer)(H3270 *session, unsigned char on);
			void (*erase)(H3270 *session);
			void (*cursor)(H3270 *session, LIB3270_CURSOR id);

		};

		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 */
		};


		/** Type of dialog boxes */
		typedef enum _PW3270_DIALOG
		{
			PW3270_DIALOG_INFO,		/**< Simple information dialog */
			PW3270_DIALOG_CRITICAL,	/**< Critical error, user can abort application */

			PW3270_DIALOG_USER
		} PW3270_DIALOG;

		/**  extended attributes */
		struct ea
		{
			unsigned char cc;		/**< EBCDIC or ASCII character code */
			unsigned char fa;		/**< field attribute, it nonzero */
			unsigned char fg;		/**< foreground color (0x00 or 0xf<n>) */
			unsigned char bg;		/**< background color (0x00 or 0xf<n>) */
			unsigned char gr;		/**< ANSI graphics rendition bits */
			unsigned char cs;		/**< character set (GE flag, or 0..2) */
			unsigned char ic;		/**< input control (DBCS) */
			unsigned char db;		/**< DBCS state */

			/* Updated by addch() */
			unsigned char  chr;		/**< ASCII character code */
			unsigned short attr;	/**< Converted character attribute (color & etc) */

		};
		#define GR_BLINK		0x01
		#define GR_REVERSE		0x02
		#define GR_UNDERLINE	0x04
		#define GR_INTENSIFY	0x08

		#define CS_MASK			0x03	/**< mask for specific character sets */
		#define CS_BASE			0x00	/**< base character set (X'00') */
		#define CS_APL			0x01	/**< APL character set (X'01' or GE) */
		#define CS_LINEDRAW		0x02	/**< DEC line-drawing character set (ANSI) */
		#define CS_DBCS			0x03	/**< DBCS character set (X'F8') */
		#define CS_GE			0x04	/**< cs flag for Graphic Escape */

		/**
		 * Return a "malloced" copy of the device buffer, set number of elements
		 */
		LIB3270_EXPORT struct ea * copy_device_buffer(int *el);

		/**
		 * Set the contents of the device buffer for debugging purposes
		 */
		LIB3270_EXPORT int  set_device_buffer(struct ea *src, int el);

		/* File transfer */
		#define FT_FLAG_RECEIVE					0x0001
		#define FT_FLAG_ASCII					0x0002
		#define FT_FLAG_CRLF					0x0004
		#define FT_FLAG_APPEND					0x0008
		#define FT_FLAG_TSO						0x0010
		#define FT_FLAG_REMAP_ASCII				0x0020

		#define FT_RECORD_FORMAT_FIXED			0x0100
		#define FT_RECORD_FORMAT_VARIABLE		0x0200
		#define FT_RECORD_FORMAT_UNDEFINED		0x0300
		#define FT_RECORD_FORMAT_MASK 			FT_RECORD_FORMAT_UNDEFINED

		#define FT_ALLOCATION_UNITS_TRACKS		0x1000
		#define FT_ALLOCATION_UNITS_CYLINDERS	0x2000
		#define FT_ALLOCATION_UNITS_AVBLOCK		0x3000
		#define FT_ALLOCATION_UNITS_MASK		FT_ALLOCATION_UNITS_AVBLOCK

		enum ft_state
		{
			FT_NONE,		/**< No transfer in progress */
			FT_AWAIT_ACK,	/**< IND$FILE sent, awaiting acknowledgement message */
			FT_RUNNING,		/**< Ack received, data flowing */
			FT_ABORT_WAIT,	/**< Awaiting chance to send an abort */
			FT_ABORT_SENT	/**< Abort sent; awaiting response */
		};

		LIB3270_EXPORT int 				BeginFileTransfer(unsigned short flags, const char *local, const char *remote, int lrecl, int blksize, int primspace, int secspace, int dft);
		LIB3270_EXPORT int 				CancelFileTransfer(int force);
		LIB3270_EXPORT enum ft_state	GetFileTransferState(void);

		struct filetransfer_callbacks
		{
			unsigned short sz;

			void (*begin)(unsigned short flags, const char *local, const char *remote);
			void (*complete)(const char *errmsg,unsigned long length,double kbytes_sec,const char *mode);
			void (*setlength)(unsigned long length);
			void (*update)(unsigned long length,double kbytes_sec);
			void (*running)(int is_cut);
			void (*aborting)(void);

		};

		LIB3270_EXPORT int RegisterFTCallbacks(const struct filetransfer_callbacks *cbk);

		#define PCONNECTED		lib3270_pconnected(NULL)
		#define HALF_CONNECTED	lib3270_half_connected(NULL)
		#define CONNECTED		lib3270_connected(NULL)

		#define IN_NEITHER		lib3270_in_neither(NULL)
		#define IN_ANSI			lib3270_in_ansi(NULL)
		#define IN_3270			lib3270_in_3270(NULL)
		#define IN_SSCP			lib3270_in_sscp(NULL)
		#define IN_TN3270E		lib3270_in_tn3270e(NULL)
		#define IN_E			lib3270_in_e(NULL)

		#ifndef LIB3270

			LIB3270_EXPORT enum ft_state	QueryFTstate(void);

		#endif

		#define Register3270IOCallbacks(x) lib3270_register_io_handlers(x)


		/* Screen processing */

		#define CURSOR_MODE_NORMAL		LIB3270_CURSOR_NORMAL
		#define CURSOR_MODE_WAITING		LIB3270_CURSOR_WAITING
		#define CURSOR_MODE_LOCKED		LIB3270_CURSOR_LOCKED

		typedef enum _SCRIPT_STATE
		{
			SCRIPT_STATE_NONE,
			SCRIPT_STATE_RUNNING,
			SCRIPT_STATE_HALTED,

			SCRIPT_STATE_USER

		} SCRIPT_STATE;

		typedef enum _COUNTER_ID
		{
			COUNTER_ID_CTLR_DONE,
			COUNTER_ID_RESET,

			COUNTER_ID_USER
		} COUNTER_ID;

		LIB3270_EXPORT int query_counter(COUNTER_ID id);

		#define	query_screen_change_counter() query_counter(COUNTER_ID_CTLR_DONE)

		#define COLOR_ATTR_NONE			0x0000
		#define COLOR_ATTR_FIELD		LIB3270_ATTR_FIELD
		#define COLOR_ATTR_BLINK		LIB3270_ATTR_BLINK
		#define COLOR_ATTR_UNDERLINE	LIB3270_ATTR_UNDERLINE
		#define COLOR_ATTR_INTENSIFY	LIB3270_ATTR_INTENSIFY

		#define CHAR_ATTR_CG			LIB3270_ATTR_CG
		#define CHAR_ATTR_MARKER		LIB3270_ATTR_MARKER

		#define CHAR_ATTR_UNCONVERTED	CHAR_ATTR_CG

		struct lib3270_screen_callbacks
		{
			unsigned short	sz;

			int		(*init)(void);
			int		(*popup_dialog)(H3270 *session, PW3270_DIALOG type, const char *title, const char *msg, const char *fmt, va_list arg);
			void	(*Error)(const char *fmt, va_list arg);
			void	(*Warning)(const char *fmt, va_list arg);
			void	(*SysError)(const char *title, const char *message, const char *system);
			void 	(*model_changed)(H3270 *session, const char *name, int model, int rows, int cols);
			int		(*addch)(int row, int col, unsigned char c, unsigned short attr);
			void	(*charset)(char *dcs);
			void	(*title)(char *text);
			void	(*ring_bell)(void);
			void	(*redraw)(void);
			void	(*move_cursor)(H3270 *session, unsigned short row, unsigned short col, unsigned char c, unsigned short attr);
			int		(*set_suspended)(int state);
			void	(*set_script)(SCRIPT_STATE state);
			void	(*reset)(int lock);
			void	(*status)(H3270 *session, LIB3270_STATUS id);
			void	(*cursor)(H3270 *session, LIB3270_CURSOR mode);
			void	(*lu)(H3270 *session, const char *lu);
			void	(*set_oia)(H3270 *session, OIA_FLAG id, unsigned char on);

			void	(*erase)(H3270 *session);
			void	(*display)(H3270 *session);
			void 	(*set_viewsize)(H3270 *session, unsigned short rows, unsigned short cols);


			void	(*toggle_changed)(H3270 *session, LIB3270_TOGGLE ix, unsigned char value, LIB3270_TOGGLE_TYPE reason, const char *name);
			void	(*show_timer)(long seconds);

			// Console/Trace window
			HCONSOLE	(*console_new)(const char *title, const char *label);
			void		(*console_delete)(HCONSOLE hwnd);
			int			(*console_append)(HCONSOLE hwnd, const char *fmt, va_list 	args);
			char *		(*console_entry)(HCONSOLE hwnd);

		};

		struct lib3270_option
		{
			const char *name;
			enum
			{
				OPT_BOOLEAN,
				OPT_STRING,
				OPT_INTEGER,
				OPT_XRM,
				OPT_SKIP2,
				OPT_NOP,
				OPT_DONE
			} type;
			unsigned char	flag;
			const char		*res_name;
			void			*aoff;
			const char		*description;
		};

		LIB3270_EXPORT int Register3270ScreenCallbacks(const struct lib3270_screen_callbacks *cbk);

		#define new_3270_session(m) lib3270_session_new(m)

		LIB3270_EXPORT const struct lib3270_option * get_3270_option_table(int sz);

		/* Popups */
		LIB3270_EXPORT void Error(const char *fmt, ...);
		LIB3270_EXPORT void Warning(const char *fmt, ...);
		LIB3270_EXPORT void show_3270_popup_dialog(H3270 *session, PW3270_DIALOG type, const char *title, const char *msg, const char *fmt, ...);

		/* Set/Get screen contents */
		LIB3270_EXPORT int find_field_attribute(H3270 *session, int baddr);
		LIB3270_EXPORT int find_field_length(H3270 *session, int baddr);
		LIB3270_EXPORT unsigned char get_field_attribute(H3270 *session, int baddr);
		LIB3270_EXPORT int screen_read(char *dest, int baddr, int count);
		LIB3270_EXPORT void Input_String(const unsigned char *str);
		LIB3270_EXPORT void screen_size(int *rows, int *cols);

		#define query_secure_connection(h) lib3270_get_ssl_state(h)
		#define lib3270_paste_string(str) lib3270_set_string(NULL,str)
		#define get_3270_terminal_size(h,r,c) lib3270_get_screen_size(h,r,c)

		/* Keyboard */
		LIB3270_EXPORT int			  emulate_input(char *s, int len, int pasting);

		/* Network related calls */
		LIB3270_EXPORT int 			  Get3270Socket(void);

        /* Misc calls */
		LIB3270_EXPORT void 		  popup_an_error(const char *fmt, ...);
		LIB3270_EXPORT void 		  popup_system_error(const char *title, const char *message, const char *system);
		LIB3270_EXPORT void 		  popup_a_sockerr(char *fmt, ...);

		#define query_3270_terminal_status(void) lib3270_get_program_message(NULL)

		#define set_3270_model(h,m)	lib3270_set_model(h,m)
		#define get_3270_model(h) lib3270_get_model(h)

		LIB3270_EXPORT int			  lib3270_set_model(H3270 *session, int model);
		LIB3270_EXPORT int			  lib3270_get_model(H3270 *session);

		/* Get connection info */
		#define get_connected_lu(h) lib3270_get_luname(h)
		#define get_current_host(h) lib3270_get_host(h)

		LIB3270_EXPORT SCRIPT_STATE status_script(SCRIPT_STATE state);

		#define Toggled(ix) lib3270_get_toggle(NULL,ix)
		#define CallAndWait(c,h,p) lib3270_call_thread(c,h,p)

		LIB3270_EXPORT void RunPendingEvents(int wait);
		LIB3270_EXPORT int Wait(int seconds);

        LIB3270_EXPORT int ctlr_get_cols(void) __attribute__ ((deprecated));
        LIB3270_EXPORT int ctlr_get_rows(void) __attribute__ ((deprecated));

        /* Screen calls */
		LIB3270_EXPORT void screen_resume(H3270 *session);
		LIB3270_EXPORT void screen_suspend(H3270 *session);
		LIB3270_EXPORT void screen_disp(H3270 *session);

        /* Cursor calls */
		#define cursor_get_addr(void)	lib3270_get_cursor_address(NULL)
		#define cursor_set_addr(x)		lib3270_set_cursor_address(NULL,x)
		#define cursor_move(x)			lib3270_set_cursor_address(NULL,x)

		#include <lib3270/actions.h>

		#define host_connect(n,wait) lib3270_connect(NULL,n,wait)
		#define host_reconnect(w) lib3270_reconnect(NULL,w)

		#define register_schange(tx,func) lib3270_register_schange(NULL,tx,func,NULL)

		/* Console/Trace window */
		LIB3270_EXPORT HCONSOLE	  console_window_new(const char *title, const char *label);
		LIB3270_EXPORT void	  console_window_delete(HCONSOLE hwnd);
		LIB3270_EXPORT int		  console_window_append(HCONSOLE hwnd, const char *fmt, ...);
		LIB3270_EXPORT char	* console_window_wait_for_user_entry(HCONSOLE hwnd);

#ifdef __cplusplus
	}
#endif

#endif // LIB3270_API_INCLUDED