1 /*****************************************************************
2 |
3 |   Neptune - Zip Support
4 |
5 | Copyright (c) 2002-2008, Axiomatic Systems, LLC.
6 | All rights reserved.
7 |
8 | Redistribution and use in source and binary forms, with or without
9 | modification, are permitted provided that the following conditions are met:
10 |     * Redistributions of source code must retain the above copyright
11 |       notice, this list of conditions and the following disclaimer.
12 |     * Redistributions in binary form must reproduce the above copyright
13 |       notice, this list of conditions and the following disclaimer in the
14 |       documentation and/or other materials provided with the distribution.
15 |     * Neither the name of Axiomatic Systems nor the
16 |       names of its contributors may be used to endorse or promote products
17 |       derived from this software without specific prior written permission.
18 |
19 | THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
20 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 | DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
23 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 |
30  ****************************************************************/
31 
32 #ifndef _NPT_ZIP_H_
33 #define _NPT_ZIP_H_
34 
35 /*----------------------------------------------------------------------
36 |   includes
37 +---------------------------------------------------------------------*/
38 #include "NptConfig.h"
39 #include "NptStreams.h"
40 #include "NptFile.h"
41 
42 /*----------------------------------------------------------------------
43 |   class references
44 +---------------------------------------------------------------------*/
45 class NPT_ZipInflateState;
46 class NPT_ZipDeflateState;
47 
48 /*----------------------------------------------------------------------
49 |   NPT_Zip
50 +---------------------------------------------------------------------*/
51 const int NPT_ZIP_COMPRESSION_LEVEL_DEFAULT = -1;
52 const int NPT_ZIP_COMPRESSION_LEVEL_MIN     = 0;
53 const int NPT_ZIP_COMPRESSION_LEVEL_MAX     = 9;
54 const int NPT_ZIP_COMPRESSION_LEVEL_NONE    = 0;
55 class NPT_Zip
56 {
57 public:
58     // class methods
59     static NPT_Result MapError(int err);
60 
61     /**
62      * Compressed data format
63      */
64     typedef enum {
65         ZLIB,
66         GZIP
67     } Format;
68 
69     /**
70      * Deflate (i.e compress) a buffer
71      */
72     static NPT_Result Deflate(const NPT_DataBuffer& in,
73                               NPT_DataBuffer&       out,
74                               int                   compression_level = NPT_ZIP_COMPRESSION_LEVEL_DEFAULT,
75                               Format                format = ZLIB);
76 
77     /**
78      * Inflate (i.e decompress) a buffer
79      */
80     static NPT_Result Inflate(const NPT_DataBuffer& in,
81                               NPT_DataBuffer&       out);
82 
83     /**
84      * Deflate (i.e compress) a file
85      */
86     static NPT_Result Deflate(NPT_File& in,
87                               NPT_File& out,
88                               int       compression_level = NPT_ZIP_COMPRESSION_LEVEL_DEFAULT,
89                               Format    format = GZIP);
90 
91 };
92 
93 /*----------------------------------------------------------------------
94 |   NPT_ZipInflatingInputStream
95 +---------------------------------------------------------------------*/
96 class NPT_ZipInflatingInputStream : public NPT_InputStream
97 {
98 public:
99     NPT_ZipInflatingInputStream(NPT_InputStreamReference& source);
100    ~NPT_ZipInflatingInputStream();
101 
102     // NPT_InputStream methods
103     virtual NPT_Result Read(void*     buffer,
104                             NPT_Size  bytes_to_read,
105                             NPT_Size* bytes_read = NULL);
106     virtual NPT_Result Seek(NPT_Position offset);
107     virtual NPT_Result Tell(NPT_Position& offset);
108     virtual NPT_Result GetSize(NPT_LargeSize& size);
109     virtual NPT_Result GetAvailable(NPT_LargeSize& available);
110 
111 private:
112     NPT_InputStreamReference m_Source;
113     NPT_Position             m_Position;
114     NPT_ZipInflateState*     m_State;
115     NPT_DataBuffer           m_Buffer;
116 };
117 
118 /*----------------------------------------------------------------------
119 |   NPT_ZipInflatingOutputStream
120 +---------------------------------------------------------------------*/
121 
122 /*----------------------------------------------------------------------
123 |   NPT_ZipDeflatingInputStream
124 +---------------------------------------------------------------------*/
125 class NPT_ZipDeflatingInputStream : public NPT_InputStream
126 {
127 public:
128     NPT_ZipDeflatingInputStream(NPT_InputStreamReference& source,
129                                 int                       compression_level = NPT_ZIP_COMPRESSION_LEVEL_DEFAULT,
130                                 NPT_Zip::Format           format = NPT_Zip::ZLIB);
131    ~NPT_ZipDeflatingInputStream();
132 
133     // NPT_InputStream methods
134     virtual NPT_Result Read(void*     buffer,
135                             NPT_Size  bytes_to_read,
136                             NPT_Size* bytes_read = NULL);
137     virtual NPT_Result Seek(NPT_Position offset);
138     virtual NPT_Result Tell(NPT_Position& offset);
139     virtual NPT_Result GetSize(NPT_LargeSize& size);
140     virtual NPT_Result GetAvailable(NPT_LargeSize& available);
141 
142 private:
143     NPT_InputStreamReference m_Source;
144     NPT_Position             m_Position;
145     bool                     m_Eos;
146     NPT_ZipDeflateState*     m_State;
147     NPT_DataBuffer           m_Buffer;
148 };
149 
150 /*----------------------------------------------------------------------
151 |   NPT_ZipDeflatingOutputStream
152 +---------------------------------------------------------------------*/
153 /*class NPT_ZipDeflatingOutputStream : public NPT_OutputStream
154 {
155 public:
156     NPT_ZipDeflatingOutputStream(NPT_OutputStreamReference& source,
157                                  int                        compression_level = NPT_ZIP_COMPRESSION_LEVEL_DEFAULT,
158                                  NPT_Zip::Format            format = NPT_Zip::ZLIB);
159    NPT_ZipDeflatingOutputStream();
160 
161     // NPT_OutputStream methods
162     virtual NPT_Result Write(void*     buffer,
163                              NPT_Size  bytes_to_write,
164                              NPT_Size* bytes_written = NULL);
165     virtual NPT_Result Seek(NPT_Position offset);
166     virtual NPT_Result Tell(NPT_Position& offset);
167 
168 private:
169     NPT_OutputStreamReference m_Output;
170     NPT_Position              m_Position;
171     bool                      m_Eos;
172     NPT_ZipDeflateState*      m_State;
173     NPT_DataBuffer            m_Buffer;
174 }; */
175 
176 #endif // _NPT_ZIP_H_
177