/*
**	Global.h
**
**	Global data structure definitions
**
**	Copyright © 1990-1997 by Olaf `Olsen' Barthel
**		All Rights Reserved
**
**	:ts=8
*/

/**********************************************************************/

#ifndef _GLOBAL_H
#define _GLOBAL_H 1

#ifndef _HEADERS_H
#include "Headers.h"
#endif	/* _HEADERS_H */

/**********************************************************************/

	/* Special character codes. */

#define XOF ('S' & 0x1F)
#define XON ('Q' & 0x1F)

#define BEL '\a'
#define VTB '\v'
#define TAB '\t'
#define BKS '\b'
#define ENT '\n'
#define RET '\r'
#define ESC '\033'
#define DEL '\177'
#define FFD '\f'
#define CAN '\030'
#define SUB '\032'
#define ENQ '\005'
#define SI  '\016'
#define SO  '\017'

	/* Control keys we assign special codes to. */

#define CUP 150
#define CDN 151
#define CFW 152
#define CBK 153

#define FN1 128
#define FN2 129
#define FN3 130
#define FN4 131
#define FN5 132
#define FN6 133
#define FN7 134
#define FN8 135
#define FN9 136
#define F10 137

#define HLP 149

	/* Control sequence introducer. */

#define CSI 155

	/* Standard IFF chunk types. */

#ifndef ID_8SVX
#define ID_8SVX	MAKE_ID('8','S','V','X')	/* Eight bit sampled voice. */
#endif	/* ID_8SVX */

#ifndef ID_VHDR
#define ID_VHDR	MAKE_ID('V','H','D','R')	/* Voice header. */
#endif	/* ID_VHDR */

#ifndef ID_BODY
#define ID_BODY	MAKE_ID('B','O','D','Y')	/* Generic data body chunk. */
#endif	/* ID_BODY */

#ifndef ID_ANNO
#define ID_ANNO MAKE_ID('A','N','N','O')	/* Annotation chunk. */
#endif	/* ID_ANNO */

#define ID_CHAN MAKE_ID('C','H','A','N')	/* Sound channel information. */
#define ID_CHRS	MAKE_ID('C','H','R','S')	/* Character data. */
#define ID_FTXT	MAKE_ID('F','T','X','T')	/* Formatted text. */

	/* "term" private chunk types. */

#define ID_DATE	MAKE_ID('D','A','T','E')	/* Date and time information. */
#define ID_DAT2	MAKE_ID('D','A','T','2')	/* Date and time information, second try. */

#ifndef ID_NAME
#define ID_NAME	MAKE_ID('N','A','M','E')	/* Name header */
#endif	/* ID_NAME */

#ifndef ID_PREF
#define ID_PREF	MAKE_ID('P','R','E','F')	/* Preferences data chunk. */
#endif	/* ID_PREF */

#define ID_DIAL	MAKE_ID('D','I','A','L')	/* Number of phonebook entries. */
#define ID_FAST	MAKE_ID('F','A','S','T')	/* Fast! macro settings. */
#define ID_TRAP	MAKE_ID('T','R','A','P')	/* Trap command. */
#define ID_SEQN	MAKE_ID('S','E','Q','N')	/* Trap sequence. */
#define ID_TRST MAKE_ID('T','R','S','T')	/* Trap settings. */
#define ID_HOTK	MAKE_ID('H','O','T','K')	/* Hotkey settings. */
#define ID_KEYS	MAKE_ID('K','E','Y','S')	/* Function key settings. */
#define ID_PHON	MAKE_ID('P','H','O','N')	/* Phonebook data. */
#define ID_PSWD	MAKE_ID('P','S','W','D')	/* Password entry. */
#define ID_RECV	MAKE_ID('R','E','C','V')	/* Translation table data (receiver side). */
#define ID_SEND	MAKE_ID('S','E','N','D')	/* Translation table data (sender side). */
#define ID_TRNS	MAKE_ID('T','R','N','S')	/* Translation table data (master table). */
#define ID_SPEK	MAKE_ID('S','P','E','K')	/* Speech settings. */
#define ID_TERM	MAKE_ID('T','E','R','M')	/* "term" data chunk. */
#define ID_VERS	MAKE_ID('V','E','R','S')	/* Version identification. */
#define ID_WIND	MAKE_ID('W','I','N','D')	/* Fast! macro window size and position. */
#define ID_SOUN	MAKE_ID('S','O','U','N')	/* Sound settings. */
#define ID_WINF	MAKE_ID('W','I','N','F')	/* Window position/size information. */
#define ID_GRUP MAKE_ID('G','R','U','P')	/* Grouping information. */

	/* "term" configuration and phonebook file chunk types. */

#ifndef ID_SERL
#define ID_SERL	MAKE_ID('S','E','R','L')	/* Serial settings. */
#endif	/* ID_SERL */

#define ID_MODM	MAKE_ID('M','O','D','M')	/* Modem settings. */
#define ID_COMD	MAKE_ID('C','O','M','D')	/* Command settings. */
#define ID_SCRN	MAKE_ID('S','C','R','N')	/* Screen settings. */
#define ID_TRML	MAKE_ID('T','R','M','L')	/* Terminal setting. */
#define ID_PATH	MAKE_ID('P','A','T','H')	/* Path settings. */
#define ID_MISC	MAKE_ID('M','I','S','C')	/* Misc settings. */
#define ID_CLIP	MAKE_ID('C','L','I','P')	/* Clip settings. */
#define ID_CPTR	MAKE_ID('C','P','T','R')	/* Capture settings. */
#define ID_FILE	MAKE_ID('F','I','L','E')	/* File settings. */
#define ID_EMLN	MAKE_ID('E','M','L','N')	/* Emulation settings. */
#define ID_XFER	MAKE_ID('X','F','E','R')	/* Transfer settings. */
#define ID_XLNM	MAKE_ID('X','L','N','M')	/* Translation file name. */
#define ID_MFNM	MAKE_ID('M','F','N','M')	/* Macro file name. */
#define ID_CRNM	MAKE_ID('C','R','N','M')	/* Cursor file name. */
#define ID_FMNM	MAKE_ID('F','M','N','M')	/* Fast macro file name. */
#define ID_SPNM	MAKE_ID('S','P','N','M')	/* Speech file name. */
#define ID_SONM	MAKE_ID('S','O','N','M')	/* Sound file name. */
#define ID_ACNM	MAKE_ID('A','C','N','M')	/* Area code file name. */
#define ID_PBNM	MAKE_ID('P','B','N','M')	/* Phonebook file name. */
#define ID_HKNM	MAKE_ID('H','K','N','M')	/* Hotkey file name. */
#define ID_TRNM	MAKE_ID('T','R','N','M')	/* Trap file name. */

	/* This still appears to be missing. */

#ifndef FORMAT_DEF
#define FORMAT_DEF 4
#endif	/* FORMAT_DEF */

	/* Single precision boolean value. */

typedef char BOOLEAN;

	/* Structure forward declarations for the GNU `C' compiler. */

#ifdef __GNUC__
struct MsgItem;
struct GenericList;
#endif	/* __GNUC__ */

	/* The configuration file format version. This will from now
	 * on hopefully stay the same.
	 */

#define CONFIG_FILE_VERSION	4
#define CONFIG_FILE_REVISION	3

	/* The name of the global `term' message port. */

#define TERMPORTNAME "term Port"

	/* IDCMP flags for the main window */

#define DEFAULT_IDCMP		(IDCMP_RAWKEY | IDCMP_INACTIVEWINDOW | IDCMP_ACTIVEWINDOW | IDCMP_MOUSEMOVE | IDCMP_GADGETUP | IDCMP_GADGETDOWN | IDCMP_MENUPICK | IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_CLOSEWINDOW | IDCMP_NEWSIZE | IDCMP_IDCMPUPDATE | IDCMP_MENUHELP)

	/* The interval in which routine checks are executed (in seconds). */

#define ROUTINE_CHECK_INTERVAL	2

	/* Jump table entry. */

typedef BOOL (* JUMP)(LONG Char);

	/* Capture output routine. */

typedef VOID (* COPTR)(APTR Data,LONG Size);

	/* ConTransfer callback routine. */

typedef VOID (* CONTRANSFER)(STRPTR,LONG);

	/* Simple text transfer callback routine. */

typedef BOOL (* SENDLINE)(STRPTR,LONG);

	/* PutChar routine for RawDoFmt(). */

typedef VOID (* PUTCHAR)(UBYTE Char,APTR PutChData);

	/* Mode filter function callback. */

typedef ULONG (* MODEFILTER)(ULONG,APTR);

	/* Stackcall routine type. */

typedef LONG (* STACKARGS STACKCALL)(ULONG Arg1,...);

	/* The routine to do the comparison for QuickSort. */

typedef int (* SORTFUNC)(const void * , const void *);

	/* CR/LF receiver translation */

typedef LONG (* TRANSLATEFUNC)(STRPTR Data,LONG Size);

	/* Raster save callback routine. */

typedef VOID (* SAVERASTER)(LONG First,LONG Last);

	/* Bypass for serial output. */

typedef BOOL (* BYPASS)(STRPTR Buffer,LONG Size);

	/* Normal serial output. */

typedef VOID (* SERWRITE)(STRPTR Buffer,LONG Size);

	/* This defines the destructor data type */

typedef VOID (* DESTRUCTOR)(struct MsgItem *);

	/* The generic list notify function. */

typedef VOID (* GENERICNOTIFY)(struct GenericList *List,WORD Login);

	/* A task or process entry function. */

typedef VOID (* STACKARGS TASKENTRY)(LONG Arg,...);

	/* Menu item codes. */

enum	{	MEN_SAVE_AS_PICTURE=1,MEN_SAVE_AS_TEXT,MEN_PRINT_SCREEN,MEN_PRINT_CLIP,MEN_CAPTURE_TO_FILE,
		MEN_CAPTURE_TO_PRINTER,MEN_ICONIFY,MEN_ABOUT,MEN_QUIT,

		MEN_COPY,MEN_PASTE,MEN_CLEAR,

		MEN_EXECUTE_DOS_COMMAND,MEN_EXECUTE_REXX_COMMAND,MEN_RECORD,MEN_RECORD_LINE,
		MEN_EDIT_TRAPS,MEN_DISABLE_TRAPS,

		MEN_PHONEBOOK,MEN_REDIAL,MEN_DIAL_NUMBER,MEN_SEND_BREAK,
		MEN_HANG_UP,MEN_WAIT,MEN_FLUSH_BUFFER,MEN_RELEASE_DEVICE,

		MEN_UPLOAD_ASCII,MEN_DOWNLOAD_ASCII,MEN_UPLOAD_TEXT,MEN_DOWNLOAD_TEXT,MEN_EDIT_AND_UPLOAD_TEXT,
		MEN_UPLOAD_BINARY,MEN_DOWNLOAD_BINARY,

		MEN_CLEAR_BUFFER,MEN_DISPLAY_BUFFER,MEN_CLOSE_BUFFER,MEN_FREEZE_BUFFER,MEN_OPEN_BUFFER,
		MEN_SAVE_BUFFER_AS,

		MEN_CLEAR_SCREEN,MEN_RESET_FONT,MEN_RESET_STYLES,MEN_RESET_TERMINAL,

		MEN_SERIAL,MEN_MODEM,MEN_SCREEN,MEN_TERMINAL,MEN_SET_EMULATION,MEN_CLIPBOARD,MEN_CAPTURE,MEN_COMMANDS,
		MEN_MISC,MEN_PATH,MEN_TRANSFER_PROTOCOL,MEN_TRANSFER,MEN_TRANSLATION,MEN_MACROS,
		MEN_CURSORKEYS,MEN_FAST_MACROS,MEN_HOTKEYS,MEN_SPEECH,MEN_SOUND,MEN_RATES,MEN_SET_CONSOLE,MEN_OPEN_SETTINGS,MEN_SAVE_SETTINGS,
		MEN_SAVE_SETTINGS_AS,

		MEN_STATUS_WINDOW,MEN_REVIEW_WINDOW,MEN_PACKET_WINDOW,MEN_CHAT_LINE,MEN_FAST_MACROS_WINDOW,
		MEN_UPLOAD_QUEUE_WINDOW,

		/* Avoid recompilation */

		MEN_PRINT_SCREEN_AS_GFX,
		MEN_EXTRA_DIAL,
		MEN_MATRIX_WINDOW,
		MEN_CAPTURE_TO_RAW_FILE,
		MEN_SELECT_ALL
	};

	/* Menu item code limit, required by the quick dial menu. */

#define DIAL_MENU_LIMIT 1000

	/* How many phone book entries will be stored in
	 * the quick dial menu.
	 */

#define DIAL_MENU_MAX	50

	/* The size of the attention scanner buffers. */

#define ATTENTION_BUFFER_SIZE 260

	/* The maximum length of a password. */

#define MAX_PASSWORD_LENGTH 20

	/* Undefine the following symbols, the preferences header file
	 * will use the same names and the same values.
	 */

#undef PARITY_NONE
#undef PARITY_EVEN
#undef PARITY_ODD
#undef PARITY_MARK
#undef PARITY_SPACE

	/* Serial settings. */

enum	{	PARITY_NONE,PARITY_EVEN,PARITY_ODD,PARITY_MARK,PARITY_SPACE };

enum	{	HANDSHAKING_NONE,HANDSHAKING_RTSCTS,HANDSHAKING_RTSCTS_DSR };
enum	{	DUPLEX_FULL,DUPLEX_HALF };
enum	{	FLOW_NONE,FLOW_XON_XOFF };

	/* Terminal settings. */

enum	{	EOL_IGNORE,EOL_CR,EOL_LF,EOL_CRLF,EOL_LFCR };
enum	{	EMULATION_ANSIVT100,EMULATION_ATOMIC,EMULATION_TTY,EMULATION_EXTERNAL,EMULATION_HEX };
enum	{	COLOUR_AMIGA,COLOUR_EIGHT,COLOUR_SIXTEEN,COLOUR_MONO };

	/* Protocol types. */

enum	{	PROTOCOL_XMODEM,PROTOCOL_XMODEMCRC,PROTOCOL_YMODEM,PROTOCOL_ZMODEM };

	/* Font types. */

enum	{	FONT_STANDARD,FONT_IBM,FONT_IBM_RAW };

	/* Bell modes. */

enum	{	BELL_NONE, BELL_VISIBLE, BELL_AUDIBLE, BELL_BOTH, BELL_SYSTEM };

	/* Data flow scanner indices. */

enum	{	SCAN_NOCARRIER, SCAN_CONNECT, SCAN_VOICE, SCAN_RING, SCAN_BUSY, SCAN_NODIALTONE,
		SCAN_OK, SCAN_ERROR, SCAN_SIGDEFAULTUPLOAD, SIG_DEFAULTUPLOAD,
		SCAN_SIGASCIIUPLOAD,SCAN_SIGASCIIDOWNLOAD, SCAN_SIGTEXTUPLOAD,
		SCAN_SIGTEXTDOWNLOAD, SCAN_SIGBINARYUPLOAD,
		SCAN_SIGBINARYDOWNLOAD, SCAN_NOANSWER,
		SCAN_COUNT
	};

	/* Status types. */

enum	{	STATUS_READY,STATUS_HOLDING,STATUS_DIALING,STATUS_UPLOAD,
		STATUS_DOWNLOAD,STATUS_BREAKING,STATUS_HANGUP,
		STATUS_RECORDING,STATUS_RECORDING_LINE,STATUS_AREXX
	};

	/* Sound types. */

enum	{	SOUND_BELL,SOUND_CONNECT,SOUND_DISCONNECT,SOUND_GOODTRANSFER,
		SOUND_BADTRANSFER,SOUND_RING,SOUND_VOICE,SOUND_ERROR,
		SOUND_COUNT
	};

	/* Settings types. */

enum	{	PREF_ALL,PREF_SERIAL,PREF_MODEM,PREF_COMMAND,PREF_SCREEN,
		PREF_TERMINAL,PREF_PATH,PREF_MISC,PREF_CLIP,PREF_CAPTURE,
		PREF_FILE,PREF_EMULATION,PREF_TRANSFER,PREF_TRANSLATIONFILENAME,
		PREF_MACROFILENAME,PREF_CURSORFILENAME,PREF_FASTMACROFILENAME,
		PREF_SPEECHFILENAME,PREF_SOUNDFILENAME,PREF_AREACODEFILENAME,
		PREF_PHONEBOOKFILENAME,PREF_HOTKEYFILENAME,PREF_TRAPFILENAME,
		PREF_RATES	/* Note: PREF_RATES must always be last */
	};

	/* Gadgets attached to the main window. */

enum	{	CHAT_GadgetID=400 };

	/* Status line modes. */

enum	{	STATUSLINE_DISABLED,STATUSLINE_STANDARD,STATUSLINE_COMPRESSED };

	/* Capture filter modes. */

enum	{	FILTER_NONE,FILTER_ESCAPE,FILTER_CONTROL,FILTER_BOTH };

	/* Scrolling modes. */

enum	{	SCROLL_JUMP,SCROLL_SMOOTH };

	/* Auto-capture file creation. */

enum	{	AUTOCAPTURE_DATE_NAME,AUTOCAPTURE_DATE_INCLUDE };

	/* Cursor and numeric keypad modes. */

enum	{	KEYMODE_STANDARD,KEYMODE_APPLICATION };

	/* Font scales. */

enum	{	SCALE_NORMAL,SCALE_HALF };
enum	{	SCALE_ATTR_NORMAL,SCALE_ATTR_TOP2X,SCALE_ATTR_BOT2X,SCALE_ATTR_2X };

	/* Character tables. */

enum	{	TABLE_ASCII,TABLE_GFX };

	/* Transfer types. */

enum	{	TRANSFER_BINARY,TRANSFER_TEXT,TRANSFER_ASCII };

	/* Translation table entry types. */

enum	{	TRANSLATE_SINGLE,TRANSLATE_STRING };

	/* Upload panel actions. */

enum	{	UPLOAD_TEXT=1,UPLOAD_BINARY,UPLOAD_IGNORE,UPLOAD_ABORT,
		UPLOAD_TEXT_FROM_LIST,UPLOAD_BINARY_FROM_LIST,UPLOAD_DUMMY
	};

	/* Alert types. */

enum	{	ALERT_NONE,ALERT_BEEP,ALERT_SCREEN,ALERT_BEEP_SCREEN };

	/* Online time display modes. */

enum	{	ONLINETIME_TIME,ONLINETIME_COST,ONLINETIME_BOTH };

	/* What to print. */

enum	{	PRINT_SCREEN,PRINT_CLIP };

	/* Dial command types. */

enum	{	DIAL_IGNORE,DIAL_LIST,DIAL_REDIAL,DIAL_MENU };

	/* Errors returned by ReconfigureSerial(). */

enum	{	RECONFIGURE_FAILURE,RECONFIGURE_NOCHANGE,RECONFIGURE_SUCCESS };

	/* Operation codes for SetItem(). */

enum	{	SETITEM_SETCHECK,SETITEM_CLRCHECK,SETITEM_ON,SETITEM_OFF };

	/* File identification actions. */

enum	{	IDENTIFY_IGNORE,IDENTIFY_FILETYPE,IDENTIFY_SOURCE };

	/* Generic list types. */

enum	{	GLIST_UPLOAD,GLIST_DOWNLOAD,GLIST_DIAL,GLIST_WAIT,GLIST_TRAP,GLIST_COUNT };

	/* Generic list add operations. */

enum	{	ADD_GLIST_BOTTOM,ADD_GLIST_TOP,ADD_GLIST_BEHIND,ADD_GLIST_BEFORE };

	/* Dialing modes. */

enum	{	DIALMODE_PULSE, DIALMODE_TONE, DIALMODE_MODEM, DIALMODE_ISDN };

	/* Transfer window gadgets. */

enum	{	GAD_TRANSFER_INFORMATION_LIST=1,
		GAD_TRANSFER_PERCENT,GAD_TRANSFER_TIME,
		GAD_TRANSFER_ABORT,GAD_TRANSFER_SKIP,
		GAD_TRANSFER_PROTOCOL,GAD_TRANSFER_FILE,
		GAD_TRANSFER_SIZE,GAD_TRANSFER_SECONDS,
		GAD_TRANSFER_TOTALTIME,GAD_TRANSFER_ERRORS,
		GAD_TRANSFER_ABORT_FILE
	};

	/* How to satisfy OwnDevUnit.library requests. */

enum	{	ODU_RELEASE,ODU_WAIT,ODU_KEEP };

	/* When to notify the user during a file transfer. */

enum	{	XFERNOTIFY_NEVER,XFERNOTIFY_ALWAYS,XFERNOTIFY_START,XFERNOTIFY_END };

	/* XPR options setting. */

enum	{	GAD_XPROPTIONS_USE=42,GAD_XPROPTIONS_CANCEL };

	/* Terminal types */

enum	{	TERMINAL_VT200,TERMINAL_VT102,TERMINAL_VT101,TERMINAL_VT100 };

	/* Call log file formats */

enum	{	LOGFILEFORMAT_CallInfo,LOGFILEFORMAT_PhoneLog };

	/* AmigaGuide help context. */

enum	{	CONTEXT_MAIN,CONTEXT_SERIAL,CONTEXT_MODEM,CONTEXT_SCREEN,
		CONTEXT_TERMINAL,CONTEXT_CLIP,CONTEXT_CAPTURE,CONTEXT_COMMAND,
		CONTEXT_MISC,CONTEXT_PATHS,CONTEXT_TRANSLATION,CONTEXT_MACROS,
		CONTEXT_CURSOR,CONTEXT_FASTMACROS,CONTEXT_HOTKEYS,CONTEXT_SPEECH,
		CONTEXT_EMULATION,CONTEXT_TRANSFER,CONTEXT_PHONEBOOK,CONTEXT_DATE,
		CONTEXT_DAY,CONTEXT_IMPORT,CONTEXT_RATES,CONTEXT_TIME,
		CONTEXT_COPY,CONTEXT_PASSWORDUSER,CONTEXT_DIAL,CONTEXT_PRINT,
		CONTEXT_TEXTBUFFER,CONTEXT_PACKETWINDOW,CONTEXT_SOUND,
		CONTEXT_LIBS,CONTEXT_ASCII,CONTEXT_PENS,CONTEXT_UPLOAD_QUEUE,
		CONTEXT_TRAPS,CONTEXT_AREA_CODES,CONTEXT_MAIN_MENU,
		CONTEXT_BUFFER_MENU,CONTEXT_PACKET_MENU,CONTEXT_PROJECT_MEN,
		CONTEXT_EDIT_MEN,CONTEXT_CMDS_MEN,CONTEXT_PHONE_MEN,
		CONTEXT_TRANSF_MEN,CONTEXT_BUFFER_MEN,CONTEXT_TERMINAL_MEN,
		CONTEXT_SETTINGS_MEN,CONTEXT_WINDOWS_MEN,CONTEXT_DIAL_MEN,
		CONTEXT_TEXTPEN_PANEL,CONTEXT_ASCII_TRANSFER_SETTINGS,
		CONTEXT_PARAMETERS,CONTEXT_SIGNATURE

	};

	/* Character types. */

enum	{	CHAR_VANILLA,CHAR_CURSOR,CHAR_FUNCTION,CHAR_HELP,
		CHAR_XON,CHAR_XOFF,CHAR_ENTER,CHAR_RETURN };

	/* Review window positioning codes. */

enum	{	REVIEW_MOVE_TOP,REVIEW_MOVE_BOTTOM,REVIEW_MOVE_UP,REVIEW_MOVE_DOWN };

	/* File type classes. */

enum	{	FILETYPE_NONE,FILETYPE_DIR,FILETYPE_FILE,FILETYPE_TEXT,FILETYPE_SOUND,
		FILETYPE_PICTURE,FILETYPE_PREFS,FILETYPE_ARCHIVE,
		FILETYPE_PROGRAM,

		FILETYPE_COUNT };

	/* Text pacing modes. */

enum	{	PACE_DIRECT,PACE_ECHO,PACE_ANYECHO,PACE_PROMPT,PACE_DELAY,PACE_KEYBOARD };

	/* Where to open the buffer text window. */

enum	{	BUFFER_TOP,BUFFER_END };

	/* Where to place the buffer screen horizontally. */

enum	{	SCREEN_LEFT,SCREEN_CENTRE,SCREEN_RIGHT };

	/* File transfer mode. */

enum	{	XFER_XPR,XFER_EXTERNALPROGRAM,XFER_DEFAULT,XFER_INTERNAL };

	/* File transfer protocol signatures. */

enum	{	TRANSFERSIG_DEFAULTUPLOAD,TRANSFERSIG_DEFAULTDOWNLOAD,
		TRANSFERSIG_ASCIIUPLOAD,TRANSFERSIG_ASCIIDOWNLOAD,
		TRANSFERSIG_TEXTUPLOAD,TRANSFERSIG_TEXTDOWNLOAD,
		TRANSFERSIG_BINARYUPLOAD,TRANSFERSIG_BINARYDOWNLOAD
	};

	/* Requester modes. */

enum	{	REQUESTERMODE_CENTRE,REQUESTERMODE_PREFS,
		REQUESTERMODE_IGNORE
	};

	/* Buffer capture modes. */

enum	{	BUFFERMODE_FLOW, BUFFERMODE_REVIEW };

	/* How to sort the phonebook. */

enum	{	SORT_NAME,SORT_NUMBER,SORT_COMMENT,SORT_SELECTION };

	/* How to move list nodes around. */

enum	{	MOVE_HEAD,MOVE_PRED,MOVE_SUCC,MOVE_TAIL };

	/* Some raw key codes. */

#define HELP_CODE		95
#define DEL_CODE		70
#define BACKSPACE_CODE		65
#define RAMIGA_CODE		103
#define TAB_CODE		66

#define CURSOR_UP_CODE		76
#define CURSOR_DOWN_CODE	77
#define CURSOR_RIGHT_CODE	78
#define CURSOR_LEFT_CODE	79

#define F01_CODE		80
#define F02_CODE		81
#define F03_CODE		82
#define F04_CODE		83
#define F05_CODE		84
#define F06_CODE		85
#define F07_CODE		86
#define F08_CODE		87
#define F09_CODE		88
#define F10_CODE		89

#define ALT_KEY			(IEQUALIFIER_LALT|IEQUALIFIER_RALT)
#define SHIFT_KEY		(IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT)
#define CONTROL_KEY		IEQUALIFIER_CONTROL

	/* A couple of useful minterms. */

#define MINTERM_ZERO		0
#define MINTERM_ONE		ABC | ABNC | ANBC | ANBNC | NABC | NABNC | NANBC | NANBNC
#define MINTERM_COPY		ABC | ABNC | NABC | NABNC
#define MINTERM_NOT_C		ABNC | ANBNC | NABNC | NANBNC
#define MINTERM_B_AND_C		ABC | NABC
#define MINTERM_NOT_B_AND_C	ANBC | NANBC
#define MINTERM_B_OR_C		ABC | ABNC | NABC | NABNC | ANBC | NANBC

	/* Printer control bits. */

#define PRINT_SERIAL	(1L << 0)
#define PRINT_MODEM	(1L << 1)
#define PRINT_SCREEN	(1L << 2)
#define PRINT_TERMINAL	(1L << 3)
#define PRINT_USERNAME	(1L << 4)
#define PRINT_COMMENT	(1L << 5)
#define PRINT_SIZE	(1L << 6)
#define PRINT_DATE	(1L << 7)
#define PRINT_BITS	(1L << 8)

	/* Day of week flags. */

#define DAY_MONDAY	(1L << 0)
#define DAY_TUESDAY	(1L << 1)
#define DAY_WEDNESDAY	(1L << 2)
#define DAY_THURSDAY	(1L << 3)
#define DAY_FRIDAY	(1L << 4)
#define DAY_SATURDAY	(1L << 5)
#define DAY_SUNDAY	(1L << 6)

	/* These signal masks will make life a bit easier. */

#define SIG_WINDOW	(1L << Window -> UserPort -> mp_SigBit)
#define SIG_SERIAL	((ReadPort != NULL) ? (1UL << ReadPort -> mp_SigBit) : (0))
#define SIG_TIMER	(1L << TimePort -> mp_SigBit)
#define SIG_QUEUE	(SpecialQueue -> SigMask)
#define SIG_CHECK	(1L << CheckBit)
#define SIG_REXX	(1L << TermRexxPort -> mp_SigBit)
#define SIG_OWNDEVUNIT	(1L << OwnDevBit)

	/* Task termination and handshake signal.
	 * Note: don't try this at home kids.
	 */

#define SIG_KILL	SIGBREAKF_CTRL_C
#define SIG_HANDSHAKE	SIGF_SINGLE

	/* Double-buffered file server command. */

#define	SIG_COMMAND	SIGBREAKF_CTRL_D

	/* ARexx break signal. */

#define SIG_BREAK	SIGBREAKF_CTRL_D

	/* Hotkey reset command. */

#define SIG_RESET	SIGBREAKF_CTRL_D

	/* Skip dial entry. */

#define SIG_SKIP	SIGBREAKF_CTRL_D

	/* Status commands. */

#define SIG_BELL	SIGBREAKF_CTRL_D
#define SIG_RESETTIME	SIGBREAKF_CTRL_E

	/* Buffer special signals. */

#define SIG_TOFRONT	SIGBREAKF_CTRL_D
#define SIG_UPDATE	SIGBREAKF_CTRL_E
#define SIG_MOVEUP	SIGBREAKF_CTRL_F

	/* Status display task. */

#define SIG_CLOSEWINDOW	SIGBREAKF_CTRL_F

	/* Upload queue. */

#define SIG_SHOW	SIGBREAKF_CTRL_D
#define SIG_HIDE	SIGBREAKF_CTRL_E
#define SIG_GOAWAY	SIGBREAKF_CTRL_F

	/* A port signal mask. */

#define PORTMASK(P)	(1L << (((struct MsgPort *)(P)) -> mp_SigBit))

	/* Replacements for CheckItem() and OnMenu()/OffMenu(). */

#define CheckItem(ID,Mode)	SetItem(ID,Mode ? SETITEM_SETCHECK : SETITEM_CLRCHECK)
#define OnItem(ID)		SetItem(ID,SETITEM_ON)
#define OffItem(ID)		SetItem(ID,SETITEM_OFF)

	/* Some more neat macros. */

#define ClrSignal(Signals)	SetSignal(0,Signals)

#define NUM_ELEMENTS(s)		(sizeof(s) / sizeof((s)[0]))

#define OK			(0)
#define SAME			(0)
#define CANNOT			!
#define NO			!

	/* Definitions to access the line signal setting functions supported by
	 * some serial IO boards (namely the ASDG board).
	 */

#define SIOCMD_SETCTRLLINES	(CMD_NONSTD + 7)
#define SIOB_RTSB		0
#define SIOB_DTRB		1
#define SIOB_RTSF		(1L << SIOB_RTSB)
#define SIOB_DTRF		(1L << SIOB_DTRB)

	/* Turn time of day into `compressed' format. */

#define DT_GET_TIME(Hour,Minute) ((Minute) / 10 + (Hour) * 6)

	/* Vector offsets for the TimeDate structure. */

enum	{ DT_FIRST_UNIT,DT_NEXT_UNIT };

	/* Multiply lines and columns with the current font size. */

#define MUL_X(x)		OffsetXTable[x]
#define MUL_Y(y)		OffsetYTable[y]

	/* This macro lets us long-align structures on the stack */

#define D_S(type,name)	char a_##name[sizeof(type)+3]; \
			type *name = (type *)((LONG)(a_##name+3) & ~3);

	/* Like sizeof(..), but for a structure entry. */

#define structsizeof(s,e)	sizeof(((struct s *)0)->e)

	/* A handy and short alias. */

#define TICK			(CHECKIT | MENUTOGGLE)

	/* For now the maximum length of a path/file name. */

#define MAX_FILENAME_LENGTH	256

	/* The maximum width of a line to be stored in the text buffer. */

#define BUFFER_LINE_MAX		255

	/* User interface definitions. */

#define SZ_AutoWidth	TAG_USER+2	/* Use default width? */
#define SZ_NewColumn	TAG_USER+4	/* Start new column */
#define SZ_Lines	TAG_USER+5	/* Number of lines in object */

	/* Box information types. */

enum	{	BOX_LEFT,BOX_TOP,BOX_WIDTH,BOX_HEIGHT };

	/* Status gadget properties. */

#define SGA_FullWidth	(TAG_USER+42)
#define SGA_Mode	(TAG_USER+43)

	/* Sizing gadget sizes. */

#define SIZE_GADGET_WIDTH_HIGH	18
#define SIZE_GADGET_WIDTH_LOW	13

	/* Some windows to be opened on the main screen. */

enum	{	WINDOW_PACKET=100,WINDOW_STATUS,
		WINDOW_REVIEW,WINDOW_FAST,WINDOW_MAIN,
		WINDOW_CHARTAB,WINDOW_QUEUE,WINDOW_FILETRANSFER
	};

	/* Window alignment information. */

#define WC_ALIGNLEFT	(1<<0)
#define WC_ALIGNRIGHT	(1<<1)
#define WC_ALIGNTOP	(1<<2)
#define WC_ALIGNBOTTOM	(1<<3)
#define WC_EXPANDWIDTH	(1<<4)
#define WC_EXPANDHEIGHT	(1<<5)
#define WC_ALIGNSIDE	(1<<6)
#define WC_ALIGNBELOW	(1<<7)

	/* To turn printable characters into control characters. */

#define CONTROL_(x)	(x & 0x1F)

	/* Screen mode list entry. */

struct ModeNode
{
	struct Node	Node;
	ULONG		DisplayID;
};

	/* Trap management. */

struct TrapNode
{
	struct Node	Node;
	LONG		Count,
			SequenceLen;
	STRPTR		Sequence,
			Command;
};

	/* Trap preferences, not much. */

struct TrapSettings
{
	BOOLEAN		Enabled;
	BOOLEAN		Filter;
};

	/* Window alignment data. */

struct WindowInfo
{
	WORD	ID;
	UWORD	WindowFlags;

	LONG	Left,
		Top,
		Width,
		Height;
};

	/* Special character treatment. */

struct SpecialKey
{
	UBYTE	Key;
	JUMP	Routine;
};

	/* Cursor backup data. */

struct CursorData
{
	struct TextFont	*CurrentFont;
	WORD		 CursorX,
			 CursorY;
	UBYTE		 Charset;
	UBYTE		 CharMode[2];
	UBYTE		 Attributes;
	UBYTE		 FgPen,
			 BgPen;
	UBYTE		 Style;
};

	/* File transfer information. */

struct FileTransferNode
{
	struct MinNode	 MinNode;
	ULONG		 Size;
	STRPTR		 Name;
};

struct FileTransferInfo
{
	struct MinList		 FileList;
	ULONG			 TotalSize;
	LONG			 TotalFiles;

	ULONG			 DoneSize;
	LONG			 DoneFiles;

	struct FileTransferNode	*CurrentFile;
	ULONG			 CurrentSize;
};

	/* Global data link. */

struct TermPort
{
	struct MsgPort		 MsgPort;

	struct Window		*TopWindow;

	struct SignalSemaphore	 OpenSemaphore;

	LONG			 ID,OpenCount,HoldIt;
	LONG			 Reserved[5];
};

	/* Buffer search support. */

struct SearchInfo
{
	UBYTE	Distance[256],
		Pattern[256];
	LONG	FoundX,
		FoundY;
	WORD	PatternWidth;
	WORD	Index;
	BOOLEAN	Forward,
		IgnoreCase,
		WholeWords;
};

struct SearchContext
{
	struct Window		*SearchWindow;
	struct LayoutHandle	*SearchHandle;

	UBYTE			 LocalBuffer[256];
	STRPTR			 Buffer;

	BOOLEAN			 Ok;
};

	/* Support for optimized scrolling routines. */

struct ScrollLineInfo
{
	LONG	Left,Right,Width,
		ColourMask;
};

	/* A Fast! macro list entry. */

struct MacroNode
{
	struct Node	Node;
	UBYTE		Macro[30];	/* Macro title */
	UBYTE		Code[256];	/* The execution code. */
};

	/* Speech preferences. */

struct SpeechConfig
{
	WORD	Rate,
		Pitch;
	LONG	Frequency;
	BOOLEAN	Sex,
		Volume,
		Enabled;
	BYTE	Pad;
};

	/* Sound preferences */

struct SoundConfig
{
	UBYTE	BellFile[MAX_FILENAME_LENGTH],

		ConnectFile[MAX_FILENAME_LENGTH],
		DisconnectFile[MAX_FILENAME_LENGTH],

		GoodTransferFile[MAX_FILENAME_LENGTH],
		BadTransferFile[MAX_FILENAME_LENGTH],

		RingFile[MAX_FILENAME_LENGTH],
		VoiceFile[MAX_FILENAME_LENGTH];

	BOOLEAN	Preload;
	BYTE	Pad;
	BOOLEAN	Volume;
	BYTE	Pad2;

	UBYTE	ErrorNotifyFile[MAX_FILENAME_LENGTH];
};

	/* Macro Preferences. */

struct MacroKeys
{
	UBYTE	Keys[4][10][256];
};

	/* Cursor key preferences. */

struct CursorKeys
{
	UBYTE	Keys[4][4][256];
};

	/* Translation table entry. */

struct TranslationEntry
{
	STRPTR	String;		/* Corresponding code string. */
	UBYTE	Type;		/* Table entry type. */
	UBYTE	Len;		/* String length if any. */
	UBYTE	Extra;		/* Saves space, don't need to allocate memory for this one. */
	UBYTE	Null;		/* Terminating null. */
};

struct TranslationHeader
{
	UBYTE	Type;		/* Table entry type. */
	UBYTE	Code;		/* Table offset. */
	UBYTE	Len;		/* Entry length. */
	BYTE	Pad;
};

	/* Buffer translation handle. */

struct TranslationHandle
{
	STRPTR			LocalBuffer;
	LONG			LocalLen;

	STRPTR			SourceBuffer;
	LONG			SourceLen;

	STRPTR			DestinationBuffer;
	LONG			DestinationLen;

	struct TranslationEntry	**Table;
};

	/* term hotkey configuration. */

struct HotkeysOld
{
	UBYTE	termScreenToFront[256];
	UBYTE	BufferScreenToFront[256];
	UBYTE	SkipDialEntry[256];
	BOOLEAN	CommodityPriority;
	BOOLEAN	HotkeysEnabled;

	ULONG	Reserved[25];
};

struct Hotkeys
{
	UBYTE	termScreenToFront[256];
	UBYTE	BufferScreenToFront[256];
	UBYTE	SkipDialEntry[256];
	BOOLEAN	CommodityPriority;
	BOOLEAN	HotkeysEnabled;

	ULONG	Reserved[25];

	UBYTE	AbortARexx[256];
};

	/* Time/date structure. */

struct TimeDate
{
	LONG	Count;		/* Table size. */

	ULONG	PayPerUnit[2];	/* Pay for each unit; stored as ten thousands */
	ULONG	SecPerUnit[2];	/* Number of seconds each unit lasts; stored as ten thousands */

	UBYTE	Time;		/* The time associated with this entry. */
	BOOLEAN	Mark;		/* Used by the rates editor to keep track of item being edited. */
};

struct TimeDateOld
{
	LONG	Count;		/* Table size. */
	WORD	PayPerUnit[2],	/* Pay for each unit. */
		SecPerUnit[2];	/* Number of seconds each unit lasts. */
	UBYTE	Time;		/* The time associated with this entry. */
	BYTE	Pad;
};

	/* Time date header information. */

struct TimeDateHeader
{
	UBYTE	Comment[22];	/* Comment for this entry. */

	BOOLEAN	Month,		/* Month of year or -1 -> Day = bitmapped days of week. */
		Day;		/* Day of month or -1 -> standard settings. */
};

struct TimeDateNode
{
	struct Node		 Node;		/* Default node entry. */
	UBYTE			 Buffer[30];	/* Name buffer. */

	struct TimeDate		*Table;		/* Table of time/date entries. */

	struct TimeDateHeader	 Header;	/* Header information. */
};

struct TimeNode
{
	struct Node	Node;		/* Default node entry. */
	UBYTE		Name[20];	/* Name string. */
	UBYTE		Time;		/* The time for this entry. */
};

	/* This node type links phone number patterns
	 * and date/time lists.
	 */

struct PatternNode
{
	struct Node	Node;
	UBYTE		Pattern[256],
			Comment[40];
	struct MinList	List;
};

	/* Serial settings. */

struct SerialSettings
{
	ULONG	BaudRate;		/* Baud rate. */
	ULONG	BreakLength;		/* Length of break signal in microseconds. */
	ULONG	SerialBufferSize;	/* Size of serial read/write buffer. */

	UBYTE	SerialDevice[MAX_FILENAME_LENGTH];
					/* Serial device name. */
	LONG	UnitNumber;		/* Serial device unit number. */

	BYTE	BitsPerChar;		/* Bits per character. */
	BYTE	Parity;			/* Parity check mode. */
	BYTE	StopBits;		/* Number of stop bits. */
	BYTE	HandshakingProtocol;	/* Handshaking protocol (RTS/CTS, etc.). */
	BOOLEAN	Duplex;			/* Full- or half-duplex? */

	BOOLEAN	xONxOFF;		/* xON/xOFF handshaking enabled? */
	BOOLEAN	HighSpeed;		/* Radboogie? */
	BOOLEAN	Shared;			/* Shared device access? */
	BOOLEAN	StripBit8;		/* Strip high-order bit? */
	BOOLEAN	CheckCarrier;		/* Track the carrier signal? */
	BOOLEAN	PassThrough;		/* Pass xON/xOFF characters through to modem? */
	BOOLEAN	UseOwnDevUnit;		/* Enable OwnDevUnit.library? */

	ULONG	Quantum;		/* Buffer read quantum. */

	BOOLEAN	IgnoreCarrier;		/* Ignore carrier signal. */

	BOOLEAN	UseNet;			/* Use DNet-ID. */
	UWORD	NetID;			/* The DNet-ID to use. */

	BOOLEAN	SatisfyODURequests;	/* How to satisfy ODU requests. */
	BOOLEAN	DirectConnection;	/* Directly connected to host? */

	UWORD	LastVersionSaved,	/* The last version the config file was saved with. */
		LastRevisionSaved;

	BOOLEAN	ReleaseODUWhenOnline;	/* Release the device even when online? */
	BOOLEAN	ReleaseODUWhenDialing;	/* Release the device even when dialing? */
	BOOLEAN	NoODUIfShared;		/* Don't use ODU when device is opened in shared mode? */
	BYTE	Pad;
};

	/* Modem settings. */

struct ModemSettings
{
	UBYTE	ModemInit[80];		/* Modem init string. */
	UBYTE 	ModemExit[80];		/* Modem exit string. */
	UBYTE 	ModemHangup[80];	/* Modem hangup string. */
	UBYTE	DialPrefix[80];		/* Dial command prefix. */
	UBYTE	DialSuffix[80];		/* Dial command suffix. */

	UBYTE	NoCarrier[16];		/* `No carrier' string. */
	UBYTE	NoDialTone[16];		/* `No dialtone' string. */
	UBYTE	Connect[16];		/* `Connect' string. */
	UBYTE	Voice[16];		/* `Voice' string. */
	UBYTE	Ring[16];		/* `Ring' string. */
	UBYTE	Busy[16];		/* `Busy' string. */

	LONG	RedialDelay;		/* Length of redial delay. */
	LONG	DialRetries;		/* Number of dial retries. */
	LONG	DialTimeout;		/* Length of dial timeout. */
	BOOLEAN	ConnectAutoBaud;	/* Use baud rate returned by modem? */
	BOOLEAN	DropDTR;		/* Drop the DTR signal on hangup? */
	BOOLEAN	RedialAfterHangup;	/* Redial list after hangup? */
	BOOLEAN	VerboseDialing;		/* Output modem responses while dialing? */

	UBYTE	Ok[16];			/* `Ok' string. */
	UBYTE	Error[16];		/* `Error' string. */

	BOOLEAN	NoCarrierIsBusy;	/* Treat `NO CARRIER' as `BUSY' signal? */
	BOOLEAN	AbortHangsUp;		/* Dialer `Abort' sends hangup string? */

	WORD	ConnectLimit;				/* Connection limit. */
	UBYTE	ConnectLimitMacro[MAX_FILENAME_LENGTH];	/* Macro to be executed when limit is reached. */

	LONG	TimeToConnect;		/* Number of seconds to pass between modem picking up
					 * the line and issuing the `CONNECT' message.
					 */

	BOOLEAN	DialMode;		/* Use tone or pulse dialing? */
	BOOLEAN	DoNotSendMainModemCommands;	/* Do not send modem init/exit commands when dialing and using the main configuration? */

	LONG	InterDialDelay;		/* Seconds to wait between two successive dial attempts. */

	LONG	CharSendDelay;		/* Microseconds to wait between chars to send. */

	UBYTE	PBX_Prefix[80];		/* Additional commands to insert between dial prefix and phone number. */
	BOOLEAN	PBX_Mode;		/* Send the prefix above. */
	BYTE	Pad;

	UBYTE	NoAnswer[16];		/* `No answer' string. */
};

	/* Command settings. */

struct CommandSettings
{
	UBYTE	StartupMacro[256];	/* Startup macro. */
	UBYTE	LogoffMacro[256];	/* Macro executed after carrier has dropped or hung up. */
	UBYTE	UploadMacro[256];	/* Macro to execute after a successful upload. */
	UBYTE	DownloadMacro[256];	/* Macro to execute after a successful download. */

	UBYTE	LoginMacro[256];	/* Login macro, complements the logoff macro. */
};

	/* Screen settings. */

struct ScreenSettings
{
	ULONG	DisplayMode;			/* Screen display mode. */
	WORD	ColourMode;			/* The terminal colour mode. */
	UWORD	Colours[16];			/* Colour palette. */
	UBYTE	FontName[MAX_FILENAME_LENGTH];	/* Default user interface font. */
	WORD	FontHeight;			/* Default user interface font height. */

	BOOLEAN	MakeScreenPublic;		/* Are we to make our screen public? */
	BOOLEAN	ShanghaiWindows;		/* Are we to `shanghai' windows? */

	BOOLEAN	Blinking;			/* Screen blinking enabled? */
	BOOLEAN	FasterLayout;			/* Faster screen layout? */
	BOOLEAN	TitleBar;			/* Is the screen title bar enabled? */
	UBYTE	StatusLine;			/* Which mode is the status line in? */

	BOOLEAN	UseWorkbench;			/* Use the Workbench screen for the terminal window? */

	UBYTE	PubScreenName[MAXPUBSCREENNAME + 1];	/* Name of public screen to open window upon. */

	BOOLEAN	TimeMode;			/* Online time/fee display. */
	BOOLEAN	Depth;				/* Screen depth if any, 0 = don't bother. */

	BOOLEAN	UsePens;			/* Use special screen pens? */
	BYTE	PenColourMode;			/* For which colour mode was the pen array built? */

	UWORD	PenArray[16];			/* Pen index array. */

	ULONG	DisplayWidth,			/* Screen width. */
		DisplayHeight;			/* Screen height. */
	UWORD	OverscanType;			/* Screen overscan type. */

	BOOLEAN	ShareScreen;			/* Don't open a backdrop window, share pens. */
	BOOLEAN	SplitStatus;			/* Split the status line from the main window. */

	BOOLEAN	UseSimpleRefresh;		/* Use simple refresh windows? */

	BOOLEAN	UseColours96;			/* Use the 96 bit colours? */
	ULONG	Colours96[16 * 3];		/* The 96 bit colour table. */
};

	/* Terminal settings. */

struct TerminalSettings
{
	BOOLEAN	BellMode;				/* The bell mode. */
	BOOLEAN	AlertMode;				/* The user alert mode. */
	BOOLEAN	EmulationMode;				/* The terminal emulation mode. */
	BOOLEAN	FontMode;				/* The font mode. */

	BOOLEAN	SendCR;					/* Standard translations. */
	BOOLEAN	SendLF;
	BOOLEAN	ReceiveCR;
	BOOLEAN	ReceiveLF;

	UWORD	NumColumns,				/* Size of the terminal window. */
		NumLines;

	UBYTE	KeyMapFileName[MAX_FILENAME_LENGTH];	/* Name of custom keymap file. */
	UBYTE	EmulationFileName[MAX_FILENAME_LENGTH];	/* External emulation file name. */
	UBYTE	BeepFileName[MAX_FILENAME_LENGTH];	/* Name of the custom beep sound file. */

	UBYTE	TextFontName[MAX_FILENAME_LENGTH];	/* Terminal text font name. */
	WORD	TextFontHeight;				/* Terminal text font height. */

	BOOLEAN	UseTerminalTask;			/* Enable the terminal emulation process. */
	BOOLEAN	AutoSize;				/* Terminal size should be auto adapted. */

	UBYTE	IBMFontName[MAX_FILENAME_LENGTH];	/* Terminal text font name. */
	WORD	IBMFontHeight;				/* Terminal text font height. */
};

	/* Path settings. */

struct PathSettings
{
	UBYTE	ASCIIUploadPath[MAX_FILENAME_LENGTH];		/* Default ASCII upload file path. */
	UBYTE	ASCIIDownloadPath[MAX_FILENAME_LENGTH];		/* Default ASCII download file path. */

	UBYTE	TextUploadPath[MAX_FILENAME_LENGTH];		/* Default text upload file path. */
	UBYTE	TextDownloadPath[MAX_FILENAME_LENGTH];		/* Default text download file path. */

	UBYTE	BinaryUploadPath[MAX_FILENAME_LENGTH];		/* Default binary data upload file path. */
	UBYTE	BinaryDownloadPath[MAX_FILENAME_LENGTH];	/* Default binary data download file path. */

	UBYTE	DefaultStorage[MAX_FILENAME_LENGTH];		/* Default configuration storage path. */

	UBYTE	Editor[MAX_FILENAME_LENGTH];			/* Text file editor to use. */

	UBYTE	HelpFile[MAX_FILENAME_LENGTH];			/* Help text file. */
};

	/* Miscellaneous settings. */

struct MiscSettings
{
	BOOLEAN	Priority;		/* Program priority. */
	BOOLEAN	BackupConfig;		/* Save the configuration between calls? */

	BOOLEAN	OpenFastMacroPanel;	/* Open the fast! macro panel? */
	BOOLEAN	ReleaseDevice;		/* Release serial device when iconified? */

	BOOLEAN	TransferServer;		/* Enable data transfer server? */
	BOOLEAN	EmulationServer;	/* Enable terminal emulation server? */

	BOOLEAN	OverridePath;		/* Override the protocol transfer path? */
	BOOLEAN	AutoUpload;		/* Enable the auto-upload panel? */
	BOOLEAN	SetArchivedBit;		/* Set the archived bit for files sent? */
	BOOLEAN	IdentifyFiles;		/* Try to identify files after download? */

	BOOLEAN	TransferIcons;		/* Transfer files along with their icons? */
	BOOLEAN	CreateIcons;		/* Create icons for files saved? */

	BOOLEAN	SimpleIO;		/* Use simple file I/O? */
	BOOLEAN	PerfMeter;		/* Transfer performance meter enabled? */

	LONG	IOBufferSize;		/* Size of the asynchronous I/O buffer. */

	BOOLEAN	HideUploadIcon;		/* Hide the upload queue icon? */
	BOOLEAN	ProtectiveMode;		/* Give hints and ask for confirmation? */

	BOOLEAN	AlertMode;		/* The user alert mode. */

	BOOLEAN	RequesterMode;		/* Centre, ignore, use preference? */

	UWORD	RequesterWidth,		/* Width of asl requesters. */
		RequesterHeight;	/* Height of asl requesters. */
	UWORD	RequesterLeft,		/* Left edge of asl requesters. */
		RequesterTop;		/* Top edge of asl requesters. */

	UBYTE	WaitString[256];	/* String to send repeatedly while the "Wait" code is running. */
	LONG	WaitDelay;		/* Time to wait between single commands. */

	UBYTE	WindowName[256];	/* The console window specifier. */
	BOOLEAN	SuppressOutput;		/* Suppress console output? */
	BYTE	Pad;
};

	/* Clipboard settings. */

struct ClipSettings
{
	WORD	ClipboardUnit;		/* Clipboard unit to use. */

	WORD	LineDelay,		/* Insert line delay. */
		CharDelay;		/* Insert character delay. */

	UBYTE	InsertPrefix[80];	/* Line insertion prefix. */
	UBYTE	InsertSuffix[80];	/* Line insertion suffix. */

	UBYTE	LinePrompt[256];	/* Line wait prompt. */
	WORD	SendTimeout;		/* Line send timeout. */
	UBYTE	PacingMode;		/* Text pacing mode. */
	BOOLEAN	ConvertLF;		/* Convert <LF> characters to <CR> */
};

	/* Capture and logfile settings. */

struct CaptureSettings
{
	BOOLEAN	LogActions;				/* Create logfile? */
	BOOLEAN	LogCall;				/* Create callinfo-compatible logfile? */
	UBYTE	LogFileName[MAX_FILENAME_LENGTH];	/* Default logfile name. */

	LONG	MaxBufferSize;				/* Maximum text buffer size. */
	BOOLEAN	BufferEnabled;				/* Is the text buffer enabled? */

	BOOLEAN	ConnectAutoCapture;			/* Open capture file on logon? */
	BOOLEAN	CaptureFilterMode;			/* The capture filter mode. */
	UBYTE	CapturePath[MAX_FILENAME_LENGTH];	/* The default path for capture files. */

	UBYTE	CallLogFileName[MAX_FILENAME_LENGTH];	/* Name of the call log file. */
	UBYTE	BufferPath[MAX_FILENAME_LENGTH];	/* Text buffer save path. */

	BOOLEAN	AutoCaptureDate;			/* Where to include the creation date? */
	UBYTE	SearchHistory;

	BOOLEAN	OpenBufferWindow;			/* Where to open the buffer window. */
	BOOLEAN	OpenBufferScreen;			/* Where to open the buffer screen. */

	BOOLEAN	BufferScreenPosition;			/* Where to place the buffer screen (horizontal) */
	UBYTE	BufferWidth;				/* How long each line in the buffer should be. */

	BOOLEAN	RememberBufferWindow;			/* Remember buffer window context? */
	BOOLEAN	RememberBufferScreen;			/* Remember buffer screen context? */

	ULONG	BufferScreenMode;			/* Screen display mode for buffer screen. */

	BOOLEAN	ConvertChars;				/* Convert IBM characters? */
	BOOLEAN	BufferMode;				/* How the capture buffer should receive data. */

	BYTE	LogFileFormat;				/* Format of the log files. */
	BYTE	Pad;

	ULONG	BufferSafetyMemory;			/* Don't allocate any further memory if
							 * this or less memory is still available.
							 */
};

	/* File settings. */

struct FileSettings
{
	UBYTE	ProtocolFileName[MAX_FILENAME_LENGTH];		/* Transfer protocol file name. */
	UBYTE	TranslationFileName[MAX_FILENAME_LENGTH];	/* Character translation file name. */
	UBYTE	MacroFileName[MAX_FILENAME_LENGTH];		/* Keyboard macro file name. */
	UBYTE	CursorFileName[MAX_FILENAME_LENGTH];		/* Cursor key file name. */
	UBYTE	FastMacroFileName[MAX_FILENAME_LENGTH];		/* Fast macro file name. */
};

	/* Emulation settings. */

struct EmulationSettings
{
	BOOLEAN	CursorMode;		/* Are the cursor keys switched to application mode? */
	BOOLEAN	NumericMode;		/* Is the numeric keypad switched to application mode? */

	BOOLEAN	CursorWrap;		/* Is cursor position wrapping enabled? */
	BOOLEAN	LineWrap;		/* Is character line wrapping enabled? */

	BOOLEAN	InsertMode;		/* Is the character insertion mode enabled? */
	BOOLEAN	NewLineMode;		/* Is the newline mode enabled? */

	BOOLEAN	FontScale;		/* Which font scale is enabled? */
	BOOLEAN	ScrollMode;		/* Is smooth scrolling enabled? */
	BOOLEAN	DestructiveBackspace;	/* Backspace erases characters? */
	BOOLEAN	SwapBSDelete;		/* DEL and BS keys are swapped? */
	BOOLEAN	PrinterEnabled;		/* Printer commands enabled? */
	BOOLEAN	CLSResetsCursor;	/* Clear screen command resets cursor position? */

	UBYTE	AnswerBack[80];		/* Answer-back message. */

	BOOLEAN	KeysLocked;		/* Numeric keypad mode locked? */
	UBYTE	MaxScroll;		/* Maximum number of lines to prescroll. */
	UBYTE	MaxJump;		/* Maximum number of lines to scroll in one jump. */
	BOOLEAN	CursorLocked;		/* Cursor keys locked? */
	BOOLEAN	FontLocked;		/* Font size locked? */
	BOOLEAN	LockWrapping;		/* Line wrapping locked? */
	BOOLEAN	LockStyle;		/* Text style locked? */
	BOOLEAN	LockColour;		/* Text colour locked? */

	BOOLEAN	UseStandardPens;	/* Use the standard pens/attributes? */
	BYTE	TerminalType;		/* How to identify ourselves (VT100 or VT200) */

	UBYTE	Attributes[4];		/* Attribute mappings. */
	UWORD	Pens[16];		/* Rendering pens. */
};

struct TransferSignature
{
	UBYTE	Signature[40];
	WORD	Length;
};

	/* File transfer library settings. */

struct TransferSettings
{
	UBYTE	DefaultLibrary[MAX_FILENAME_LENGTH],
		ASCIIUploadLibrary[MAX_FILENAME_LENGTH],
		ASCIIDownloadLibrary[MAX_FILENAME_LENGTH],
		TextUploadLibrary[MAX_FILENAME_LENGTH],
		TextDownloadLibrary[MAX_FILENAME_LENGTH],
		BinaryUploadLibrary[MAX_FILENAME_LENGTH],
		BinaryDownloadLibrary[MAX_FILENAME_LENGTH];
	BOOLEAN	InternalASCIIUpload,
		InternalASCIIDownload,
		QuietTransfer,
		MangleFileNames;

	WORD	LineDelay,		/* Insert line delay. */
		CharDelay;		/* Insert character delay. */

	UBYTE	LinePrompt[256];	/* Line wait prompt. */
	WORD	SendTimeout;		/* Line send timeout. */
	UBYTE	PacingMode;		/* Text pacing mode. */
	BOOLEAN	StripBit8;		/* Strip high order bit. */
	BOOLEAN	IgnoreDataPastArnold;	/* Ignore data past terminator. */
	UBYTE	TerminatorChar;		/* Terminator character. */
	BYTE	SendCR,
		SendLF,
		ReceiveCR,
		ReceiveLF;

	UWORD	ErrorNotification;	/* Notify user after <n> errors have occured. */
	BYTE	TransferNotification;	/* Notify the user when a transfer has started/finished? */
	BYTE	DefaultType,
		ASCIIDownloadType,
		ASCIIUploadType,
		TextDownloadType,
		TextUploadType,
		BinaryUploadType,
		BinaryDownloadType;

	struct TransferSignature Signatures[TRANSFERSIG_BINARYDOWNLOAD + 1];

	BOOLEAN	OverridePath;		/* Override the protocol transfer path? */
	BOOLEAN	SetArchivedBit;		/* Set the archived bit for files sent? */
	BOOLEAN	IdentifyFiles;		/* Try to identify files after download? */
	BOOLEAN	TransferIcons;		/* Transfer files along with their icons? */
	BOOLEAN	PerfMeter;		/* Transfer performance meter enabled? */
	BOOLEAN	HideUploadIcon;		/* Hide the upload queue icon? */

	UBYTE	IdentifyCommand[256];	/* Command used to identify downloaded files. */

	BOOLEAN	ExpandBlankLines;	/* Insert spaces when transferring blank text lines? */
	BYTE	Pad;
};

	/* The new configuration settings. */

struct Configuration
{
	struct SerialSettings		*SerialConfig;
	struct ModemSettings		*ModemConfig;
	struct ScreenSettings		*ScreenConfig;
	struct TerminalSettings		*TerminalConfig;
	struct EmulationSettings	*EmulationConfig;
	struct ClipSettings		*ClipConfig;
	struct CaptureSettings		*CaptureConfig;
	struct CommandSettings		*CommandConfig;
	struct MiscSettings		*MiscConfig;
	struct PathSettings		*PathConfig;
	struct FileSettings		*FileConfig;
	struct TransferSettings		*TransferConfig;

	STRPTR				TranslationFileName;
	STRPTR				MacroFileName;
	STRPTR				CursorFileName;
	STRPTR				FastMacroFileName;

	STRPTR				SpeechFileName;
	STRPTR				SoundFileName;
	STRPTR				AreaCodeFileName;
	STRPTR				PhonebookFileName;
	STRPTR				HotkeyFileName;
	STRPTR				TrapFileName;
};

	/* A text box for several lines of text. */

struct TextBox
{
	struct TextBox		*NextBox;		/* Next box in chain. */

	LONG			 Left,Top,		/* Position and size. */
				 Width,Height;

	LONG			 LineWidth,		/* Line width in pixels. */
				 LineHeight;		/* Line height in pixels. */

	LONG			 NumChars,		/* Number of chars per line. */
				 NumLines;		/* Number of lines. */

	STRPTR			*Title,			/* Line titles. */
				*Text;			/* Line texts. */

	LONG			 TitleFgPen,
				 TitleBgPen,
				 TextPen;
};

	/* Block marker structure. */

struct BlockMarker
{
		/* The object to manipulate. */

	struct RastPort *	RPort;

		/* Origin anchor point. */

	LONG			OriginX,
				OriginY;

		/* First and last selected line. */

	LONG			FirstLine,
				LastLine;

		/* First and last selected column. */

	LONG			FirstColumn,
				LastColumn;

		/* Top of display window, lines in the buffer and size of
		 * the display window.
		 */

	LONG			Top,
				Lines,
				Width,
				Height;

		/* Canvas left and top edge. */

	LONG			LeftEdge,
				TopEdge;

		/* Last mouse position. */

	LONG			LastX,
				LastY;

		/* Single character dimensions. */

	LONG			TextFontWidth,
				TextFontHeight;

		/* Plane write mask. */

	UBYTE			WriteMask;
};

	/* Clipboard marker callback routine. */

typedef VOID (* MARKER)(struct BlockMarker *,LONG,LONG,LONG,LONG);

	/* Global data flow <-> term interface. */

struct FlowInfo
{
	BOOLEAN	Changed;

	BOOLEAN	NoCarrier;

	BOOLEAN	NoAnswer;

	BOOLEAN	Connect,
		Voice,
		Ring,
		Busy,
		NoDialTone,
		Ok,
		Error;

	BOOLEAN	Signature;
};

	/* A scan sequence, somewhat similar to the FlowInfo structure. */

struct WaitNode
{
	struct Node	Node;
	LONG		Count;		/* Number of characters matched. */
	STRPTR		Response;	/* Immediate response. */
	LONG		ResponseLen;	/* Length of immediate response string. */
};

	/* A rudimentary dial node, as employed by the ARexx interface */

struct GenericDialNode
{
	struct Node	Node;		/* The node name */
	STRPTR		Number;		/* The number to dial if any */
	LONG		Index;		/* The phonebook entry to dial */
};

	/* A list as employed by the ARexx interface. */

struct GenericList
{
	struct MinList		 ListHeader;
	struct Node		*ListNode;
	LONG			 ListOffset;
	LONG			 ListCount;
	struct SignalSemaphore	 ListSemaphore;
	APTR			 UserData;
	GENERICNOTIFY		 Notify;
};

	/* Number of buffers to be used for buffered I/O. */

#define BUFFER_NUMBER		2

	/* Auxiliary structure for buffered file I/O. */

struct Buffer
{
	struct Message		 Message;			/* Vanilla message header. */

	struct MsgPort		*InfoPort;			/* The filing system the destination file handle is bound to. */
	struct InfoData		 InfoData;

	BOOLEAN			 SimpleIO;			/* Real simple I/O? */
	BYTE			 Pad;

	BOOLEAN			 Read;				/* Last access has read data. */
	BOOLEAN			 Written;			/* Last access has written data. */

	LONG			 Action;			/* Action to perform. */
	LONG			 ActionData[2];			/* Seek and the like. */
	LONG			 Result;			/* Return value. */

	BPTR			 FileHandle;			/* Dos filehandle. */

	UBYTE			*Data;				/* Data buffer. */
	LONG			 BufLength;			/* Length of data buffer. */

	LONG			 BufPosition;			/* Read/write pointer into buffer. */

	LONG			 ReadBufFull;			/* How many bytes are still to be read from the buffer? */
	LONG			 WriteBufFull;			/* How many bytes are still to be written to the buffer?*/

	LONG			 RealPosition;			/* Real position in file. */
	LONG			 Cached;			/* How many bytes in pre-load cache. */

	UBYTE			*DataBuffer[BUFFER_NUMBER];	/* The data buffers. */
	LONG			 DataLength[BUFFER_NUMBER];	/* The lengths of the data buffers. */
	WORD			 DataCount;			/* Which buffer to use. */
	BOOLEAN			 WriteAccess;			/* TRUE if a write file handle. */
	BOOLEAN			 LastActionFailed;		/* TRUE if last action failed -> abort actions. */

	struct Process		*Child;
	struct Process		*Caller;			/* Synchronization. */

	BOOLEAN			 Fresh;				/* TRUE if no read/write access has taken place yet. */
	BOOLEAN			 Used;				/* Did any access take place at all? */

	struct DateStamp	 OpenDate;			/* Date and time when file was opened. */
};

	/* xpr serial bits. */

#define ST_PARTYON	(1L << 0)
#define ST_PARTYODD	(1L << 1)
#define ST_7WIRE	(1L << 2)
#define ST_QBREAK	(1L << 3)
#define ST_RADBOOGIE	(1L << 4)
#define ST_SHARED	(1L << 5)
#define ST_EOFMODE	(1L << 6)
#define ST_XDISABLED	(1L << 7)
#define ST_PARTYMARKON	(1L << 8)
#define ST_PARTYMARK	(1L << 9)
#define ST_2BITS	(1L << 10)
#define ST_READ7	(1L << 11)
#define ST_WRITE7	(1L << 12)

	/* Miscellaneous definitions. */

#define MILLION		1000000

	/* Raster text line attributes. */

#define	ATTR_UNDERLINE	1
#define	ATTR_HIGHLIGHT	2
#define ATTR_BLINK	4
#define	ATTR_INVERSE	8

enum	{	TEXTATTR_UNDERLINE,TEXTATTR_HIGHLIGHT,
		TEXTATTR_BLINK,TEXTATTR_INVERSE,
		TEXTATTR_NONE
	};

	/* Audio channels. */

#define LEFT0F  1
#define RIGHT0F  2
#define RIGHT1F  4
#define LEFT1F  8

	/* Program revision and the appropriate info structure. */

struct TermInfo
{
	UWORD	Version;
	UWORD	Revision;
};

/**********************************************************************/


	/* A message queue handle */

struct MsgQueue
{
	struct SignalSemaphore	 Access;	/* Access semaphore */
	struct MinList		 MsgList;	/* This is where the queue items go */

	LONG			 QueueSize,	/* The length of the queue */
				 MaxSize;	/* The maximum size of the queue, may be 0 */

	struct MinList		 WaitList;	/* The list of tasks to wait for a wakeup signal */

	struct Task		*SigTask;	/* The owner of this handle */
	ULONG			 SigMask;	/* The signal mask to wake up the owner */
	WORD			 SigBit;	/* The bit allocated for the mask, may be -1 */

	BOOLEAN			 Discard;	/* Discard or queue new items? */
};

	/* A message item as used by the queue manager */

struct MsgItem
{
	struct MinNode		 MinNode;	/* List node link */
	DESTRUCTOR		 Destructor;	/* Destructor routine if any */
};

	/* Your simple message item destructor setup */

#define InitMsgItem(Item,Dest)	(((struct MsgItem *)Item) -> Destructor = (Dest))


/**********************************************************************/


enum	{	DATAMSGTYPE_WRITE,DATAMSGTYPE_WRITECLIP,
		DATAMSGTYPE_UPDATEREVIEW,DATAMSGTYPE_MOVEREVIEW,
		DATAMSGTYPE_SERIALCOMMAND,DATAMSGTYPE_UPLOAD,
		DATAMSGTYPE_COMMANDDONE,DATAMSGTYPE_MENU,
		DATAMSGTYPE_RENDEZVOUS,DATAMSGTYPE_SERIALCOMMANDNOECHO,
		DATAMSGTYPE_CLEARBUFFER,DATAMSGTYPE_REDIAL,
		DATAMSGTYPE_HANGUP,DATAMSGTYPE_GOONLINE,
		DATAMSGTYPE_DIAL,DATAMSGTYPE_WRITESTRING,
		DATAMSGTYPE_WRITESTRING_NOECHO
	};

	/* An extension of the MsgItem data type */

struct DataMsg
{
	struct MsgItem	Item;	/* The message item link */

	LONG		Type;	/* Message type */
	UBYTE *		Data;	/* Pointer to data area */
	LONG		Size;	/* Size of data area */

	struct Task *	Client;	/* Client task to signal */
	ULONG		Mask;	/* Client signal mask */
};

	/* An extension of the DataMsg data type */

struct DataReplyMsg
{
	struct DataMsg	Data;		/* DataMsg link */

	struct Task *	Creator;	/* Creator to notify */
	ULONG		CreatorMask;	/* Creator notification signal */
};

	/* Another extension of the DataMsg data type */

struct DataDialMsg
{
	struct DataMsg	Data;		/* DataMsg link */

	struct RexxMsg *DialMsg;	/* RexxMsg to reply when done */
	struct List *	DialList;	/* List of entries to dial */
};


/**********************************************************************/


	/* Serial device attributes */

#define SERA_Baud		TAG_USER+1	/* Baud rate */
#define SERA_BreakTime		TAG_USER+2	/* Break time */
#define SERA_BitsPerChar	TAG_USER+3	/* Bits per character */
#define SERA_StopBits		TAG_USER+4	/* Number of stop bits */
#define SERA_BufferSize		TAG_USER+5	/* Read/Write buffer size */
#define SERA_Parity		TAG_USER+6	/* Parity */
#define SERA_Handshaking	TAG_USER+7	/* Handshaking mode */
#define SERA_HighSpeed		TAG_USER+8	/* Highspeed mode */
#define SERA_Shared		TAG_USER+9	/* Shared access */


/**********************************************************************/


	/* One of the emulation callback routines. */

typedef VOID (* EPTR)(STRPTR Buffer);

	/* This structure describes an ANSI control sequence. */

struct ControlCode
{
	UBYTE	FirstChar;
	STRPTR	Match,
		Terminator;
	UBYTE	LastChar;

	BYTE	ExactSize;
	EPTR	Func;
};


/**********************************************************************/


	/* A 96 bit colour entry. */

typedef struct ColourEntry
{
	WORD	One,
		Which;

	ULONG	Red,
		Green,
		Blue;
} ColourEntry;

	/* A table of colour entries, ready for LoadRGB32(). */

typedef struct ColourTable
{
	WORD			NumColours;

	struct ColourEntry	Entry[0];

	WORD			Terminator;
} ColourTable;

	/* Spread a byte across a long word. */

#define SPREAD(v)	((ULONG)(v) << 24 | (ULONG)(v) << 16 | (ULONG)(v) << 8 | (v))


/**********************************************************************/


	/* AmigaUW terminal window resize support. */

#define UWCMD_TTYRESIZE (CMD_NONSTD+20)


/**********************************************************************/


	/* A phone list entry. */

typedef struct PhoneNode
{
	struct Node		 Node;		/* A standard node header. */
	UBYTE			 LocalName[60];	/* Name of this entry; this includes
						 * a prefix assigned if this entry is
						 * marked to go into the dial list.
						 */
	struct PhoneEntry	*Entry;		/* Points to the curresponding phonebook entry. */
} PhoneNode;

	/* A dial list entry. */

struct DialNode
{
	struct Node		Node;		/* List link */
	struct PhoneEntry *	Entry;		/* Points to the configuration data */
	STRPTR			Number;		/* Holds the number to dial if any */
	BOOL			FromPhonebook;	/* TRUE if this entry was put here because */
						/* it was tagged in the phonebook */
	STRPTR			InitCommand;	/* Modem setup command, if any. */
	STRPTR			ExitCommand;	/* Modem cleanup command, if any. */
	STRPTR			DialPrefix;	/* Modem dial prefix, if any. */
	STRPTR			DialSuffix;	/* Modem dial suffix, if any. */
};

	/* Phonebook entry header. */

typedef struct PhoneHeader
{
	UBYTE		Name[40],		/* BBS name. */
			Number[100],		/* Phone number. */
			Comment[100];		/* Comment. */

	UBYTE		UserName[100],		/* User name for this BSS. */
			Password[100];		/* Password for user name. */

	BOOLEAN		QuickMenu;		/* This entry appears in the quick dial menu? */
	BOOLEAN		NoRates;		/* Do not use rate information. */

	ULONG		ID;			/* Unique ID of this entry. */

	struct timeval	Creation;		/* Creation time. */

	BOOLEAN		AutoDial;		/* Put this entry on the autodial list. */
	BYTE		Pad;

	LONG		Marked;			/* > 0 if marked for dialing. */
} PhoneHeader;

	/* A phonebook entry. */

typedef struct PhoneEntry
{
	struct PhoneNode	*Node;		/* Points back to attached list node if any;
						 * this node would be on display in the
						 * phonebook list view.
						 */
	struct DialNode		*DialNode;	/* Points back to attached list node if any;
						 * this node would be on the dial list.
						 */

	struct MinList		 TimeDateList;	/* Rates and costs. */

	LONG			 Count;		/* Denotes the order in which this entry is to
						 * go into the dial list. A value < 0 indicates
						 * that this entry is not going to go into the
						 * dial list.
						 */

	struct PhoneGroupNode	*ThisGroup;	/* The group in which this entry is found. A
						 * value of NULL indicates that this entry is
						 * not a memer of a group.
						 */
	struct PhoneNode	*GroupNode;	/* Points to the group node attached to this
						 * entry. A value of NULL indicates that this
						 * entry is not a member of a group.
						 */

	struct PhoneHeader	*Header;	/* Points to phone book header. */
	struct Configuration	*Config;	/* Points to configuration data. */
} PhoneEntry;

typedef struct PhonebookHandle
{
	struct PhoneEntry	**Phonebook;		/* Table of phonebook entries. */
	LONG			 PhoneSize;		/* Total size of the phonebook table */
	LONG			 NumPhoneEntries;	/* Number of table entries actually used. */
	struct MinList		 PhoneGroupList;	/* The list of groups used by this phonebook. */
	ULONG			 PhonebookID;		/* A counter every phonebook entry receives
							 * its unique ID from.
							 */
	ULONG			 DefaultGroup;		/* Default group to show after loading. */
	UBYTE			 PhonePassword[30];	/* The access password assigned to this phonebook. */
	BOOLEAN			 PhonePasswordUsed;	/* Indicates whether the password is active or not. */
	BOOLEAN			 AutoDial;		/* Indicates whether this phonebook has the
							 * automatic startup dial feature enabled.
							 */
	BOOLEAN			 AutoExit;		/* Indicates whether this phonebook has the
							 * automatic startup dial & exit feature enabled.
							 */
	LONG			 DialMarker;		/* Number of entries marked for dialing. */

	struct List		*DialList;		/* The dial list attached to this phonebook. */

	struct List		*PhoneList;		/* List of phonebook entries, ready to display
							 * in a list view.
							 */
	struct SignalSemaphore	 ActiveSemaphore;	/* Must be locked before messing with the active entry. */
	PhoneEntry		*ActiveEntry;		/* Currently active phonebook entry. */
} PhonebookHandle;

typedef struct PhoneGroupNode
{
	struct Node		 Node;			/* A standard node header. */
	UBYTE			 LocalName[40];		/* The name of the group. */
	struct MinList		 GroupList;		/* The phonebook entries assigned to this group. */
} PhoneGroupNode;

typedef struct PhonebookGlobals
{
	ULONG			 Count;			/* Number of entries in this phonebook */
	ULONG			 ID;			/* ID counter for this phonebook */
	ULONG			 DefaultGroup;		/* Number of the group the phonebook displays when first opened */
	BOOLEAN			 AutoDial;		/* Start dialing after program is started */
	BOOLEAN			 AutoExit;		/* Exit program after list is dialed */
} PhonebookGlobals;

typedef struct PhoneGroupHeader
{
	UBYTE			 FullName[40];		/* Name of this very group */
	LONG			 Count;			/* Number of entries to follow */
	BYTE			 Pad[8];		/* For future extension, if necessary */
} PhoneGroupHeader;

typedef struct PhoneListContext
{
	PhonebookHandle		*PhoneHandle;		/* The phonebook currently in use */
	struct List		*CurrentList;		/* List currently being displayed */
	LONG			 NumEntries;		/* Number of entries in that list */
	STRPTR			*GroupLabels;		/* The labels to go into the group display */
	struct MsgPort		*WindowPort;		/* The MsgPort to use for the windows attached */
										/* to this control panel */
	PhoneNode		*SelectedNode;		/* Currently active entry (from the list) */
	LONG			 SelectedIndex;		/* Currently active entry (from the table) */

	UBYTE			 WindowTitle[80];	/* The main window title */

	LayoutHandle		*Manager;		/* The main window layout handle */
	LayoutHandle		*Editor;		/* The editor window layout handle */
	LayoutHandle		*Selector;
	LayoutHandle		*Grouping;
	LayoutHandle		*Sorting;
	LayoutHandle		*PasswordHandle;

	struct Window		*Window;		/* The main window */
	struct Window		*EditWindow;
	struct Window		*PatternWindow;
	struct Window		*GroupWindow;
	struct Window		*SortWindow;
	struct Window		*PasswordWindow;

	BOOL			 Hide;			/* Whether or not password and user name should be hidden */
} PhoneListContext;


/**********************************************************************/


	/* Window backfill support */

typedef struct LayerMsg
{
	ULONG			Layer;
	struct Rectangle	Bounds;
} LayerMsg;


/**********************************************************************/


	/* Information table entry types. */

enum	{	INFO_STEM,INFO_TEXT,INFO_NUMERIC,INFO_BOOLEAN,INFO_MAPPED };

	/* Data types to save or open. */

enum	{	DATATYPE_TRANSLATIONS,DATATYPE_FUNCTIONKEYS,DATATYPE_CURSORKEYS,
		DATATYPE_FASTMACROS,DATATYPE_HOTKEYS,DATATYPE_SPEECH,DATATYPE_SOUND,DATATYPE_BUFFER,
		DATATYPE_CONFIGURATION,DATATYPE_PHONEBOOK,DATATYPE_SCREENTEXT,
		DATATYPE_SCREENIMAGE,DATATYPE_COUNT };

	/* Requester types. */

enum	{	REQUESTER_SERIAL,REQUESTER_MODEM,REQUESTER_SCREEN,
		REQUESTER_TERMINAL,REQUESTER_EMULATION,REQUESTER_CLIPBOARD,
		REQUESTER_CAPTURE,REQUESTER_COMMANDS,REQUESTER_MISC,
		REQUESTER_PATH,REQUESTER_TRANSFER,REQUESTER_TRANSLATIONS,
		REQUESTER_FUNCTIONKEYS,REQUESTER_CURSORKEYS,REQUESTER_FASTMACROS,
		REQUESTER_HOTKEYS,REQUESTER_SPEECH,REQUESTER_SOUND,REQUESTER_PHONE,
		REQUESTER_COUNT };

	/* Window types. */

enum	{	WINDOWID_BUFFER,WINDOWID_REVIEW,WINDOWID_PACKET,WINDOWID_FASTMACROS,
		WINDOWID_STATUS,WINDOWID_MAIN,WINDOWID_UPLOAD_QUEUE,WINDOWID_SINGLE_CHAR_ENTRY,
		WINDOWID_COUNT
	};

	/* The maximum length of an ARexx result variable. */

#define MAX_RESULT_LEN	65536

	/* ARexx interface error codes. */

#define TERMERROR_NO_DATA_TO_PROCESS			1000
#define TERMERROR_INDEX_OUT_OF_RANGE			1001
#define TERMERROR_UNKNOWN_OBJECT			1002
#define TERMERROR_RESULT_VARIABLE_REQUIRED		1003
#define TERMERROR_UNIT_NOT_AVAILABLE			1004
#define TERMERROR_DEVICE_DRIVER_STILL_OPEN		1005
#define TERMERROR_CLIPBOARD_ERROR			1006
#define TERMERROR_INFORMATION_IS_READ_ONLY		1007
#define TERMERROR_DATA_TYPES_INCOMPATIBLE		1008
#define TERMERROR_LIST_IS_ALREADY_EMPTY			1009
#define TERMERROR_UNKNOWN_LIST				1010
#define TERMERROR_WRONG_LIST				1011
#define TERMERROR_UNKNOWN_COMMAND			1012

	/* An information table entry node. */

struct AttributeEntry
{
	WORD	 Level;		/* Node level */
	STRPTR	 Name;		/* Name or NULL for numeric value */
	UBYTE	 Type;		/* Node type (INFO_TEXT through INFO_MAPPED) */
	BOOLEAN	 ReadOnly;	/* If information happens to be read-only */
	STRPTR	*Mappings;	/* Type mappings if applicable */
	WORD	 NodeID;	/* Node ID code */
};

	/* Argument mutual exclusion information. */

struct ExclusionInfo
{
	BYTE	A,B;
};

	/* A special message and argument packet. */

struct RexxPkt
{
	struct Message		 Message;

	struct RexxMsg		*RexxMsg;
	STRPTR			*Array;
	struct RDArgs		*Args;
	struct CommandInfo	*CommandInfo;
	LONG			 Results[2];
};

	/* A special function key pointer. */

typedef STRPTR (* COMMAND)(struct RexxPkt *);

	/* Argument inclusion bits. */

#define INCLUDE_00 (1 <<  0)
#define INCLUDE_01 (1 <<  1)
#define INCLUDE_02 (1 <<  2)
#define INCLUDE_03 (1 <<  3)
#define INCLUDE_04 (1 <<  4)
#define INCLUDE_05 (1 <<  5)
#define INCLUDE_06 (1 <<  6)
#define INCLUDE_07 (1 <<  7)
#define INCLUDE_08 (1 <<  8)
#define INCLUDE_09 (1 <<  9)
#define INCLUDE_10 (1 << 10)
#define INCLUDE_11 (1 << 11)

	/* Rexx command information. */

struct CommandInfo
{
	BOOLEAN			Async;
	BOOLEAN			AutoCleanup;
	COMMAND			Routine;
	STRPTR			Name,
				Arguments;
	ULONG			InclusionParameters;
	struct ExclusionInfo *	ExclusionParameters;
};


/**********************************************************************/


enum	{	ATTR_APPLICATION,
		ATTR_APPLICATION_VERSION,
		ATTR_APPLICATION_SCREEN,
		ATTR_APPLICATION_SESSION,
		ATTR_APPLICATION_SESSION_ONLINE,
		ATTR_APPLICATION_SESSION_SESSIONSTART,
		ATTR_APPLICATION_SESSION_BYTESSENT,
		ATTR_APPLICATION_SESSION_BYTESRECEIVED,
		ATTR_APPLICATION_SESSION_CONNECTMESSAGE,
		ATTR_APPLICATION_SESSION_BBSNAME,
		ATTR_APPLICATION_SESSION_BBSNUMBER,
		ATTR_APPLICATION_SESSION_BBSCOMMENT,
		ATTR_APPLICATION_SESSION_USERNAME,
		ATTR_APPLICATION_SESSION_ONLINEMINUTES,
		ATTR_APPLICATION_SESSION_ONLINECOST,
		ATTR_APPLICATION_AREXX,
		ATTR_APPLICATION_LASTERROR,
		ATTR_APPLICATION_TERMINAL,
		ATTR_APPLICATION_TERMINAL_ROWS,
		ATTR_APPLICATION_TERMINAL_COLUMNS,
		ATTR_APPLICATION_BUFFER,
		ATTR_APPLICATION_BUFFER_SIZE,
		ATTR_PHONEBOOK,
		ATTR_PHONEBOOK_COUNT,
		ATTR_PHONEBOOK_X,
		ATTR_PHONEBOOK_X_NAME,
		ATTR_PHONEBOOK_X_NUMBER,
		ATTR_PHONEBOOK_X_COMMENTTEXT,
		ATTR_PHONEBOOK_X_USERNAME,
		ATTR_PHONEBOOK_X_PASSWORDTEXT,
		ATTR_PREFS_SERIAL,
		ATTR_PREFS_SERIAL_BAUDRATE,
		ATTR_PREFS_SERIAL_BREAKLENGTH,
		ATTR_PREFS_SERIAL_BUFFERSIZE,
		ATTR_PREFS_SERIAL_DEVICENAME,
		ATTR_PREFS_SERIAL_UNIT,
		ATTR_PREFS_SERIAL_BITSPERCHAR,
		ATTR_PREFS_SERIAL_PARITYMODE,
		ATTR_PREFS_SERIAL_STOPBITS,
		ATTR_PREFS_SERIAL_HANDSHAKINGMODE,
		ATTR_PREFS_SERIAL_DUPLEXMODE,
		ATTR_PREFS_SERIAL_XONXOFF,
		ATTR_PREFS_SERIAL_HIGHSPEED,
		ATTR_PREFS_SERIAL_SHARED,
		ATTR_PREFS_SERIAL_STRIPBIT8,
		ATTR_PREFS_SERIAL_CARRIERCHECK,
		ATTR_PREFS_SERIAL_PASSXONXOFFTHROUGH,
		ATTR_PREFS_SERIAL_QUANTUM,
		ATTR_PREFS_SERIAL_USE_OWNDEVUNIT,
		ATTR_PREFS_SERIAL_OWNDEVUNIT_REQUEST,
		ATTR_PREFS_SERIAL_DIRECT_CONNECTION,
		ATTR_PREFS_SERIAL_RELEASE_WHEN_ONLINE,
		ATTR_PREFS_SERIAL_RELEASE_WHEN_DIALING,
		ATTR_PREFS_SERIAL_NO_ODU_IF_SHARED,
		ATTR_PREFS_SERIAL_LOCAL_ECHO,
		ATTR_PREFS_MODEM,
		ATTR_PREFS_MODEM_MODEMINITTEXT,
		ATTR_PREFS_MODEM_MODEMEXITTEXT,
		ATTR_PREFS_MODEM_MODEMHANGUPTEXT,
		ATTR_PREFS_MODEM_DIALPREFIXTEXT,
		ATTR_PREFS_MODEM_DIALSUFFIXTEXT,
		ATTR_PREFS_MODEM_NOCARRIERTEXT,
		ATTR_PREFS_MODEM_NOANSWERTEXT,
		ATTR_PREFS_MODEM_NODIALTONETEXT,
		ATTR_PREFS_MODEM_CONNECTTEXT,
		ATTR_PREFS_MODEM_VOICETEXT,
		ATTR_PREFS_MODEM_RINGTEXT,
		ATTR_PREFS_MODEM_BUSYTEXT,
		ATTR_PREFS_MODEM_OKTEXT,
		ATTR_PREFS_MODEM_ERRORTEXT,
		ATTR_PREFS_MODEM_REDIALDELAY,
		ATTR_PREFS_MODEM_DIALRETRIES,
		ATTR_PREFS_MODEM_DIALTIMEOUT,
		ATTR_PREFS_MODEM_CONNECTAUTOBAUD,
		ATTR_PREFS_MODEM_HANGUPDROPSDTR,
		ATTR_PREFS_MODEM_REDIALAFTERHANGUP,
		ATTR_PREFS_MODEM_VERBOSEDIALING,
		ATTR_PREFS_MODEM_NOCARRIERISBUSY,
		ATTR_PREFS_MODEM_CONNECTLIMIT,
		ATTR_PREFS_MODEM_CONNECTLIMITMACRO,
		ATTR_PREFS_MODEM_TIME_TO_CONNECT,
		ATTR_PREFS_MODEM_DIAL_MODE,
		ATTR_PREFS_MODEM_INTER_DIAL_DELAY,
		ATTR_PREFS_MODEM_CHAR_SEND_DELAY,
		ATTR_PREFS_MODEM_DO_NOT_SEND_COMMANDS,
		ATTR_PREFS_MODEM_PBX_PREFIX,
		ATTR_PREFS_MODEM_PBX_MODE,
		ATTR_PREFS_COMMANDS,
		ATTR_PREFS_COMMANDS_STARTUPMACROTEXT,
		ATTR_PREFS_COMMANDS_LOGOFFMACROTEXT,
		ATTR_PREFS_COMMANDS_UPLOADMACROTEXT,
		ATTR_PREFS_COMMANDS_DOWNLOADMACROTEXT,
		ATTR_PREFS_COMMANDS_LOGINMACROTEXT,
		ATTR_PREFS_SCREEN,
		ATTR_PREFS_SCREEN_WINDOW_BORDER,
		ATTR_PREFS_SCREEN_SPLIT_STATUS,
		ATTR_PREFS_SCREEN_COLOURMODE,
		ATTR_PREFS_SCREEN_FONTNAME,
		ATTR_PREFS_SCREEN_FONTSIZE,
		ATTR_PREFS_SCREEN_MAKESCREENPUBLIC,
		ATTR_PREFS_SCREEN_SHANGHAIWINDOWS,
		ATTR_PREFS_SCREEN_BLINKING,
		ATTR_PREFS_SCREEN_FASTERLAYOUT,
		ATTR_PREFS_SCREEN_TITLEBAR,
		ATTR_PREFS_SCREEN_STATUSLINEMODE,
		ATTR_PREFS_SCREEN_USEWORKBENCH,
		ATTR_PREFS_SCREEN_PUBSCREENNAME,
		ATTR_PREFS_SCREEN_ONLINEDISPLAY,
		ATTR_PREFS_SCREEN_USEPENS,
		ATTR_PREFS_SCREEN_SIMPLE_REFRESH,
		ATTR_PREFS_TERMINAL,
		ATTR_PREFS_TERMINAL_BELLMODE,
		ATTR_PREFS_TERMINAL_EMULATIONMODE,
		ATTR_PREFS_TERMINAL_FONTMODE,
		ATTR_PREFS_TERMINAL_SENDCRMODE,
		ATTR_PREFS_TERMINAL_SENDLFMODE,
		ATTR_PREFS_TERMINAL_RECEIVECRMODE,
		ATTR_PREFS_TERMINAL_RECEIVELFMODE,
		ATTR_PREFS_TERMINAL_NUMCOLUMNS,
		ATTR_PREFS_TERMINAL_NUMLINES,
		ATTR_PREFS_TERMINAL_KEYMAPNAME,
		ATTR_PREFS_TERMINAL_EMULATIONNAME,
		ATTR_PREFS_TERMINAL_FONTNAME,
		ATTR_PREFS_TERMINAL_FONTSIZE,
		ATTR_PREFS_TERMINAL_USETERMINALPROCESS,
		ATTR_PREFS_TERMINAL_AUTOSIZE,
		ATTR_PREFS_PATHS,
		ATTR_PREFS_PATHS_ASCIIUPLOADPATH,
		ATTR_PREFS_PATHS_ASCIIDOWNLOADPATH,
		ATTR_PREFS_PATHS_TEXTUPLOADPATH,
		ATTR_PREFS_PATHS_TEXTDOWNLOADPATH,
		ATTR_PREFS_PATHS_BINARYUPLOADPATH,
		ATTR_PREFS_PATHS_BINARYDOWNLOADPATH,
		ATTR_PREFS_PATHS_CONFIGPATH,
		ATTR_PREFS_PATHS_EDITORNAME,
		ATTR_PREFS_PATHS_HELPFILENAME,
		ATTR_PREFS_MISC,
		ATTR_PREFS_MISC_PRIORITY,
		ATTR_PREFS_MISC_BACKUPCONFIG,
		ATTR_PREFS_MISC_OPENFASTMACROPANEL,
		ATTR_PREFS_MISC_RELEASEDEVICE,
		ATTR_PREFS_MISC_OVERRIDEPATH,
		ATTR_PREFS_MISC_AUTOUPLOAD,
		ATTR_PREFS_MISC_SETARCHIVEDBIT,
		ATTR_PREFS_MISC_COMMENTMODE,
		ATTR_PREFS_MISC_TRANSFERICONS,
		ATTR_PREFS_MISC_CREATEICONS,
		ATTR_PREFS_MISC_SIMPLEIO,
		ATTR_PREFS_MISC_TRANSFER_PERFMETER,
		ATTR_PREFS_MISC_IOBUFFERSIZE,
		ATTR_PREFS_MISC_HIDE_UPLOAD_ICON,
		ATTR_PREFS_MISC_OVERWRITE_WARNING,
		ATTR_PREFS_MISC_ALERTMODE,
		ATTR_PREFS_MISC_REQUESTERMODE,
		ATTR_PREFS_MISC_REQUESTERWIDTH,
		ATTR_PREFS_MISC_REQUESTERHEIGHT,
		ATTR_PREFS_MISC_WAITSTRING,
		ATTR_PREFS_MISC_WAITDELAY,
		ATTR_PREFS_MISC_CONSOLEWINDOW,
		ATTR_PREFS_MISC_SUPPRESSOUTPUT,
		ATTR_PREFS_CLIPBOARD,
		ATTR_PREFS_CLIPBOARD_UNIT,
		ATTR_PREFS_CLIPBOARD_LINEDELAY,
		ATTR_PREFS_CLIPBOARD_CHARDELAY,
		ATTR_PREFS_CLIPBOARD_INSERTPREFIXTEXT,
		ATTR_PREFS_CLIPBOARD_INSERTSUFFIXTEXT,
		ATTR_PREFS_CLIPBOARD_TEXTPACING,
		ATTR_PREFS_CLIPBOARD_LINEPROMPT,
		ATTR_PREFS_CLIPBOARD_SENDTIMEOUT,
		ATTR_PREFS_CLIPBOARD_CONVERTLF,
		ATTR_PREFS_CAPTURE,
		ATTR_PREFS_CAPTURE_LOGACTIONS,
		ATTR_PREFS_CAPTURE_LOGCALLS,
		ATTR_PREFS_CAPTURE_LOGFILENAME,
		ATTR_PREFS_CAPTURE_MAXBUFFERSIZE,
		ATTR_PREFS_CAPTURE_BUFFER,
		ATTR_PREFS_CAPTURE_CONNECTAUTOCAPTURE,
		ATTR_PREFS_CAPTURE_AUTOCAPTUREDATE,
		ATTR_PREFS_CAPTURE_CAPTUREFILTER,
		ATTR_PREFS_CAPTURE_CAPTUREPATH,
		ATTR_PREFS_CAPTURE_CALLLOGFILENAME,
		ATTR_PREFS_CAPTURE_BUFFERSAVEPATH,
		ATTR_PREFS_CAPTURE_OPENBUFFERWINDOW,
		ATTR_PREFS_CAPTURE_OPENBUFFERSCREEN,
		ATTR_PREFS_CAPTURE_BUFFERSCREENPOSITION,
		ATTR_PREFS_CAPTURE_BUFFERWIDTH,
		ATTR_PREFS_CAPTURE_REMEMBER_BUFFERWINDOW,
		ATTR_PREFS_CAPTURE_REMEMBER_BUFFERSCREEN,
		ATTR_PREFS_CAPTURE_SEARCH_HISTORY,
		ATTR_PREFS_CAPTURE_CONVERTCHARACTERS,
		ATTR_PREFS_CAPTURE_BUFFERMODE,
		ATTR_PREFS_CAPTURE_BUFFERSAFETYMEMORY,
		ATTR_PREFS_FILE,
		ATTR_PREFS_FILE_TRANSFERPROTOCOLNAME,
		ATTR_PREFS_FILE_TRANSLATIONFILENAME,
		ATTR_PREFS_FILE_MACROFILENAME,
		ATTR_PREFS_FILE_CURSORFILENAME,
		ATTR_PREFS_FILE_FASTMACROFILENAME,
		ATTR_PREFS_EMULATION,
		ATTR_PREFS_EMULATION_IDENTIFICATION,
		ATTR_PREFS_EMULATION_CURSORMODE,
		ATTR_PREFS_EMULATION_NUMERICMODE,
		ATTR_PREFS_EMULATION_CURSORWRAP,
		ATTR_PREFS_EMULATION_LINEWRAP,
		ATTR_PREFS_EMULATION_INSERTMODE,
		ATTR_PREFS_EMULATION_NEWLINEMODE,
		ATTR_PREFS_EMULATION_FONTSCALEMODE,
		ATTR_PREFS_EMULATION_SCROLLMODE,
		ATTR_PREFS_EMULATION_DESTRUCTIVEBACKSPACE,
		ATTR_PREFS_EMULATION_SWAPBSDELETE,
		ATTR_PREFS_EMULATION_CURSORLOCKED,
		ATTR_PREFS_EMULATION_FONTLOCKED,
		ATTR_PREFS_EMULATION_NUMPADLOCKED,
		ATTR_PREFS_EMULATION_PRINTERENABLED,
		ATTR_PREFS_EMULATION_ANSWERBACKTEXT,
		ATTR_PREFS_EMULATION_CLS_RESETS_CURSOR,
		ATTR_PREFS_EMULATION_MAXSCROLL,
		ATTR_PREFS_EMULATION_MAXJUMP,
		ATTR_PREFS_EMULATION_WRAPLOCKED,
		ATTR_PREFS_EMULATION_STYLELOCKED,
		ATTR_PREFS_EMULATION_COLOURLOCKED,
		ATTR_PREFS_EMULATION_USEPENS,
		ATTR_PREFS_TRANSFER,
		ATTR_PREFS_TRANSFER_DEFAULT_LIBRARY,
		ATTR_PREFS_TRANSFER_ASCII_UPLOAD_LIBRARY,
		ATTR_PREFS_TRANSFER_INTERNAL_ASCII_UPLOAD,
		ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_LIBRARY,
		ATTR_PREFS_TRANSFER_INTERNAL_ASCII_DOWNLOAD,
		ATTR_PREFS_TRANSFER_QUIET_TRANSFER,
		ATTR_PREFS_TRANSFER_TEXT_UPLOAD_LIBRARY,
		ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_LIBRARY,
		ATTR_PREFS_TRANSFER_BINARY_UPLOAD_LIBRARY,
		ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_LIBRARY,
		ATTR_PREFS_TRANSFER_MANGLE_FILE_NAMES,
		ATTR_PREFS_TRANSFER_LINEDELAY,
		ATTR_PREFS_TRANSFER_CHARDELAY,
		ATTR_PREFS_TRANSFER_TEXTPACING,
		ATTR_PREFS_TRANSFER_LINEPROMPT,
		ATTR_PREFS_TRANSFER_SENDTIMEOUT,
		ATTR_PREFS_TRANSFER_STRIP_BIT_8,
		ATTR_PREFS_TRANSFER_IGNORE_DATA_PAST_ARNOLD,
		ATTR_PREFS_TRANSFER_TERMINATOR_CHAR,
		ATTR_PREFS_TRANSFER_ERROR_NOTIFY_COUNT,
		ATTR_PREFS_TRANSFER_ERROR_NOTIFY_WHEN,
		ATTR_PREFS_TRANSFER_OVERRIDEPATH,
		ATTR_PREFS_TRANSFER_SETARCHIVEDBIT,
		ATTR_PREFS_TRANSFER_COMMENTMODE,
		ATTR_PREFS_TRANSFER_TRANSFERICONS,
		ATTR_PREFS_TRANSFER_TRANSFER_PERFMETER,
		ATTR_PREFS_TRANSFER_HIDE_UPLOAD_ICON,
		ATTR_PREFS_TRANSFER_DEFAULT_TYPE,
		ATTR_PREFS_TRANSFER_DEFAULT_SEND_SIGNATURE,
		ATTR_PREFS_TRANSFER_DEFAULT_RECEIVE_SIGNATURE,
		ATTR_PREFS_TRANSFER_ASCII_UPLOAD_TYPE,
		ATTR_PREFS_TRANSFER_ASCII_UPLOAD_SIGNATURE,
		ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_TYPE,
		ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_SIGNATURE,
		ATTR_PREFS_TRANSFER_TEXT_UPLOAD_TYPE,
		ATTR_PREFS_TRANSFER_TEXT_UPLOAD_SIGNATURE,
		ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_TYPE,
		ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_SIGNATURE,
		ATTR_PREFS_TRANSFER_BINARY_UPLOAD_TYPE,
		ATTR_PREFS_TRANSFER_BINARY_UPLOAD_SIGNATURE,
		ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_TYPE,
		ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_SIGNATURE,
		ATTR_PREFS_TRANSFER_IDENTIFY_COMMAND,
		ATTR_PREFS_TRANSFER_EXPAND_BLANK_LINES,
		ATTR_PREFS_SPEECH,
		ATTR_PREFS_SPEECH_RATE,
		ATTR_PREFS_SPEECH_PITCH,
		ATTR_PREFS_SPEECH_FREQUENCY,
		ATTR_PREFS_SPEECH_SEXMODE,
		ATTR_PREFS_SPEECH_VOLUME,
		ATTR_PREFS_SPEECH_SPEECH,
		ATTR_PREFS_TRANSLATIONS,
		ATTR_PREFS_TRANSLATIONS_X,
		ATTR_PREFS_TRANSLATIONS_X_SEND,
		ATTR_PREFS_TRANSLATIONS_X_RECEIVE,
		ATTR_PREFS_FASTMACROS,
		ATTR_PREFS_FASTMACROS_COUNT,
		ATTR_PREFS_FASTMACROS_X,
		ATTR_PREFS_FASTMACROS_X_NAME,
		ATTR_PREFS_FASTMACROS_X_CODE,
		ATTR_PREFS_HOTKEYS,
		ATTR_PREFS_HOTKEYS_TERMSCREENTOFRONTTEXT,
		ATTR_PREFS_HOTKEYS_BUFFERSCREENTOFRONTTEXT,
		ATTR_PREFS_HOTKEYS_SKIPDIALENTRYTEXT,
		ATTR_PREFS_HOTKEYS_ABORTAREXX,
		ATTR_PREFS_HOTKEYS_COMMODITYPRIORITY,
		ATTR_PREFS_HOTKEYS_HOTKEYSENABLED,
		ATTR_PREFS_CURSORKEYS,
		ATTR_PREFS_CURSORKEYS_UPTEXT,
		ATTR_PREFS_CURSORKEYS_RIGHTTEXT,
		ATTR_PREFS_CURSORKEYS_DOWNTEXT,
		ATTR_PREFS_CURSORKEYS_LEFTTEXT,
		ATTR_PREFS_CURSORKEYS_SHIFT,
		ATTR_PREFS_CURSORKEYS_SHIFT_UPTEXT,
		ATTR_PREFS_CURSORKEYS_SHIFT_RIGHTTEXT,
		ATTR_PREFS_CURSORKEYS_SHIFT_DOWNTEXT,
		ATTR_PREFS_CURSORKEYS_SHIFT_LEFTTEXT,
		ATTR_PREFS_CURSORKEYS_ALT,
		ATTR_PREFS_CURSORKEYS_ALT_UPTEXT,
		ATTR_PREFS_CURSORKEYS_ALT_RIGHTTEXT,
		ATTR_PREFS_CURSORKEYS_ALT_DOWNTEXT,
		ATTR_PREFS_CURSORKEYS_ALT_LEFTTEXT,
		ATTR_PREFS_CURSORKEYS_CONTROL,
		ATTR_PREFS_CURSORKEYS_CONTROL_UPTEXT,
		ATTR_PREFS_CURSORKEYS_CONTROL_RIGHTTEXT,
		ATTR_PREFS_CURSORKEYS_CONTROL_DOWNTEXT,
		ATTR_PREFS_CURSORKEYS_CONTROL_LEFTTEXT,
		ATTR_PREFS_FUNCTIONKEYS,
		ATTR_PREFS_FUNCTIONKEYS_X,
		ATTR_PREFS_FUNCTIONKEYS_SHIFT,
		ATTR_PREFS_FUNCTIONKEYS_SHIFT_X,
		ATTR_PREFS_FUNCTIONKEYS_ALT,
		ATTR_PREFS_FUNCTIONKEYS_ALT_X,
		ATTR_PREFS_FUNCTIONKEYS_CONTROL,
		ATTR_PREFS_FUNCTIONKEYS_CONTROL_X,
		ATTR_PREFS_PROTOCOL,
		ATTR_PREFS_CONSOLE,
		ATTR_PREFS_SOUND,
		ATTR_PREFS_SOUND_BELLNAME,
		ATTR_PREFS_SOUND_CONNECTNAME,
		ATTR_PREFS_SOUND_DISCONNECTNAME,
		ATTR_PREFS_SOUND_GOODTRANSFERNAME,
		ATTR_PREFS_SOUND_BADTRANSFERNAME,
		ATTR_PREFS_SOUND_RINGNAME,
		ATTR_PREFS_SOUND_VOICENAME,
		ATTR_PREFS_SOUND_PRELOAD,
		ATTR_PREFS_SOUND_ERROR,
		ATTR_PREFS_SOUND_VOLUME
	};


/**********************************************************************/


	/* How many characters we will keep in the scan buffer. */

#define MAX_SCAN_SIZE	255

typedef struct ParseContext
{
	STRPTR	pc_Arnie;
	WORD	pc_CharsInBuffer,
		pc_ScanStep;
	UBYTE	pc_SaveBuffer[MAX_SCAN_SIZE + 1];

	UBYTE	pc_LineBuffer[BUFFER_LINE_MAX + 1];
	WORD	pc_LineLen,
		pc_LineIndex;

	BOOLEAN	pc_InSequence;
} ParseContext;


/**********************************************************************/


	/* Sound replay information. */

struct SoundInfo
{
	UBYTE		 Name[MAX_FILENAME_LENGTH];

	ULONG		 Rate,
			 Length,
			 Volume;

	APTR		 SoundData;

	APTR		 LeftData,
			 RightData;

	Object		*SoundObject;
	struct timeval	 SoundTime;
};


/**********************************************************************/


	/* Text buffer private data (render info & window). */

typedef struct TextBufferInfo
{
	UWORD			 Left,Top,
				 Width,Height;

	struct Process		*Buddy;

	struct Window		*Window;
	struct Screen		*Screen;
	struct Menu		*BufferMenuStrip;

	BYTE			 BufferSignal;
	BOOLEAN			 BufferTerminated;

	struct RastPort		*RPort;

	LONG			 NumBufferLines,
				 NumBufferColumns,
				 LastTopLine;

	struct DrawInfo		*BufferDrawInfo;
	struct Image		*BufferAmigaGlyph,
				*BufferCheckGlyph;

	struct TextFont		*LocalFont;

	WORD			 LocalTextFontWidth,
				 LocalTextFontHeight;

	struct TTextAttr	 LocalTextFont;
	UBYTE			 LocalTextFontName[MAX_FILENAME_LENGTH];

	struct TTextAttr	 LocalUserFont;
	UBYTE			 LocalUserFontName[MAX_FILENAME_LENGTH];

	LONG			 TopLine,
				 DisplayedLines;

	BOOL			 SearchForward,
				 IgnoreCase,
				 WholeWords,
				 NeedClipConversion;

	Object			*Scroller,
				*UpArrow,
				*DownArrow;

	Object			*UpImage,
				*DownImage;

	LONG			 ArrowWidth;

	UWORD			*BufferLineOffsets,
				*BufferColumnOffsets;

	UWORD			 TitleFrontPen,
				 TitleBackPen,
				 TextFrontPen,
				 TextBackPen;

	WORD			 OldColumn,
				 OldLine,
				 OldLength;

	LONG			 TitleOffset;
	LONG			 MaxPen;
	WORD			 RightBorderWidth;

	struct Screen		*Parent;

	UBYTE			 TitleBuffer[100];

	struct MsgQueue		*Queue;
	ULONG			 QueueMask;

	struct MarkerContext	*Marker;
	BOOLEAN			 Interrupted;
	BYTE			 Pad[3];

	BOOL			*pSearchForward;
	BOOL			*pIgnoreCase;
	BOOL			*pWholeWords;
	LONG			*pTopLine;
} TextBufferInfo;


/**********************************************************************/


	/* The catalog data is stored in the following format. */

struct CatCompArrayType
{
	ULONG	cca_ID;
	STRPTR	cca_Str;
};


/**********************************************************************/


#ifdef __GNUC__
struct LaunchMsg;
#endif	/* __GNUC__ */

	/* This is what we can do. */

enum	{ LAUNCH_Program,LAUNCH_RexxCmd,LAUNCH_RexxString };

	/* A callback routine to handle the cleanup work. */

typedef VOID (*LAUNCHCLEANUP)(struct LaunchMsg *Message);

typedef struct LaunchMsg
{
	struct Message	 Message;	/* Standard message header. */

	WORD		 Type;		/* What type of command this message implements. */

	struct RexxPkt	*RexxPkt;	/* An ARexx interface command packet. */

	LONG		 Result;	/* Primary result code. */
	LONG		 Result2;	/* Secondary result code. */

	LAUNCHCLEANUP	 Cleanup;	/* A cleanup routine that gets call when all the work is done. */

	UBYTE		 Command[1];	/* The command to execute, if any. */
} LaunchMsg;


/**********************************************************************/


#ifdef __GNUC__
struct JobNode;
struct JobQueue;
#endif	/* __GNUC__ */

typedef BOOL (*JOBFUNCTION)(struct JobNode *);

typedef ULONG (*JOBQUEUEWAIT)(struct JobQueue *);

	/* The job types supported. */

enum { JOBTYPE_Once,JOBTYPE_Always,JOBTYPE_Disposable,JOBTYPE_Wait };

typedef struct JobNode
{
	struct Node		 Node;		/* Link and name. */
	WORD			 Type;		/* Job type. */
	BOOL			 Active;	/* Whether or not this job is currently active. */

	struct JobQueue		*HomeQueue;	/* In which queue to find this job. */

	JOBFUNCTION		 Function;	/* The function to invoke. */
	JOBFUNCTION		 SubFunction;	/* If necessary, the function invoked by
						 * the default entry point.
						 */
	ULONG			 Mask;		/* Signal to wait for. */
} JobNode;

typedef struct JobQueue
{
	struct MinList		 ReadyList;	/* List of jobs ready for execution. */

	ULONG			 ReadyMask;	/* Signal mask to wait for events. */
	LONG			 OnceCounter;	/* Number of jobs to call once only. */

	JobNode			*NextJob;	/* The next job to execute. */

	JOBQUEUEWAIT		 QueueWait;	/* The routine to wait for events to happen. */

	struct SignalSemaphore	 AccessLock;	/* Access lock for this data structure. */
} JobQueue;

	/* To initialize the jobs from scratch. */

struct JobInitStruct
{
	STRPTR		Name;		/* Name of this job, if any. */
	JobNode **	Node;		/* The node to initialize. */
	JOBFUNCTION	Function;	/* The function to invoke. */
	WORD		Type;		/* The job type. */
};

/**********************************************************************/

	/* For LimitedVSprintf() and friends. */

struct FormatContext
{
	STRPTR	Index;
	LONG	Size;
};

/**********************************************************************/

enum
{
	MARKERASK_Clipped,
	MARKERASK_Scroll
};

	/* Ask for the mouse position to be converted into a line and column index. */

typedef VOID (*MARKER_AskPosition)(struct MarkerContext *Context,LONG *Column,LONG *Line,WORD Mode);

	/* Scroll the visible region. */

typedef VOID (*MARKER_Scroll)(struct MarkerContext *Context,LONG DeltaX,LONG DeltaY);

	/* Highlight a line of text between the "Left" and "Right" column (inclusive).
	 * If both parameters are < 0 the entire line should be highlighted.
	 */

typedef VOID (*MARKER_Highlight)(struct MarkerContext *Context,LONG Line,LONG Left,LONG Right);

	/* Transfer the buffer contents line by line. */

typedef APTR (*MARKER_TransferStartStop)(struct MarkerContext *Context,APTR UserData,ULONG Qualifier);
typedef BOOL (*MARKER_Put)(APTR UserData,STRPTR Buffer,LONG Length);
typedef BOOL (*MARKER_Transfer)(struct MarkerContext *Context,LONG Line,LONG Left,LONG Right,MARKER_Put Put,APTR UserData);
typedef BOOL (*MARKER_PickWord)(struct MarkerContext *Context,LONG Left,LONG Top,LONG *WordLeft,LONG *WordRight);

typedef struct MarkerContext
{
	LONG	FirstVisibleLine,	/* The first line visible on the screen. */
		NumVisibleLines;	/* The number of lines visible on the screen. */
	LONG	NumLines;		/* The number of text lines in the buffer. */

	LONG	FirstVisibleColumn,	/* The first column visible on the screen. */
		NumVisibleColumns;	/* The number of columns visible on the screen. */
	LONG	NumColumns;		/* The number of text columns used by the buffer. */

	LONG	AnchorColumn,		/* The current marker anchor position on the anchor line. */
		AnchorLine;		/* The line on which the marker is anchored. */

	LONG	CurrentColumn,		/* This is where the mouse pointer currently is. */
		CurrentLine;

	LONG	FirstFullLine,		/* The first and the last line that is completely highlighted. */
		LastFullLine;

	LONG	FirstPartialLine,	/* The first line that has text marked in it. */
		FirstPartialLeft,	/* The first column in which text is marked (inclusive). */
		FirstPartialRight;	/* The last column in which text is marked (inclusive). */

	LONG	LastPartialLine,	/* The last line that has text marked in it. */
		LastPartialLeft,	/* The first column in which text is marked (inclusive). */
		LastPartialRight;	/* The last column in which text is marked (inclusive). */

	LONG	Direction;		/* If -1, user is dragging the mouse towards the top left corner,
					 * otherwise user is dragging the mouse towards the bottom right corner.
					 */

		/* Ask for the mouse position to be converted into a line and column index. */

	MARKER_AskPosition AskPosition;

		/* Scroll the visible region. */

	MARKER_Scroll Scroll;

		/* Highlight a line of text between the "Left" and "Right" column (inclusive).
		 */

	MARKER_Highlight Highlight;

		/* Unhighlight a line of text between the "Left" and "Right" column (inclusive).
		 */

	MARKER_Highlight Unhighlight;

		/* Prepare for data transfer or clean up after the transfer. */

	MARKER_TransferStartStop TransferStartStop;

		/* Transfer the contents of a buffer line. */

	MARKER_Transfer Transfer;

		/* Called by the Transfer function. */

	MARKER_Put Put;
	MARKER_Put PutLine;

		/* Pick the word at the given position. */

	MARKER_PickWord PickWord;

		/* User defined data. */

	APTR UserData;
} MarkerContext;

/**********************************************************************/

	/* And now for something completely different... */

#ifndef _PROTOS_H
#include "Protos.h"
#endif	/* _PROTOS_H */

#ifndef _DATA_H
#include "Data.h"
#endif	/* _DATA_H */

#ifndef _ERRORS_H
#include "Errors.h"
#endif	/* _ERRORS_H */

/**********************************************************************/

#include "Assert.h"

/**********************************************************************/

#endif	/* _GLOBAL_H */
