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