Unit AViewARJ;

{$I M_OPS.PAS}

Interface

Uses
  Dos,
  AView;

Const
  flag_DIR = $10;

Type
  AFHeader = Record
    HeadId  : Word;
    BHdrSz  : Word;
    HdrSz   : Byte;
    AVNo    : Byte;
    MAVX    : Byte;
    HostOS  : Byte;
    Flags   : Byte;
    SVer    : Byte;
    FType   : Byte;
    Res1    : Byte;
    DOS_DT  : LongInt;
    CSize   : LongInt;
    OSize   : LongInt;
    SEFP    : LongInt;
    FSFPos  : Word;
    SEDLgn  : Word;
    Res2    : Word;
    NameDat : Array[1..120] of Char;
    Res3    : Array[1..10] of Char;
  End;

Type
  PArjArchive = ^TArjArchive;
  TArjArchive = Object(TGeneralArchive)
    Constructor Init;
    Procedure   FindFirst (Var SR : ArcSearchRec); Virtual;
    Procedure   FindNext  (Var SR : ArcSearchRec); Virtual;
  Private
    _FHdr : AFHeader;
    _SL   : LongInt;
    Procedure GetHeader (Var SR : ArcSearchRec);
  End;

Implementation

Const
  BSize = 4096;

Var
  BUFF : Array[1..BSize] of Byte;

Constructor TArjArchive.Init;
Begin
  FillChar (_FHdr, SizeOf(_FHdr), 0);
End;

Procedure TArjArchive.GetHeader(var sr:ArcSearchRec);
Var
  {$IFDEF MSDOS}
  BC : Word;
  {$ELSE}
  BC : LongInt;
  {$ENDIF}
  B  : Byte;
Begin
  FillChar (_FHdr, SizeOf(_FHdr), #0);
  FillChar (Buff, BSize, #0);
  Seek (ArcFile, _SL);
  BlockRead (ArcFile, BUFF, BSIZE, BC);
  Move(BUFF[1], _FHdr, SizeOf(_FHdr));
  With _FHdr Do Begin
    If BHdrSz > 0 Then Begin
      B       := 1;
      SR.Name := '';
      While NameDat[B] <> #0 Do Begin
        If NameDat[B] = '/' Then
          SR.Name := ''
        Else
          SR.Name := SR.Name + NameDat[B];
        Inc(B);
      End;
      SR.Size := BHdrSz + CSize;
      If FType = 2 Then SR.Size := BHdrSz;
      If BHdrSz = 0 Then SR.Size := 0;
      Inc(_SL, SR.Size + 10);
      SR.Time := DOS_DT;
{      If Flags and flag_DIR > 0 Then SR.Attr := 16 Else SR.Attr := 0;}
{		If (SR.Name[Length(SR.Name)] = '/') and (SR.Size = 0) Then SR.Attr := 16;}

    End;
  End;
End;

Procedure TArjArchive.FindFirst (Var SR : ArcSearchRec);
Begin
  _SL := 0;
  GetHeader (SR);
  GetHeader (SR);
End;

Procedure TArjArchive.FindNext (Var SR : ArcSearchRec);
Begin
  GetHeader(SR);
End;

End.