home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Jason Aller Floppy Collection
/
270.img
/
FORUM25C.ZIP
/
TRANSFER.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1989-02-26
|
28KB
|
813 lines
(* Note: This Code has the added External Protocols by Mr. Transistor & by *)
(* Spring King. The original code is written by Ken Duda. The new code is *)
(* written by Spring King & Mr. Transistor. There is 1 new feature in this *)
(* version: in an external protocal transfer, a time credit of 1/2 of the *)
(* time of the upload is given the user. Ymodem & Xmodem use a different *)
(* formula, which can be modified in the file 'protocol.pas'. *)
(* This code is written to include the megalink and protocol too, but *)
(* but the menu selections 'M' is disabled because of a problem setting *)
(* the modem back up after using MegaLink. If you are going to use Sealink *)
(* you must have your modem setup as COM1 or else Sealink will NOT work. *)
(* Thanks to Omen Technologies (DSZ) and to whoever wrote Wxmodem, Sealink, *)
(* and Megalink. *)
(* Special thanks to Spring King, Mr. Transistor, and Ken Duda, the author *)
(* of Forum PC. *)
(* call the Isengard BBS (312) 985-9699 *)
procedure batchdownload (typeoftransfer:char);
function timeval (blocks:integer):real;
var min,sec:integer;
rsec:real;
begin
rsec:=1.38 * blocks * (1200/baudrate);
timeval:=rsec/60.0;
end;
function checkfile(pointsleft:integer;num:integer):boolean;
var ud:udrec;
fname:lstr;
f:file;
begin
writeln;
if num=0 then
begin
checkfile:=false;
exit;
end;
seekudfile (num);
read (udfile,ud);
if (not sponsoron) and (ud.points>pointsleft) then begin
writeln ('Sorry, that file requires ',ud.points,' points.');
checkfile:=false;
exit
end;
if (ud.newfile) and (not sponsoron) then begin
writeln ('Sorry, that is a new file and must be validated.');
checkfile:=false;
exit
end;
if (ud.specialfile) and (not sponsoron) then begin
writeln ('Sorry, downloading that file requires special permission.');
checkfile:=false;
exit
end;
fname:=getfname(ud.path,ud.filename);
assign (f,fname);
reset (f);
close (f);
iocode:=ioresult;
if iocode<>0 then
begin
fileerror ('BATCH DOWNLOAD',fname);
checkfile:=false;
exit
end;
checkfile:=true;
end;
procedure getfileinfo (var num:integer;var totalminsleft,realtime:real;
var mins,fsize,actualsize:integer;var sender:mstr;
var whensent,ratedwhen:longint;var nameoffile:sstr;var filepath:string;
var filepoints:integer;var filedescrip:lstr;var timesdownloaded:integer;
var isitnew,isitspecial:boolean);
var ud:udrec;
f:file;
fname:lstr;
totaltime:sstr;
secs:integer;
begin
seekudfile (num);
read (udfile,ud);
fname:=getfname (ud.path,ud.filename);
assign (f,fname);
reset (f);
fsize:=filesize(f);
actualsize:=fsize;
close (f);
totaltime:=minstr(fsize);
mins:=valu(copy(totaltime,1,pos(':',totaltime)-1));
secs:=valu(copy(totaltime,pos(':',totaltime)+1,2));
if secs<>0 then realtime:=mins+(secs/60)
else realtime:=mins;
if mins=0 then mins:=1;
if ((mins>totalminsleft) and (not sponsoron)) then begin
writestr ('Sorry, you don''t have enough time left!');
mins:=-5;
exit
end;
if (mins-5>timetillevent) then begin
writestr ('Sorry, the timed event is coming up too soon!');
mins:=-5;
exit
end;
writeln (^B^M'Filename: '^S,ud.filename);
writeln ('Uploaded by: '^S,ud.sentby);
write ('Downloaded: '^S,ud.downloaded,' time');
if ud.downloaded=1 then writeln else writeln ('s');
fsize:=(fsize+7) div 8;
if fsize = 0 then fsize := 1;
writeln ('Blocks to send: '^S,fsize);
writeln ('Transfer time: '^S,totaltime);
writeln;
sender:=ud.sentby;
whensent:=ud.when;
ratedwhen:=ud.whenrated;
nameoffile:=ud.filename;
filepath:=ud.path;
filepoints:=ud.points;
filedescrip:=ud.descrip;
timesdownloaded:=ud.downloaded;
isitnew:=ud.newfile;
isitspecial:=ud.specialfile;
end;
procedure check1(var abort:boolean);
begin
writestr ('Abort this batch transfer? *');
if yes then abort:=true
else abort:=false;
end;
procedure check2(var abort,readytostart:boolean);
begin
abort:=false;
readytostart:=false;
writestr('Ready to start batch transfer? *');
input:=copy(input,1,1);
if input='Y' then readytostart:=true
else if input='y' then readytostart:=true;
if readytostart then exit
else
writeln;
check1 (abort);
end;
type textarray = array[1..9] of string;
numberarray = array[1..9] of integer;
realarray = array[1..9] of real;
sentbyarray = array[1..9] of mstr;
whenarray = array[1..9] of longint;
filenamearray = array[1..9] of sstr;
patharray = array[1..9] of string[50];
descriparray = array[1..9] of lstr;
booleanarray = array[1..9] of boolean;
var totalblocks,b,pointsleft,points,num,mins,fsize,totalbytes,actualsize,
filecounter,loopcounter,starttime,endtime,transfertime,estimatedtime:integer;
var mins2,minsleft,timetotal:real;
name,fname:string;
f:file of byte;
dirsave,command_line,switches,blocks,minutes:lstr;
baudst,commst:mstr;
singlecharacter,batchxfer:char;
autohang,abort,readytostart:boolean;
fnames:textarray;
textname:textarray;
fsizes,NUMB,filepoints,timesdownloaded,areanumber:numberarray;
ftime:realarray;
sender:sentbyarray;
whensent,ratedwhen:whenarray;
nameoffile:filenamearray;
filepath:patharray;
filedescrip:descriparray;
isitnew,isitspecial:booleanarray;
batchfile:text;
begin
case typeoftransfer of
'B':batchxfer:='Y';
'Z':batchxfer:='Z';
else exit;
end;
writeln;
writeln (batchxfer,'Modem Batch Download Selected');
getdir (0, dirsave); (* drive: 0 = cur. 1 = A: etc. - save cur. dir. *)
str (baudrate:3, baudst); (* cnvt baud and comm port to strings *)
str (usecom:1, commst);
filecounter:=1;
pointsleft:=urec.udpoints;
minsleft:=timeleft;
totalbytes:=0;
readytostart:=false;
repeat
tab ('Points available: '^S+strr(pointsleft),24);
writeln (^R'Time available: '^S+strr(round(minsleft)));
estimatedtime:=timeleft-round(minsleft);
if estimatedtime<1 then estimatedtime:=0;
tab ('Total D/L Time: '^S+strr(estimatedtime),24);
writeln (^R'Batch file #: '^S,filecounter);
writeln;
num:=getfilenumbatch('Batch Download');
input:='';
if num=0 then if filecounter = 1 then
begin
check1(abort);
if abort then exit;
end;
if num=0 then if filecounter >1 then if filecounter <10 then
begin
check2(abort,readytostart);
if abort then exit;
if readytostart then writeln(^M^J'Starting Batch Download.')
end;
if not checkfile (pointsleft,num) then if filecounter =1 then exit;
if checkfile (pointsleft,num) then
begin
if tempsysop then
begin
ulvl:=regularlevel;
tempsysop:=false;
writeurec;
bottomline
end;
getfileinfo(num,minsleft,mins2,mins,fsize,actualsize,sender[filecounter],
whensent[filecounter],ratedwhen[filecounter],nameoffile[filecounter],
filepath[filecounter],filepoints[filecounter],filedescrip[filecounter],
timesdownloaded[filecounter],isitnew[filecounter],
isitspecial[filecounter]);
areanumber[filecounter]:=curarea;
if (mins=-5) and (filecounter =1) then exit
else if mins=-5 then readytostart:=true;
if mins<>-5 then begin
if (filepoints[filecounter]>0) and (not sponsoron) then
pointsleft:=pointsleft-filepoints[filecounter];
fnames[filecounter]:=getfname(filepath[filecounter],nameoffile[filecounter]);
textname[filecounter]:=nameoffile[filecounter];
fsizes[filecounter]:=fsize;
totalbytes:=totalbytes+actualsize;
ftime[filecounter]:=mins2;
numb[filecounter]:=num;
minsleft:=minsleft-mins2;
filecounter:=filecounter+1;
if filecounter=10 then readytostart:=true
end;
end;
until readytostart;
if readytostart then begin
assign (batchfile,'batch.xfr');
rewrite (batchfile);
loopcounter:=1;
timetotal:=0;
totalblocks:=0;
repeat
if fsizes[loopcounter]>1 then blocks:=' 1 K Blocks'
else blocks:='Block';
if ftime[loopcounter]>1.0 then minutes:=' minutes'
else minutes:='minute';
totalblocks:=totalblocks+fsizes[loopcounter];
timetotal:=timetotal+ftime[loopcounter];
writeln (batchfile,fnames[loopcounter]);
loopcounter:=loopcounter+1;
until loopcounter=filecounter;
textclose (batchfile);
loopcounter:=1;
if ansigraphics in urec.config then begin
writestr ('┌─────────────────────────────────────────────────────────────┐');
writestr ('│ Batch Download Statistics │');
writestr ('├─────────────────────────────────────────────────────────────┤');
writestr ('│'^S' # Filename Kbytes Time to d/l (minutes)'^R' │');
writestr ('├─────────────────────────────────────────────────────────────┤');
end
else begin
writestr ('+-------------------------------------------------------------+');
writestr ('! Batch Download Statistics !');
writestr ('+-------------------------------------------------------------+');
writestr ('! # Filename Kbytes Time to d/l (minutes) !');
writestr ('+-------------------------------------------------------------+');
end;
repeat
if ansigraphics in urec.config then begin
write (^R'│ '^S);
tab (strr(loopcounter),3);
tab (nameoffile[loopcounter],17);
tab (strr(round(fsizes[loopcounter])),11);
tab (minstr(round(fsizes[loopcounter]*8)),29);
writeln (^R'│');
end
else begin
write ('! ');
tab (strr(loopcounter),3);
tab (nameoffile[loopcounter],18);
tab (strr(round(fsizes[loopcounter])),12);
tab (minstr(round(fsizes[loopcounter]*8)),27);
writeln ('!');
end;
loopcounter:=loopcounter+1;
until loopcounter=filecounter;
if ansigraphics in urec.config then begin
writestr('├─────────────────────────────────────────────────────────────┤');
write (^R'│');
tab (^P+'Total Files:',14);
tab (^S+strr(filecounter-1),4);
tab (^P+'Total 1k blocks:',18);
tab (^S+strr(totalblocks),6);
tab (^P+'Apprx. d/l time:',18);
tab (^S+minstr(totalbytes-round((totalbytes * 0.1))),7);
writeln (^R'│');
writestr('└─────────────────────────────────────────────────────────────┘');
end
else begin
writestr('+-------------------------------------------------------------+');
write ('!');
tab ('Total Files:',13);
tab (strr(filecounter-1),3);
tab ('Total 1k blocks:',17);
tab (strr(totalblocks),5);
tab ('Apprx. d/l time:',17);
tab (minstr(totalbytes-round((totalbytes * 0.1))),6);
writeln ('!');
writestr('+-------------------------------------------------------------+');
end;
writeln;
writestr('Automatically DISCONNECT after the download? (y/N) *');
if yes then autohang:=true
else autohang:=false;
writeln;
writeln (batchxfer,'Modem Batch Download. [Ctrl-X][Ctrl-X][Enter] a few times to abort');
{ switches:=' port '+commst+' speed '+baudst+' s'; }
switches:=' port '+commst+' speed '+baudst+' handshake both s';
if batchxfer='Y' then
switches:=switches+'b -k @'+dirsave+'\batch.xfr';
if batchxfer='Z' then
switches:=switches+'z @'+dirsave+'\batch.xfr';
command_line:='DSZ.COM';
starttime:=timer;
runext(b,command_line,switches);
endtime:=timer;
if endtime<starttime then endtime:=endtime+1440;
transfertime:=endtime-starttime;
if b=1 then b:=2;
beepbeep(b);
loopcounter:=1;
repeat
if transfertime-round(ftime[loopcounter])>0 then
begin
transfertime:=transfertime-round(ftime[loopcounter]);
writelog (15,5,textname[loopcounter]);
setareareset (areanumber[loopcounter]);
seekudfile(numb[loopcounter]);
fname:=getfname(filepath[loopcounter],nameoffile[loopcounter]);
assign (f,fname);
reset (f);
ud.sentby:=sender[loopcounter];
ud.when:=whensent[loopcounter];
ud.whenrated:=ratedwhen[loopcounter];
ud.filename:=nameoffile[loopcounter];
ud.path:=filepath[loopcounter];
ud.points:=filepoints[loopcounter];
ud.filesize:=filesize (f);
ud.descrip:=filedescrip[loopcounter];
ud.downloaded:=timesdownloaded[loopcounter]+1;
ud.newfile:=isitnew[loopcounter];
ud.specialfile:=isitspecial[loopcounter];
urec.downloads:=urec.downloads+1;
if (ud.points>0) and (not sponsoron) then
urec.udpoints:=urec.udpoints-ud.points;
write (udfile,ud);
writeurec;
close (f);
loopcounter:=loopcounter+1;
end
else loopcounter:=filecounter;
until loopcounter=filecounter;
writeln (^B'You now have ',numthings (urec.udpoints,'point','points'),' left in your account.');
chdir (dirsave);
if autohang then disconnect;
end;
end;
(* Note: The following builds a command line to invoke the various external *)
(* protocols directly. This should allow ERRORLEVEL to be returned cor- *)
(* rectly and allow externals to be used on a Multi-Tasking system. *)
(* DSZ returns ERRORLEVEL correctly but WXmodem does not. - Mr. Transistor *)
(* & Spring King. *)
function doext (mode,proto:char;uddir,fn:lstr;baud,comm:integer):integer;
var cmdline,switches,dirsave,cddir:lstr;
baudst,commst:mstr;
retcd:integer;
begin
getdir (0, dirsave); (* drive: 0 = cur. 1 = A: etc. - save cur. dir. *)
if uddir[length(uddir)]='\'
then
cddir:=copy(uddir,1,length(uddir)-1)
else
cddir:=uddir;
chdir (cddir); (* cd to rcv/snd dir *)
str (baud:3, baudst); (* cnvt baud and comm port to strings *)
str (comm:1, commst);
if mode='R' then begin (* receive stuff *)
case proto of
'W':cmdline:=dirsave+'\WXMODEM.COM';
'M':cmdline:=dirsave+'\MEGALINK.COM';
'S':cmdline:=dirsave+'\CLINK.EXE';
'Z':cmdline:=dirsave+'\DSZ.EXE';
'J':cmdline:=dirsave+'\JModem.COM';
end
end;
if mode='R' then begin (* receive stuff *)
case proto of
'W':switches:=' -b '+baudst+' -l com'+commst+' -p W -r -f '+fn+' -c';
'M':switches:=' PORT '+commst+' SPEED '+baudst+' RM';
'S':switches:=' R';
'Z':switches:=' port '+commst+' speed '+baudst+' rz '+cddir+'\'+fn;
'J':switches:=' R'+commst+' '+fn;
end;
end;
if mode='S' then begin (* xmit stuff *)
case proto of
'W':cmdline:=dirsave+'\WXMODEM.COM';
'M':cmdline:=dirsave+'\MEGALINK.COM';
'S':cmdline:=dirsave+'\CLINK.EXE';
'J':cmdline:=dirsave+'\JModem.Com';
end
end;
if mode='S' then begin (* xmit stuff *)
case proto of
'W':switches:=' -s -b '+baudst+' -l com'+commst+' -p y -f '+fn;
'M':switches:=' PORT '+commst+' SPEED '+baudst+' SM '+fn;
'S':switches:=' T '+fn;
'J':switches:=' R'+commst+' '+fn;
end
end;
runext (retcd, cmdline,switches); (* actually do external call... *)
chdir (dirsave); (* back from whence we came... *)
setparam(usecom,baudrate,parity);
doext:=retcd;
end;
procedure download (autoselect:integer);
var totaltime:sstr;
num,fsize,mins:integer;
ud:udrec;
fname:lstr;
autohang,ymodem:boolean;
i,b:integer;
f:file;
extrnproto:char;
begin
if not allowxfer then exit;
if nofiles then exit;
ymodem:=false;
extrnproto:='N';
i:=menu('Protocol','PROTO','XYZBWSMQJ');
if hungupon then exit;
case i of
1:ymodem:=false;
2:ymodem:=true;
3:extrnproto:='Z';
4:extrnproto:='B';
5:extrnproto:='W';
6:extrnproto:='S';
7:extrnproto:='M';
8:exit;
9:extrnproto:='J';
end;
if (extrnproto ='B') or (extrnproto='Z') then
begin
batchdownload (extrnproto);
exit;
end;
if autoselect=0
then num:=getfilenum('download')
else num:=autoselect;
if num=0 then exit;
writeln;
seekudfile (num);
read (udfile,ud);
if (not sponsoron) and (ud.points>urec.udpoints) then begin
writeln ('Sorry, that file requires ',ud.points,' points.');
exit
end;
if (ud.newfile) and (not sponsoron) then begin
writeln ('Sorry, that is a new file and must be validated.');
exit
end;
if (ud.specialfile) and (not sponsoron) then begin
writeln ('Sorry, downloading that file requires special permission.');
exit
end;
if tempsysop then begin
ulvl:=regularlevel;
tempsysop:=false;
writeurec;
bottomline
end;
(* if extrnproto='W' then
{If you want to re-enable WXmodem, then just remove the lines from the next}
{ begin through to the next end, and the above if statement.}
begin
writestr ('I am sorry, but WXmodem bombs when a filetransfer is aborted.');
writestr ('If the author fixes this error, then WXmodem will be re-enabled.');
writeln ('Transfer Aborted! '^G);
exit;
end; *)
fname:=getfname(ud.path,ud.filename);
assign (f,fname);
reset (f);
iocode:=ioresult;
if iocode<>0 then
begin
fileerror ('DOWNLOAD',fname);
exit
end;
fsize:=filesize(f);
close (f);
totaltime:=minstr(fsize);
mins:=valu(copy(totaltime,1,pos(':',totaltime)-1));
if ((mins>timeleft) and (not sponsoron)) then begin
writestr ('Sorry, you don''t have enough time left!');
exit
end;
if (mins-5>timetillevent) then begin
writestr ('Sorry, the timed event is coming up too soon!');
exit
end;
writeln (^B^M'Filename: '^S,ud.filename);
writeln ('Uploaded by: '^S,ud.sentby);
write ('Downloaded: '^S,ud.downloaded,' time');
if ud.downloaded=1 then writeln else writeln ('s');
if ymodem then fsize:=(fsize+7) div 8;
if fsize = 0 then fsize:= 1;
writeln ('Blocks to send: '^S,fsize);
writeln ('Transfer time: '^S,totaltime);
writeln (^M'CRC use will be automatically selected');
writeln;
writestr('Automatically DISCONNECT after the download? (Y/N) *');
if upcase(input[1]) ='Y' then autohang:=true
else autohang:=false;
case extrnproto of
'S':tab ('Sealink',7);
'W':tab ('WXmodem',7);
'M':tab ('Megalink',8);
'J':tab ('JModem',6);
end;
if ymodem then write ('Ymodem') else if extrnproto='N' then
write ('Xmodem-CRC');
writeln (' transmit ready. [Ctrl-X][Ctrl-X][Enter] a few times to abort');
if extrnproto='N' then begin
b:=protocolxfer (true,false,ymodem,fname);
beepbeep (b)
end;
if extrnproto<>'N' then begin
b:=doext('S',extrnproto,ud.path,ud.filename,baudrate,usecom);
if b<>0 then b:=2;
modeminlock:=false;
beepbeep (b)
end;
if (b=0) then begin
writelog (15,1,fname);
ud.downloaded:=ud.downloaded+1;
urec.downloads:=urec.downloads+1;
seekudfile (num);
write (udfile,ud);
if (ud.points>0) and (not sponsoron) then begin
urec.udpoints:=urec.udpoints-ud.points;
writeln (^B'You now have ',
numthings (urec.udpoints,'point','points'),'.')
end;
writeurec
end;
if autohang then disconnect;
end;
procedure typefile;
var num:integer;
ud:udrec;
fname:lstr;
f:text;
k:char;
begin
if nofiles then exit;
num:=getfilenum('type');
if num=0 then exit;
writeln;
seekudfile (num);
read (udfile,ud);
if (not sponsoron) and (ud.points>urec.udpoints) then begin
writeln ('Sorry, that file requires ',ud.points,' points.');
exit
end;
if (ud.newfile) and (not sponsoron) then begin
writeln ('Sorry, that is a new file and must be validated.');
exit
end;
if (ud.specialfile) and (not sponsoron) then begin
writeln ('Sorry, downloading that file requires special permission.');
exit
end;
if tempsysop then begin
ulvl:=regularlevel;
tempsysop:=false;
writeurec;
bottomline
end;
fname:=getfname(ud.path,ud.filename);
assign (f,fname);
reset (f);
iocode:=ioresult;
if iocode<>0 then
begin
fileerror ('TYPEFILE',fname);
exit
end;
writeln (^B^M'Filename: '^S,ud.filename);
writeln ('Uploaded by: '^S,ud.sentby);
if (ud.points>0) and (not sponsoron) then begin
write (^B^M'NOTE: When the transfer begins, you ',
^M' will be charged ',ud.points,' point');
if ud.points<>1 then write ('s');
writeln ('!')
end;
writeln (^B^M'Press any key to begin the transfer,',
^M'or [Ctrl-X] to abort...'^M);
k:=waitforchar;
if (k=^X) or (upcase(k)='X') then begin
textclose (f);
writeln (^B^M'Aborted!');
exit
end;
while not (eof(f) or break) do begin
read (f,k);
if k=^M then writeln else if k<>^J then write (k)
end;
textclose (f);
if (ud.points>0) and (not sponsoron) then begin
urec.udpoints:=urec.udpoints-ud.points;
writeln (^B'You now have ',
numthings (urec.udpoints,'point','points'),'.')
end;
writeurec
end;
procedure upload;
var ud:udrec;
ok,crcmode,ymodem:boolean;
i,b,starttime,endtime,transfertimecredit:integer;
dirsave,cddir,fn:lstr;
time:string;
extrnproto:char;
f:file;
begin
if not allowxfer then exit;
if timetillevent<30 then begin
writestr (
'Sorry, uploads are not allowed within one half hour of the timed event!');
exit
end;
ok:=false;
write ('Free disk space: ');
writefreespace (area.xmodemdir);
writeln;
repeat
writestr ('Target filename:');
if length(input)=0 then exit;
if not validfname(input) then begin
writeln ('Invalid filename!');
exit
end;
ud.filename:=input;
ud.path:=area.xmodemdir;
fn:=getfname(ud.path,ud.filename);
if hungupon then exit;
if exist(fn)
then writeln ('Sorry! File exists!')
else ok:=true
until ok;
crcmode:=false;
ymodem:=false;
extrnproto:='N';
i:=menu('Protocol','PROTO','XYZWSMQJ');
if hungupon then exit;
case i of
1:ymodem:=false;
2:ymodem:=true;
3:extrnproto:='Z';
4:extrnproto:='W';
5:extrnproto:='S';
6:extrnproto:='M';
7:exit;
8:extrnproto := 'J';
end;
{ If you want to re-enable WXmodem, then just remove the lines from the next
if statement through to the next end.}
{ if extrnproto='W' then
begin
writestr ('I am sorry, but WXmodem bombs when a filetransfer is aborted.');
writestr ('If the author fixes this error, then WXmodem will be re-enabled.');
writeln ('Transfer Aborted! '^G);
exit;
end; }
if extrnproto='N' then if ymodem then crcmode:=true
else begin
writestr ('CRC Mode? *');
crcmode:=yes
end;
case extrnproto of
'S':tab ('Sea Link',8);
'Z':tab ('Zmodem',6);
'W':tab ('WXmodem',7);
'M':tab ('Megalink',8);
'B':tab ('Ymodem Batch',12);
'J':tab ('Jmodem',6);
end;
if ymodem then write ('Ymodem') else if extrnproto='N' then
write ('Xmodem');
if crcmode then write ('-CRC');
writeln (' receive ready. [Ctrl-X][Ctrl-X][Enter] a few times to abort');
if tempsysop then begin
ulvl:=regularlevel;
tempsysop:=false;
writeurec;
bottomline
end;
starttime:=timer;
if extrnproto='N' then begin
b:=protocolxfer (false,crcmode,ymodem,fn);
beepbeep (b)
end
else begin
b:=doext('R',extrnproto,ud.path,ud.filename,baudrate,usecom);
endtime:=timer;
modeminlock:=false;
modemoutlock:=false;
if b<>0 then b:=2;
beepbeep (b)
end;
if b>=1 then
begin
if exist (fn) then
begin
assign(f, fn);
erase (f);
end;
exit;
end;
if b=0 then begin
buflen:=50;
writestr ('If your upload failed & Forum thinks otherwise, then please');
writestr ('enter ''BAD TRANSFER'' at the Description prompt. Thanks.');
writeln;
writestr (' 0 1 2 3 4 5');
writestr ('50 Characters Maximum! 1---!----0----!----0----!----0----!----0----!----0');
writestr ('Description of upload: &');
if input='BAD TRANSFER' then
begin
if exist(fn) then
begin
assign(f, fn);
erase (f);
end;
exit;
end;
writelog (15,2,fn);
ud.descrip:=input;
ud.sentby:=unam;
ud.when:=now;
ud.whenrated:=now;
ud.points:=0;
ud.downloaded:=0;
ud.newfile:=true;
ud.specialfile:=false;
ud.downloaded:=0;
writeln ('Thanks for uploading!');
if extrnproto<>'N' then
begin
if endtime<starttime then endtime:=endtime+1440;
transfertimecredit:=(endtime-starttime)div 2;
settimeleft(timeleft+transfertimecredit);
writeln;
str(transfertimecredit, time);
writeln('Upload time credit: ',time,' minutes.');
end;
str(timeleft, time);
writeln;
writeln('You now have ',time,' minutes left!');
getfsize (ud);
addfile (ud);
urec.uploads:=urec.uploads+1;
newuploads:=newuploads+1
end;
end;