1275793eaSopenharmony_ci----------------------------------------------------------------
2275793eaSopenharmony_ci--  ZLib for Ada thick binding.                               --
3275793eaSopenharmony_ci--                                                            --
4275793eaSopenharmony_ci--  Copyright (C) 2002-2003 Dmitriy Anisimkov                 --
5275793eaSopenharmony_ci--                                                            --
6275793eaSopenharmony_ci--  Open source license information is in the zlib.ads file.  --
7275793eaSopenharmony_ci----------------------------------------------------------------
8275793eaSopenharmony_ci
9275793eaSopenharmony_ci--  $Id: zlib-streams.adb,v 1.10 2004/05/31 10:53:40 vagul Exp $
10275793eaSopenharmony_ci
11275793eaSopenharmony_ciwith Ada.Unchecked_Deallocation;
12275793eaSopenharmony_ci
13275793eaSopenharmony_cipackage body ZLib.Streams is
14275793eaSopenharmony_ci
15275793eaSopenharmony_ci   -----------
16275793eaSopenharmony_ci   -- Close --
17275793eaSopenharmony_ci   -----------
18275793eaSopenharmony_ci
19275793eaSopenharmony_ci   procedure Close (Stream : in out Stream_Type) is
20275793eaSopenharmony_ci      procedure Free is new Ada.Unchecked_Deallocation
21275793eaSopenharmony_ci         (Stream_Element_Array, Buffer_Access);
22275793eaSopenharmony_ci   begin
23275793eaSopenharmony_ci      if Stream.Mode = Out_Stream or Stream.Mode = Duplex then
24275793eaSopenharmony_ci         --  We should flush the data written by the writer.
25275793eaSopenharmony_ci
26275793eaSopenharmony_ci         Flush (Stream, Finish);
27275793eaSopenharmony_ci
28275793eaSopenharmony_ci         Close (Stream.Writer);
29275793eaSopenharmony_ci      end if;
30275793eaSopenharmony_ci
31275793eaSopenharmony_ci      if Stream.Mode = In_Stream or Stream.Mode = Duplex then
32275793eaSopenharmony_ci         Close (Stream.Reader);
33275793eaSopenharmony_ci         Free (Stream.Buffer);
34275793eaSopenharmony_ci      end if;
35275793eaSopenharmony_ci   end Close;
36275793eaSopenharmony_ci
37275793eaSopenharmony_ci   ------------
38275793eaSopenharmony_ci   -- Create --
39275793eaSopenharmony_ci   ------------
40275793eaSopenharmony_ci
41275793eaSopenharmony_ci   procedure Create
42275793eaSopenharmony_ci     (Stream            :    out Stream_Type;
43275793eaSopenharmony_ci      Mode              : in     Stream_Mode;
44275793eaSopenharmony_ci      Back              : in     Stream_Access;
45275793eaSopenharmony_ci      Back_Compressed   : in     Boolean;
46275793eaSopenharmony_ci      Level             : in     Compression_Level := Default_Compression;
47275793eaSopenharmony_ci      Strategy          : in     Strategy_Type     := Default_Strategy;
48275793eaSopenharmony_ci      Header            : in     Header_Type       := Default;
49275793eaSopenharmony_ci      Read_Buffer_Size  : in     Ada.Streams.Stream_Element_Offset
50275793eaSopenharmony_ci                                    := Default_Buffer_Size;
51275793eaSopenharmony_ci      Write_Buffer_Size : in     Ada.Streams.Stream_Element_Offset
52275793eaSopenharmony_ci                                    := Default_Buffer_Size)
53275793eaSopenharmony_ci   is
54275793eaSopenharmony_ci
55275793eaSopenharmony_ci      subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size);
56275793eaSopenharmony_ci
57275793eaSopenharmony_ci      procedure Init_Filter
58275793eaSopenharmony_ci         (Filter   : in out Filter_Type;
59275793eaSopenharmony_ci          Compress : in     Boolean);
60275793eaSopenharmony_ci
61275793eaSopenharmony_ci      -----------------
62275793eaSopenharmony_ci      -- Init_Filter --
63275793eaSopenharmony_ci      -----------------
64275793eaSopenharmony_ci
65275793eaSopenharmony_ci      procedure Init_Filter
66275793eaSopenharmony_ci         (Filter   : in out Filter_Type;
67275793eaSopenharmony_ci          Compress : in     Boolean) is
68275793eaSopenharmony_ci      begin
69275793eaSopenharmony_ci         if Compress then
70275793eaSopenharmony_ci            Deflate_Init
71275793eaSopenharmony_ci              (Filter, Level, Strategy, Header => Header);
72275793eaSopenharmony_ci         else
73275793eaSopenharmony_ci            Inflate_Init (Filter, Header => Header);
74275793eaSopenharmony_ci         end if;
75275793eaSopenharmony_ci      end Init_Filter;
76275793eaSopenharmony_ci
77275793eaSopenharmony_ci   begin
78275793eaSopenharmony_ci      Stream.Back := Back;
79275793eaSopenharmony_ci      Stream.Mode := Mode;
80275793eaSopenharmony_ci
81275793eaSopenharmony_ci      if Mode = Out_Stream or Mode = Duplex then
82275793eaSopenharmony_ci         Init_Filter (Stream.Writer, Back_Compressed);
83275793eaSopenharmony_ci         Stream.Buffer_Size := Write_Buffer_Size;
84275793eaSopenharmony_ci      else
85275793eaSopenharmony_ci         Stream.Buffer_Size := 0;
86275793eaSopenharmony_ci      end if;
87275793eaSopenharmony_ci
88275793eaSopenharmony_ci      if Mode = In_Stream or Mode = Duplex then
89275793eaSopenharmony_ci         Init_Filter (Stream.Reader, not Back_Compressed);
90275793eaSopenharmony_ci
91275793eaSopenharmony_ci         Stream.Buffer     := new Buffer_Subtype;
92275793eaSopenharmony_ci         Stream.Rest_First := Stream.Buffer'Last + 1;
93275793eaSopenharmony_ci         Stream.Rest_Last  := Stream.Buffer'Last;
94275793eaSopenharmony_ci      end if;
95275793eaSopenharmony_ci   end Create;
96275793eaSopenharmony_ci
97275793eaSopenharmony_ci   -----------
98275793eaSopenharmony_ci   -- Flush --
99275793eaSopenharmony_ci   -----------
100275793eaSopenharmony_ci
101275793eaSopenharmony_ci   procedure Flush
102275793eaSopenharmony_ci     (Stream : in out Stream_Type;
103275793eaSopenharmony_ci      Mode   : in     Flush_Mode := Sync_Flush)
104275793eaSopenharmony_ci   is
105275793eaSopenharmony_ci      Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size);
106275793eaSopenharmony_ci      Last   : Stream_Element_Offset;
107275793eaSopenharmony_ci   begin
108275793eaSopenharmony_ci      loop
109275793eaSopenharmony_ci         Flush (Stream.Writer, Buffer, Last, Mode);
110275793eaSopenharmony_ci
111275793eaSopenharmony_ci         Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last));
112275793eaSopenharmony_ci
113275793eaSopenharmony_ci         exit when Last < Buffer'Last;
114275793eaSopenharmony_ci      end loop;
115275793eaSopenharmony_ci   end Flush;
116275793eaSopenharmony_ci
117275793eaSopenharmony_ci   -------------
118275793eaSopenharmony_ci   -- Is_Open --
119275793eaSopenharmony_ci   -------------
120275793eaSopenharmony_ci
121275793eaSopenharmony_ci   function Is_Open (Stream : Stream_Type) return Boolean is
122275793eaSopenharmony_ci   begin
123275793eaSopenharmony_ci      return Is_Open (Stream.Reader) or else Is_Open (Stream.Writer);
124275793eaSopenharmony_ci   end Is_Open;
125275793eaSopenharmony_ci
126275793eaSopenharmony_ci   ----------
127275793eaSopenharmony_ci   -- Read --
128275793eaSopenharmony_ci   ----------
129275793eaSopenharmony_ci
130275793eaSopenharmony_ci   procedure Read
131275793eaSopenharmony_ci     (Stream : in out Stream_Type;
132275793eaSopenharmony_ci      Item   :    out Stream_Element_Array;
133275793eaSopenharmony_ci      Last   :    out Stream_Element_Offset)
134275793eaSopenharmony_ci   is
135275793eaSopenharmony_ci
136275793eaSopenharmony_ci      procedure Read
137275793eaSopenharmony_ci        (Item : out Stream_Element_Array;
138275793eaSopenharmony_ci         Last : out Stream_Element_Offset);
139275793eaSopenharmony_ci
140275793eaSopenharmony_ci      ----------
141275793eaSopenharmony_ci      -- Read --
142275793eaSopenharmony_ci      ----------
143275793eaSopenharmony_ci
144275793eaSopenharmony_ci      procedure Read
145275793eaSopenharmony_ci        (Item : out Stream_Element_Array;
146275793eaSopenharmony_ci         Last : out Stream_Element_Offset) is
147275793eaSopenharmony_ci      begin
148275793eaSopenharmony_ci         Ada.Streams.Read (Stream.Back.all, Item, Last);
149275793eaSopenharmony_ci      end Read;
150275793eaSopenharmony_ci
151275793eaSopenharmony_ci      procedure Read is new ZLib.Read
152275793eaSopenharmony_ci         (Read       => Read,
153275793eaSopenharmony_ci          Buffer     => Stream.Buffer.all,
154275793eaSopenharmony_ci          Rest_First => Stream.Rest_First,
155275793eaSopenharmony_ci          Rest_Last  => Stream.Rest_Last);
156275793eaSopenharmony_ci
157275793eaSopenharmony_ci   begin
158275793eaSopenharmony_ci      Read (Stream.Reader, Item, Last);
159275793eaSopenharmony_ci   end Read;
160275793eaSopenharmony_ci
161275793eaSopenharmony_ci   -------------------
162275793eaSopenharmony_ci   -- Read_Total_In --
163275793eaSopenharmony_ci   -------------------
164275793eaSopenharmony_ci
165275793eaSopenharmony_ci   function Read_Total_In (Stream : in Stream_Type) return Count is
166275793eaSopenharmony_ci   begin
167275793eaSopenharmony_ci      return Total_In (Stream.Reader);
168275793eaSopenharmony_ci   end Read_Total_In;
169275793eaSopenharmony_ci
170275793eaSopenharmony_ci   --------------------
171275793eaSopenharmony_ci   -- Read_Total_Out --
172275793eaSopenharmony_ci   --------------------
173275793eaSopenharmony_ci
174275793eaSopenharmony_ci   function Read_Total_Out (Stream : in Stream_Type) return Count is
175275793eaSopenharmony_ci   begin
176275793eaSopenharmony_ci      return Total_Out (Stream.Reader);
177275793eaSopenharmony_ci   end Read_Total_Out;
178275793eaSopenharmony_ci
179275793eaSopenharmony_ci   -----------
180275793eaSopenharmony_ci   -- Write --
181275793eaSopenharmony_ci   -----------
182275793eaSopenharmony_ci
183275793eaSopenharmony_ci   procedure Write
184275793eaSopenharmony_ci     (Stream : in out Stream_Type;
185275793eaSopenharmony_ci      Item   : in     Stream_Element_Array)
186275793eaSopenharmony_ci   is
187275793eaSopenharmony_ci
188275793eaSopenharmony_ci      procedure Write (Item : in Stream_Element_Array);
189275793eaSopenharmony_ci
190275793eaSopenharmony_ci      -----------
191275793eaSopenharmony_ci      -- Write --
192275793eaSopenharmony_ci      -----------
193275793eaSopenharmony_ci
194275793eaSopenharmony_ci      procedure Write (Item : in Stream_Element_Array) is
195275793eaSopenharmony_ci      begin
196275793eaSopenharmony_ci         Ada.Streams.Write (Stream.Back.all, Item);
197275793eaSopenharmony_ci      end Write;
198275793eaSopenharmony_ci
199275793eaSopenharmony_ci      procedure Write is new ZLib.Write
200275793eaSopenharmony_ci         (Write       => Write,
201275793eaSopenharmony_ci          Buffer_Size => Stream.Buffer_Size);
202275793eaSopenharmony_ci
203275793eaSopenharmony_ci   begin
204275793eaSopenharmony_ci      Write (Stream.Writer, Item, No_Flush);
205275793eaSopenharmony_ci   end Write;
206275793eaSopenharmony_ci
207275793eaSopenharmony_ci   --------------------
208275793eaSopenharmony_ci   -- Write_Total_In --
209275793eaSopenharmony_ci   --------------------
210275793eaSopenharmony_ci
211275793eaSopenharmony_ci   function Write_Total_In (Stream : in Stream_Type) return Count is
212275793eaSopenharmony_ci   begin
213275793eaSopenharmony_ci      return Total_In (Stream.Writer);
214275793eaSopenharmony_ci   end Write_Total_In;
215275793eaSopenharmony_ci
216275793eaSopenharmony_ci   ---------------------
217275793eaSopenharmony_ci   -- Write_Total_Out --
218275793eaSopenharmony_ci   ---------------------
219275793eaSopenharmony_ci
220275793eaSopenharmony_ci   function Write_Total_Out (Stream : in Stream_Type) return Count is
221275793eaSopenharmony_ci   begin
222275793eaSopenharmony_ci      return Total_Out (Stream.Writer);
223275793eaSopenharmony_ci   end Write_Total_Out;
224275793eaSopenharmony_ci
225275793eaSopenharmony_ciend ZLib.Streams;
226