/*************************************************************************
**   File:  ascii.c
**      contains ascii capture and send routines 
**
**   Functions:
**	do_send() - send ascii text file to remote
**	add_cap(char) - add char to capture buffer
**	open_cap() - open capture file and buffer
**	clos_cap() - close capture file
**	flush_cap() - write out contents of capture buffer to file
**	fix_menu() - adjust menu to reflect current capture file status
**
*************************************************************************/
#include "term.h"

extern char	 *getmem();

extern int	capture,
		cap_open,
		fd,
		bufr_ptr;
extern char	name[],
		*bufr;
extern LONG	bytes_xferred;
extern FILE	*tranr, *trans;
extern struct Window *mywindow;
extern struct Menu menu[];
extern struct MenuItem FileItem[];
extern struct IntuiText FileText[];
extern struct MenuItem X_Sub_Item[];

extern struct IOExtSer *Read_Request;
extern char rs_in[2];
extern struct IOExtSer *Write_Request;
extern char rs_out[2];

/*************************************************
*  locally defined variables 
*************************************************/

extern unsigned char readchar();

/*********************************************
**   function to send file (ascii)
*********************************************/

do_send()
{
	char c, ch, name[64];
	
	if (cap_open) flush_cap();
	
	emits("\nAscii Send:");
	filename(name);
	if ((trans = fopen(name,"r")) == 0) {
		emits("\nError Opening File\n");
		return(FALSE);
	}
	
	while ((c = getc(trans)) != EOF) {
		if (c == '\n')
			sendchar('\r');
		else if (c != '\r')
			sendchar(c);
		if (CheckIO(Read_Request)) {
			WaitIO(Read_Request);
			ch = rs_in[0] & 0x7f;
			BeginIO(Read_Request);
			emit(ch);
		}
		if (test_kbd_abort()) {
			emits("\n\nUser Cancelled Transfer\n");
			break;
		}
	}
	
	fclose(trans);
	emits("\nFile Sent\n");
	return(TRUE);
}


/*     capture file processes   */

add_cap(c)
	char c;
{
		/* trash them mangy ctl chars */
	if ((c > 31 && c < 127) || c == 10) 
		bufr[bufr_ptr++] = c;

	if (bufr_ptr >= BufSize) {
		flush_cap();
	}

	return(0);
}

open_cap()
{
	char nam[32];

	emits("\nAscii Capture:");
	filename(nam);
	if ((tranr=fopen(nam,"w")) == 0) {
		cap_open = capture = FALSE;
		fix_menu();
		emits("\nError Opening File\n");
		return(0);
	}
	cap_open = TRUE;
	if (bufr == NULL) {
		if ((bufr = getmem(BufSize)) == NULL) {
			emits("Unable to Allocate Buffer\n");
			fclose(tranr);
			cap_open = capture = FALSE;
			fix_menu();
		}
	}
	return(0);
}

clos_cap()
{
	flush_cap();
	if (cap_open)
		fclose(tranr);
	cap_open = capture = FALSE;
	emits("Capture File closed\n");
	fix_menu();
	return(0);
}

flush_cap()
{
	if (bufr_ptr > 0) {
		rs_out[0] = '\x13';  /* ctrl-s */
		DoIO(Write_Request);
		if (fwrite(bufr,1,bufr_ptr,tranr) != bufr_ptr) {
			emits("Capture File Truncated\n");
			fclose(tranr);
			capture = cap_open = FALSE;
			fix_menu();
		}
		bufr_ptr = 0;
		rs_out[0] = '\x11';	/* ctrl-q */
		DoIO(Write_Request);
	}
	return(0);
}

fix_menu()
{
	ClearMenuStrip(mywindow);
	if (capture) {
		FileItem[0].ItemFill = (APTR)&FileText[6];
	}
	else {
		FileItem[0].ItemFill = (APTR)&FileText[0];
	}
	if (cap_open) {
		FileItem[1].Flags |= ITEMENABLED;
	}
	else {
		FileItem[1].Flags &= (0xffff - ITEMENABLED);
	}
	SetMenuStrip(mywindow,&menu[0]);
	return(0);
}

