home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C!T ROM 2
/
ctrom_ii_b.zip
/
ctrom_ii_b
/
PROGRAM
/
PASCAL
/
TPKERMIT
/
SENDFILE.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1987-03-25
|
11KB
|
269 lines
(* +FILE+ SENDFILE.PASMS *)
(* **************************************************************** *)
(* SENDFILE - This routine handles the sending of a file from * *)
(* the micro computer. * *)
(* * *)
(* **************************************************************** *)
PROCEDURE SENDFILE (var InParms : ComString);
VAR
MyFiles,FileName,AsFileNames,AsFileName,Atoken : Comstring ;
SENDING, GETREPLY, LastFile, rawfile : Boolean ;
abyte, Kchar,Kbchar : byte ;
ErrorMsg : String[80];
PacketCount,i,ix : Integer ;
FILETOSEND : File of byte ;
Label Subdir,GetAsName,GetNextFile,Exit ;
(* --------------------------------------------------- *)
(* SENDRAW - This routine send the file in unpacket *)
(* mode, Simply read and send. *)
(* --------------------------------------------------- *)
Procedure SENDRAW ;
Begin (* SendRaw Procedure *)
Sending := true ;
While Sending Do
Begin (* Send a file *)
ClrScr; Writeln(' Sending File >>>>>>> ',Filename,' <<<<<<< ');
Assign(FileToSend,Prefixof(Myfiles)+FileName);
RESET(FileToSend);
While not EOF(FileToSend) do
Begin (* Send data *)
Read(FileToSend,abyte);
SendChar(abyte);
If LocalEcho then Write(chr(abyte))
else If Readchar(abyte) then Write(chr(abyte));
If XonXoff and (abyte = $0D) then (* wait for Xon *)
While abyte<>XON do
If Readchar(abyte) then
else abyte := xon ;
End ; (* Send data *)
CLOSE(FileToSend);
Sending := Nextfile(Myfiles,Filename);
End ; (* Send a file *)
Writeln(' ');
End ; (* SendRaw Procedure *)
(* **************************************************************** *)
BEGIN (* SENDFILE procedure *)
rawfile := false ;
RetryCount := 0 ;
(* Check the file to be sent here *)
If length(InParms) < 1 then
Begin (* Get name of file to send *)
Write (' Enter name of file to be sent >');
Readln(InParms);
End;
MyFiles := ' ';
MyFiles := UpperCase(GetToken(InParms));
AsFileNames := MyFiles ;
Atoken := UpperCase(GetToken(InParms));
If Atoken = 'AS' then
If length(InParms)<1 then AsFileNames := MyFiles
else AsFileNames := UpperCase(GetToken(InParms))
else
If Atoken = 'RAW' then rawfile := true
else InParms := Atoken + InParms ;
subdir:
ix := Pos('\',AsFilenames) ;
If ix > 1 then delete(AsFilenames,1,ix) ; (* Eliminate sub-dir prefixs *)
if ix > 1 then goto subdir ;
If FirstFile(Myfiles,Filename) then
else
begin (* No file found *)
Writeln (' File "',MyFiles,'" not found.');
Goto Exit ;
end ; (* No file found *)
AsFilename := 'Blank' ;
If rawfile then
begin SendRaw ; goto exit ; end ;
GetAsName:
writeln('Filename is =',Filename);
If NewAsFile(Myfiles,Filename,AsFileNames,AsFileName) then
else
If NextFile(Myfiles,Filename) then goto GetAsName
else
begin (* No file found *)
Writeln (' File "',MyFiles,'" not found on disk.');
Goto Exit ;
end ; (* No file found *)
STATE := S ;
BreakState := NoBreak ;
GETREPLY := FALSE ;
LastFile := false ;
SENDING := TRUE ;
ClrScr;
GotoXY(10,4); Write(' Number of Packets Sent = ');
GotoXY(10,5); Write(' Number of Retries = ');
PacketCount := 0 ;
WHILE SENDING DO
BEGIN (* Send files *)
IF GETREPLY THEN
IF RECVPACKET THEN
IF InPacketType = Ord('Y') THEN
ELSE
IF InPacketType = Ord('N') THEN RESENDIT(10)
ELSE
IF InPacketType = Ord('R') THEN STATE := S
ELSE STATE := A
ELSE RESENDIT(10) ;
GotoXY(36,5); Write (RetryCount);
GETREPLY := TRUE ;
If (InPacketType = Ord('Y')) and (InDataCount > 1) then
If RecvData[1] = Ord('X') then STATE := SZ else
If RecvData[1] = Ord('Z') then
Begin STATE := SZ ; LastFile := true ; End ;
If STATE = SD then
Case Breakstate of
NoBreak : ;
BC : Sending := False ;
BE : STATE := A ;
BX : STATE := SZ ;
BZ : Begin STATE := SZ ; LastFile := true ; End ;
End ; (* Case Breakstate *)
CASE STATE OF
S : BEGIN (* Send INIT packit *)
OutPacketType := Ord('S') ;
PutInitPacket ;
SENDPACKET ;
STATE := SF ;
END ; (* Send INIT packit *)
SF: BEGIN (* Send file header *)
(* If InDataCount = 0 then
Begin Not a Init packet, Resend our Init Packet
GetReply := False;
State := S ;
End
Else *)
Begin (* Got Init packet, Get init parameters *)
If InDataCount > 1 then GetInitPacket ;
OUTSEQ := OUTSEQ + 1 ;
IF OUTSEQ >= 64 THEN OUTSEQ := 0 ;
OutPacketType := Ord('F') ;
OutDataCount := LENGTH(AsFileName);
For i := 1 to OutDataCount do SendData[i] := Ord(AsFilename[i]) ;
GotoXY(10,2);
Write(' Sending file ',Filename,' as ',AsFileName,
' ');
Assign(FileToSend,Prefixof(MyFiles)+FileName);
RESET(FILETOSEND);
STATE := SD ;
SENDPACKET ;
End (* Got Init packet, Get init parameters *)
END ; (* Send file header *)
SD: BEGIN (* Send data *)
OutDataCount := 0 ;
OUTSEQ := OUTSEQ + 1 ;
IF OUTSEQ >= 64 THEN OUTSEQ := 0 ;
OutPacketType := Ord('D') ;
WHILE (OutDataCount<PacketSize-3-4) AND (NOT EOF(FILETOSEND)) DO
BEGIN (* Read a char *)
OutDataCount := OutDataCount + 1 ;
READ(FILETOSEND,abyte);
SendData[OutDataCount] := abyte;
IF SendData[OutDataCount] >= $80 THEN
IF Bit8Quote = $00 THEN (* No bit8 quoting *)
(* Just drop the 8th bit *)
SendData[OutDataCount] := SendData[OutDataCount]-$80
ELSE
BEGIN (* BIT8 QUOTING *)
SendData[OutDataCount+1] := SendData[OutDataCount]-$80;
SendData[OutDataCount] := Bit8Quote ;
OutDataCount := OutDataCount + 1 ;
END ; (* BIT8 QUOTING *)
IF SendData[OutDataCount] < $20 THEN
BEGIN (* CONTROL QUOTING *)
SendData[OutDataCount+1] := SendData[OutDataCount] + $40 ;
SendData[OutDataCount] := CntrlQuote ;
OutDataCount := OutDataCount + 1 ;
END ; (* CONTROL QUOTING *)
IF SendData[OutDataCount] = $7F THEN
BEGIN (* DEL QUOTING *)
SendData[OutDataCount+1] := $3F ;
SendData[OutDataCount] := CntrlQuote ;
OutDataCount := OutDataCount + 1 ;
END ; (* DEL QUOTING *)
IF (SendData[OutDataCount] = CntrlQuote) OR
(SendData[OutDataCount] = Bit8Quote) THEN
BEGIN (* Quote the quote *)
SendData[OutDataCount+1] := SendData[OutDataCount] ;
SendData[OutDataCount] := CntrlQuote ;
OutDataCount := OutDataCount + 1 ;
END ; (* Quote the quote *)
END ; (* Read a char *)
PacketCount := PacketCount + 1 ;
GotoXY(36,4) ; WRITE (PacketCount);
IF EOF(FILETOSEND) THEN STATE := SZ ;
SENDPACKET ;
END ; (* Send data *)
SZ: BEGIN (* End of File *)
(* WRITELN ('end of file'); *)
Close(FILETOSEND);
GotoXY(10,6) ;
If BreakState = NoBreak then
WRITELN ('File ',Filename,' has been sent as ',AsFileName,
' ')
else
Writeln('File ',Filename,' Partially sent as ',AsFileName,
' ');
If Lastfile then STATE := SB
else
GetNextFile:
(* Get next file *)
If Nextfile(Myfiles,Filename) then
If NewAsFile(Myfiles,Filename,AsFilenames,AsFilename)
then STATE := SF
else goto GetNextFile
else STATE := SB ;
If Breakstate = BX then Breakstate := NoBreak ;
SendPacketType('Z') ;
END ; (* End of File *)
SB: BEGIN (* Last file sent *)
(* WRITELN ('SENT last file completed'); *)
SendPacketType('B') ;
STATE := C ;
END ; (* Last file sent *)
C: BEGIN (* Completed Sending *)
GotoXY(10,7) ;
If BreakState = NoBreak then
WRITELN ('Sending FILEs completed OK ')
else
WRITELN ('Sending FILEs terminated due to manual Interruption ');
SENDING := FALSE ;
END ; (* Completed Sending *)
A: BEGIN (* Abort Sending *)
Close(FILETOSEND);
GotoXY(10,7) ;
WRITELN ('SENDing files ABORTED');
ABORT := BADSF ;
SENDING := FALSE ;
(* SEND ERROR packet *)
OutDataCount := 15 ;
OUTSEQ := 0 ;
ErrorMsg := 'Send file abort' ;
for i := 1 to OutDataCount do SendData[i] := Ord(ErrorMsg[i]) ;
OutPacketType := Ord('E');
SENDPACKET ;
END ; (* Abort Sending *)
END ; (* CASE of STATE *)
END ; (* Send files *)
Exit:
END ; (* SENDFILE procedure *)