data_tree.hpp
Go to the documentation of this file.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