Disk ARchive  2.5.7
Full featured and portable backup and archiving tool
cat_directory.hpp
Go to the documentation of this file.
1 /*********************************************************************/
2 // dar - disk archive - a backup/restoration program
3 // Copyright (C) 2002-2052 Denis Corbin
4 //
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 //
19 // to contact the author : http://dar.linux.free.fr/email.html
20 /*********************************************************************/
21 
25 
26 #ifndef CAT_DIRECTORY_HPP
27 #define CAT_DIRECTORY_HPP
28 
29 #include "../my_config.h"
30 
31 extern "C"
32 {
33 } // end extern "C"
34 
35 #ifdef LIBDAR_FAST_DIR
36 #include <map>
37 #endif
38 
39 #include <list>
40 #include "cat_inode.hpp"
41 #include "cat_tools.hpp"
42 
43 namespace libdar
44 {
45  class cat_eod;
46 
49 
51  class cat_directory : public cat_inode
52  {
53  public :
54  cat_directory(const infinint & xuid,
55  const infinint & xgid,
56  U_16 xperm,
57  const datetime & last_access,
58  const datetime & last_modif,
59  const datetime & last_change,
60  const std::string & xname,
61  const infinint & device);
62  cat_directory(const cat_directory &ref); // only the inode part is build, no children is duplicated (empty dir)
63  const cat_directory & operator = (const cat_directory & ref); // set the inode part *only* no subdirectories/subfiles are copies or removed.
65  const smart_pointer<pile_descriptor> & pdesc,
66  const archive_version & reading_ver,
67  saved_status saved,
68  entree_stats & stats,
69  std::map <infinint, cat_etoile *> & corres,
70  compression default_algo,
71  bool lax,
72  bool only_detruit, // objects of other class than detruit and cat_directory are not built in memory
73  bool small);
74  ~cat_directory() throw(Ebug); // detruit aussi tous les fils et se supprime de son 'parent'
75 
77  bool operator == (const cat_entree & ref) const;
78 
79  void add_children(cat_nomme *r); // when r is a cat_directory, 'parent' is set to 'this'
80  bool has_children() const { return !ordered_fils.empty(); };
81  void reset_read_children() const;
82  void end_read() const;
83  bool read_children(const cat_nomme * &r) const; // read the direct children of the cat_directory, returns false if no more is available
84  // remove all entry not yet read by read_children
85  void tail_to_read_children();
86 
87 
94  void remove(const std::string & name);
95 
96  cat_directory * get_parent() const { return parent; };
97  bool search_children(const std::string &name, const cat_nomme *&ref) const;
98  bool callback_for_children_of(user_interaction & dialog, const std::string & sdir, bool isolated = false) const;
99 
100  // using is_more_recent_than() from cat_inode class
101  // using method has_changed_since() from cat_inode class
102  unsigned char signature() const { return mk_signature('d', get_saved_status()); };
103 
105  bool get_recursive_has_changed() const { return recursive_has_changed; };
106 
108  void recursive_has_changed_update() const;
109 
111  infinint get_tree_size() const;
112 
114  infinint get_tree_ea_num() const;
115 
118 
119  // for each mirage found (hard link implementation) in the cat_directory tree, add its etiquette to the returned
120  // list with the number of reference that has been found in the tree. (map[etiquette] = number of occurence)
121  // from outside of class cat_directory, the given argument is expected to be an empty map.
122  void get_etiquettes_found_in_tree(std::map<infinint, infinint> & already_found) const;
123 
125  bool is_empty() const { return ordered_fils.empty(); };
126 
129 
132 
135 
136  cat_entree *clone() const { return new (get_pool()) cat_directory(*this); };
137 
138  const infinint & get_size() const { recursive_update_sizes(); return x_size; };
139  const infinint & get_storage_size() const { recursive_update_sizes(); return x_storage_size; };
140 
141  void recursively_set_to_unsaved_data_and_FSA();
142 
145 
146  protected:
147  void inherited_dump(const pile_descriptor & pdesc, bool small) const;
148 
149  private:
150  static const cat_eod fin;
151 
152  infinint x_size;
153  infinint x_storage_size;
154  bool updated_sizes;
155  cat_directory *parent;
156 #ifdef LIBDAR_FAST_DIR
157  std::map<std::string, cat_nomme *> fils; // used for fast lookup
158 #endif
159  std::list<cat_nomme *> ordered_fils;
160  std::list<cat_nomme *>::iterator it; //< next to entry to be returned by read_children
161  bool recursive_has_changed;
162 
163  void clear();
164  void recursive_update_sizes() const;
165  void recursive_flag_size_to_update() const;
166  };
167 
169 
170 } // end of namespace
171 
172 #endif
cat_entree * clone() const
a way to copy the exact type of an object even if pointed to by a parent class pointer ...
memory_pool * get_pool() const
Definition: on_pool.hpp:144
holds the statistics contents of a catalogue
Definition: cat_entree.hpp:61
the End of Directory entry class
Definition: cat_eod.hpp:45
infinint get_tree_ea_num() const
get the number of entry having some EA set in the cat_directory tree (recursive call) ...
This is a pure virtual class that is used by libdar when interaction with the user is required...
void set_all_mirage_s_inode_wrote_field_to(bool val)
recursively set all mirage inode_wrote flag
infinint get_tree_size() const
get then number of "cat_nomme" entry contained in this cat_directory and subdirectories (recursive ca...
void recursive_has_changed_update() const
ask recursive update for the recursive_has_changed field
unsigned char signature() const
inherited class signature
the cat_directory inode class
the base class for all entry that have a name
Definition: cat_nomme.hpp:44
bool operator==(const cat_entree &ref) const
attention this compares only the directories themselves, not the list of their children ...
void remove_all_mirages_and_reduce_dirs()
recursively remove all mirage entries
void change_location(const smart_pointer< pile_descriptor > &pdesc)
overwrite virtual method of cat_entree to propagate the action to all entries of the directory tree ...
exception used to signal a bug. A bug is triggered when reaching some code that should never be reach...
Definition: erreurs.hpp:137
compression
the different compression algorithm available
Definition: compressor.hpp:43
the root class for all cat_inode
Definition: cat_inode.hpp:54
base object for all inode types, managed EA and FSA, dates, permissions, ownership, ...
the arbitrary large positive integer class
void set_all_mirage_s_inode_dumped_field_to(bool val)
set the value of inode_dumped for all mirage (recusively)
bool get_recursive_has_changed() const
detemine whether some data has changed since archive of reference in this cat_directory or subdirecto...
infinint get_tree_mirage_num() const
get the number of entry that are hard linked inode (aka mirage in dar implementation) (recursive call...
the root class from all other inherite for any entry in the catalogue
Definition: cat_entree.hpp:85
bool is_empty() const
whether this cat_directory is empty or not
set of routines used by catalogue related classes
void inherited_dump(const pile_descriptor &pdesc, bool small) const
inherited class may overload this method but shall first call the parent&#39;s inherited_dump() in the ov...
libdar namespace encapsulate all libdar symbols
Definition: archive.hpp:47