/*->c.mzmodem */

/* collection of common routines and variables from zmodem progs */


#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <stdarg.h>
#include <ctype.h>
#include <time.h>


#include "h.os"
#include "h.wimp"
#include "h.bbc"


#include "h.def"

#include "h.wos"
#include "h.timex"


#include "h.mym"
#include "h.serial"
#include "h.view"
#include "h.batch"
#include "h.ftp"
#include "h.xmodem"



#include "h.zmodem"
#include "h.zmextra"


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

int  AutoResume=1;
int  zmautodload;


unsigned Txwindow;      /* Control the size of the transmitted window */
unsigned Txwspac;       /* Spacing between zcrcq requests */
unsigned Txwcnt;        /* Counter used to space ack requests */
long Lrxpos;            /* Receiver's last reported offset */


int Filesleft;
long Totalleft;


FILE *in;

char * txbuf;


int Ascii=0;            /* Add CR's for brain damaged programs */
int blklen=128;         /* length of transmitted records */
int Optiong;            /* Let it rip no wait for sector ACK's */
int Eofseen;            /* EOF seen on input set by zfilbuf */
int BEofseen;           /* EOF seen on input set by fooseek */
int Lfseen=0;


unsigned Rxbuflen = 16384;      /* Receiver's max buffer length */
int Tframlen = 0;       /* Override for tx frame length */
int blkopt=0;           /* Override value for zmodem blklen */
int Rxflags = 0;
long bytcnt;
int  Wantfcs32=TRUE;    /* want to send 32 bit FCS */
char Lzconv;            /* Local ZMODEM file conversion request */
char Lzmanag;           /* Local ZMODEM file management request */
int  Lskipnocor;
char Lztrans;

char zconv;             /* ZMODEM file conversion request */
char zmanag;            /* ZMODEM file management request */
char ztrans;            /* ZMODEM file transport request */


long Lastsync;          /* Last offset to which we got a ZRPOS */
int Beenhereb4;         /* How many times we've been ZRPOS'd same place */



FILE *fout;

int Lastrx;
int Firstsec;
int Eofseen;            /* indicates cpm eof (~Z) has been received */
int errors;


long Bytesleft;         /* number of bytes of incoming file left */
long Modtime;           /* Unix style mod time for incoming file */
int  Filemode;          /* Unix style mode for incoming file */



int Rxbinary=FALSE;     /* receive all files in bin mode */
int Rxascii=FALSE;      /* receive files in ascii (translate) mode */
int Thisbinary;         /* current file is to be received in bin mode */
int Blklen;             /* record length of received packets */


char * secbuf;


time_t timep[2];
char   Lzmanag;           /* Local file management request */
char   zconv;             /* ZMODEM file conversion request */
char   zmanag;            /* ZMODEM file management request */
char   ztrans;            /* ZMODEM file transport request */
int    Zctlesc;           /* Encode control characters */
int    Zrwindow = 1400;   /* RX window size (controls garbage count) */




int tryzhdrtype=ZRINIT; /* Header type to send corresponding to Last rx close */



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

/*
 * Routine to calculate the free bytes on the current file system
 *  ~0 means many free bytes (unknown)
 */

long getfree(void)
{
 return(~0L);    /* many free bytes ... */
}








/* Local screen character display function */

void bttyout(int c)
{
 /* display character on terminal screen */
}







#ifdef ZMDEBUG


static FILE * zdbf=NULL;


void zdeb(char * format, ...)
{
 va_list args;
 char v[256];

 va_start(args, format);

 if(!zdbf)
 {
  zdbf=fopen("zm_debug","wb");
  if(!zdbf) return;
 }

 vsprintf(v, format, args);

 fprintf(zdbf,"%s\n",v);

 va_end(args);
}


#endif





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

#ifdef NEVER

void setpopzmodem(void)
{
 tickst(zmodem_menu,0,Wantfcs32);
 tickst(zmodem_menu,1,AutoResume);
 tickst(zmodem_menu,2,zmautodload);
}


void decodezmodem(int m2,int m3,int m4)
{

 switch(m2)
 {
  case 0:
         Wantfcs32^=1;
         break;

  case 1:
         AutoResume^=1;
         break;

  case 2:
         zmautodload^=1;
         break;
 }

 m3=m4;
}

#endif



static int tempzmautodload;
static int tempAutoResume;
static int tempWantfcs32;


void zmodemicon(void)
{
 int handle=whandle[TZMODEM];

 switch(icon)
 {
  case 0:
         selectst(handle,0,tempWantfcs32^=1);
         break;

  case 1:
         selectst(handle,1,tempAutoResume^=1);
         break;

  case 2:
         zmautodload=tempzmautodload;
         AutoResume=tempAutoResume;
         Wantfcs32=tempWantfcs32;
         if(buttons==0x4) zapmenu();
         break;

  case 3:
         selectst(handle,3,tempzmautodload^=1);
         break;

 }
}


int zmodemsetup(void)
{
 int handle=createwindow(TZMODEM);

 tempzmautodload=zmautodload;
 tempAutoResume=AutoResume;
 tempWantfcs32=Wantfcs32;

 selectst(handle,0,tempWantfcs32);
 selectst(handle,1,tempAutoResume);
 selectst(handle,3,tempzmautodload);

 return(handle);
}





/* attempt to rx files using zmodem */

void zmodemrx(void)
{
 char buff[1030];

 secbuf=buff;

 wcreceive();
}




/* attempt to tx files using zmodem */

void zmodemtx(void)
{
 int  fx;
 int  ret;
 char buff[1030];

 txbuf=buff;

 Txfcs32=Wantfcs32;

 ret=!ERROR;

 stohdr(0);
 zshhdr(ZRQINIT,Txhdr);

 while((fx=txbatchnext())>-1 && ret!=ERROR)
 {
  ret=wcs(fx);
 }

 sendsaybibi();
}


