home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Elysian Archive
/
AmigaElysianArchive.iso
/
comm
/
zedzap05.lha
/
dosstuff.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-11-27
|
8KB
|
241 lines
#include <proto/all.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <exec/execbase.h>
/* added */
#include <libraries/dos.h>
#include <libraries/dosextens.h>
/* end */
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "xproto.h"
#include "zmodem.h"
#include "xprzmodem.h"
char WinName[256];
struct DosLibrary *DOSBase = NULL;
void ClearStats(struct Vars *v){
if(!DOSBase) return;
if(!v->use_dos_lib) return;
if(!v->TransferWindow) return;
WinPuts(v,"\x1B[1;1H\x1B[J\x1B[1m"); /* erase display */
WinPuts(v,"\x1B[1;1HProtocol:\n");
WinPuts(v,"\x1B[2;1H\n");
WinPuts(v,"\x1B[3;1H Filename:\x1B[3;40H Size:\n");
WinPuts(v,"\x1B[4;1HExpected Time:\x1B[4;40H Elapsed Time:\n");
WinPuts(v,"\x1B[5;1H CPS:\x1B[5;40H Bytes Sent:\n");
WinPuts(v,"\x1B[6;1H Block Size:\x1B[6;40H Blocks Sent:\n");
WinPuts(v,"\x1B[7;1H Block Check:\x1B[7;40H Char Delay:\n");
WinPuts(v,"\x1B[8;1H Packet Type:\x1B[8;40H Packet Delay:\n");
WinPuts(v,"\x1B[9;1H Errors:\x1B[9;40H TimeOuts:\n");
WinPuts(v,"\x1B[10;1H\n");
WinPuts(v,"\x1B[11;1H Last Message:\n");
WinPuts(v,"\x1B[12;1H Last Error:\n");
WinPuts(v,"\x1B[13;1H\n");
WinPuts(v,"\x1B[14;1H Status:\x1B[0m\n");
}
void UpdateStats(struct Vars *v){
struct XPR_UPDATE *xpru = &v->xpru;
char Buffer[100],buffer[20];
unsigned long val = 0, va = 0, vb = 0;
if(!DOSBase) return;
if(!v->use_dos_lib) return; /* dos.library may be open */
if(!v->TransferWindow) return;
/* do we even have to update something ? */
if(xpru->xpru_updatemask){
if(xpru->xpru_updatemask & XPRU_PROTOCOL){
sprintf(Buffer,"\x1B[1;10H%-20.20s\n",xpru->xpru_protocol);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_FILENAME){
sprintf(Buffer,"\x1B[3;15H%-20.20s\n",xpru->xpru_filename);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_FILESIZE){
sprintf(Buffer,"\x1B[3;54H%-20.20ld\n",xpru->xpru_filesize);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_EXPECTTIME){
sprintf(Buffer,"\x1B[4;15H%-20.20s\n",xpru->xpru_expecttime);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_ELAPSEDTIME){
sprintf(Buffer,"\x1B[4;54H%-20.20s\n",xpru->xpru_elapsedtime);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_DATARATE){
val = 0;
if(v->NEWBAUD){
val = (xpru->xpru_datarate * 1000) / v->NEWBAUD;
}
else{
val = (xpru->xpru_datarate * 1000) / v->Baud;
}
sprintf(buffer,"%ld (%ld%%)",xpru->xpru_datarate,val);
sprintf(Buffer,"\x1B[5;15H%-20.20s\n",buffer);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_BYTES){
val = 0;
va = v->Fsize;
vb = xpru->xpru_bytes;
while(va > 1000){ /* don't really need to be all that precise */
va = va / 10;
vb = vb / 10;
}
if(va) val = (vb * 100) / va;
sprintf(buffer,"%ld (%ld%%)",xpru->xpru_bytes,val);
sprintf(Buffer,"\x1B[5;54H%-20.20s\n",buffer);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_BLOCKSIZE){
sprintf(Buffer,"\x1B[6;15H%-20.20ld\n",xpru->xpru_blocksize);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_BLOCKS){
sprintf(Buffer,"\x1B[6;54H%-20.20ld\n",xpru->xpru_blocks);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_BLOCKCHECK){
sprintf(Buffer,"\x1B[7;15H%-20.20s\n",xpru->xpru_blockcheck);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_CHARDELAY){
sprintf(Buffer,"\x1B[7;54H%-20.20ld\n",xpru->xpru_chardelay);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_PACKETTYPE){
sprintf(Buffer,"\x1B[8;15H%-20.20ld\n",xpru->xpru_packettype);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_PACKETDELAY){
sprintf(Buffer,"\x1B[8;54H%-20.20ld\n",xpru->xpru_packetdelay);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_ERRORS){
sprintf(Buffer,"\x1B[9;15H%-20.20ld\n",xpru->xpru_errors);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_TIMEOUTS){
sprintf(Buffer,"\x1B[9;54H%-20.20ld\n",xpru->xpru_timeouts);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_MSG){
sprintf(Buffer,"\x1B[11;15H%-60.60s\n",xpru->xpru_msg);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_ERRORMSG){
sprintf(Buffer,"\x1B[12;15H%-60.60s\n",xpru->xpru_errormsg);
WinPuts(v,Buffer);
}
if(xpru->xpru_updatemask & XPRU_STATUS){
sprintf(Buffer,"\x1B[14;15H%-20.20ld\n",xpru->xpru_status);
WinPuts(v,Buffer);
}
}
}
void OpenDisplay(struct Vars *v){
/* open up the dos.library so we can do our own IO */
char *bufptr = WinName;
BPTR MyEnvVal = NULL;
char EnvVal[50];
*bufptr = 0;
CloseDisplay(v); /* maybe we are opening up in a different way */
OpenDosLibrary();
if(!DOSBase) return; /* don't even bother opening up the window! */
if(!v->use_dos_lib) return; /* dos.library is still open, but we will not */
/* touch it since another program may also be */
/* accessing this library */
/* prevent any other program from doing things with DOSBase */
Forbid();
if(DOSBase){
if(!v->TransferWindow){
/* get the env: variable */
sprintf(EnvVal,"%sZedZapWindow",v->env_starter);
MyEnvVal = Open(EnvVal,MODE_OLDFILE);
if(MyEnvVal){
while(Read(MyEnvVal,bufptr,1)){
bufptr++;
*bufptr = 0;
}
Close(MyEnvVal);
MyEnvVal = NULL;
}
if(WinName[0]){
v->TransferWindow = Open(WinName,MODE_NEWFILE);
if(v->TransferWindow){
WinPuts(v,"\x9B\x3E\x31\x6C"); /* disable scroll */
WinPuts(v,"\x9B\x3F\x37\x6C"); /* disable autowrap */
WinPuts(v,"\x9B\x30\x20\x70"); /* disable cursor */
}
}
}
}
Permit();
ClearStats(v);
}
void CloseDisplay(struct Vars *v){
/* prevent any other program from doing things with DOSBase */
Forbid();
if(DOSBase){ /* check if the dos.library is open... */
if(v->TransferWindow){ /* close the window... */
Close(v->TransferWindow);
v->TransferWindow = NULL;
}
}
Permit();
}
void WinPuts(struct Vars *v,char *out_string){
if(!v->use_dos_lib) return; /* although dos.library may be open */
/* prevent any other program from doing things with DOSBase */
Forbid();
if(DOSBase){ /* check if can do dos functions */
if(v->TransferWindow){ /* check if the window is open */
Write(v->TransferWindow,out_string,strlen(out_string));
}
}
Permit();
}
void OpenDosLibrary(){
Forbid();
if(!DOSBase){
DOSBase = (struct DosLibrary*)OpenLibrary("dos.library",0);
}
/* tada... the dos.library was secretly opened... */
Permit();
/* REMEBER: since multiple programs may use the same library, it is */
/* important to remeber that the dos.library is opened only ONCE! */
/* Therefore one must be VERY SURE when calling XProtocolCleanup() */
/* since that closes the dos.library */
/* Since XProtocolSetup can be called on many occasions without the */
/* need of XProtocolCleanup, I suggest setting up the protocol once */
/* for each slave (when using Welmat) and then cleaning up only if */
/* all slaves have been shut down. */
/* If the dos.library is opened, then one must be very sure that no */
/* other program will call XProtocolCleanup() while another program */
/* is still accessing the library! */
/* A few Forbid() statements have been added to prevent some of the */
/* problems that may occur... */
}
void CloseDosLibrary(){
Forbid();
if(DOSBase){
CloseLibrary(DOSBase);
DOSBase = NULL;
}
Permit();
}