1555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Protocol Buffers - Google's data interchange format
2555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Copyright 2008 Google Inc.  All rights reserved.
3555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// http://code.google.com/p/protobuf/
4555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot//
5555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Redistribution and use in source and binary forms, with or without
6555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// modification, are permitted provided that the following conditions are
7555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// met:
8555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot//
9555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot//     * Redistributions of source code must retain the above copyright
10555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// notice, this list of conditions and the following disclaimer.
11555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot//     * Redistributions in binary form must reproduce the above
12555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// copyright notice, this list of conditions and the following disclaimer
13555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// in the documentation and/or other materials provided with the
14555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// distribution.
15555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot//     * Neither the name of Google Inc. nor the names of its
16555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// contributors may be used to endorse or promote products derived from
17555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// this software without specific prior written permission.
18555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot//
19555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
31555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Author: brianolson@google.com (Brian Olson)
32555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot//
33555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// This file contains the definition for classes GzipInputStream and
34555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// GzipOutputStream.
35555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot//
36555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// GzipInputStream decompresses data from an underlying
37555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ZeroCopyInputStream and provides the decompressed data as a
38555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ZeroCopyInputStream.
39555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot//
40555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// GzipOutputStream is an ZeroCopyOutputStream that compresses data to
41555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// an underlying ZeroCopyOutputStream.
42555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
43555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#ifndef GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__
44555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__
45555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
46555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <zlib.h>
47555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
48555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <google/protobuf/stubs/common.h>
49555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <google/protobuf/io/zero_copy_stream.h>
50555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
51555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace google {
52555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace protobuf {
53555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace io {
54555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
55555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// A ZeroCopyInputStream that reads compressed data through zlib
56555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass LIBPROTOBUF_EXPORT GzipInputStream : public ZeroCopyInputStream {
57555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public:
58555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Format key for constructor
59555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  enum Format {
60555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // zlib will autodetect gzip header or deflate stream
61555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    AUTO = 0,
62555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
63555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // GZIP streams have some extra header data for file attributes.
64555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    GZIP = 1,
65555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
66555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Simpler zlib stream format.
67555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    ZLIB = 2,
68555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
69555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
70555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // buffer_size and format may be -1 for default of 64kB and GZIP format
71555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  explicit GzipInputStream(
72555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      ZeroCopyInputStream* sub_stream,
73555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      Format format = AUTO,
74555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      int buffer_size = -1);
75555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  virtual ~GzipInputStream();
76555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
77555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Return last error message or NULL if no error.
78555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  inline const char* ZlibErrorMessage() const {
79555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    return zcontext_.msg;
80555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  }
81555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  inline int ZlibErrorCode() const {
82555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    return zerror_;
83555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  }
84555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
85555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // implements ZeroCopyInputStream ----------------------------------
86555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  bool Next(const void** data, int* size);
87555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  void BackUp(int count);
88555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  bool Skip(int count);
89555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  int64 ByteCount() const;
90555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
91555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot private:
92555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  Format format_;
93555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
94555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  ZeroCopyInputStream* sub_stream_;
95555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
96555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  z_stream zcontext_;
97555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  int zerror_;
98555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
99555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  void* output_buffer_;
100555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  void* output_position_;
101555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  size_t output_buffer_length_;
102555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
103555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  int Inflate(int flush);
104555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  void DoNextOutput(const void** data, int* size);
105555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
106555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GzipInputStream);
107555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot};
108555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
109555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
110555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass LIBPROTOBUF_EXPORT GzipOutputStream : public ZeroCopyOutputStream {
111555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public:
112555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Format key for constructor
113555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  enum Format {
114555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // GZIP streams have some extra header data for file attributes.
115555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    GZIP = 1,
116555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
117555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Simpler zlib stream format.
118555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    ZLIB = 2,
119555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
120555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
121555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  struct LIBPROTOBUF_EXPORT Options {
122555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Defaults to GZIP.
123555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    Format format;
124555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
125555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // What size buffer to use internally.  Defaults to 64kB.
126555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    int buffer_size;
127555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
128555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // A number between 0 and 9, where 0 is no compression and 9 is best
129555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // compression.  Defaults to Z_DEFAULT_COMPRESSION (see zlib.h).
130555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    int compression_level;
131555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
132555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Defaults to Z_DEFAULT_STRATEGY.  Can also be set to Z_FILTERED,
133555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // Z_HUFFMAN_ONLY, or Z_RLE.  See the documentation for deflateInit2 in
134555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    // zlib.h for definitions of these constants.
135555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    int compression_strategy;
136555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
137555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    Options();  // Initializes with default values.
138555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  };
139555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
140555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Create a GzipOutputStream with default options.
141555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  explicit GzipOutputStream(ZeroCopyOutputStream* sub_stream);
142555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
143555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Create a GzipOutputStream with the given options.
144555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  GzipOutputStream(
145555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      ZeroCopyOutputStream* sub_stream,
146555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot      const Options& options);
147555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
148555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  virtual ~GzipOutputStream();
149555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
150555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Return last error message or NULL if no error.
151555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  inline const char* ZlibErrorMessage() const {
152555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    return zcontext_.msg;
153555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  }
154555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  inline int ZlibErrorCode() const {
155555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    return zerror_;
156555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  }
157555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
158555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Flushes data written so far to zipped data in the underlying stream.
159555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // It is the caller's responsibility to flush the underlying stream if
160555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // necessary.
161555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Compression may be less efficient stopping and starting around flushes.
162555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Returns true if no error.
163555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  //
164555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Please ensure that block size is > 6. Here is an excerpt from the zlib
165555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // doc that explains why:
166555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  //
167555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that avail_out
168555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // is greater than six to avoid repeated flush markers due to
169555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // avail_out == 0 on return.
170555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  bool Flush();
171555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
172555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Writes out all data and closes the gzip stream.
173555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // It is the caller's responsibility to close the underlying stream if
174555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // necessary.
175555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Returns true if no error.
176555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  bool Close();
177555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
178555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // implements ZeroCopyOutputStream ---------------------------------
179555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  bool Next(void** data, int* size);
180555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  void BackUp(int count);
181555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  int64 ByteCount() const;
182555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
183555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot private:
184555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  ZeroCopyOutputStream* sub_stream_;
185555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Result from calling Next() on sub_stream_
186555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  void* sub_data_;
187555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  int sub_data_size_;
188555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
189555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  z_stream zcontext_;
190555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  int zerror_;
191555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  void* input_buffer_;
192555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  size_t input_buffer_length_;
193555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
194555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Shared constructor code.
195555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  void Init(ZeroCopyOutputStream* sub_stream, const Options& options);
196555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
197555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Do some compression.
198555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Takes zlib flush mode.
199555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  // Returns zlib error code.
200555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  int Deflate(int flush);
201555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
202555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GzipOutputStream);
203555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot};
204555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
205555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}  // namespace io
206555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}  // namespace protobuf
207555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
208555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}  // namespace google
209555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif  // GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__
210