|
|
/* File: C:\WACKER\xfer\hpr.hh (Created: 24-Jan-1994)
* created from HAWIN source file: * hpr.hh -- Header file for HyperProtocol routines. * * Copyright 1989,1994 by Hilgraeve Inc. -- Monroe, MI * All rights reserved * * $Revision: 1 $ * $Date: 10/05/98 1:16p $ */
/* The NOTIMEOUTS constant can be defined to prevent HyperProtocol from
* timing out while waiting for the other end of the connection. This is * useful while debugging when events may be drawn out by debugging activities */ /* #define NOTIMEOUTS */
/* Constants for HyperProtocol */
#define H_MSGCHAR 0x01
#define MAXRETRIES 5
#define MAX_START_TRIES 25
#define RESYNCH_TIME 50
#define RESYNCH_INC 50
// #define RESYNCH_TIME 300
// #define RESYNCH_INC 300
#define FINAL_ACK_WAIT 1800L
#define BURSTSIZE 5
#define TIMEOUT_LIMIT 3
#define H_START_WAIT 100 /* no. of seconds to wait for startup */
#define H_MINBLOCK 128
#define H_MINDEADMAN 10
#define H_CHARTIME 100L
#define tochar(c) ((BYTE)((c) + 0x20))
#define unchar(c) ((BYTE)((c) - 0x20))
#define h_crc_calc(x, cc)\
{\ unsigned q;\ q = (x->h_crc ^ (cc)) & 0x0F;\ x->h_crc = (x->h_crc >> 4) ^ (q * 0x1081);\ q = (x->h_crc ^ ((cc) >> 4)) & 0x0F;\ x->h_crc = (x->h_crc >> 4) ^ (q * 0x1081);\ }
/* * * * * * * * * * * * * * * * * * * * * * *
* This section pertains to the sender only * * * * * * * * * * * * * * * * * * * * * * * */
/* status display codes passed to hsdsp_status() */ #define HSS_WAITSTART 0
#define HSS_SENDING 1
#define HSS_WAITACK 2
#define HSS_WAITRESUME 3
#define HSS_CANCELLED 4
#define HSS_COMPLETE 5
#define HSS_MAX 6
/* event display codes passed to hsdsp_event() */ #define HSE_GOTSTART 0
#define HSE_GOTRETRY 1
#define HSE_GOTRESUME 2
#define HSE_GOTACK 3
#define HSE_USRABORT 4
#define HSE_RMTABORT 5
#define HSE_USRCANCEL 6
#define HSE_RMTCANCEL 7
#define HSE_FILEERR 8
#define HSE_NORESP 9
#define HSE_FULL 10
#define HSE_DONE 11
#define HSE_ILLEGAL 12
#define HSE_ERRLIMIT 13
#define HSE_MAX 14
/* structure for the file status table. This table holds details about files
* during and after the time they are sent until they are acknowledged by * the receiver. */ struct s_ftbl { int filen; /* file number (1st file sent is 1, etc. */ int cntrl; /* control bits FTC_CONFIRMED and FTC_COMPRESSED */ int status; /* transfer status, normal, aborted, error, etc. */ long flength; /* length of this file in bytes */ long dsp_bytes; /* length of all files prior to this file */ long thru_bytes; /* amt. of data actually sent prior to this file */ TCHAR fname[FNAME_LEN]; /* file name */ };
/* file table control bits */ #define FTC_CONFIRMED 0x01
#define FTC_COMPRESSED 0x02
#define FTC_DONT_CMPRS 0x04
/* file table status values */ #define FTS_NORMAL 0
#define FTS_USRABORT 1
#define FTS_RMTABORT 2
#define FTS_FILEERR 3
#define FTS_COMMERR 4
/* control structure used by hyperprotocol sender */ struct s_hsc { int ft_current; /* index to current file in file table */ int ft_open; /* index to currently opened file */ int ft_top; /* index of highest used entry in file table */ int ft_limit; /* number of entries available in file table */ jmp_buf jb_bailout; /* jump buffer used to bail out of xfer */ jmp_buf jb_restart; /* jump buffer used during restarts */ int rmt_compress; /* TRUE if remote has indicated it is able to
handle compression */ int nfiles; /* no. of files to be transferred */ long nbytes; /* no. of bytes to be transferred */ long bytes_sent; /* no. of bytes actually passed to xmitter */
int rmtchkt; /* Type of error checking requested by remote
session. H_CRC by default. */ long last_response; /* time last message received */ int lastmsgn; /* last message number */ int rmtcancel; /* TRUE if remote has cancelled xfer */ int started; /* TRUE after 1st restart message is received
from remote */ int lasterr_filenum; /* file number of last restart request */ long lasterr_offset; /* file offset of last restart request */ int sameplace; /* no. of consecutive restarts to same spot*/ int receiver_timedout; /* true if receiver sent time out msg */
struct s_ftbl *hs_ftbl; /* pointer to dynamically allocated file
progress table */ int (*hs_ptrgetc)(void *); /* pointer to function to get
characters to send */ };
/* globals used by sender */ // extern struct s_hsc FAR *hsc; /* contains transfer control variables */
// extern struct s_ftbl FAR *hs_ftbl; /* pointer to dynamically allocated file
// progress table */
// extern metachar (NEAR *hs_ptrgetc)(void);/* pointer to function to get
// characters to send */
/* macros used to send characters using the double buffering scheme */ #define HSXB_SIZE 1024
#define HSXB_CYCLE 75
#define hs_xmit_(p,c) (--p->hsxb.cnt > 0 ? (*p->hsxb.bptr++ = (c)) : hs_xmit_switch(p,c))
#define HS_XMIT(p,c) {if ((c) == H_MSGCHAR) hs_xmit_(p,c); hs_xmit_(p,c);}
struct s_hsxb { char *curbufr; /* buffer being filled */ char *altbufr; /* other buffer, possibly being transmitted */ char *bptr; /* place to put next character to be sent */ unsigned bufrsize; /* size of each buffer in bytes */ unsigned total; /* number of bytes still free in the current buffer
not counting those in the current fill cycle */ unsigned cnt; /* number of bytes left to load in this fill cycle */ };
// extern unsigned hse_text[];
// extern unsigned hss_text[];
// extern struct s_hsxb hsxb; /* control structure for double buffered
// transmission scheme */
#define HS_XMIT_CLEAR hs_xbclear
#define HS_XMIT_FLUSH hs_xbswitch
struct s_hprsd { int k_received; unsigned int hld_options; };
// extern struct s_hprsd FAR *hsd;
/* * * * * * * * * * * * * * * * * * * * * * * *
* This section pertains to the receiver only * * * * * * * * * * * * * * * * * * * * * * * * */
/* Result codes for overall transfer */ #define H_OK 0
#define H_ERRLIMIT 1
#define H_BADMSGFMT 2
#define H_FILEERR 3
#define H_NORESYNCH 4
#define H_USERABORT 5
#define H_TIMEOUT 6
#define H_COMPLETE 7
#define H_NOSTART 8
#define H_RMTABORT 9
/* Result codes for data collection routines */ #define HR_UNDECIDED 0
#define HR_COMPLETE 1
#define HR_TIMEOUT 2
#define HR_MESSAGE 3
#define HR_KBDINT 4
#define HR_FILEERR 5
#define HR_NOCARRIER 6
#define HR_BADCHECK 7
#define HR_BADMSG 8
#define HR_LOSTDATA 9
#define HR_DCMPERR 10
#define HR_LOST_CARR 11
#define HR_VIRUS_FOUND 12
/* Hyper receive status codes for hrdsp_status() */ #define HRS_REQSTART 0
#define HRS_REQRESYNCH 1
#define HRS_REC 2
#define HRS_CANCELLED 3
#define HRS_COMPLETE 4
#define HRS_MAX 5
/* event codes for hrdsp_event() */ #define HRE_NONE 0
#define HRE_DATAERR 1
#define HRE_LOSTDATA 2
#define HRE_NORESP 3
#define HRE_RETRYERR 4
#define HRE_ILLEGAL 5
#define HRE_ERRFIXED 6
#define HRE_RMTABORT 7
#define HRE_USRCANCEL 8
#define HRE_TIMEOUT 9
#define HRE_DCMPERR 10
#define HRE_LOST_CARR 11
#define HRE_TOO_MANY 12
#define HRE_DISK_FULL 13
#define HRE_CANT_OPEN 14
#define HRE_DISK_ERR 15
#define HRE_OLDER_FILE 16
#define HRE_NO_FILETIME 17
#define HRE_VIRUS_DET 18
#define HRE_USER_SKIP 19
#define HRE_USER_REFUSED 20
#define HRE_MAX 21
/* Structure containing control variables for the receiver */ struct s_hrc { long bytes_expected; /* total number of bytes expected for xfer */ long checkpoint; /* number of bytes known to be good */ long basesize; /* original size of file being appended to */ int expected_msg; /* number of next expected message */ /* a timestamp of 0 means unused */ unsigned long ul_lstw; /* timestamp of file being received, if any */ unsigned long ul_cmp; /* time to compare to if /N option used */ /* a timestamp of -1 means rejected by time */ long filesize; /* size of file being received */ int files_expected; /* number of files to be rcvd. during xfer */ BYTE rmtfname[FNAME_LEN]; /* name remote system used for file */ TCHAR ourfname[FNAME_LEN]; /* name we will use for file */ int cancel_reason; /* event code associated with cancellation */ int using_compression; /* TRUE if we're using compression */ BYTE rmsg_bufr[256]; /* buffer to build outgoing messages */ int single_file; /* TRUE if user named single file as dest */ //SSHDLMCH ssmchVscan; /* handle for virus scanning */
int virus_detected; /* set TRUE upon virus detection */ //FARPROC pfVirusCheck; /* pointer to function for virus check */
int (*hr_ptr_putc)(void *, int); };
// VOID _export PASCAL hr_virus_detect(VOID FAR *h, USHORT usMatchId);
/* globals for receiver */ // extern struct s_hrc FAR *hrc;/* pointer to receiver's control structure */
// extern metachar (NEAR *hr_ptr_putc)(metachar);
extern int hr_result_codes[]; /* maps HyperProtocol event codes to
transfer status codes */
/******************************************************/ /* control structure used by both sender and receiver */ /******************************************************/
struct s_hc { HSESSION hSession;
int blocksize; /* current size of data blocks */ int current_filen; /* current file number */ int datacnt; /* keeps track of data sent or received */ long deadmantime; /* time between dead man notices */ unsigned total_tries; /* number of restarts */ long total_thru; /* total number of bytes transferred */ long total_dsp; /* total number of bytes for vu display */ int ucancel; /* set true if user hits cancel key */ int usecrc; /* set true if CRC is being used */ long xfertimer; /* interval timer value */ long xfertime; /* transfer time */ BYTE omsg_bufr[256]; /* outgoing message buffer */ BYTE *omsg; /* pointer into outgoing message buffer */ int omsgn; /* next outgoing message number */ int omsg_printable; /* true of outgoing message characters
should be confined to printable chrs */ int omsg_embed; /* true if outgoing messages should be embedded
in other outgoing data */ long last_omsg; /* time last outgoing message was sent */
unsigned h_checksum; /* used to calculate data checksum */ unsigned h_crc; /* used to calculate data crcs */ long h_filebytes; /* counts bytes transferred */
/* External parameters set by the user */ int h_useattr; /* use received attributes when available */ int h_trycompress; /* try to use compression when possible */ int h_chkt; /* 1 == checksum, 2 == CRC */ int h_resynctime; /* new resync time value */ int h_suspenddsk; /* old feature, no longer used */
long displayed_time; /* used in display timing */
BYTE *storageptr; /* temporary use */
BYTE msgdata[96]; /* more static storate stuff */ BYTE *dptr; int rmcnt;
struct s_hrc rc; /* data used for receiving */
struct s_hsc sc; /* data used for sending */
struct s_hsxb hsxb; /* control structure for double buffered */
struct s_hprsd sd; /* display stuff */
ST_IOBUF *fhdl; };
/* Globals used by sender and receiver.
* These items are defined as globals rather than being placed int one * of the control structures because they are accessed frequently in * speed-sensitive portions of the code. */ // extern struct s_hc FAR *hc; /* pointer to control structure */
// extern unsigned h_checksum; /* used to calculate data checksum */
// extern unsigned h_crc; /* used to calculate data crcs */
// extern long h_filebytes; /* counts bytes transferred */
/*************************/ /* function prototypes : */ /*************************/
/* used by both sender and receiver -- */ extern void omsg_init(struct s_hc *hc, int fPrintable, int fEmbedMsg); extern void omsg_new(struct s_hc *hc, BYTE type); extern int omsg_add(struct s_hc *hc, BYTE *newfield); extern int omsg_setnum(struct s_hc *hc, int n); extern int omsg_send(struct s_hc *hc, int burstcnt, int usecrc, int backspace); extern long omsg_last(struct s_hc *hc); extern int omsg_number(struct s_hc *hc);
// extern void h_crc_calc(uchar);
/* used by receiver -- */ extern int hr_collect_msg(struct s_hc *, int *, BYTE **, long); extern int hr_storedata(void *, int); extern void hr_still_alive(struct s_hc *, int, int); extern void hr_kbdint(struct s_hc *); extern int hr_decode_msg(struct s_hc *, BYTE *); extern int hr_reject_file(struct s_hc *, int); extern int hr_closefile(struct s_hc *, int); extern int hr_collect_data(struct s_hc *, int *, int, long); extern int hr_cancel(struct s_hc *, int); extern int hr_restart(struct s_hc *, int); extern int hr_resynch(struct s_hc *, int); extern int hr_putc(void *, int); extern int hr_putc_vir(void *, int); extern int hr_toss(void *, int);
extern void hr_suspend_input(VOID *hS, int suspend); extern void hr_check_input(VOID *hS, int suspend);
/* used by sender -- */ extern int hyper_sendx(struct s_hc *, int); extern int hs_datasend(struct s_hc *); extern void hs_dorestart(struct s_hc *, int, long, int, int); extern int hs_reteof(struct s_hc *); extern int hs_getc(struct s_hc *); extern void hs_background(struct s_hc *); extern void hs_rcvmsg(struct s_hc *); extern void hs_filebreak(struct s_hc *hc, int nfiles, long nbytes); extern void hs_waitack(struct s_hc *); extern void hs_decode_rmsg(struct s_hc *, BYTE *); extern void hs_fileack(struct s_hc *, int); extern void hs_logx(struct s_hc *, int);
/******************* end of hpr.hh *************************/
|