/************************************************************************
*  vt100 terminal emulator with xmodem transfer capability
*
*     v1.0  DBW   860710   Dave Wecker - major rewrite of AmigaTerm
*
*  use <esc> to abort xmodem or kermit transfers
*
*  written by Michael Mounier
*  new version by Dave Wecker
************************************************************************/

/*  all includes defines and globals */
#define MODULE_MAIN 1
#include "vt100.h"

/******************************************************/
/*                   Main Program                     */
/*                                                    */
/*      This is the main body of the program.         */
/******************************************************/

main()
    {
    ULONG class;
    USHORT code,menunum,itemnum;
    int KeepGoing,capture,send,maxwait;
    char c,name[32];
    FILE *tranr,*trans;

    InitDevs();
    InitFileItems();
    InitRSItems();
    InitXFItems();
    InitMenu();
    SetMenuStrip(mywindow,&menu[0]);

    KeepGoing = TRUE;
    capture=FALSE;
    send=FALSE;
    x = MINX ; y = MINY; curmode = 0;
    SetAPen(mywindow->RPort,1L);
    cursoron();
    cursoroff();
    emit(12);
    BeginIO(Read_Request);

    while( KeepGoing )
	    {
	    /* wait for window message or serial port message */
	    cursoron();
	    Wait((1L << Read_Request->IOSer.io_Message.mn_ReplyPort->mp_SigBit) |
		(1L << mywindow->UserPort->mp_SigBit));
	    cursoroff();

	    if (send)
		{
		if ((c=getc(trans)) != EOF)
		    {
		    if (c == '\n') c = '\r';
		    sendchar(c);
		    }
		else
		    {
		    fclose(trans);
		    emits("\nFile Sent\n");
		    send=FALSE;
		    }
		}
	    maxwait = 0;
	    while (CheckIO(Read_Request) && maxwait++ < 20)
		{
		WaitIO(Read_Request);
		c=rs_in[0] & 0x7f;
		BeginIO(Read_Request);
		doremote(c);
		if (capture && c != 10) {
		    if (c == 13) c = 10;
		    putc(c , tranr);
		    }
		}

	    while( NewMessage=(struct IntuiMessage *)GetMsg(mywindow->UserPort) )
		{
		class = NewMessage->Class;
		code = NewMessage->Code;
		ReplyMsg( NewMessage );
		switch( class )
		    {
		    case CLOSEWINDOW:
		    KeepGoing = FALSE;
		    break;

		    case RAWKEY:
		    c = toasc(code);
		    break;

		    case NEWSIZE:
		    emit(12);
		    break;

		    case MENUPICK:
		    if ( code != MENUNULL )
			{
			menunum = MENUNUM( code );
			itemnum = ITEMNUM( code );
			switch( menunum )
			    {
			    case 0:
			    switch( itemnum )
				{
				case 0:
				if (capture == TRUE)
				    {
				    capture=FALSE;
				    fclose(tranr);
				    emits("\nEnd File Capture\n");
				    }
				else
				    {
				    emits("\nAscii Capture:");
				    filename(name);
				    if ((tranr=fopen(name,"w")) == 0)
					{
					capture=FALSE;
					emits("\nError Opening File\n");
					break;
					}
				    capture=TRUE;
				    }
				break;

				case 1:
				if (send == TRUE)
				{ 
				    send=FALSE;
				    fclose(trans);
				    emits("\nFile Send Cancelled\n");
				    }
				else
				    {
				    emits("\nAscii Send:");
				    filename(name);
				    if ((trans=fopen(name,"r")) == 0)
					{
					send=FALSE;
					emits("\nError Opening File\n");
					break;
					}
				    send=TRUE;
				    }
				break;

				case 2:
				emits("\nXmodem Receive:");
				filename(name);
				if (XMODEM_Read_File(name))
				    {
				    emits("\nRecieved File\n");
				    emit(8);
				    }
				else
				    {
				    close(fd);
				    emits("Xmodem Receive Failed\n");
				    emit(8);
				    }
				break;

				case 3:
				emits("\nXmodem Send:");
				filename(name);
				if (XMODEM_Send_File(name))
				    {
				    emits("\nSent File\n");
				    emit(8);
				    }
				else
				    {
				    close(fd);
				    emits("\nXmodem Send Failed\n");
				    emit(8);
				    }
				break;

				case 4:
				emits("\nKermit Receive local name:");
				filename(name);
				if (dokreceive(name))
				    {
				    emits("\nRecieved File\n");
				    emit(8);
				    }
				else
				    {
				    close(fd);
				    emits("Kermit Receive Failed\n");
				    emit(8);
				    }
				break;

				case 5:
				emits("\nKermit Send local name:");
				filename(name);
				if (doksend(name))
				    {
				    emits("\nSent File\n");
				    emit(8);
				    }
				else
				    {
				    close(fd);
				    emits("\nKermit Send Failed\n");
				    emit(8);
				    }
				break;
				}
			    break;

			    case 1:
			    AbortIO(Read_Request);
			    switch( itemnum )
				{
				case 0:
				Read_Request->io_Baud = 300;
				break;
				case 1:
				Read_Request->io_Baud = 1200;
				break;
				case 2:
				Read_Request->io_Baud = 2400;
				break;
				case 3:
				Read_Request->io_Baud = 4800;
				break;
				case 4:
				Read_Request->io_Baud = 9600;
				break;
				}
			    Read_Request->IOSer.io_Command = SDCMD_SETPARAMS;
			    DoIO(Read_Request);
			    Read_Request->IOSer.io_Command = CMD_READ;
			    BeginIO(Read_Request);
			    break;

			    case 2:
			    switch( itemnum )
				{
				case 0:
				imagemode = 0;
				break;

				case 1:
				imagemode = 1;
				break;
				}
			    break;
			    } /* end of switch ( menunum ) */
			}    /*  end of if ( not null ) */
		    }   /* end of switch (class) */
		}   /* end of while ( newmessage )*/
	    }  /* end while ( keepgoing ) */

    /*   It must be time to quit, so we have to clean
    *   up and exit.
    */

    CloseDevice(Read_Request);
    DeletePort(Read_Request->IOSer.io_Message.mn_ReplyPort);
    FreeMem(Read_Request,(long)sizeof(*Read_Request));
    CloseDevice(Write_Request);
    DeletePort(Write_Request->IOSer.io_Message.mn_ReplyPort);
    FreeMem(Write_Request,(long)sizeof(*Write_Request));
    ClearMenuStrip( mywindow );
    FreeColorMap( mycolormap );
    CloseWindow( mywindow );
    CloseScreen( myscreen );
    exit(FALSE);
    } /* end of main */
