/* * astgmt.c ATARI ST Kermit: GEM interface to Transfer functions */ #include /* TOS bindings */ #include /* common I/O defintions */ #include /* common object defintions */ #include /* GEM defintions */ #include "astinc.h" /* common KERMIT defintions */ #include "astobj.h" /* KERMIT object definitions */ OBJECT *optr, /* pointer to an object */ *displo; /* pointer to the Transfer Display Object */ int old_n, /* old packet number */ old_n_total, /* old total count */ old_bps, /* old bps */ old_timcnt, /* old timeout count */ old_nakcnt; /* old nak counter */ long int old_bytecnt; /* old byte count */ /* * handle transfer commands */ do_transfer(menuix) int menuix; { int ready, doit; char savfnam[13]; rsrc_gaddr(R_TREE,KERDISPL,&displo); tvar_init(); switch (menuix) { case TPUT: displo[KDSENDS].ob_flags &= ~HIDETREE; displ_object(KRTDOPUT,-1,0,MTRANS,&optr); doit = fsetfilename(gpathname,filnam); strcpy(savfnam,filnam); destroy_object(KRTDOPUT,-1,0,MTRANS); goto do_send; case TSEND: displo[KDSEND].ob_flags &= ~HIDETREE; displ_object(KRTDOSND,-1,0,MTRANS,&optr); doit = fsetfilename(gpathname,filnam); strcpy(savfnam,filnam); destroy_object(KRTDOSND,-1,0,MTRANS); do_send: if (!doit) return; dt_files(FALSE); displ_object(KERDISPL,-1,-1,MTRANS,&displo); msgall(-1,MSGSNDBG,gpathname,filnam); if (!f1stfil(filnam)) msgall(KRFILNEX,MSGFILNX); else { fp = NIL; if (ready = sendsw()) msgall(-1,MSGSNDRD); else msgall(-1,MSGSNDFD); }; break; case TGET: rsrc_gaddr(R_TREE,KRTASKG,&optr); change_state(optr,KRTASKAB,NORMAL); change_state(optr,KRTASKOK,NORMAL); displ_object(KRTASKG,-1,-1,MTRANS,&optr); doit = form_do(optr,KRTGFILN); destroy_object(KRTASKG,-1,-1,MTRANS); if (doit == KRTASKAB) return; strcpy(filnam1,optr[KRTGFILN].ob_spec->te_ptext); if (strlen(filnam1) == 0) return; displo[KDRECEIV].ob_flags &= ~HIDETREE; displ_object(KRTDOGET,-1,0,MTRANS,&optr); doit = fsetfilename(gpathname,filnam); strcpy(savfnam,filnam); destroy_object(KRTDOGET,-1,0,MTRANS); dt_files(FALSE); displ_object(KERDISPL,-1,-1,MTRANS,&displo); msgall(-1,MSGGETBG,filnam1,gpathname,filnam); fp = NULL; if (ready = getsw()) msgall(-1,MSGGETRD); else msgall(-1,MSGGETFD); break; case TRECEIVE: displo[KDRECEIV].ob_flags &= ~HIDETREE; displ_object(KRTDOREC,-1,0,MTRANS,&optr); doit = fsetfilename(gpathname,filnam); strcpy(savfnam,filnam); destroy_object(KRTDOREC,-1,0,MTRANS); if (!doit) return; dt_files(FALSE); displ_object(KERDISPL,-1,-1,MTRANS,&displo); msgall(-1,MSGRECBG,gpathname,filnam); fp = NULL; if (ready = recsw()) msgall(-1,MSGRECRD); else msgall(-1,MSGRECFD); break; case TFINISH: displo[KDFINISH].ob_flags &= ~HIDETREE; displ_object(KERDISPL,-1,-1,MTRANS,&displo); msgall(-1,MSGSRVFI); if (ready = gencmdsw('F')) msgall(-1,MSGFINRD); else msgall(KSVFERR,MSGFINFD); break; case TBYE: displo[KDBYE].ob_flags &= ~HIDETREE; displ_object(KERDISPL,-1,-1,MTRANS,&displo); msgall(-1,MSGSRVBY); if (ready = gencmdsw('L')) msgall(-1,MSGBYERD); else msgall(KSVBERR,MSGBYEFD); break; }; if (ready) change_state(displo,KRDABORT,DISABLED); else change_state(displo,KRDABORT,DISABLED | SELECTED); redisp_fld(KRDABORT,NIL,NIL); change_state(displo,KRDRFCTI,DISABLED); redisp_fld(KRDRFCTI,NIL,NIL); change_state(displo,KRDRDYOK,NORMAL); redisp_fld(KRDRDYOK,NIL,NIL); Cconout(0x07); form_do(displo,-1); destroy_object(KERDISPL,-1,-1,MTRANS); if (fp != NULL) fclose(fp); strcpy(filnam,savfnam); } /* some display utilities for the transfer function */ /* * access of message strings * will be used mostly by prtdeb & prtlog */ char *msg_string(ix) int ix; { OBJECT *oprt; rsrc_gaddr(R_TREE,KRMESSS,&oprt); return (oprt[ix].ob_spec); } /* * initialize transfer variables * and transfer display object */ tvar_init() { /* init vars */ numtry = getfile = n = n_total = filecnt = bps = nakcnt = timcnt = 0; old_n = old_n_total = old_bps = old_nakcnt = old_timcnt = 0; bytecnt = old_bytecnt = 0L; fp = NULL; strcpy(filnam1,"\0"); /* init display object */ change_state(displo,KRDABORT,NORMAL); change_state(displo,KRDRFCTI,NORMAL); change_state(displo,KRDRDYOK,DISABLED); displo[KDSEND].ob_flags |= HIDETREE; displo[KDSENDS].ob_flags |= HIDETREE; displo[KDRECEIV].ob_flags |= HIDETREE; displo[KDRECEIS].ob_flags |= HIDETREE; displo[KDFINISH].ob_flags |= HIDETREE; displo[KDBYE].ob_flags |= HIDETREE; dt_files(FALSE); dt_packets(FALSE); } /* * update file fields and redisplay */ dt_files(dp_change) int dp_change; { char *dest; char tname[21]; dest = displo[KDFILNAM].ob_spec->te_ptext; strncpy(tname,filnam,21); tname[21] = '\0'; sprintf(dest,"%s",tname); dest = displo[KDCNVFIL].ob_spec->te_ptext; strncpy(tname,filnam1,21); tname[21] = '\0'; sprintf(dest,"%s",tname); sprintf(displo[KDFCNT].ob_spec->te_ptext,"%d",filecnt); if (dp_change) { redisp_fld(KDFILNAM,NIL,NIL); redisp_fld(KDCNVFIL,NIL,NIL); redisp_fld(KDFCNT,NIL,NIL); }; } /* * update packet fields and redisplay */ dt_packets(dp_change) int dp_change; { sprintf(displo[KDPCNT].ob_spec->te_ptext,"%d",n_total); sprintf(displo[KDBCNT].ob_spec->te_ptext,"%ld",bytecnt); sprintf(displo[KDPNUM].ob_spec->te_ptext,"%02x",n); sprintf(displo[KDBPS].ob_spec->te_ptext,"%d",bps); sprintf(displo[KDNAKCNT].ob_spec->te_ptext,"%d",nakcnt); sprintf(displo[KDTIMCNT].ob_spec->te_ptext,"%d",timcnt); if (dp_change) { redisp_fld(KDPCNT,&n_total,&old_n_total); if (bytecnt != old_bytecnt) redisp_fld(KDBCNT,NIL,NIL); old_bytecnt = bytecnt; redisp_fld(KDPNUM,&n,&old_n); redisp_fld(KDBPS,&bps,&old_bps); redisp_fld(KDNAKCNT,&nakcnt,&old_nakcnt); redisp_fld(KDTIMCNT,&timcnt,&old_timcnt); }; } /* * redisplay a field in the transfer display object */ redisp_fld(ix,new,old) int ix; int *new, *old; { int absx, absy; OBJECT *cobj; if ((new != NIL) && (old != NIL)) { if (*new == *old) return; else *old = *new; }; cobj = &(displo[ix]); objc_offset(displo,ix,&absx,&absy); objc_draw(displo,ROOT,MAX_DEPTH,absx,absy,cobj->ob_width,cobj->ob_height); } /* * display an error packet message */ displ_pckerr(msg) char *msg; { OBJECT *addr,*krabort; int maxslen; char *dest; rsrc_gaddr(R_TREE,KRABORT,&krabort); dest = krabort[KRABMESS].ob_spec->te_ptext; maxslen = strlen(krabort[KRABMESS].ob_spec->te_pvalid) - 1; strncpy(dest,msg,maxslen); dest[maxslen] = '\0'; displ_object(KRABORT,-1,-1,-1,&addr); form_do(addr,-1); change_state(addr,KRABOK,NORMAL); destroy_object(KRABORT,-1,-1,-1); displ_object(KERDISPL,-1,-1,-2,&addr); } /* * wait the specified milli seconds * and additionally for a click on the ABORT box * in the display object */ sleepwait(msecs) int msecs; { int event, dummy, dummy1, dummy2, mx, my; event = evnt_multi((MU_TIMER | MU_BUTTON), 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &dummy, msecs, 0, &mx, &my, &dummy, &dummy, &dummy1, &dummy2); if (MU_BUTTON & event) if (objc_find(displo, KRDABORT, 1, mx, my) == KRDABORT) { change_state(displo,KRDABORT,SELECTED); redisp_fld(KRDABORT,NIL,NIL); if (displ_alert(1,KRCONFAB) != 1) return ('A'); change_state(displo,KRDABORT,NORMAL); redisp_fld(KRDABORT,NIL,NIL); return(FALSE); } else if (objc_find(displo, KRDRFCTI, 1, mx, my) == KRDRFCTI) { change_state(displo,KRDRFCTI,SELECTED); redisp_fld(KRDRFCTI,NIL,NIL); evnt_timer(200,0); change_state(displo,KRDRFCTI,NORMAL); redisp_fld(KRDRFCTI,NIL,NIL); return('T'); } else Cconout(0x07); return(FALSE); }