/*
 * Windows Kermit
 * 
 * Written by William S. Hall
 *	      3665 Benton Street, #66
 *	      Santa Clara, CA 95051
 *
 * protocol header file
 */

#if !defined(EXTERN)
#define EXTERN extern
#endif

/* functions from protocol module */
void krmKermitDispatch(HWND, BYTE *, int);
void FAR PASCAL krmDoTimeout(HWND hWnd,unsigned message,short event,DWORD time);
void clsif(void);
clsof(int);

/* functions from extended function module */
void UpdateErrorString(HWND hWnd, char *str, int index);
void tinit(HWND hWnd, int mode);
BOOL krmInitMainDisplay(HWND hWnd, short cwidth, short cheight);
void krmMainStringDisplay(HWND hWnd, BYTE *str, short len);

/* functions from dialog box function */
BOOL FAR PASCAL krmXferDlgBox(HWND, unsigned, WORD, LONG);
BOOL FAR PASCAL SendFileDlgProc(HWND, unsigned, WORD, LONG);
BOOL FAR PASCAL GetFileList(HWND, unsigned, WORD, LONG);
BOOL FAR PASCAL SetMiscParams(HWND, unsigned, WORD, LONG);
BOOL FAR PASCAL krmRemoteChdir(HWND, unsigned, WORD, LONG);
BOOL FAR PASCAL krmRemoteCmdDlgBox(HWND, unsigned, WORD, LONG);

/* some protocol manifests */
#define KRM_WAITPACKET		1
#define KRM_WAITSEND		2
#define KRM_COMPLETE		-1
#define KRM_ERROR_PKT		-2
#define KRM_USERCNX		-3
#define KRM_NO_SEND_FILE	-4
#define KRM_FILE_OPEN_ERROR	-5
#define KRM_TERM_OPEN_ERROR	-6
#define KRM_FILE_WRITE_ERROR	-7
#define KRM_FILE_CLOSE_ERROR	-8
#define KRM_FILE_READ_ERROR	-9
#define KRM_UNKNOWN_PACKET	-10
#define KRM_RETRY_LIMIT		-11

/* dialog boxes */
#define DT_KRM_GETFILE		10000
#define DT_KRM_SENDFILE		10001
#define DT_KRM_MXPARAMS		10002
#define DT_KRM_REMOTE2		10003
#define DT_KRM_XFER		10004

/* dialog box items */
#define IDD_GETNAME		10100

#define IDD_EDITSELECT		10100
#define IDD_LISTSELECT		10101
#define IDD_PATHDISPLAY 	10102	
#define IDD_PATHSELECT		10103
#define IDD_SEND		10104

#define IDD_TIMER		10100
#define IDD_FILEWARN		10101
#define IDD_FILEDISCARD		10102
#define IDD_KRM_BELL		10103
#define IDD_KRM_SAVE		10104

#define IDD_GETTEXT1		10100
#define IDD_GETTEXT2		10101
#define IDD_STATICTEXT1		10102
#define IDD_STATICTEXT2		10103

#define	IDD_FILENAME	10000
#define IDD_SAVENAME	10001
#define IDD_BYTESMOVED	10002
#define IDD_PACKETS	10003
#define IDD_RETRIES	10004
#define IDD_PERCENTAGE	10005
#define IDD_OPERATION	10006

/* Menu items.  Must be consecutive to end marker */
#define IDM_KRM_SEND		10200
#define IDM_KRM_RECEIVE		10201
#define IDM_KRM_GET		10202

#define IDM_KRM_FINISH		10203
#define IDM_KRM_LOGOUT		10204
#define IDM_KRM_BYE		10205
#define IDM_KRM_CWD		10206
#define IDM_KRM_REMOTEDIR	10207
#define IDM_KRM_REMOTETYPE	10208
#define IDM_KRM_REMOTEHELP	10209
#define IDM_KRM_REMOTEDEL	10210
#define IDM_KRM_REMOTEWHO	10211
#define IDM_KRM_REMOTESPACE	10212
#define IDM_KRM_REMOTEHOST	10213
/* end consecutive list */

/* these next menu items must be consecutive */
#define IDM_CANCELFILE		10220
#define IDM_CANCELBATCH		10221
#define IDM_ERRORCANCEL		10222
#define IDM_CANCELPROTOCOL	10223

#define IDM_RXPARAMS		10230
#define IDM_TXPARAMS		10231
#define IDM_MXPARAMS		10232

/* strings */
#define IDS_KRM_SENDING		10319
#define IDS_KRM_KERMIT		10320
#define IDS_KRM_ADDDEFAULTS	10321
#define IDS_KRM_GETFILES	10324
#define IDS_KRM_CWD		10325
#define IDS_KRM_PASSWORD	10326
#define IDS_KRM_REMOTEDIR	10329
#define IDS_KRM_REMOTETYPE	10332
#define IDS_KRM_REMOTEDEL	10335
#define IDS_KRM_REMOTEHELP	10338
#define IDS_KRM_REMOTEWHO	10341
#define IDS_KRM_REMOTESPACE	10344
#define IDS_KRM_REMOTEHOST	10347
#define IDS_KRM_TIMER		10400
#define IDS_KRM_FILEWARN	10401
#define IDS_KRM_DISCARD		10402
#define IDS_KRM_BELL		10403

/* states for getpacket */
#define PS_SYNCH		10000
#define PS_LEN			10001
#define PS_NUM			10002
#define PS_TYPE			10003
#define PS_DATA			10004
#define PS_CHK			10005
#define PS_DONE			10006

/* macros */
#define tochar(ch) ((ch) + ' ')
#define unchar(ch) ((ch) - ' ')
#define ctl(ch) ((ch) ^ 64)

/* send init packet structure */
struct sendinit_rec {
    int maxpacketsize;
    int timeout;
    int padcount;
    char padchar;
    int eol;
    char quote;
    char binquote;
    int chksumtype;
    char rptprefix;
};

/* general kermit variables */
struct Kermit_rec {
    int numtry;			/* number of attempts */
    int maxtry;
    int maxsenddatalen;		/* maximum send packet length */
    int chksumtype;		/* check sum type */
    unsigned retrycount;	/* retry count */
    int pktnum;			/* my packet number */
    unsigned pktcount;		/* packet count for display on screen */
    long bytesmoved;    	/* bytes transferred */
    long filesize;		/* file size in bytes */
    int percentage;		/* percentage moved */
    unsigned waitsendtime;	/* wait in ms before sending first send_init */
    unsigned mstimeout;		/* remote timeout in ms */
    int errorcount;		/* error count */

    BOOL fileabort;		/* abort file transfer */
    BOOL batchabort;
    BOOL protocolabort;
    BOOL inpacket;
    BOOL newname_flag;
    BOOL waitsend;
    int displayfile;
    
    BOOL ebqflg;
    int rqf;
    char ebq;

    BOOL rptflg;

    BOOL timer;
    BOOL filewarning;
    BOOL filediscard;
    BOOL bell;

    short DispCharWidth, DispCharHeight;

    HANDLE hfilelist;
    char *pfilelist;
    char *pNextFile;
    char *filename;		/* filename from pathname in ofstruct */
    HANDLE hRemoteCommand;
    char *pRemoteCommand;
    HANDLE hInFile;
    HANDLE hOutFile;
    FARPROC fpTimer;

    WORD ids_title;
    char remotecmd;
    BOOL nullstrOK;

    int sstate;
    BOOL timeout;		/* packet timed out */
};

EXTERN struct Kermit_rec Kermit;

/* packet structure */
struct packet_rec {
    BYTE mark;
    int len;
    int num;    
    BYTE type;
    BYTE rchksum;
    int state;
    BYTE cchksum;
    int data_count;
    BYTE data[100];
};

EXTERN struct packet_rec rcvpkt;

/* send packet structure */
struct sndpkt_rec {
    BYTE mark;
    BYTE data[100];
    BYTE pktbuf[110];
    int len;
};

EXTERN struct sndpkt_rec sndpkt;

/* default manifests */
#define KRM_DEFMARK		1
#define KRM_DEFMAXTRY		5
#define KRM_MAXPACKETSIZE	94
#define KRM_DEFPACKETSIZE 	80
#define KRM_MINPACKETSIZE	10
#define KRM_DEFTIMEOUT 		5
#define KRM_DEFPADCOUNT 	0
#define KRM_DEFPADCHAR 		'\000'
#define KRM_DEFEOL		13
#define KRM_DEFQUOTE		'#'
#define KRM_DEFBINQUOTE		'Y'
#define KRM_DEFCHKSUM		1
#define KRM_DEFRPTCHAR		' '

/* miscellaneous variables */
EXTERN int krmState;
EXTERN OFSTRUCT myofstruct;
EXTERN struct sendinit_rec remote;
EXTERN struct sendinit_rec local;
EXTERN HWND hWndXfer;
EXTERN FARPROC fpXfer;
