dcf_2.0.2_9ba2652f/src/dcf-unzip-streams.ads

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
--  SPDX-License-Identifier: MIT
--
--  Copyright (c) 1999 - 2018 Gautier de Montmollin
--  SWITZERLAND
--
--  Permission is hereby granted, free of charge, to any person obtaining a copy
--  of this software and associated documentation files (the "Software"), to deal
--  in the Software without restriction, including without limitation the rights
--  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
--  copies of the Software, and to permit persons to whom the Software is
--  furnished to do so, subject to the following conditions:
--
--  The above copyright notice and this permission notice shall be included in
--  all copies or substantial portions of the Software.
--
--  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
--  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
--  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
--  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
--  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
--  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
--  THE SOFTWARE.

--  UnZip.Streams
--  -------------
--
--  Extracts, as a stream, a file which is has been compressed into a Zip archive.
--  The Zip archive itself (the input) can be a file or a more general stream.
--  This package is resembling Ada.Streams.Stream_IO, to facilitate transition.

with Ada.Streams;

with DCF.Zip;
with DCF.Streams;

package DCF.Unzip.Streams is
   pragma Preelaborate;

   type Stream_Writer
     (Target : access DCF.Streams.Root_Zipstream_Type'Class)
   is new Ada.Streams.Root_Stream_Type with private;
   --  A simple helper object to extract files to a Root_Zipstream_Type
   --
   --  To extract to a file on disk, create a Stream_Writer object as follows:
   --
   --  File_Stream   : aliased DCF.Streams.File_Zipstream := DCF.Streams.Create (Path);
   --  Stream_Writer : DCF.Unzip.Streams.Stream_Writer (File_Stream'Access);
   --
   --  And then call procedure Extract below.

   use type DCF.Streams.Zipstream_Class_Access;

   procedure Extract
     (Destination      : in out Ada.Streams.Root_Stream_Type'Class;
      Archive_Info     : in     Zip.Zip_Info;       --  Archive's Zip_info
      File             : in     Zip.Archived_File;  --  Zipped entry
      Verify_Integrity : in     Boolean)
   with Pre  => Archive_Info.Is_Loaded and Archive_Info.Stream /= null;
   --  Extract a Zip archive entry to the given output stream
   --
   --  The memory footprint is limited to the decompression structures and
   --  buffering, so the outward stream can be an interesting alternative
   --  to the inward, albeit less comfortable.

private

   type Stream_Writer
     (Target : access DCF.Streams.Root_Zipstream_Type'Class)
   is new Ada.Streams.Root_Stream_Type with record
      Index : DCF.Streams.Zs_Index_Type := DCF.Streams.Zs_Index_Type'First;
   end record;

   overriding procedure Read
     (Stream : in out Stream_Writer;
      Item   :    out Ada.Streams.Stream_Element_Array;
      Last   :    out Ada.Streams.Stream_Element_Offset) is null;

   overriding procedure Write
     (Stream : in out Stream_Writer;
      Item   : in     Ada.Streams.Stream_Element_Array);

end DCF.Unzip.Streams;