/*
 *  CopyRight 1995. Nicholas Poljakov all rights reserved.
 */
#include <dos.h>
#include <stdio.h>
#include <string.h>
#include <io.h>
#include <fcntl.h>
#include <stdlib.h>
#include <state1.h>

#define BORDER 1
#define REV_VID 0x70
#define NORM_VID 0x1E
#define MAX_FRAME 31
#define BKSP 8
#define F1 59
#define F2 60
#define F3 61
#define F4 62
#define F5 63
#define F6 64
#define F7 65
#define F8 66
#define F9 67
#define F10 68
#define HM  71   /* Home key     */
#define UP  72   /* Up Arrow     */
#define PU  73   /* Page Up      */
#define LT  75   /* Left Arrow   */
#define RT  77   /* Right Arrow  */
#define END 79   /* End key      */
#define DN  80   /* Down Arrow   */
#define PD  81   /* Page Down    */
#define ESC '\033'
#define DIR 0x10
#define BLKSIZ 1000  /* block size for send */

#define ROWS1 19
#define ROWS2 23
#define ROWS  25
#define COLS 78
#define L_W 20
#define M_W 36
#define R_W 20
#define SCRNSIZE ((ROWS)*(COLS+2)*2)
#define LAST (24 * 80)*2

#define M0C  4     /* Files maping col.s */
#define M0L  14    /* Files maping rows  */
#define M0F (((80 * 5) + 9)) * 2
#define INTR 18*2

extern unsigned int attr1b;
extern unsigned int *ptrs;
extern int size;
extern unsigned char row, col;
extern int adapter;
extern unsigned char far *videomem;
extern int offset;
extern int sw;
extern char *path;
extern char file[12];
extern char tpname[31];
extern char luname[8];
extern char rcv_file[12];
extern char dta[128];

extern char far *vid_mem;
extern short cur_ln;

extern struct  part {            /* partner structure */
		  char	 plu[8] ;	     /* str plu_name	    */
                  int psl;                    /* str plu_s_limit     */
		  char	 mode_name[8] ;	     /* str mode_name	    */
                  int max_ru_size;            /* str ru_h_size       */
                  int pacing;                 /* str =               */
                  unsigned char lu_type;
               }  pstr[4];

extern struct APL_PARM{
       int status;  /* 0-start aplmain,1-start transaction,2-dos shell */
       char p[80];  /* string for system(p) */
       char args[64];/* string of arguments */
       int rc;      /* aplmain return code */
       char dir[60];/* directory name for aplmain */
       int drlen;   /* directory name length */
       void *tpe;   /* entry of exit program */
       char pgm_state;
}*p_aparm;

extern struct menu_frame {
    int startx, endx, starty, endy;
    unsigned char *p;
    char **menu;
    char *keys;
    int border;
    unsigned long count;
    unsigned char attrib;
    int active;
    int curx, cury;
    char *header;
    } frame[MAX_FRAME];

extern char p_dcl[21];
extern unsigned char dr_ind[80];
extern char c_pt[60];
extern int drive_ind[10];
extern char lu_name[9];
extern char lu_id[8];
extern char tp_id[8];
extern unsigned  long conv_id;
extern char mode_name[9];
extern char tp_exist;

SendFil(p, n)
char *p;
int n;
{
    long FS; /* File Size */
    int  fd; /* File handle */
    char *buff; /* input buffer */
    unsigned s;
    char fsiz[10];
    char retstr[8];
    unsigned long count;
    int i;
    int ch;
    unsigned char rts;
    unsigned char wr;
    unsigned int max_length ;

    char pt[80];
    unsigned  char tpn[64];
    struct rc {
                unsigned int prim;
                unsigned long sec;
              } v_rc;
    struct msg {  /*send_data*/
                int len;
                char str[BLKSIZ];
               } *p_gds;
    unsigned long rc;
    char p_lu[9];
    char p_mode[9];
    int length;

    if(( fd = open(p, O_RDONLY | O_BINARY)) < 0){
        window(20);
        window_xy(20, 6, 1);
        strcpy(pt, "Error file open. Press ESC to continue.");
        window_puts(20, pt);
        goto SendExit;
    }
    FS = filelength( fd );
    sprintf(fsiz, "%lu", FS);

    if ((p_gds = malloc(sizeof(struct msg))) == NULL) {
        return 1;
    }
    buff = (char *)p_gds + 2;
    window(20);
    window_xy(20, 1, 1);
    strcpy(pt, "Partner LU..................");
    strcat(pt, pstr[cur_ln].plu);
    window_puts(20, pt);
    window_xy(20, 2, 1);
    strcpy(pt, "File name...................");
    strcat(pt, p);
    window_puts(20, pt);
    window_xy(20, 3, 1);
    strcpy(pt, "File size...................");
    strcat(pt, fsiz);
    window_puts(20, pt);
    window_xy(20, 4, 1);
    strcpy(pt, "Sent count..................0");
    window_puts(20, pt);

   if ( n != 0 ){
    if (!tp_exist) {
        tp_started
                 (lu_id,
                  tp_id,
                  &rc);
        if (rc != 0) {
            window_xy(20, 6, 1);
            window_puts(20, "TP_started failure. Press ESC to exit.");
            goto SendExit;
	}
	tp_exist = 1; /* TP_started O.K! */
    }

     strcpy (tpn,"SEND "); /* name of work */
    strcat (tpn, p);      /* file name    */
    /*conv_id - return param -id work link */
    strcpy(p_lu, pstr[cur_ln].plu);
    strcpy(p_mode, pstr[cur_ln].mode_name);
    allocate  (p_lu,
               p_mode,
               tpn,
               WHEN_SESSION_ALLOCATED,
               NONE,
               NONE,
               NULL,
               NULL,
               tp_id,
               &conv_id,
               NULL,
               &v_rc) ;

    if (v_rc.prim != 0) {
        window_xy(20, 6, 1);
        window_puts(20, "Allocation failure. Press ESC to exit.");
        goto SendExit;
    }
  }
  else
       {
       max_length = 255;
       recwait (tp_id,
                conv_id,
                ll,
                &v_rc,
                &length,
                max_length,
                &rts,
                p_gds,
                &wr);
       }

    count = 0;
    while ((s = read(fd,buff, BLKSIZ)) > 0 ) {
	/*  Send this line */
       count += s;
       p_gds->len =s + 2;
       length=p_gds->len;
       send_data(tp_id,
                 conv_id,
                 p_gds,
                 0,
                 0,
                 length,
                 &v_rc,
		 &rts);
       max_length = 255;
       if (v_rc.prim == 0) {
	  recwait (tp_id,
                conv_id,
                ll,
                &v_rc,
                &length,
                max_length,
                &rts,
                p_gds,
                &wr);
       }
       else	{
           window(14);
           window_xy(14, 1, 4);
           window_puts(14, "Return code from send");
           sprintf(retstr,"%x", v_rc.prim);
           i = (30 - strlen(retstr))/2;
           window_xy(14, 2, i);
           window_puts(14, retstr);
           while ((ch = getch()) != ESC) ;
           deactivate(14);
           goto EndOfSend;
       }

       /* Map bytes count */
       window_xy(20, 4, 29);
       sprintf(fsiz, "%lu", count);
       window_puts(20, fsiz);
    }
EndOfSend:
    deallocate (tp_id,
                conv_id,
                Flush,
                &v_rc);
    if (v_rc.prim != 0) {
        window(14);
        window_xy(14, 1, 4);
        window_puts(14, "Ret. code from DEALLOCATE");
        sprintf(retstr,"%x", v_rc.prim);
        i = (30 - strlen(retstr))/2;
        window_xy(14, 2, i);
        window_puts(14, retstr);
        while ((ch = getch()) != ESC) ;
        deactivate(14);
    }
    window_xy(20, 6, 1);
    strcpy(pt, "Ready!  Press ESC to continue.");
    window_puts(20, pt);

SendExit:
    if (p_aparm -> pgm_state != 1) { /* Local control */
        while ((ch = getch()) != ESC) ;
    }
    else {
           tp_ended (tp_id, &rc);
           tp_exist = 0;
         }
    deactivate(20);
    close( fd );
    free( p_gds );

    return (0);
}
