/*
    $Header: Welmat:src/Welmat/xprfts/RCS/xprfts.h,v 1.2 92/11/24 23:40:53 rwm Exp Locker: rwm $

    Main include file for XPR FTS protocol

    Copyright (C) 1992 Russell McOrmond

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

 */

/* Return codes */
#define OK            0
#define NODCD       (-1)
#define ERROR       (-2)
#define GOTEOT      (-3)
#define GOTACK      (-4)
#define GOTSACK     (-5)
#define GOTNAK      (-6)
#define GOTCNAK     (-7)
#define GOTSNAK     (-8)
#define GOTSCNAK    (-9)
#define GOTBLOCK    (-10)
#define GOTBADBLOCK (-11)
#define MDM7BAD     (-12)
#define TIMEOUT     (-13)

#define SCRATCHLEN 256

/* relevant characters */
#define TSYNCH 0xAE
#define YOOHOO 0xF1
#define SOH    0x01
#define SYN    0x16
#define ACK    0x06
#define NAK    0x15
#define EOT    0x04
#define ENQ    0x05
#define ETB    0x17
#define CAN    0x18
#define SUB    PADZ
#define PADZ   0x1A
#define CNAK   'C'
#define HELLONAK '?'
#define ESC    0x1b

struct Vars {
     /* Copy of XProtocol IO struct passed in by term prog. */
  struct XPR_IO io;                   
     /* Scratchpad xpr_update() control struct */
  struct XPR_UPDATE __aligned xpru;  
  UBYTE option_7;
  UBYTE option_c;
  UBYTE option_o;
  UBYTE option_i;
  UBYTE option_p;
  UBYTE option_s;
  UBYTE option_b;
  UBYTE option_a;
  UBYTE option_n;
  UBYTE option_w;
  UBYTE option_f;
  UBYTE option_m;

     /* a debug level */
  long debug;
     /* count incoming and out-going files */
  long infiles,outfiles;
     /* Scratchpad buffer for printing messages */
  UBYTE __aligned scratch[SCRATCHLEN];     
};

/* Option settings and other variables needed outside of XProtocolSend/Receive;
   separated from rest of Vars so that huge Vars struct doesn't have to be
   allocated except during transfers.  Pointer to this struct kept in xpr_data. */
struct SetupVars {
  UBYTE *matchptr, *bufpos;
  short buflen;
  long debug;
  UBYTE option_7[2],option_c[2],option_o[2],option_i[2],option_p[2],option_s[2],
        option_b[2],option_a[2],option_n[2],option_w[2],option_f[2],option_m[2];
};


/* Function prototypes */
long  __saveds XProtocolSend(struct XPR_IO *io);
long __saveds XProtocolReceive(struct XPR_IO *io);
long __saveds XProtocolSetup(struct XPR_IO *io);
long __saveds XProtocolCleanup(struct XPR_IO *io);
long __saveds XProtocolHostMon(struct XPR_IO *io,UBYTE *serbuff,long actual,long maxsize);
long __saveds XProtocolUserMon(struct XPR_IO *io,UBYTE *serbuff,long actual,long maxsize);
struct Vars *setup(struct XPR_IO *io);
UBYTE *find_option(UBYTE *buf,UBYTE option);
void ioerr(struct XPR_IO *io,char *msg);
void upderr(struct Vars *v,char *msg);
void updmsg(struct Vars *v,char *msg);

/* format.asm */
int SPrintF(UBYTE *buf, UBYTE *format,...);

/* debug.lib */
int KPrintF(UBYTE *format,...);

void * __asm xpr_fopen(register __a3 struct XPR_IO *io,register __a0 char *filename,register __a1 char *accessmode);
void __asm xpr_fclose(register __a3 struct XPR_IO *io,register __a0 void *fileptr);
long __asm xpr_fread(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __d0 long size,register __d1 long count,register __a1 void *fileptr);
long __asm xpr_fwrite(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __d0 long size,register __d1 long count,register __a1 void *fileptr);
long __asm xpr_sread(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __d0 long size,register __d1 long timeout);
long __asm xpr_swrite(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __d0 long size);
long __asm xpr_sflush(register __a3 struct XPR_IO *io);
void __asm xpr_update(register __a3 struct XPR_IO *io,register __a0 struct XPR_UPDATE *updatestruct);
long __asm xpr_chkabort(register __a3 struct XPR_IO *io);
long __asm xpr_chkmisc(register __a3 struct XPR_IO *io);
long __asm xpr_gets(register __a3 struct XPR_IO *io,register __a0 char *prompt,register __a1 char *buffer);
long __asm xpr_setserial(register __a3 struct XPR_IO *io,register __d0 long newstatus);
long __asm xpr_ffirst(register __a3 struct XPR_IO *io,register __a0 char *buffer,register __a1 char *pattern);
long __asm xpr_fnext(register __a3 struct XPR_IO *io,register __d0 long oldstate,register __a0 char *buffer,register __a1 char *pattern);
long __asm xpr_finfo(register __a3 struct XPR_IO *io,register __a0 char *filename,register __d0 long typeofinfo);
long __asm xpr_fseek(register __a3 struct XPR_IO *io,register __a0 void *fileptr,register __d0 long offset,register __d1 long origin);
long __asm xpr_options(register __a3 struct XPR_IO *io,register __d0 long n,register __a0 struct xpr_option **opt);
long __asm xpr_unlink(register __a3 struct XPR_IO *io,register __a0 char *filename);
long __asm xpr_squery(register __a3 struct XPR_IO *io);
long * __asm xpr_getptr(register __a3 struct XPR_IO *io,register __d0 long type);

/* lotek.c */
int AllocWindowX(struct WindowX *WindowXBuff);
void FreeWindowX(struct WindowX *WindowXBuff);
void AckNak(struct Vars *v,int SeaLink,int blocknum,char AckNak);

/* support.c */
struct Vars *setup(struct XPR_IO *io);
UBYTE *find_option(UBYTE *buf,UBYTE option);
void ioerr(struct XPR_IO *io,char *msg);
void upderr(struct Vars *v,char *msg);
void updmsg(struct Vars *v,char *msg);
void updstatus(struct Vars *v,char *filename,long status);
ULONG GetSysTimeXPR(struct timeval *tv);

/* receivex.c */

long receiveXPacket(struct count_buf *thisCount_buf,struct Vars *v);
long receiveXFile(char *filename,struct Vars *v,BOOL fileattach);
long receivemdm7(char *filename,struct Vars *v);

/* sendx.c */

long sendXFiles(struct Vars *v);
void makeTelinkHeader(register unsigned char *buf,
                      char *filename,long size,long time, char mode);

void sendXPacket(struct Vars *v,BYTE ckmode,block *lastPacket,int blocknum);
long sendXFile(struct Vars *v,char *filename);
long sendmdm7(struct Vars *v,char *filename);

/* crc.c */

unsigned short update_crc(register unsigned char *bl,register int len,
  register unsigned short crc);

unsigned short compute_crc(unsigned char *bl, unsigned int len);
unsigned long update_crc32(register unsigned char *bl,register int len,
  register unsigned long crc);
unsigned long compute_crc32(unsigned char *bl, unsigned int len);
