00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00039
00040
00042
00043
00045 #include "infinint.hpp"
00047
00048
00049
00050 #ifndef GENERIC_FILE_HPP
00051 #define GENERIC_FILE_HPP
00052
00053
00054 #include "../my_config.h"
00055
00056 extern "C"
00057 {
00058 #if HAVE_UNISTD_H
00059 #include <unistd.h>
00060 #endif
00061 }
00062
00063 #include "path.hpp"
00064 #include "integers.hpp"
00065 #include "user_interaction.hpp"
00066 #include "thread_cancellation.hpp"
00067
00068 #include <string>
00069
00070 namespace libdar
00071 {
00072
00075
00076 const int CRC_SIZE = 2;
00077 typedef char crc[CRC_SIZE];
00078 extern void clear(crc & value);
00079 extern void copy_crc(crc & dst, const crc & src);
00080 extern bool same_crc(const crc &a, const crc &b);
00081 extern std::string crc2str(const crc &a);
00082
00084 enum gf_mode
00085 {
00086 gf_read_only,
00087 gf_write_only,
00088 gf_read_write
00089 };
00090
00091
00092 extern gf_mode generic_file_get_mode(S_I fd);
00093 extern const char * generic_file_get_name(gf_mode mode);
00094
00096
00108 class generic_file
00109 {
00110 public :
00112 generic_file(user_interaction & dialog, gf_mode m) { rw = m; clear(value); crc_offset = 0; enable_crc(false); gf_ui = dialog.clone(); };
00114 generic_file(const generic_file &ref) { copy_from(ref); };
00116 generic_file & operator = (const generic_file & ref) { detruire(); copy_from(ref); return *this; };
00118 virtual ~generic_file() { detruire(); };
00119
00121 gf_mode get_mode() const { return rw; };
00122
00124 S_I read(char *a, size_t size);
00126 S_I write(char *a, size_t size);
00128 S_I write(const std::string & arg);
00130 S_I read_back(char &a);
00132 S_I read_forward(char &a) { return read(&a, 1); };
00134 virtual bool skip(const infinint & pos) = 0;
00136 virtual bool skip_to_eof() = 0;
00138 virtual bool skip_relative(S_I x) = 0;
00140 virtual infinint get_position() = 0;
00141
00143 void copy_to(generic_file &ref);
00145 void copy_to(generic_file &ref, crc & value);
00147 U_32 copy_to(generic_file &ref, U_32 size);
00149 infinint copy_to(generic_file &ref, infinint size);
00151 bool diff(generic_file & f);
00152
00154 void reset_crc();
00156 void get_crc(crc & val) { enable_crc(false); copy_crc(val, value); };
00157
00159 user_interaction & get_gf_ui() const { return *gf_ui; };
00160
00161 protected :
00162 void set_mode(gf_mode x) { rw = x; };
00163 virtual S_I inherited_read(char *a, size_t size) = 0;
00164
00165
00166
00167 virtual S_I inherited_write(char *a, size_t size) = 0;
00168
00169
00170
00171 private :
00172 gf_mode rw;
00173 crc value;
00174 S_I crc_offset;
00175 user_interaction *gf_ui;
00176 S_I (generic_file::* active_read)(char *a, size_t size);
00177 S_I (generic_file::* active_write)(char *a, size_t size);
00178
00179 void enable_crc(bool mode);
00180 void compute_crc(char *a, S_I size);
00181 S_I read_crc(char *a, size_t size);
00182 S_I write_crc(char *a, size_t size);
00183
00184 void detruire() { if(gf_ui != NULL) delete gf_ui; };
00185 void copy_from(const generic_file & ref);
00186 };
00187
00189 class fichier : public generic_file, public thread_cancellation
00190 {
00191 public :
00192 fichier(user_interaction & dialog, S_I fd);
00193 fichier(user_interaction & dialog, char *name, gf_mode m);
00194 fichier(user_interaction & dialog, const path & chemin, gf_mode m);
00195 ~fichier() { close(filedesc); };
00196
00197 infinint get_size() const;
00198
00199
00200 bool skip(const infinint & pos);
00201 bool skip_to_eof();
00202 bool skip_relative(S_I x);
00203 infinint get_position();
00204
00205 protected :
00206 S_I inherited_read(char *a, size_t size);
00207 S_I inherited_write(char *a, size_t size);
00208
00209 private :
00210 S_I filedesc;
00211
00212 void open(const char *name, gf_mode m);
00213 };
00214
00215 #define CONTEXT_INIT "init"
00216 #define CONTEXT_OP "operation"
00217 #define CONTEXT_LAST_SLICE "last_slice"
00218
00220
00229 class contextual : public generic_file
00230 {
00231 public :
00232 contextual(user_interaction & dialog, gf_mode m) : generic_file(dialog, m) {};
00233
00234 virtual void set_info_status(const std::string & s) = 0;
00235 virtual std::string get_info_status() const = 0;
00236 };
00237
00239
00240 }
00241
00242 #endif