api.h 13.5 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
/*
 * "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)
 *
 */


#ifndef LIB3270_API_INCLUDED

#ifdef __cplusplus
	extern "C" {
#endif

		#define LIB3270_API_INCLUDED "4.2"

		#include <errno.h>

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

			#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
			#elif defined (HAVE_GNUC_VISIBILITY)
				#define LOCAL_EXTERN	__attribute__((visibility("hidden"))) extern
			#else
				#define LOCAL_EXTERN extern
			#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);
		#else
			#define Trace( fmt, ... )	/* __VA_ARGS__ */
		#endif


		#include <lib3270/log.h>
		#define WriteLog(module,fmt, ...) 		lib3270_write_log(NULL,module,fmt,__VA_ARGS__)
		#define WriteRCLog(module,rc,fmt, ...)	lib3270_write_rc(NULL,module,fmt,__VA_ARGS__)

		#ifdef LIB3270_MODULE_NAME
			#define Log(fmt, ...)		lib3270_write_log(NULL,LIB3270_MODULE_NAME,fmt,__VA_ARGS__)
		#else
			#define Log(fmt, ...)		lib3270_write_log(NULL,"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;

		#include <lib3270/session.h>

		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 */
		#include <lib3270/popup.h>

		#define PW3270_DIALOG_INFO		LIB3270_NOTIFY_INFO
		#define PW3270_DIALOG_CRITICAL	LIB3270_NOTIFY_CRITICAL
		#define PW3270_DIALOG			LIB3270_NOTIFY

		#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
		 */
//		LOCAL_EXTERN struct ea * copy_device_buffer(int *el);

		/**
		 * Set the contents of the device buffer for debugging purposes
		 */
//		LOCAL_EXTERN 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 */
		};

		LOCAL_EXTERN int 				BeginFileTransfer(unsigned short flags, const char *local, const char *remote, int lrecl, int blksize, int primspace, int secspace, int dft);
		LOCAL_EXTERN int 				CancelFileTransfer(int force);
		LOCAL_EXTERN 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);

		};

		LOCAL_EXTERN 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

			LOCAL_EXTERN enum ft_state	QueryFTstate(void);

		#endif


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

		LOCAL_EXTERN 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_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;
		};

		#define new_3270_session(m) lib3270_session_new(m)

		LOCAL_EXTERN const struct lib3270_option * get_3270_option_table(int sz);

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

		/* Set/Get screen contents */
		#define find_field_attribute(s,a) lib3270_field_addr(s,a)
		#define find_field_length(s,a) find_field_length(s,a)

		/**
		 * Find the buffer address of the field attribute for a given buffer address.
		 *
		 * @param h		Session handle.
		 * @param addr	Buffer address of the field.
		 *
		 * @return field address or -1 if the screen isn't formatted.
		 *
		 */
		LIB3270_EXPORT int lib3270_field_addr(H3270 *h, int baddr);

		LIB3270_EXPORT int lib3270_field_length(H3270 *session, int baddr);


		LOCAL_EXTERN unsigned char get_field_attribute(H3270 *session, int baddr);
//		LOCAL_EXTERN int screen_read(char *dest, int baddr, int count);
		LOCAL_EXTERN void Input_String(const unsigned char *str);
		LOCAL_EXTERN 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 */
		LOCAL_EXTERN int			  emulate_input(char *s, int len, int pasting);

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

        /* Misc calls */
		LOCAL_EXTERN void 		  popup_an_error(H3270 *session, const char *fmt, ...);
		LOCAL_EXTERN void		  popup_system_error(H3270 *session, const char *title, const char *message, const char *fmt, ...);
		LOCAL_EXTERN void 		  popup_a_sockerr(H3270 *session, 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)

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

		LOCAL_EXTERN 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)

//		#define RunPendingEvents(x) lib3270_main_iterate(x)
//		#define Wait(s) lib3270_wait(x)

//        LOCAL_EXTERN int ctlr_get_cols(void) __attribute__ ((deprecated));
//        LOCAL_EXTERN int ctlr_get_rows(void) __attribute__ ((deprecated));

        /* Screen calls */
//		LOCAL_EXTERN void screen_resume(H3270 *session);
//		LOCAL_EXTERN void screen_suspend(H3270 *session);
		LOCAL_EXTERN 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 */
		LOCAL_EXTERN HCONSOLE	  console_window_new(const char *title, const char *label);
		LOCAL_EXTERN void	  console_window_delete(HCONSOLE hwnd);
		LOCAL_EXTERN int		  console_window_append(HCONSOLE hwnd, const char *fmt, ...);
		LOCAL_EXTERN char	* console_window_wait_for_user_entry(HCONSOLE hwnd);

#ifdef __cplusplus
	}
#endif

#endif // LIB3270_API_INCLUDED