1*44bedb31SLionel Sambuc---------------------------------------------------------------- 2*44bedb31SLionel Sambuc-- ZLib for Ada thick binding. -- 3*44bedb31SLionel Sambuc-- -- 4*44bedb31SLionel Sambuc-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- 5*44bedb31SLionel Sambuc-- -- 6*44bedb31SLionel Sambuc-- Open source license information is in the zlib.ads file. -- 7*44bedb31SLionel Sambuc---------------------------------------------------------------- 8*44bedb31SLionel Sambuc 9*44bedb31SLionel Sambuc-- Id: zlib-streams.adb,v 1.10 2004/05/31 10:53:40 vagul Exp 10*44bedb31SLionel Sambuc 11*44bedb31SLionel Sambucwith Ada.Unchecked_Deallocation; 12*44bedb31SLionel Sambuc 13*44bedb31SLionel Sambucpackage body ZLib.Streams is 14*44bedb31SLionel Sambuc 15*44bedb31SLionel Sambuc ----------- 16*44bedb31SLionel Sambuc -- Close -- 17*44bedb31SLionel Sambuc ----------- 18*44bedb31SLionel Sambuc 19*44bedb31SLionel Sambuc procedure Close (Stream : in out Stream_Type) is 20*44bedb31SLionel Sambuc procedure Free is new Ada.Unchecked_Deallocation 21*44bedb31SLionel Sambuc (Stream_Element_Array, Buffer_Access); 22*44bedb31SLionel Sambuc begin 23*44bedb31SLionel Sambuc if Stream.Mode = Out_Stream or Stream.Mode = Duplex then 24*44bedb31SLionel Sambuc -- We should flush the data written by the writer. 25*44bedb31SLionel Sambuc 26*44bedb31SLionel Sambuc Flush (Stream, Finish); 27*44bedb31SLionel Sambuc 28*44bedb31SLionel Sambuc Close (Stream.Writer); 29*44bedb31SLionel Sambuc end if; 30*44bedb31SLionel Sambuc 31*44bedb31SLionel Sambuc if Stream.Mode = In_Stream or Stream.Mode = Duplex then 32*44bedb31SLionel Sambuc Close (Stream.Reader); 33*44bedb31SLionel Sambuc Free (Stream.Buffer); 34*44bedb31SLionel Sambuc end if; 35*44bedb31SLionel Sambuc end Close; 36*44bedb31SLionel Sambuc 37*44bedb31SLionel Sambuc ------------ 38*44bedb31SLionel Sambuc -- Create -- 39*44bedb31SLionel Sambuc ------------ 40*44bedb31SLionel Sambuc 41*44bedb31SLionel Sambuc procedure Create 42*44bedb31SLionel Sambuc (Stream : out Stream_Type; 43*44bedb31SLionel Sambuc Mode : in Stream_Mode; 44*44bedb31SLionel Sambuc Back : in Stream_Access; 45*44bedb31SLionel Sambuc Back_Compressed : in Boolean; 46*44bedb31SLionel Sambuc Level : in Compression_Level := Default_Compression; 47*44bedb31SLionel Sambuc Strategy : in Strategy_Type := Default_Strategy; 48*44bedb31SLionel Sambuc Header : in Header_Type := Default; 49*44bedb31SLionel Sambuc Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset 50*44bedb31SLionel Sambuc := Default_Buffer_Size; 51*44bedb31SLionel Sambuc Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset 52*44bedb31SLionel Sambuc := Default_Buffer_Size) 53*44bedb31SLionel Sambuc is 54*44bedb31SLionel Sambuc 55*44bedb31SLionel Sambuc subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size); 56*44bedb31SLionel Sambuc 57*44bedb31SLionel Sambuc procedure Init_Filter 58*44bedb31SLionel Sambuc (Filter : in out Filter_Type; 59*44bedb31SLionel Sambuc Compress : in Boolean); 60*44bedb31SLionel Sambuc 61*44bedb31SLionel Sambuc ----------------- 62*44bedb31SLionel Sambuc -- Init_Filter -- 63*44bedb31SLionel Sambuc ----------------- 64*44bedb31SLionel Sambuc 65*44bedb31SLionel Sambuc procedure Init_Filter 66*44bedb31SLionel Sambuc (Filter : in out Filter_Type; 67*44bedb31SLionel Sambuc Compress : in Boolean) is 68*44bedb31SLionel Sambuc begin 69*44bedb31SLionel Sambuc if Compress then 70*44bedb31SLionel Sambuc Deflate_Init 71*44bedb31SLionel Sambuc (Filter, Level, Strategy, Header => Header); 72*44bedb31SLionel Sambuc else 73*44bedb31SLionel Sambuc Inflate_Init (Filter, Header => Header); 74*44bedb31SLionel Sambuc end if; 75*44bedb31SLionel Sambuc end Init_Filter; 76*44bedb31SLionel Sambuc 77*44bedb31SLionel Sambuc begin 78*44bedb31SLionel Sambuc Stream.Back := Back; 79*44bedb31SLionel Sambuc Stream.Mode := Mode; 80*44bedb31SLionel Sambuc 81*44bedb31SLionel Sambuc if Mode = Out_Stream or Mode = Duplex then 82*44bedb31SLionel Sambuc Init_Filter (Stream.Writer, Back_Compressed); 83*44bedb31SLionel Sambuc Stream.Buffer_Size := Write_Buffer_Size; 84*44bedb31SLionel Sambuc else 85*44bedb31SLionel Sambuc Stream.Buffer_Size := 0; 86*44bedb31SLionel Sambuc end if; 87*44bedb31SLionel Sambuc 88*44bedb31SLionel Sambuc if Mode = In_Stream or Mode = Duplex then 89*44bedb31SLionel Sambuc Init_Filter (Stream.Reader, not Back_Compressed); 90*44bedb31SLionel Sambuc 91*44bedb31SLionel Sambuc Stream.Buffer := new Buffer_Subtype; 92*44bedb31SLionel Sambuc Stream.Rest_First := Stream.Buffer'Last + 1; 93*44bedb31SLionel Sambuc Stream.Rest_Last := Stream.Buffer'Last; 94*44bedb31SLionel Sambuc end if; 95*44bedb31SLionel Sambuc end Create; 96*44bedb31SLionel Sambuc 97*44bedb31SLionel Sambuc ----------- 98*44bedb31SLionel Sambuc -- Flush -- 99*44bedb31SLionel Sambuc ----------- 100*44bedb31SLionel Sambuc 101*44bedb31SLionel Sambuc procedure Flush 102*44bedb31SLionel Sambuc (Stream : in out Stream_Type; 103*44bedb31SLionel Sambuc Mode : in Flush_Mode := Sync_Flush) 104*44bedb31SLionel Sambuc is 105*44bedb31SLionel Sambuc Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size); 106*44bedb31SLionel Sambuc Last : Stream_Element_Offset; 107*44bedb31SLionel Sambuc begin 108*44bedb31SLionel Sambuc loop 109*44bedb31SLionel Sambuc Flush (Stream.Writer, Buffer, Last, Mode); 110*44bedb31SLionel Sambuc 111*44bedb31SLionel Sambuc Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last)); 112*44bedb31SLionel Sambuc 113*44bedb31SLionel Sambuc exit when Last < Buffer'Last; 114*44bedb31SLionel Sambuc end loop; 115*44bedb31SLionel Sambuc end Flush; 116*44bedb31SLionel Sambuc 117*44bedb31SLionel Sambuc ------------- 118*44bedb31SLionel Sambuc -- Is_Open -- 119*44bedb31SLionel Sambuc ------------- 120*44bedb31SLionel Sambuc 121*44bedb31SLionel Sambuc function Is_Open (Stream : Stream_Type) return Boolean is 122*44bedb31SLionel Sambuc begin 123*44bedb31SLionel Sambuc return Is_Open (Stream.Reader) or else Is_Open (Stream.Writer); 124*44bedb31SLionel Sambuc end Is_Open; 125*44bedb31SLionel Sambuc 126*44bedb31SLionel Sambuc ---------- 127*44bedb31SLionel Sambuc -- Read -- 128*44bedb31SLionel Sambuc ---------- 129*44bedb31SLionel Sambuc 130*44bedb31SLionel Sambuc procedure Read 131*44bedb31SLionel Sambuc (Stream : in out Stream_Type; 132*44bedb31SLionel Sambuc Item : out Stream_Element_Array; 133*44bedb31SLionel Sambuc Last : out Stream_Element_Offset) 134*44bedb31SLionel Sambuc is 135*44bedb31SLionel Sambuc 136*44bedb31SLionel Sambuc procedure Read 137*44bedb31SLionel Sambuc (Item : out Stream_Element_Array; 138*44bedb31SLionel Sambuc Last : out Stream_Element_Offset); 139*44bedb31SLionel Sambuc 140*44bedb31SLionel Sambuc ---------- 141*44bedb31SLionel Sambuc -- Read -- 142*44bedb31SLionel Sambuc ---------- 143*44bedb31SLionel Sambuc 144*44bedb31SLionel Sambuc procedure Read 145*44bedb31SLionel Sambuc (Item : out Stream_Element_Array; 146*44bedb31SLionel Sambuc Last : out Stream_Element_Offset) is 147*44bedb31SLionel Sambuc begin 148*44bedb31SLionel Sambuc Ada.Streams.Read (Stream.Back.all, Item, Last); 149*44bedb31SLionel Sambuc end Read; 150*44bedb31SLionel Sambuc 151*44bedb31SLionel Sambuc procedure Read is new ZLib.Read 152*44bedb31SLionel Sambuc (Read => Read, 153*44bedb31SLionel Sambuc Buffer => Stream.Buffer.all, 154*44bedb31SLionel Sambuc Rest_First => Stream.Rest_First, 155*44bedb31SLionel Sambuc Rest_Last => Stream.Rest_Last); 156*44bedb31SLionel Sambuc 157*44bedb31SLionel Sambuc begin 158*44bedb31SLionel Sambuc Read (Stream.Reader, Item, Last); 159*44bedb31SLionel Sambuc end Read; 160*44bedb31SLionel Sambuc 161*44bedb31SLionel Sambuc ------------------- 162*44bedb31SLionel Sambuc -- Read_Total_In -- 163*44bedb31SLionel Sambuc ------------------- 164*44bedb31SLionel Sambuc 165*44bedb31SLionel Sambuc function Read_Total_In (Stream : in Stream_Type) return Count is 166*44bedb31SLionel Sambuc begin 167*44bedb31SLionel Sambuc return Total_In (Stream.Reader); 168*44bedb31SLionel Sambuc end Read_Total_In; 169*44bedb31SLionel Sambuc 170*44bedb31SLionel Sambuc -------------------- 171*44bedb31SLionel Sambuc -- Read_Total_Out -- 172*44bedb31SLionel Sambuc -------------------- 173*44bedb31SLionel Sambuc 174*44bedb31SLionel Sambuc function Read_Total_Out (Stream : in Stream_Type) return Count is 175*44bedb31SLionel Sambuc begin 176*44bedb31SLionel Sambuc return Total_Out (Stream.Reader); 177*44bedb31SLionel Sambuc end Read_Total_Out; 178*44bedb31SLionel Sambuc 179*44bedb31SLionel Sambuc ----------- 180*44bedb31SLionel Sambuc -- Write -- 181*44bedb31SLionel Sambuc ----------- 182*44bedb31SLionel Sambuc 183*44bedb31SLionel Sambuc procedure Write 184*44bedb31SLionel Sambuc (Stream : in out Stream_Type; 185*44bedb31SLionel Sambuc Item : in Stream_Element_Array) 186*44bedb31SLionel Sambuc is 187*44bedb31SLionel Sambuc 188*44bedb31SLionel Sambuc procedure Write (Item : in Stream_Element_Array); 189*44bedb31SLionel Sambuc 190*44bedb31SLionel Sambuc ----------- 191*44bedb31SLionel Sambuc -- Write -- 192*44bedb31SLionel Sambuc ----------- 193*44bedb31SLionel Sambuc 194*44bedb31SLionel Sambuc procedure Write (Item : in Stream_Element_Array) is 195*44bedb31SLionel Sambuc begin 196*44bedb31SLionel Sambuc Ada.Streams.Write (Stream.Back.all, Item); 197*44bedb31SLionel Sambuc end Write; 198*44bedb31SLionel Sambuc 199*44bedb31SLionel Sambuc procedure Write is new ZLib.Write 200*44bedb31SLionel Sambuc (Write => Write, 201*44bedb31SLionel Sambuc Buffer_Size => Stream.Buffer_Size); 202*44bedb31SLionel Sambuc 203*44bedb31SLionel Sambuc begin 204*44bedb31SLionel Sambuc Write (Stream.Writer, Item, No_Flush); 205*44bedb31SLionel Sambuc end Write; 206*44bedb31SLionel Sambuc 207*44bedb31SLionel Sambuc -------------------- 208*44bedb31SLionel Sambuc -- Write_Total_In -- 209*44bedb31SLionel Sambuc -------------------- 210*44bedb31SLionel Sambuc 211*44bedb31SLionel Sambuc function Write_Total_In (Stream : in Stream_Type) return Count is 212*44bedb31SLionel Sambuc begin 213*44bedb31SLionel Sambuc return Total_In (Stream.Writer); 214*44bedb31SLionel Sambuc end Write_Total_In; 215*44bedb31SLionel Sambuc 216*44bedb31SLionel Sambuc --------------------- 217*44bedb31SLionel Sambuc -- Write_Total_Out -- 218*44bedb31SLionel Sambuc --------------------- 219*44bedb31SLionel Sambuc 220*44bedb31SLionel Sambuc function Write_Total_Out (Stream : in Stream_Type) return Count is 221*44bedb31SLionel Sambuc begin 222*44bedb31SLionel Sambuc return Total_Out (Stream.Writer); 223*44bedb31SLionel Sambuc end Write_Total_Out; 224*44bedb31SLionel Sambuc 225*44bedb31SLionel Sambucend ZLib.Streams; 226