00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00028
00029
00030 #ifndef DATA_TREE_HPP
00031 #define DATA_TREE_HPP
00032
00033 #include "../my_config.h"
00034
00035 #include <map>
00036 #include <string>
00037 #include <list>
00038 #include "infinint.hpp"
00039 #include "generic_file.hpp"
00040 #include "infinint.hpp"
00041 #include "catalogue.hpp"
00042 #include "special_alloc.hpp"
00043 #include "user_interaction.hpp"
00044
00045 namespace libdar
00046 {
00047 typedef U_16 archive_num;
00048 #define ARCHIVE_NUM_MAX 65534
00049
00051
00055 class data_tree
00056 {
00057 public:
00058
00059 data_tree(const std::string &name);
00060 data_tree(generic_file &f);
00061 virtual ~data_tree() {};
00062
00063 virtual void dump(generic_file & f) const;
00064 std::string get_name() const { return filename; };
00065
00067 bool get_data(archive_num & archive, const infinint & date) const;
00068
00070 bool get_EA(archive_num & archive, const infinint & date) const;
00071
00073 bool read_data(archive_num num, infinint & val) const;
00074
00076 bool read_EA(archive_num num, infinint & val) const;
00077
00078 void set_data(const archive_num & archive, const infinint & date) { last_mod[archive] = date; };
00079 void set_EA(const archive_num & archive, const infinint & date) { last_change[archive] = date; };
00080
00082 virtual bool remove_all_from(const archive_num & archive);
00083
00085 void listing(user_interaction & dialog) const;
00086 virtual void apply_permutation(archive_num src, archive_num dst);
00087
00089 virtual void skip_out(archive_num num);
00090 virtual void compute_most_recent_stats(std::vector<infinint> & data, std::vector<infinint> & ea,
00091 std::vector<infinint> & total_data, std::vector<infinint> & total_ea) const;
00092
00093 virtual char obj_signature() const { return signature(); };
00094 static char signature() { return 't'; };
00095
00096 #ifdef LIBDAR_SPECIAL_ALLOC
00097 void *operator new(size_t taille) { return special_alloc_new(taille); };
00098 void operator delete(void *ptr) { special_alloc_delete(ptr); };
00099 #endif
00100 private:
00101 std::string filename;
00102 std::map<archive_num, infinint> last_mod;
00103 std::map<archive_num, infinint> last_change;
00104 };
00105
00107
00109 class data_dir : public data_tree
00110 {
00111 public:
00112 data_dir(const std::string &name);
00113 data_dir(generic_file &f);
00114 data_dir(const data_dir & ref);
00115 data_dir(const data_tree & ref);
00116 ~data_dir();
00117
00118 void dump(generic_file & f) const;
00119
00120 void add(const inode *entry, const archive_num & archive);
00121 const data_tree *read_child(const std::string & name) const;
00122 void read_all_children(std::vector<std::string> & fils) const;
00123
00124 bool remove_all_from(const archive_num & archive);
00125
00127 void show(user_interaction & dialog, archive_num num, std::string marge = "") const;
00128 void apply_permutation(archive_num src, archive_num dst);
00129 void skip_out(archive_num num);
00130 void compute_most_recent_stats(std::vector<infinint> & data, std::vector<infinint> & ea,
00131 std::vector<infinint> & total_data, std::vector<infinint> & total_ea) const;
00132
00133 char obj_signature() const { return signature(); };
00134 static char signature() { return 'd'; };
00135
00136 #ifdef LIBDAR_SPECIAL_ALLOC
00137 void *operator new(size_t taille) { return special_alloc_new(taille); };
00138 void operator delete(void *ptr) { special_alloc_delete(ptr); };
00139 #endif
00140
00141 private:
00142 std::list<data_tree *> rejetons;
00143
00144 void add_child(data_tree *fils);
00145 void remove_child(const std::string & name);
00146 };
00147
00148 extern data_dir *data_tree_read(generic_file & f);
00149 extern bool data_tree_find(path chemin, const data_dir & racine, const data_tree *& ptr);
00150 extern void data_tree_update_with(const directory *dir, archive_num archive, data_dir *racine);
00151 extern archive_num data_tree_permutation(archive_num src, archive_num dst, archive_num x);
00152
00153 }
00154
00155 #endif