Disk ARchive  2.6.0
Full featured and portable backup and archiving tool
cat_file.hpp
Go to the documentation of this file.
1 /*********************************************************************/
2 // dar - disk archive - a backup/restoration program
3 // Copyright (C) 2002-2018 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_FILE_HPP
27 #define CAT_FILE_HPP
28 
29 #include "../my_config.h"
30 
31 extern "C"
32 {
33 } // end extern "C"
34 
35 #include "cat_inode.hpp"
36 #include "memory_file.hpp"
37 #include "cat_delta_signature.hpp"
38 
39 namespace libdar
40 {
41 
44 
45 
47 
48  class cat_file : public cat_inode
49  {
50  public :
51 
54  {
59  };
60 
61  static constexpr U_8 FILE_DATA_WITH_HOLE = 0x01;
62  static constexpr U_8 FILE_DATA_IS_DIRTY = 0x02;
63  static constexpr U_8 FILE_DATA_HAS_DELTA_SIG = 0x04;
64 
65  cat_file(const infinint & xuid,
66  const infinint & xgid,
67  U_16 xperm,
68  const datetime & last_access,
69  const datetime & last_modif,
70  const datetime & last_change,
71  const std::string & src,
72  const path & che,
73  const infinint & taille,
74  const infinint & fs_device,
75  bool x_furtive_read_mode);
76  cat_file(const std::shared_ptr<user_interaction> & dialog,
77  const smart_pointer<pile_descriptor> & pdesc,
78  const archive_version & reading_ver,
80  compression default_algo,
81  bool small);
82  cat_file(const cat_file & ref);
83  cat_file(cat_file && ref) = delete;
84  cat_file & operator = (const cat_file & ref) = delete;
85  cat_file & operator = (cat_file && ref) = delete;
86  ~cat_file() { detruit(); };
87 
88  virtual bool has_changed_since(const cat_inode & ref,
89  const infinint & hourshift,
90  comparison_fields what_to_check) const override;
91  infinint get_size() const { return *size; };
92  void change_size(const infinint & s) const { *size = s; };
93  infinint get_storage_size() const { return *storage_size; };
94  void set_storage_size(const infinint & s) { *storage_size = s; };
95 
97  bool can_get_data() const { return get_saved_status() == saved_status::saved || get_saved_status() == saved_status::delta || status == from_path; };
98 
100 
112  virtual generic_file *get_data(get_data_mode mode,
114  generic_file *delta_ref,
115  const crc **checksum = nullptr) const;
116  void clean_data(); // partially free memory (but get_data() becomes disabled)
117  void set_offset(const infinint & r);
118  const infinint & get_offset() const;
119  virtual unsigned char signature() const override { return 'f'; };
120  virtual std::string get_description() const override { return "file"; };
121 
122  void set_crc(const crc &c);
123  bool get_crc(const crc * & c) const;
124  bool has_crc() const { return check != nullptr; };
125  bool get_crc_size(infinint & val) const;
126  void drop_crc() { if(check != nullptr) { delete check; check = nullptr; } };
127 
128  // whether the plain file has to detect sparse file
129  void set_sparse_file_detection_read(bool val) { if(status == from_cat) throw SRC_BUG; if(val) file_data_status_read |= FILE_DATA_WITH_HOLE; else file_data_status_read &= ~FILE_DATA_WITH_HOLE; };
130 
131  void set_sparse_file_detection_write(bool val) { if(val) file_data_status_write |= FILE_DATA_WITH_HOLE; else file_data_status_write &= ~FILE_DATA_WITH_HOLE; };
132 
133  // whether the plain file is stored with a sparse_file datastructure in the archive
134  bool get_sparse_file_detection_read() const { return (file_data_status_read & FILE_DATA_WITH_HOLE) != 0; };
135  bool get_sparse_file_detection_write() const { return (file_data_status_write & FILE_DATA_WITH_HOLE) != 0; };
136 
137  virtual cat_entree *clone() const override { return new (std::nothrow) cat_file(*this); };
138 
139  compression get_compression_algo_read() const { return algo_read; };
140 
141  compression get_compression_algo_write() const { return algo_write; };
142 
143  // object migration methods (merging)
144  void change_compression_algo_write(compression x) { algo_write = x; };
145 
146  // dirtiness
147 
148  bool is_dirty() const { return dirty; };
149  void set_dirty(bool value) { dirty = value; };
150 
151 
153  bool has_delta_signature_structure() const { return delta_sig != nullptr; };
154 
156  bool has_delta_signature_available() const { return delta_sig != nullptr && delta_sig->can_obtain_sig(); };
157 
158 
160  bool has_patch_base_crc() const { return delta_sig != nullptr && delta_sig->has_patch_base_crc(); };
161 
163  bool get_patch_base_crc(const crc * & c) const;
164 
166  void set_patch_base_crc(const crc & c);
167 
168 
169 
171  bool has_patch_result_crc() const { return delta_sig != nullptr && delta_sig->has_patch_result_crc(); };
172 
174  bool get_patch_result_crc(const crc * & c) const;
175 
177  void set_patch_result_crc(const crc & c);
178 
181 
184 
186 
190  void dump_delta_signature(memory_file & sig, generic_file & where, bool small) const;
191 
193  void dump_delta_signature(generic_file & where, bool small) const;
194 
196 
200  void read_delta_signature(memory_file * & delta_sig) const;
201 
203  bool has_same_delta_signature(const cat_file & ref) const;
204 
207 
210 
212  virtual bool operator == (const cat_entree & ref) const override { return true; };
213 
215  bool same_data_as(const cat_file & other, bool check_data, const infinint & hourshift);
216 
217  protected:
218  virtual void sub_compare(const cat_inode & other, bool isolated_mode) const override;
219  virtual void inherited_dump(const pile_descriptor & pdesc, bool small) const override;
220  virtual void post_constructor(const pile_descriptor & pdesc) override;
221 
222  enum { empty, from_path, from_cat } status;
223 
224  private:
225  std::string chemin;
230  bool dirty;
237 
238  void sub_compare_internal(const cat_inode & other,
239  bool can_read_my_data,
240  bool can_read_other_data,
241  const infinint & hourshift) const;
242  void detruit();
243 
244  };
245 
247 
248 } // end of namespace
249 
250 #endif
virtual void inherited_dump(const pile_descriptor &pdesc, bool small) const override
true if object has been created by sequential reading of an archive
std::string chemin
path to the data (when read from filesystem)
Definition: cat_file.hpp:225
comparison_fields
how to consider file change during comparison and incremental backup
Definition: archive_aux.hpp:52
static constexpr U_8 FILE_DATA_IS_DIRTY
data modified while being saved
Definition: cat_file.hpp:62
virtual generic_file * get_data(get_data_mode mode, memory_file *delta_sig, generic_file *delta_ref, const crc **checksum=nullptr) const
returns a newly allocated object in read_only mode
bool has_delta_signature_structure() const
return whether the object has an associated delta signature structure
Definition: cat_file.hpp:153
provide access to full data (uncompressed, uses skip() to restore holes)
Definition: cat_file.hpp:57
infinint * storage_size
how much data used in archive (after compression)
Definition: cat_file.hpp:228
void will_have_delta_signature_available()
prepare the object to receive a delta signature structure including delta signature ...
saved_status
data saved status for an entry
Definition: cat_status.hpp:44
bool has_patch_result_crc() const
returns whether the object has a CRC corresponding to data (for s_saved, s_delta, and when delta sign...
Definition: cat_file.hpp:171
virtual bool operator==(const cat_entree &ref) const override
not used
Definition: cat_file.hpp:212
class used to manage binary delta signature in catalogue and archive
void will_have_delta_signature_structure()
prepare the object to receive a delta signature structure
static constexpr U_8 FILE_DATA_WITH_HOLE
file&#39;s data contains hole datastructure
Definition: cat_file.hpp:61
infinint * offset
start location of the data in &#39;loc&#39;
Definition: cat_file.hpp:226
bool furtive_read_mode
used only when status equals "from_path"
Definition: cat_file.hpp:233
char file_data_status_write
defines the datastructure to apply when writing down the data
Definition: cat_file.hpp:235
void dump_delta_signature(memory_file &sig, generic_file &where, bool small) const
write down to archive the given delta signature
stores time information
Definition: datetime.hpp:58
bool get_patch_result_crc(const crc *&c) const
returns the CRC the file will have once restored or patched (for s_saved, s_delta, and when delta signature is present)
void set_patch_base_crc(const crc &c)
set the reference CRC of the file to base the patch on, for s_detla objects
void clear_delta_signature_structure()
remove any information about delta signature
generic_file stored in memory
Definition: memory_file.hpp:40
void set_patch_result_crc(const crc &c)
set the CRC the file will have once restored or patched (for s_saved, s_delta, and when delta signatu...
virtual std::string get_description() const override
inherited class designation
Definition: cat_file.hpp:120
inode is saved in the archive
provide access to compressed data
Definition: cat_file.hpp:55
virtual void post_constructor(const pile_descriptor &pdesc) override
let inherited classes build object&#39;s data after CRC has been read from file in small read mode ...
provide access to plain data, no skip to restore holes, provide instead zeroed bytes ...
Definition: cat_file.hpp:58
the plain file class
Definition: cat_file.hpp:48
Memory_file is a generic_file class that only uses virtual memory.
the cat_delta_signature file class
infinint * size
size of the data (uncompressed)
Definition: cat_file.hpp:227
bool has_patch_base_crc() const
returns whether the object has a base patch CRC (s_delta status objects)
Definition: cat_file.hpp:160
crc * check
crc computed on the data
Definition: cat_file.hpp:229
bool has_delta_signature_available() const
return whether the object has an associated delta signature structure including a delta signature dat...
Definition: cat_file.hpp:156
bool can_get_data() const
check whether the object will be able to provide a object using get_data() method ...
Definition: cat_file.hpp:97
cat_delta_signature * delta_sig
delta signature and associated CRC
Definition: cat_file.hpp:236
bool has_same_delta_signature(const cat_file &ref) const
return true if ref and "this" have both equal delta signatures
virtual unsigned char signature() const override
inherited class signature
Definition: cat_file.hpp:119
saved_status get_saved_status() const
obtain the saved status of the object
Definition: cat_entree.hpp:164
compression
the different compression algorithm available
Definition: compression.hpp:45
this is the interface class from which all other data transfer classes inherit
virtual cat_entree * clone() const override
a way to copy the exact type of an object even if pointed to by a parent class pointer ...
Definition: cat_file.hpp:137
compression algo_write
which compression algorithm to use to write down (merging) the file&#39;s data
Definition: cat_file.hpp:232
static constexpr U_8 FILE_DATA_HAS_DELTA_SIG
delta signature is present
Definition: cat_file.hpp:63
bool get_patch_base_crc(const crc *&c) const
returns the CRC of the file to base the patch on, for s_delta objects
the root class for all cat_inode
Definition: cat_inode.hpp:52
base object for all inode types, managed EA and FSA, dates, permissions, ownership, ...
void clear_delta_signature_only()
remove information about delta signature also associated CRCs if status is not s_delta ...
bool get_crc(const crc *&c) const
the argument is set the an allocated crc object the owned by the "cat_file" object, its stay valid while this "cat_file" object exists and MUST NOT be deleted by the caller in any case
the arbitrary large positive integer class
inode is saved but as delta binary from the content (delta signature) of what was found in the archiv...
class archive_version manages the version of the archive format
char file_data_status_read
defines the datastructure to use when reading the data
Definition: cat_file.hpp:234
the root class from all other inherite for any entry in the catalogue
Definition: cat_entree.hpp:59
bool same_data_as(const cat_file &other, bool check_data, const infinint &hourshift)
compare just data not inode information EA nor FSA
pure virtual class defining interface of a CRC object
Definition: crc.hpp:46
provide access to uncompressed data but sparse_file datastructure
Definition: cat_file.hpp:56
compression algo_read
which compression algorithm to use to read the file&#39;s data
Definition: cat_file.hpp:231
bool get_crc_size(infinint &val) const
returns true if crc is know and puts its width in argument
get_data_mode
how to get data from archive
Definition: cat_file.hpp:53
libdar namespace encapsulate all libdar symbols
Definition: archive.hpp:46
bool dirty
true when a file has been modified at the time it was saved
Definition: cat_file.hpp:230
void read_delta_signature(memory_file *&delta_sig) const
fetch the delta signature from the archive
the class path is here to manipulate paths in the Unix notation: using&#39;/&#39;
Definition: path.hpp:49