Disk ARchive 2.8.3
Full featured and portable backup and archiving tool
Loading...
Searching...
No Matches
cat_delta_signature.hpp
Go to the documentation of this file.
1/*********************************************************************/
2// dar - disk archive - a backup/restoration program
3// Copyright (C) 2002-2026 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18//
19// to contact the author, see the AUTHOR file
20/*********************************************************************/
21
25
26#ifndef CAT_DELTA_SIGNATURE_HPP
27#define CAT_DELTA_SIGNATURE_HPP
28
29#include "../my_config.h"
30
31extern "C"
32{
33} // end extern "C"
34
35#include "memory_file.hpp"
36#include "crc.hpp"
37#include "proto_compressor.hpp"
38#include "archive_version.hpp"
39
40#include <memory>
41
42namespace libdar
43{
44
47
48 // Datastructure in archive (DATA+METADATA)
49 //
50 // SEQUENTIAL MODE - in the core of the archive
51 // +------+------+-----------+--------------+----------+--------+
52 // | base | sig | sig block |sig data | data CRC | result |
53 // | CRC | size | len (if |(if size > 0) | if | CRC |
54 // | (*) | | size > 0) | | size > 0 | |
55 // +------+------+-----------+--------------+----------+--------+
56 //
57 // DIRECT MODE - in catalogue at end of archive (METADATA)
58 // +------+------+---------------+--------+
59 // | base | sig | sig offset | result |
60 // | CRC | size | (if size > 0) | CRC |
61 // | (*) | | | |
62 // +------+------+---------------+--------+
63 //
64 // DIRECT MODE - in the core of the archive (DATA)
65 // +-----------+---------------+----------+
66 // | sig block | sig data | data CRC |
67 // | len (if | (if size > 0) | if |
68 // | size > 0) | | size > 0 |
69 // +-----------+---------------+----------+
70 //
71 // Note that the SEQUENTIAL MODE is wrapping the DIRECT MODE structure in the core
72 // of the archive, the core of the archive contains either the sequential mode structure
73 // or the direct mode. While in the catalogue, the "sig offset" fields points to the
74 // offset of the direct mode in the core (possibly wrapped in the structure forming the
75 // one of the sequential mode).
76 //
77 // (*) base_CRC has been moved to cat_file structure since format 11,2
78 // in order to read this field before the delta patch in sequential read mode
79 //
80 // this structure is used for all cat_file inode that have
81 // either a delta signature or contain a delta patch (s_delta status)
82 // base_crc is used to check we apply the patch on the good file before proceeding
83 // result_crc is used to store the crc of the file the signature has been computed on
84 // result_crc is also used once a patch has been applied to verify the correctness of the patch result
85
86
88
100 {
101 public:
103
109 cat_delta_signature(generic_file *f, proto_compressor* c);
110
112 cat_delta_signature() { init(); };
113
115 cat_delta_signature(const cat_delta_signature & ref) { init(); copy_from(ref); };
116
118 cat_delta_signature(cat_delta_signature && ref) noexcept { init(); move_from(std::move(ref)); };
119
121 cat_delta_signature & operator = (const cat_delta_signature & ref) { clear(); copy_from(ref); return *this; };
122
124 cat_delta_signature & operator = (cat_delta_signature && ref) noexcept { move_from(std::move(ref)); return *this; };
125
127 ~cat_delta_signature() { destroy(); };
128
130
132 bool is_pending_read() const { return pending_read; };
133
137 void read(bool sequential_read, const archive_version & ver);
138
140 bool can_obtain_sig() const { return !delta_sig_size.is_zero(); };
141
143
147 std::shared_ptr<memory_file> obtain_sig(const archive_version & ver) const;
148
150 U_I obtain_sig_block_size() const { return sig_block_len; };
151
153
156 void drop_sig() const { sig.reset(); };
157
159
161
163
166
168
171 void set_sig(const std::shared_ptr<memory_file> & ptr, U_I sig_block_size);
172
174 void set_sig() { delta_sig_size = 0; delta_sig_offset = 0; sig_block_len = 0; sig.reset(); };
175
177
180 void dump_data(generic_file & f, bool sequential_mode, const archive_version & ver) const;
181
184
185
187
189 bool has_patch_base_crc() const { return patch_base_check != nullptr; };
190
192 bool get_patch_base_crc(const crc * & c) const;
193
195 void set_patch_base_crc(const crc & c);
196
198 bool has_patch_result_crc() const { return patch_result_check != nullptr; };
199
201 bool get_patch_result_crc(const crc * & c) const;
202
204 void set_patch_result_crc(const crc & c);
205
207 void clear() { destroy(); init(); };
208
209 private:
214 mutable std::shared_ptr<memory_file>sig;
217 proto_compressor *zip;
218 mutable U_I sig_block_len;
220
221 void init() noexcept;
222 void copy_from(const cat_delta_signature & ref);
223 void move_from(cat_delta_signature && ref) noexcept;
224 void destroy() noexcept;
225
226 // reads sig_block_len + sig data
227 void fetch_data(const archive_version & ver) const;
228 };
229
231
232} // end of namespace
233
234#endif
class archive_version that rules which archive format to follow
class archive_version manages the version of the archive format
bool pending_read
when the object has been created for read but data not yet read from archive
std::shared_ptr< memory_file > obtain_sig(const archive_version &ver) const
provide a memory_file object which the caller has the duty to destroy after use
infinint delta_sig_size
size of the data to setup "sig" (set to zero when reading in sequential mode, sig is then setup on-fl...
void dump_metadata(generic_file &f) const
write down the delta_signature metadata for catalogue
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,...
cat_delta_signature(const cat_delta_signature &ref)
copy constructor
bool has_patch_base_crc() const
returns whether the object has a base patch CRC (s_delta status objects)
void drop_sig() const
drop signature but keep metadata available
cat_delta_signature()
constructor to write an object to filesytem/backup (using dump_* methods later on)
void read(bool sequential_read, const archive_version &ver)
void set_sig()
variante used when the delta_signature object will only contain CRCs (no delta signature)
bool get_patch_base_crc(const crc *&c) const
returns the CRC of the file to base the patch on, for s_delta objects
bool can_obtain_sig() const
the cat_delta_signature structure can only hold CRC without delta_signature, this call gives the situ...
void will_have_signature()
give the object where to fetch from the delta signature, object must exist up to the next call to dum...
U_I sig_block_len
block length used within delta signature
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...
cat_delta_signature(cat_delta_signature &&ref) noexcept
move constructor
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 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...
void set_sig(const std::shared_ptr< memory_file > &ptr, U_I sig_block_size)
the object pointed to by ptr must stay available when calling dump_data()/dump_metadata() later on
void dump_data(generic_file &f, bool sequential_mode, const archive_version &ver) const
write down the data eventually with sequential read mark followed by delta sig metadata
crc * patch_base_check
associated CRC for the file this signature has been computed on, moved to cat_file since format 11....
bool is_pending_read() const
tells whether the read() call has been invoked
U_I obtain_sig_block_size() const
provide the block size used for delta signature
std::shared_ptr< memory_file > sig
the signature data, if set nullptr it will be fetched from f in direct access mode only
proto_compressor * zip
needed to disable compression when reading delta signature data from an archive
generic_file * src
where to read data from
cat_delta_signature(generic_file *f, proto_compressor *c)
constructor to read an object (using read() later on) from filesystem/backup
cat_delta_signature & operator=(const cat_delta_signature &ref)
assignement operator
pure virtual class defining interface of a CRC object
this is the interface class from which all other data transfer classes inherit
the arbitrary large positive integer class
include macro defined by the configure script and some specific additional ones
libdar namespace encapsulate all libdar symbols
class crc definition, used to handle Cyclic Redundancy Checks
Memory_file is a generic_file class that only uses virtual memory.
abstracted ancestor class for compressor and parallel_compressor classes