00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00018
00019 #ifndef NET_INSTAWEB_UTIL_PUBLIC_GZIP_INFLATER_H_
00020 #define NET_INSTAWEB_UTIL_PUBLIC_GZIP_INFLATER_H_
00021
00022 #include <cstddef>
00023 #include "net/instaweb/util/public/basictypes.h"
00024
00025 typedef struct z_stream_s z_stream;
00026
00027 namespace net_instaweb {
00028
00029 class GzipInflater {
00030 public:
00031 enum InflateType {kGzip, kDeflate};
00032
00033 explicit GzipInflater(InflateType type);
00034 ~GzipInflater();
00035
00037 bool Init();
00038
00040 void ShutDown();
00041
00045 bool HasUnconsumedInput() const;
00046
00052 bool SetInput(const void *in, size_t in_size);
00053
00058 int InflateBytes(char *buf, size_t buf_size);
00059
00061 bool finished() const { return finished_; }
00062
00064 bool error() const { return error_; }
00065
00066 private:
00067 friend class GzipInflaterTestPeer;
00068
00069 enum StreamFormat {
00070 FORMAT_GZIP,
00071 FORMAT_ZLIB_STREAM,
00072 FORMAT_RAW_INFLATE,
00073 };
00074
00075 static bool GetWindowBitsForFormat(
00076 StreamFormat format, int* out_window_bits);
00077 void Free();
00078 void SetInputInternal(const void *in, size_t in_size);
00079 void SwitchToRawDeflateFormat();
00080
00081 z_stream *zlib_;
00082 StreamFormat format_;
00083 bool finished_;
00084 bool error_;
00085
00086 DISALLOW_COPY_AND_ASSIGN(GzipInflater);
00087 };
00088
00089 }
00090
00091 #endif ///< NET_INSTAWEB_UTIL_PUBLIC_GZIP_INFLATER_H_