home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / norskdata / ndkrea.pas < prev    next >
Pascal/Delphi Source File  |  2020-01-01  |  13KB  |  350 lines

  1. (*
  2.  *
  3.  *
  4.  *      Routines for reading packets
  5.  *      and files.
  6.  *
  7. *)
  8.  
  9.     function    ReadData( idev, odev    : integer ;
  10.                           var OutFile   : ByteFile ) : KermitStates;
  11.     var     Len    : integer;
  12.             Num    : integer;
  13.             RetVal : KermitStates;
  14.             Pack   : Packet;
  15.     begin
  16.         if Debug then begin
  17.             DbgWrite( ' Entering ReadData ..... ' );
  18.             DbgNL;
  19.         end;
  20.         NumTry := NumTry + 1;
  21.         if NumTry > MaxTry then
  22.             RetVal := Abort
  23.         else
  24.         begin
  25.             case ReadPacket ( Num , Len , Pack , Idev ) of
  26.                 DataPack :
  27.                     begin
  28.                         if Num <> n then
  29.                         begin
  30.                             OldTry := OldTry + 1;
  31.                             if OldTry > MaxTry then
  32.                                 RetVal := Abort
  33.                             else
  34.                             begin
  35.                                 if  Num = Prev ( n ) then
  36.                                 begin
  37.                                     SendAck( Num, Odev );
  38.                                     NumTry := 0;
  39.                                     RetVal := CurrState;
  40.                                 end
  41.                                 else
  42.                                     RetVal := Abort;
  43.                             end;
  44.                         end
  45.                         else
  46.                         begin
  47.                             EmptyBuffer ( OutFile , Pack ) ;
  48.                             SendACK( n, Odev );
  49.                             OldTry := NumTry;
  50.                             NumTry := 0;
  51.                             n := ( n + 1 ) mod 64;
  52.                             RetVal := CurrState;
  53.                         end;
  54.                     end;
  55.     
  56.                 FHeadPack   :
  57.                     begin
  58.                         OldTry := OldTry + 1;
  59.                         if OldTry > MaxTry then
  60.                             RetVal := Abort
  61.                         else
  62.                             if Num = Prev ( n ) then
  63.                             begin
  64.                                 SendACK( num, Odev );
  65.                                 NumTry := 0;
  66.                                 RetVal := CurrState;
  67.                             end
  68.                             else
  69.                                 RetVal := Abort;
  70.                     end;
  71.     
  72.                 EOFPack     :
  73.                     begin
  74.                         if Num <> n then
  75.                             RetVal := Abort
  76.                         else
  77.                         begin
  78.                             SendAck( n, Odev );
  79.                             Disconnect ( OutFile );
  80.                             n := ( n + 1 ) mod 64;
  81.                             RetVal := FileHeader;
  82.                         end;
  83.                     end;
  84.     
  85.                 ACKPack, NAKPack, SInitPack,
  86.                 ErrPack, IllPack    :
  87.                     begin
  88.                         RetVal := Abort;
  89.                     end;
  90.     
  91.                 ChkIllPack :
  92.                     begin
  93.                         if Debug then begin
  94.                             DbgWrite ( 'Illegal CheckSum received - Sending NAK$' );
  95.                             DbgNL;
  96.                         end;
  97.                         SendNAK ( n , ODev );
  98.                         RetVal := CurrState;
  99.                     end;
  100.  
  101.                 TimOutPack  :
  102.                     begin
  103.                         if Debug then begin
  104.                             DbgWrite ( 'Timed out waiting for packet number:$' );
  105.                             DbgInt ( n );
  106.                             DbgNL;
  107.                         end;
  108.                         SendNAK ( n , ODev );
  109.                         RetVal := CurrState;
  110.                     end;
  111.             end;  (* case *)
  112.         end;
  113.         ReadData := RetVal;
  114.     end;
  115.  
  116.  
  117.     function    ReadFile    ( idev, odev  : integer ;
  118.                               var OutFile : ByteFile ) : KermitStates;
  119.  
  120.     var     num         : integer;
  121.             len         : integer;
  122.             Pack        : Packet;
  123.             RetVal      : KermitStates;
  124.             FileName    : NameType;
  125.     begin
  126.         if Debug then begin
  127.             DbgWrite( 'Entering ReadFile ...... ');
  128.             DbgNL;
  129.         end;
  130.         NumTry := NumTry + 1;
  131.         if NumTry > MaxTry then
  132.             RetVal := Abort
  133.         else
  134.         begin
  135.             case ReadPacket ( Num , len , Pack , Idev ) of
  136.                 SInitPack   :   (* May be our ACK lost *)
  137.                     begin
  138.                         OldTry := OldTry + 1;
  139.                         if OldTry > MaxTry then
  140.                             RetVal := Abort     (* abort on too many errors *)
  141.                         else
  142.                         begin
  143.                             if num = Prev ( n ) then
  144.                             (* Previous packet? *)
  145.                             begin
  146.                                 ReadPars ( Pack );       (* yes - re-ACK *)
  147.                                 SendPack (  NoChangePack,
  148.                                             num,
  149.                                             -1,
  150.                                             Pack,
  151.                                             odev    );
  152.                                 NumTry := 0;
  153.                                 RetVal := CurrState;
  154.                             end;
  155.                         end;
  156.                     end;
  157.                 
  158.                 EOFPack   :
  159.                     begin
  160.                         OldTry := OldTry + 1;
  161.                         if OldTry > MaxTry then
  162.                             RetVal := Abort
  163.                         else
  164.                         begin
  165.                             if  num = Prev ( n )  then
  166.                             begin
  167.                                 SendACK( num, Odev );
  168.                                 NumTry := 0;
  169.                                 RetVal := CurrState;
  170.                             end
  171.                             else
  172.                                 RetVal := Abort;
  173.                         end;
  174.                     end;
  175.  
  176.                 FHeadPack   :   (* which is what we really want *)
  177.                     begin
  178.                         if  num <> n then
  179.                             RetVal := Abort
  180.                         else
  181.                         begin
  182.                             GetFilename ( Filename, Pack );
  183.                             Status := OpenWrite( OutFile, Filename );
  184.                             if Status < 0 then
  185.                             begin
  186.                                 if Debug then begin
  187.                                     DbgWrite( 'Could not open file :   $' );
  188.                                     DbgFilename( Filename );
  189.                                     DbgNL;
  190.                                 end;
  191.                                 RetVal := Abort;
  192.                             end
  193.                             else
  194.                             begin
  195.                                 if Debug then begin
  196.                                     DbgWrite( 'Receiving : $' );
  197.                                     DbgFilename( Filename );
  198.                                     DbgNL;
  199.                                 end;
  200.                                 SendACK( n, Odev );
  201.                                 OldTry := NumTry;
  202.                                 NumTry := 0;
  203.                                 n := ( n + 1 ) mod 64;
  204.                                 RetVal := FileData;
  205.                             end;
  206.                         end;
  207.                     end;
  208.  
  209.                 BrkPack :
  210.                     begin
  211.                         if  num <> n then
  212.                             RetVal := Abort
  213.                         else
  214.                         begin
  215.                             SendACK( n, Odev );
  216.                             RetVal := Complete;
  217.                         end;
  218.                     end;
  219.  
  220.                 DataPack, ACKPack, NAKPack,
  221.                 ErrPack, IllPack :
  222.                     begin
  223.                         RetVal := Abort;
  224.                     end;
  225.  
  226.                 ChkIllPack :
  227.                     begin
  228.                         if Debug then begin
  229.                             DbgWrite('Wrong checksum - sending NAK$');
  230.                             DbgNL;
  231.                         end;
  232.                         SendNAK( n , ODev );
  233.                         RetVal := CurrState;
  234.                     end;
  235.  
  236.                 TimOutPack  :
  237.                     begin
  238.                         if Debug then begin
  239.                             DbgWrite('Timed out waiting for FHeadPacket$');
  240.                             DbgNL;
  241.                         end;
  242.                         SendNAK( n , ODev );
  243.                         RetVal := CurrState;
  244.                     end;
  245.             end;
  246.         end;
  247.         ReadFile := RetVal;
  248.     end;
  249.  
  250.  
  251.  
  252.     function    ReadInit(   IDev, Odev : integer ): KermitStates;
  253.     var     num     : integer;
  254.             len     : integer;
  255.             Pack    : Packet;
  256.             RetVal  : KermitStates;
  257.             Answer  : PacketType;
  258.     begin
  259.         if Debug then begin
  260.             DbgWrite( 'Entering ReadInit ...... ');
  261.             DbgNL;
  262.         end;
  263.         NumTry := NumTry + 1;
  264.         if NumTry > MaxTry then
  265.             RetVal := Abort
  266.         else
  267.         begin
  268.             Answer := ReadPacket( Num, len, Pack, Idev );
  269.             if Answer = SInitPack then
  270.             begin
  271.                 ReadPars( Pack );
  272.                 SendPacket(     NoChangePack,
  273.                                 n,
  274.                                 -1,
  275.                                 Pack,
  276.                                 ODev    );
  277.                 OldTry := NumTry;
  278.                 NumTry := 0;
  279.                 n := (n + 1) mod 64;
  280.                 RetVal := FileHeader;
  281.             end
  282.             else
  283.                 if Answer = TimOutPack then begin
  284.                     if Debug then begin
  285.                         DbgWrite('Timed out waiting for Send-init - Retrying$');
  286.                         DbgNL;
  287.                     end;
  288.                     SendNAK ( n , ODev );
  289.                     RetVal := CurrState;
  290.                 end else
  291.                     if Answer = ChkIllPack then begin
  292.                         if Debug then begin
  293.                             DbgWrite('Illegal checksum - retrying$');
  294.                             DbgNL;
  295.                         end;
  296.                         SendNAK ( n , ODev );
  297.                         RetVal := CurrState;
  298.                     end else begin
  299.                         if Debug then begin
  300.                             DbgWrite('Unable to receive send-init-packet$');
  301.                             DbgNL;
  302.                             DbgPacket( Pack );
  303.                         end;
  304.                         RetVal := Abort;
  305.                     end;
  306.  
  307.         end;
  308.         ReadInit := RetVal;
  309.     end;
  310.  
  311.     function   ReadSwitch( VAR OutFile      : ByteFile;
  312.                                Idev, Odev   : integer ) : KermitStates;
  313.     (*  This is the state table switcher for the receive file function *)
  314.     begin
  315.         xhold( SUnits, Delay );
  316.         CurrState := Init;
  317.         n := 0;
  318.         NumTry := 0;
  319.         while (CurrState <> Abort) and (CurrState <> Complete) do
  320.         begin
  321.             case CurrState of
  322.                 FileData    :   CurrState := ReadData( IDev, Odev, OutFile );
  323.                 FileHeader  :   CurrState := ReadFile( IDev, Odev, OutFile );
  324.                 Init        :
  325.                     begin
  326.                         CurrState := ReadInit( IDev, Odev );
  327.                         if RTSet then
  328.                             TimeOut := RcvTimeOut;
  329.                     end;
  330.                 Complete    :   ;
  331.                 EOFile, Break   :
  332.                                 begin
  333.                                     if Debug then begin
  334.                                         DbgWrite('Unexpected packet read - EOFile or Break$');
  335.                                         DbgNL;
  336.                                     end;
  337.                                     CurrState := Abort;
  338.                                 end;
  339.             end;
  340.  
  341.             if Debug then begin
  342.                 DbgWrite ( 'ReadSwitch :  State transition to --> $' );
  343.                 DbgState ( CurrState );
  344.                 DbgNL;
  345.             end;
  346.         end;
  347.         ReadSwitch := CurrState;
  348.     end;
  349. 
  350.