1 ----------------------------------------------------------------
   2 --  ZLib for Ada thick binding.                               --
   3 --                                                            --
   4 --  Copyright (C) 2002-2003 Dmitriy Anisimkov                 --
   5 --                                                            --
   6 --  Open source license information is in the zlib.ads file.  --
   7 ----------------------------------------------------------------
   8 
   9 --  $Id: zlib-streams.ads,v 1.12 2004/05/31 10:53:40 vagul Exp $
  10 
  11 package ZLib.Streams is
  12 
  13    type Stream_Mode is (In_Stream, Out_Stream, Duplex);
  14 
  15    type Stream_Access is access all Ada.Streams.Root_Stream_Type'Class;
  16 
  17    type Stream_Type is
  18       new Ada.Streams.Root_Stream_Type with private;
  19 
  20    procedure Read
  21      (Stream : in out Stream_Type;
  22       Item   :    out Ada.Streams.Stream_Element_Array;
  23       Last   :    out Ada.Streams.Stream_Element_Offset);
  24 
  25    procedure Write
  26      (Stream : in out Stream_Type;
  27       Item   : in     Ada.Streams.Stream_Element_Array);
  28 
  29    procedure Flush
  30      (Stream : in out Stream_Type;
  31       Mode   : in     Flush_Mode := Sync_Flush);
  32    --  Flush the written data to the back stream,
  33    --  all data placed to the compressor is flushing to the Back stream.
  34    --  Should not be used untill necessary, becouse it is decreasing
  35    --  compression.
  36 
  37    function Read_Total_In (Stream : in Stream_Type) return Count;
  38    pragma Inline (Read_Total_In);
  39    --  Return total number of bytes read from back stream so far.
  40 
  41    function Read_Total_Out (Stream : in Stream_Type) return Count;
  42    pragma Inline (Read_Total_Out);
  43    --  Return total number of bytes read so far.
  44 
  45    function Write_Total_In (Stream : in Stream_Type) return Count;
  46    pragma Inline (Write_Total_In);
  47    --  Return total number of bytes written so far.
  48 
  49    function Write_Total_Out (Stream : in Stream_Type) return Count;
  50    pragma Inline (Write_Total_Out);
  51    --  Return total number of bytes written to the back stream.
  52 
  53    procedure Create
  54      (Stream            :    out Stream_Type;
  55       Mode              : in     Stream_Mode;
  56       Back              : in     Stream_Access;
  57       Back_Compressed   : in     Boolean;
  58       Level             : in     Compression_Level := Default_Compression;
  59       Strategy          : in     Strategy_Type     := Default_Strategy;
  60       Header            : in     Header_Type       := Default;
  61       Read_Buffer_Size  : in     Ada.Streams.Stream_Element_Offset
  62                                     := Default_Buffer_Size;
  63       Write_Buffer_Size : in     Ada.Streams.Stream_Element_Offset
  64                                     := Default_Buffer_Size);
  65    --  Create the Comression/Decompression stream.
  66    --  If mode is In_Stream then Write operation is disabled.
  67    --  If mode is Out_Stream then Read operation is disabled.
  68 
  69    --  If Back_Compressed is true then
  70    --  Data written to the Stream is compressing to the Back stream
  71    --  and data read from the Stream is decompressed data from the Back stream.
  72 
  73    --  If Back_Compressed is false then
  74    --  Data written to the Stream is decompressing to the Back stream
  75    --  and data read from the Stream is compressed data from the Back stream.
  76 
  77    --  !!! When the Need_Header is False ZLib-Ada is using undocumented
  78    --  ZLib 1.1.4 functionality to do not create/wait for ZLib headers.
  79 
  80    function Is_Open (Stream : Stream_Type) return Boolean;
  81 
  82    procedure Close (Stream : in out Stream_Type);
  83 
  84 private
  85 
  86    use Ada.Streams;
  87 
  88    type Buffer_Access is access all Stream_Element_Array;
  89 
  90    type Stream_Type
  91      is new Root_Stream_Type with
  92    record
  93       Mode       : Stream_Mode;
  94 
  95       Buffer     : Buffer_Access;
  96       Rest_First : Stream_Element_Offset;
  97       Rest_Last  : Stream_Element_Offset;
  98       --  Buffer for Read operation.
  99       --  We need to have this buffer in the record
 100       --  becouse not all read data from back stream
 101       --  could be processed during the read operation.
 102 
 103       Buffer_Size : Stream_Element_Offset;
 104       --  Buffer size for write operation.
 105       --  We do not need to have this buffer
 106       --  in the record becouse all data could be
 107       --  processed in the write operation.
 108 
 109       Back       : Stream_Access;
 110       Reader     : Filter_Type;
 111       Writer     : Filter_Type;
 112    end record;
 113 
 114 end ZLib.Streams;