jigdo API
Last update by Admin on 2010-05-23
zstream-gz.hh
Go to the documentation of this file.00001 /* $Id: zstream-gz.hh,v 1.5 2005/04/09 23:09:52 atterer Exp $ -*- C++ -*- 00002 __ _ 00003 |_) /| Copyright (C) 2004-2005 | richard@ 00004 | \/¯| Richard Atterer | atterer.net 00005 ¯ '` ¯ 00006 This program is free software; you can redistribute it and/or modify 00007 it under the terms of the GNU General Public License, version 2. See 00008 the file COPYING for details. 00009 00010 */ 00016 #ifndef ZSTREAM_GZ_HH 00017 #define ZSTREAM_GZ_HH 00018 00019 #include <config.h> 00020 00021 #include <zlib.h> 00022 00023 #include <log.hh> 00024 #include <zstream.hh> 00025 //______________________________________________________________________ 00026 00027 struct ZerrorGz : public Zerror { 00028 ZerrorGz(int s, const string& m) : Zerror(s, m) { } 00029 int status; 00030 }; 00031 //______________________________________________________________________ 00032 00033 class ZobstreamGz : public Zobstream { 00034 public: 00035 inline ZobstreamGz(bostream& s, unsigned chunkLimit, 00036 int level = Z_DEFAULT_COMPRESSION, int windowBits = 15, 00037 int memLevel = 8, unsigned todoBufSz = 256U, 00038 MD5Sum* md = 0); 00039 ~ZobstreamGz() { Assert(memReleased); } 00040 00048 void open(bostream& s, unsigned chunkLimit, int level =Z_DEFAULT_COMPRESSION, 00049 int windowBits = 15, int memLevel = 8, unsigned todoBufSz = 256U); 00050 00051 protected: 00052 virtual unsigned partId(); 00053 virtual void deflateEnd(); 00054 virtual void deflateReset(); 00055 virtual unsigned totalOut() const { return z.total_out; } 00056 virtual unsigned totalIn() const { return z.total_in; } 00057 virtual unsigned availOut() const { return z.avail_out; } 00058 virtual unsigned availIn() const { return z.avail_in; } 00059 virtual byte* nextOut() const { return z.next_out; } 00060 virtual byte* nextIn() const { return z.next_in; } 00061 virtual void setTotalOut(unsigned n) { z.total_out = n; } 00062 virtual void setTotalIn(unsigned n) { z.total_in = n; } 00063 virtual void setAvailOut(unsigned n) { z.avail_out = n; } 00064 virtual void setAvailIn(unsigned n) { z.avail_in = n; } 00065 virtual void setNextOut(byte* n) { z.next_out = n; } 00066 virtual void setNextIn(byte* n) { z.next_in = n; } 00067 virtual void zip2(byte* start, unsigned len, bool finish = false); 00068 00069 private: 00070 // Throw a Zerror exception, or bad_alloc() for status==Z_MEM_ERROR 00071 // inline void throwZerror(int status, const char* zmsg); 00072 00073 z_stream z; 00074 // To keep track in the dtor whether deflateEnd() has been called 00075 bool memReleased; 00076 }; 00077 //______________________________________________________________________ 00078 00079 class ZibstreamGz : public Zibstream::Impl { 00080 public: 00081 00082 class ZibstreamGzError : public Zerror { 00083 public: 00084 ZibstreamGzError(int s, const string& m) : Zerror(s, m) { } 00085 }; 00086 00087 ZibstreamGz() : status(0), memReleased(true) { } 00088 ~ZibstreamGz() { Assert(memReleased); } 00089 00090 virtual unsigned totalOut() const { return z.total_out; } 00091 virtual unsigned totalIn() const { return z.total_in; } 00092 virtual unsigned availOut() const { return z.avail_out; } 00093 virtual unsigned availIn() const { return z.avail_in; } 00094 virtual byte* nextOut() const { return z.next_out; } 00095 virtual byte* nextIn() const { return z.next_in; } 00096 virtual void setTotalOut(unsigned n) { z.total_out = n; } 00097 virtual void setTotalIn(unsigned n) { z.total_in = n; } 00098 virtual void setAvailIn(unsigned n) { z.avail_in = n; } 00099 virtual void setNextIn(byte* n) { z.next_in = n; } 00100 00101 virtual void init() { 00102 //memset(&z, 0, sizeof(z)); 00103 z.zalloc = (alloc_func)0; 00104 z.zfree = (free_func)0; 00105 z.opaque = 0; 00106 status = inflateInit(&z); 00107 if (ok()) memReleased = false; 00108 } 00109 virtual void end() { status = inflateEnd(&z); memReleased = true; } 00110 virtual void reset() { status = inflateReset(&z); } 00111 00112 virtual void inflate(byte** nextOut, unsigned* availOut) { 00113 z.next_out = *nextOut; z.avail_out = *availOut; 00114 status = ::inflate(&z, Z_NO_FLUSH); 00115 *nextOut = z.next_out; *availOut = z.avail_out; 00116 } 00117 virtual bool streamEnd() const { return status == Z_STREAM_END; } 00118 virtual bool ok() const { return status == Z_OK; } 00119 00120 virtual void throwError() const { throw ZibstreamGzError(status, z.msg); } 00121 private: 00122 int status; 00123 z_stream z; 00124 // To keep track in the dtor whether deflateEnd() has been called 00125 bool memReleased; 00126 }; 00127 //====================================================================== 00128 00129 ZobstreamGz::ZobstreamGz(bostream& s, unsigned chunkLimit, int level, 00130 int windowBits, int memLevel, unsigned todoBufSz, 00131 MD5Sum* md) : Zobstream(md), memReleased(true) { 00132 z.zalloc = (alloc_func)0; 00133 z.zfree = (free_func)0; 00134 z.opaque = 0; 00135 open(s, chunkLimit, level, windowBits, memLevel, todoBufSz); 00136 } 00137 00138 #endif
Generated on Tue Sep 23 14:27:42 2008 for jigdo by
