00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00026
00027 #ifndef COMPRESSOR_HPP
00028 #define COMPRESSOR_HPP
00029
00030 #include "../my_config.h"
00031
00032 #include "infinint.hpp"
00033 #include "generic_file.hpp"
00034 #include "integers.hpp"
00035 #include "wrapperlib.hpp"
00036
00037 namespace libdar
00038 {
00039
00041
00044 enum compression
00045 {
00046 none = 'n',
00047 zip = 'p',
00048 gzip = 'z',
00049 bzip2 = 'y'
00050 };
00051
00052 extern compression char2compression(char a);
00053 extern char compression2char(compression c);
00054 extern std::string compression2string(compression c);
00055
00057 class compressor : public generic_file
00058 {
00059 public :
00060 compressor(user_interaction & dialog, compression algo, generic_file & compressed_side, U_I compression_level = 9);
00061
00062
00063 compressor(user_interaction & dialog, compression algo, generic_file *compressed_side, U_I compression_level = 9);
00064
00065
00066 ~compressor();
00067
00068 void flush_write();
00069
00070 void flush_read();
00071
00072 void clean_read();
00073 void clean_write();
00074
00075 compression get_algo() const { return current_algo; };
00076
00078
00083 void change_algo(compression new_algo, U_I new_compression_level);
00084
00085
00087
00088 void change_algo(compression new_algo)
00089 {
00090 change_algo(new_algo, current_level);
00091 };
00092
00093
00094 bool skip(const infinint & position) { flush_write(); flush_read(); clean_read(); return compressed->skip(position); };
00095 bool skip_to_eof() { flush_write(); flush_read(); clean_read(); return compressed->skip_to_eof(); };
00096 bool skip_relative(S_I x) { flush_write(); flush_read(); clean_read(); return compressed->skip_relative(x); };
00097 infinint get_position() { return compressed->get_position(); };
00098
00099 protected :
00100 S_I inherited_read(char *a, size_t size) { return (this->*read_ptr)(a, size); };
00101 S_I inherited_write(char *a, size_t size) { return (this->*write_ptr)(a, size); };
00102
00103 private :
00104 struct xfer
00105 {
00106 wrapperlib wrap;
00107 char *buffer;
00108 U_I size;
00109
00110 xfer(U_I sz, wrapperlib_mode mode);
00111 ~xfer();
00112 };
00113
00114 xfer *compr, *decompr;
00115 generic_file *compressed;
00116 bool compressed_owner;
00117 compression current_algo;
00118 U_I current_level;
00119
00120 void init(compression algo, generic_file *compressed_side, U_I compression_level);
00121 void terminate();
00122 S_I (compressor::*read_ptr) (char *a, size_t size);
00123 S_I none_read(char *a, size_t size);
00124 S_I gzip_read(char *a, size_t size);
00125
00126
00127
00128 S_I (compressor::*write_ptr) (char *a, size_t size);
00129 S_I none_write(char *a, size_t size);
00130 S_I gzip_write(char *a, size_t size);
00131
00132
00133 };
00134
00135 }
00136
00137 #endif