/*********************************************************************/
/*                                                                   */
/*  This Program Written by Paul Edwards, 3:711/934@fidonet.         */
/*  Released to the Public Domain                                    */
/*                                                                   */
/*********************************************************************/
/*********************************************************************/
/*                                                                   */
/*  zmfr - friend functions that operate on zmcore + zmext           */
/*                                                                   */
/*********************************************************************/
#include	<cfxbios.h>		// Persistor BIOS and I/O Definitions
#include	<cfxpico.h>		// Persistor PicoDOS Definitions

#include	<assert.h>
#include	<ctype.h>
#include	<errno.h>
#include	<float.h>
#include	<limits.h>
#include	<locale.h>
#include	<math.h>
#include	<setjmp.h>
#include	<signal.h>
#include	<stdarg.h>
#include	<stddef.h>
#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<time.h>

#include	<dirent.h>		// PicoDOS POSIX-like Directory Access Defines
#include	<dosdrive.h>	// PicoDOS DOS Drive and Directory Definitions
#include	<fcntl.h>		// PicoDOS POSIX-like File Access Definitions
#include	<stat.h>		// PicoDOS POSIX-like File Status Definitions
#include	<termios.h>		// PicoDOS POSIX-like Terminal I/O Definitions
#include	<unistd.h>		// PicoDOS POSIX-like UNIX Function Definitions

#include "error.h"
#include "trav.h"
#include "unused.h"

#include "zmext.h"
#include "zmcore.h"
#include "zmfr.h"



void extModemClearInbound(ZMCORE *zmcore, ZMEXT *zmext)
{
	SCIRxFlush();
    return;
}

void extModemResponseSent(ZMCORE *zmcore, ZMEXT *zmext)
{
    unused(zmcore);
    unused(zmext);
    return;
}

/*
void extModemGetBlock(ZMCORE *zmcore, 
                      ZMEXT *zmext, 
                      void *buf, 
                      size_t max, 
                      size_t *actual)
{
    char inchar;
    size_t chars_read;
	unused(zmcore);
	
	for(chars_read=0;chars_read<max;chars_read++)
	{
		inchar = SCIRxGetCharWithTimeout(2000);		// Wait 2 seconds for a character
		if(inchar == (-1)) break;					// If no char, break
		buf = inchar;				// If char, store it
		 						
	}
	
   if (chars_read == 0)
    {
        errorSet(ZMODEM_TIMEOUT);
    }
    *actual = chars_read;
    
    return;
}
*/

void extModemRegisterBad(ZMCORE *zmcore, ZMEXT *zmext)
{
    unused(zmcore);
    unused(zmext);
    return;
}

void extModemRegisterGood(ZMCORE *zmcore, ZMEXT *zmext)
{
    unused(zmcore);
    unused(zmext);
    return;
}

/*
void extModemGetBlockImm(ZMCORE *zmcore, 
                         ZMEXT *zmext,
                         void *buf, 
                         size_t max, 
                         size_t *actual)
{
    char inchar;
    size_t chars_read = 0;
    unused(zmcore);


	inchar = SCIRxGetCharWithTimeout(10);		// Wait 10 ms for a character
	if(inchar != (-1) 					
	{
		(char*)buf++ = inchar;					// Store char if there
		chars_read++; 						
	}
    
    if (chars_read == 0)
    {
        errorSet(ZMODEM_TIMEOUT);
    }
    *actual = chars_read;

    return;
}
*/
/*
void extModemWriteBlock(ZMCORE *zmcore, ZMEXT *zmext, void *buf, size_t max)
{

    size_t chars_sent;
    char out_char;
    unused(zmcore);    
 	
 	for(chars_sent=0;chars_sent<max;chars_sent++)
 	{
 		SCITxPutChar((ushort*) buf++);
 	}

    return;
}
*/
   
void extFileSetInfo(ZMCORE *zmcore,
                    ZMEXT *zmext,
                    unsigned char *filename, 
                    unsigned char *fileinfo,
                    long *offset,
                    int *skip)
{
    unused(fileinfo);
    unused(zmcore);
    printf("opening file %s\n", filename);
    zmext->fq = fopen((char *)filename, "wb");
    if (zmext->fq == NULL)
    {
        printf("failed to open file %s\n", filename);
    }
    *offset = 0;
    *skip = 0;
    return;
}

void extFileWriteData(ZMCORE *zmcore, ZMEXT *zmext, void *buf, size_t bytes)
{
    unused(zmcore);
    fwrite(buf, bytes, 1, zmext->fq);
    return;
}

void extFileFinish(ZMCORE *zmcore, ZMEXT *zmext)
{
    unused(zmcore);
    printf("closing file\n");
    fclose(zmext->fq);
    return;
}

int extFileGetFile(ZMCORE *zmcore, 
                   ZMEXT *zmext, 
                   unsigned char *buf, 
                   long *filesize)
{
    int ret = 0;

    unused(zmcore);    
    strcpy((char *)buf, zmext->fileList[zmext->fileUpto++]);
    printf("opening file %s\n", buf);
    zmext->fq = fopen((char *)buf, "rb");
    if (zmext->fq == NULL)
    {
        printf("failed to open file %s\n", buf);
    }
    else
    {
        fseek(zmext->fq, 0, SEEK_END);
        *filesize = ftell(zmext->fq);
        rewind(zmext->fq);
        ret = 1;
    }
    return (ret);
}

void extFileSetPos(ZMCORE *zmcore, ZMEXT *zmext, long offset)
{
    unused(zmcore);
    fseek(zmext->fq, offset, SEEK_SET);
    printf("seeking to offset %lu\n", offset);
    return;
}

int extFileGetData(ZMCORE *zmcore,
                   ZMEXT *zmext,
                   void *buf, 
                   size_t max, 
                   size_t *bytes)
{
    unused(zmcore);
    *bytes = fread(buf, 1, max, zmext->fq);
//    printf("read %d bytes\n", *bytes);
    return (*bytes != 0);
}
