cannam@89: ---------------------------------------------------------------- cannam@89: -- ZLib for Ada thick binding. -- cannam@89: -- -- cannam@89: -- Copyright (C) 2002-2003 Dmitriy Anisimkov -- cannam@89: -- -- cannam@89: -- Open source license information is in the zlib.ads file. -- cannam@89: ---------------------------------------------------------------- cannam@89: cannam@89: -- $Id: zlib-streams.adb,v 1.10 2004/05/31 10:53:40 vagul Exp $ cannam@89: cannam@89: with Ada.Unchecked_Deallocation; cannam@89: cannam@89: package body ZLib.Streams is cannam@89: cannam@89: ----------- cannam@89: -- Close -- cannam@89: ----------- cannam@89: cannam@89: procedure Close (Stream : in out Stream_Type) is cannam@89: procedure Free is new Ada.Unchecked_Deallocation cannam@89: (Stream_Element_Array, Buffer_Access); cannam@89: begin cannam@89: if Stream.Mode = Out_Stream or Stream.Mode = Duplex then cannam@89: -- We should flush the data written by the writer. cannam@89: cannam@89: Flush (Stream, Finish); cannam@89: cannam@89: Close (Stream.Writer); cannam@89: end if; cannam@89: cannam@89: if Stream.Mode = In_Stream or Stream.Mode = Duplex then cannam@89: Close (Stream.Reader); cannam@89: Free (Stream.Buffer); cannam@89: end if; cannam@89: end Close; cannam@89: cannam@89: ------------ cannam@89: -- Create -- cannam@89: ------------ cannam@89: cannam@89: procedure Create cannam@89: (Stream : out Stream_Type; cannam@89: Mode : in Stream_Mode; cannam@89: Back : in Stream_Access; cannam@89: Back_Compressed : in Boolean; cannam@89: Level : in Compression_Level := Default_Compression; cannam@89: Strategy : in Strategy_Type := Default_Strategy; cannam@89: Header : in Header_Type := Default; cannam@89: Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset cannam@89: := Default_Buffer_Size; cannam@89: Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset cannam@89: := Default_Buffer_Size) cannam@89: is cannam@89: cannam@89: subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size); cannam@89: cannam@89: procedure Init_Filter cannam@89: (Filter : in out Filter_Type; cannam@89: Compress : in Boolean); cannam@89: cannam@89: ----------------- cannam@89: -- Init_Filter -- cannam@89: ----------------- cannam@89: cannam@89: procedure Init_Filter cannam@89: (Filter : in out Filter_Type; cannam@89: Compress : in Boolean) is cannam@89: begin cannam@89: if Compress then cannam@89: Deflate_Init cannam@89: (Filter, Level, Strategy, Header => Header); cannam@89: else cannam@89: Inflate_Init (Filter, Header => Header); cannam@89: end if; cannam@89: end Init_Filter; cannam@89: cannam@89: begin cannam@89: Stream.Back := Back; cannam@89: Stream.Mode := Mode; cannam@89: cannam@89: if Mode = Out_Stream or Mode = Duplex then cannam@89: Init_Filter (Stream.Writer, Back_Compressed); cannam@89: Stream.Buffer_Size := Write_Buffer_Size; cannam@89: else cannam@89: Stream.Buffer_Size := 0; cannam@89: end if; cannam@89: cannam@89: if Mode = In_Stream or Mode = Duplex then cannam@89: Init_Filter (Stream.Reader, not Back_Compressed); cannam@89: cannam@89: Stream.Buffer := new Buffer_Subtype; cannam@89: Stream.Rest_First := Stream.Buffer'Last + 1; cannam@89: Stream.Rest_Last := Stream.Buffer'Last; cannam@89: end if; cannam@89: end Create; cannam@89: cannam@89: ----------- cannam@89: -- Flush -- cannam@89: ----------- cannam@89: cannam@89: procedure Flush cannam@89: (Stream : in out Stream_Type; cannam@89: Mode : in Flush_Mode := Sync_Flush) cannam@89: is cannam@89: Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size); cannam@89: Last : Stream_Element_Offset; cannam@89: begin cannam@89: loop cannam@89: Flush (Stream.Writer, Buffer, Last, Mode); cannam@89: cannam@89: Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last)); cannam@89: cannam@89: exit when Last < Buffer'Last; cannam@89: end loop; cannam@89: end Flush; cannam@89: cannam@89: ------------- cannam@89: -- Is_Open -- cannam@89: ------------- cannam@89: cannam@89: function Is_Open (Stream : Stream_Type) return Boolean is cannam@89: begin cannam@89: return Is_Open (Stream.Reader) or else Is_Open (Stream.Writer); cannam@89: end Is_Open; cannam@89: cannam@89: ---------- cannam@89: -- Read -- cannam@89: ---------- cannam@89: cannam@89: procedure Read cannam@89: (Stream : in out Stream_Type; cannam@89: Item : out Stream_Element_Array; cannam@89: Last : out Stream_Element_Offset) cannam@89: is cannam@89: cannam@89: procedure Read cannam@89: (Item : out Stream_Element_Array; cannam@89: Last : out Stream_Element_Offset); cannam@89: cannam@89: ---------- cannam@89: -- Read -- cannam@89: ---------- cannam@89: cannam@89: procedure Read cannam@89: (Item : out Stream_Element_Array; cannam@89: Last : out Stream_Element_Offset) is cannam@89: begin cannam@89: Ada.Streams.Read (Stream.Back.all, Item, Last); cannam@89: end Read; cannam@89: cannam@89: procedure Read is new ZLib.Read cannam@89: (Read => Read, cannam@89: Buffer => Stream.Buffer.all, cannam@89: Rest_First => Stream.Rest_First, cannam@89: Rest_Last => Stream.Rest_Last); cannam@89: cannam@89: begin cannam@89: Read (Stream.Reader, Item, Last); cannam@89: end Read; cannam@89: cannam@89: ------------------- cannam@89: -- Read_Total_In -- cannam@89: ------------------- cannam@89: cannam@89: function Read_Total_In (Stream : in Stream_Type) return Count is cannam@89: begin cannam@89: return Total_In (Stream.Reader); cannam@89: end Read_Total_In; cannam@89: cannam@89: -------------------- cannam@89: -- Read_Total_Out -- cannam@89: -------------------- cannam@89: cannam@89: function Read_Total_Out (Stream : in Stream_Type) return Count is cannam@89: begin cannam@89: return Total_Out (Stream.Reader); cannam@89: end Read_Total_Out; cannam@89: cannam@89: ----------- cannam@89: -- Write -- cannam@89: ----------- cannam@89: cannam@89: procedure Write cannam@89: (Stream : in out Stream_Type; cannam@89: Item : in Stream_Element_Array) cannam@89: is cannam@89: cannam@89: procedure Write (Item : in Stream_Element_Array); cannam@89: cannam@89: ----------- cannam@89: -- Write -- cannam@89: ----------- cannam@89: cannam@89: procedure Write (Item : in Stream_Element_Array) is cannam@89: begin cannam@89: Ada.Streams.Write (Stream.Back.all, Item); cannam@89: end Write; cannam@89: cannam@89: procedure Write is new ZLib.Write cannam@89: (Write => Write, cannam@89: Buffer_Size => Stream.Buffer_Size); cannam@89: cannam@89: begin cannam@89: Write (Stream.Writer, Item, No_Flush); cannam@89: end Write; cannam@89: cannam@89: -------------------- cannam@89: -- Write_Total_In -- cannam@89: -------------------- cannam@89: cannam@89: function Write_Total_In (Stream : in Stream_Type) return Count is cannam@89: begin cannam@89: return Total_In (Stream.Writer); cannam@89: end Write_Total_In; cannam@89: cannam@89: --------------------- cannam@89: -- Write_Total_Out -- cannam@89: --------------------- cannam@89: cannam@89: function Write_Total_Out (Stream : in Stream_Type) return Count is cannam@89: begin cannam@89: return Total_Out (Stream.Writer); cannam@89: end Write_Total_Out; cannam@89: cannam@89: end ZLib.Streams;