/usr/include/dar/compressor.hpp is in libdar-dev 2.4.2-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | /*********************************************************************/
// dar - disk archive - a backup/restoration program
// Copyright (C) 2002-2052 Denis Corbin
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// to contact the author : http://dar.linux.free.fr/email.html
/*********************************************************************/
// $Id: compressor.hpp,v 1.26 2011/04/17 13:12:29 edrusb Rel $
//
/*********************************************************************/
/// \file compressor.hpp
/// \brief compression engine implementation
/// \ingroup Private
#ifndef COMPRESSOR_HPP
#define COMPRESSOR_HPP
#include "/usr/include/dar/libdar_my_config.h"
#include "/usr/include/dar/infinint.hpp"
#include "/usr/include/dar/generic_file.hpp"
#include "/usr/include/dar/integers.hpp"
#include "/usr/include/dar/wrapperlib.hpp"
namespace libdar
{
/// the different compression algorithm available
/// values to be used as argument of libdar API calls
/// \ingroup API
enum compression
{
none = 'n', ///< no compression
gzip = 'z', ///< gzip compression
bzip2 = 'y', ///< bzip2 compression
lzo = 'l' ///< lzo compression
};
/// \ingroup Private
/// @}
extern compression char2compression(char a);
extern char compression2char(compression c);
extern std::string compression2string(compression c);
extern compression string2compression(const std::string & a); // throw Erange if an unknown string is given
/// compression class for gzip and bzip2 algorithms
class compressor : public generic_file
{
public :
compressor(compression algo, generic_file & compressed_side, U_I compression_level = 9);
// compressed_side is not owned by the object and will remains
// after the objet destruction
compressor(compression algo, generic_file *compressed_side, U_I compression_level = 9);
// compressed_side is owned by the object and will be
// deleted a destructor time
~compressor();
void flush_write(); // flush all data to compressed_side, and reset the compressor
// for that additional write can be uncompresssed starting at this point.
void flush_read(); // reset decompression engine to be able to read the next block of compressed data
// if not called, furthur read return EOF
void clean_read(); // discard any byte buffered and not yet returned by read()
void clean_write(); // discard any byte buffered and not yet wrote to compressed_side;
compression get_algo() const { return current_algo; };
/// changes compression algorithm used by the compressor
/// \param[in] new_algo defines the new algorithm to use
/// \param[in] new_compression_level defines the new compression level to use.
/// \note valid value for new_compression_level range from 0 (no compression) to
/// 9 (maximum compression).
void change_algo(compression new_algo, U_I new_compression_level);
/// changes the compression algorithm keeping the same compression level
void change_algo(compression new_algo)
{
change_algo(new_algo, current_level);
};
// inherited from generic file
bool skip(const infinint & pos) { flush_write(); flush_read(); clean_read(); return compressed->skip(pos); };
bool skip_to_eof() { flush_write(); flush_read(); clean_read(); return compressed->skip_to_eof(); };
bool skip_relative(S_I x) { flush_write(); flush_read(); clean_read(); return compressed->skip_relative(x); };
infinint get_position() { return compressed->get_position(); };
protected :
U_I inherited_read(char *a, U_I size) { return (this->*read_ptr)(a, size); };
void inherited_write(const char *a, U_I size) { (this->*write_ptr)(a, size); };
void inherited_sync_write() { flush_write(); };
void inherited_terminate() { local_terminate(); };
private :
struct xfer
{
wrapperlib wrap;
char *buffer;
U_I size;
xfer(U_I sz, wrapperlib_mode mode);
~xfer();
};
struct lzo_block_header
{
char type; //< let the possibility to extend this architecture (for now type is fixed)
infinint size; //< size of the following compressed block of data
void dump(generic_file & f);
void set_from(generic_file & f);
};
xfer *compr, *decompr; //< datastructure for bzip2 an gzip compression
char *lzo_read_buffer; //< stores clear data (uncompressed) read from the compressed generic_file
char *lzo_write_buffer; //< stores the clear data to be compressed and written to the compressed generic_file
U_I lzo_read_size; //< number of available bytes in the read buffer for lzo decompression
U_I lzo_write_size; //< number of available bytes to compress and next place where to add more data in the wite buffer
U_I lzo_read_start; //< location of the next byte to read out from the read buffer
bool lzo_write_flushed; //< whether write flushing has been done
bool lzo_read_reached_eof; //< whether reading reached end of file and the lzo engine has to be reset to uncompress further data
char *lzo_compressed; //< compressed data just read or about to be written
char *lzo_wrkmem; //< work memory for LZO library
generic_file *compressed;
bool compressed_owner;
compression current_algo;
U_I current_level;
void init(compression algo, generic_file *compressed_side, U_I compression_level);
void local_terminate();
U_I (compressor::*read_ptr) (char *a, U_I size);
U_I none_read(char *a, U_I size);
U_I gzip_read(char *a, U_I size);
// U_I zip_read(char *a, U_I size);
// U_I bzip2_read(char *a, U_I size); // using gzip_read, same code thanks to wrapperlib
U_I lzo_read(char *a, U_I size);
void (compressor::*write_ptr) (const char *a, U_I size);
void none_write(const char *a, U_I size);
void gzip_write(const char *a, U_I size);
// void zip_write(char *a, U_I size);
// void bzip2_write(char *a, U_I size); // using gzip_write, same code thanks to wrapperlib
void lzo_write(const char *a, U_I size);
void lzo_compress_buffer_and_write();
void lzo_read_and_uncompress_to_buffer();
};
/// @}
} // end of namespace
#endif
|