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