home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
atarist
/
astgmt.c
< prev
next >
Wrap
C/C++ Source or Header
|
2020-01-01
|
9KB
|
318 lines
/*
* astgmt.c ATARI ST Kermit: GEM interface to Transfer functions
*/
#include <osbind.h> /* TOS bindings */
#include <stdio.h> /* common I/O defintions */
#include <obdefs.h> /* common object defintions */
#include <gemdefs.h> /* 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);
}