package FS.FILO.Ext2 is

   type T is private;

   function Is_Mounted (State : T) return Boolean;
   function Is_Open (State : T) return Boolean
   with
      Post => (if Is_Open'Result then Is_Mounted (State));

   procedure Mount
     (State    : in out T;
      Part_Len : in     Partition_Length;
      Success  :    out Boolean)
   with
      Pre => not Is_Mounted (State),
      Post => Success = Is_Mounted (State);

   procedure Open
     (State       : in out T;
      File_Len    :    out File_Length;
      File_Path   : in     String;
      Success     : out    Boolean)
   with
      Pre => Is_Mounted (State) and not Is_Open (State),
      Post => Success = Is_Open (State);

   procedure Close (State : in out T)
   with
      Pre => Is_Open (State),
      Post => Is_Mounted (State);

   procedure Read
     (State    : in out T;
      File_Len : in     File_Length;
      File_Pos : in out File_Offset;
      Buf      :    out Buffer_Type;
      Len      :    out Natural)
   with
      Pre => Is_Open (State),
      Post => Is_Open (State);

private
   type State is (Unmounted, Mounted, File_Opened);

   -- maximum block size is 64KiB (2^16):
   subtype Log_Block_Size is Positive range 10 .. 16;

   subtype Inode_Size is Positive range 128 .. Positive (Unsigned_16'Last);
   subtype Desc_Size  is Positive range  32 .. Positive (Unsigned_16'Last);

   type T is record
      S : State;
      Part_Len          : Partition_Length := 0;
      First_Data_Block  : Block_Offset := 0;
      Block_Size_Bits   : Log_Block_Size := 10;
      Inodes_Per_Group  : Positive := 1;
      Inode_Size        : Ext2.Inode_Size := Ext2.Inode_Size'First;
      Desc_Size         : Ext2.Desc_Size := Ext2.Desc_Size'First;
      Feature_Extents   : Boolean := False;
      Feature_64Bit     : Boolean := False;
   end record;

end FS.FILO.Ext2;
