Disk ARchive  2.6.6
Full featured and portable backup and archiving tool
generic_rsync.hpp
Go to the documentation of this file.
1 /*********************************************************************/
2 // dar - disk archive - a backup/restoration program
3 // Copyright (C) 2002-2019 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 : http://dar.linux.free.fr/email.html
20 /*********************************************************************/
21 
25 
26 
27 #ifndef GENERIC_RSYNC_HPP
28 #define GENERIC_RSYNC_HPP
29 
30 #include "../my_config.h"
31 
32 extern "C"
33 {
34 #if HAVE_LIBRSYNC_H
35 #include <librsync.h>
36 #endif
37 }
38 
39 #include "generic_file.hpp"
40 #include "erreurs.hpp"
41 
42 namespace libdar
43 {
44 
47 
49 
50  class generic_rsync : public generic_file
51  {
52  public:
54 
61  generic_rsync(generic_file *signature_storage,
62  U_I signature_block_size,
63  generic_file *below);
64 
66 
78  generic_rsync(generic_file *base_signature,
79  generic_file *below,
80  const infinint & crc_size,
81  const crc **checksum);
82 
84 
93  generic_rsync(generic_file *current_data,
94  generic_file *delta);
95 
96 
97  generic_rsync(const generic_rsync & ref) = delete;
98  generic_rsync(generic_rsync && ref) noexcept = delete;
99  generic_rsync & operator = (const generic_rsync & ref) = delete;
100  generic_rsync & operator = (generic_rsync && ref) noexcept = delete;
101 
102  ~generic_rsync() noexcept(false);
103 
104  // inherited from generic_file
105 
106  virtual bool skippable(skippability direction, const infinint & amount) override { return false; };
107  virtual bool skip(const infinint & pos) override {if(pos != 0 || !initial) throw SRC_BUG; else return true; };
108  virtual bool skip_to_eof() override { throw SRC_BUG; };
109  virtual bool skip_relative(S_I x) override { if(x != 0) throw SRC_BUG; else return true; };
110  virtual infinint get_position() const override { return x_below->get_position(); };
111 
112  protected:
113  virtual void inherited_read_ahead(const infinint & amount) override {};
114  virtual U_I inherited_read(char *a, U_I size) override;
115  virtual void inherited_write(const char *a, U_I size) override;
116  virtual void inherited_sync_write() override {};
117  virtual void inherited_flush_read() override {};
118  virtual void inherited_terminate() override;
119 
120  private:
121  enum { sign, delta, patch } status;
122 
124  generic_file *x_input;
125  generic_file *x_output;
126  bool initial;
127  char *working_buffer;
128  U_I working_size;
129  bool patching_completed;
130  crc *data_crc;
131 
132 #if LIBRSYNC_AVAILABLE
133  rs_job_t *job;
134  rs_signature_t *sumset;
135 
137  static rs_result patch_callback(void *opaque,
138  rs_long_t pos,
139  size_t *len,
140  void **buf);
141 #endif
142 
144 
154  bool step_forward(const char *buffer_in,
155  U_I & avail_in,
156  bool shift_input,
157  char *buffer_out,
158  U_I & avail_out);
159  void free_job();
160  void send_eof();
161  };
162 
164 
165 } // end of namespace
166 
167 #endif
generic_file * x_below
underlying layer to read from / write to
generic_rsync(generic_file *signature_storage, U_I signature_block_size, generic_file *below)
constructor for "signature" operation
class generic_file is defined here as well as class fichierthe generic_file interface is widely used ...
virtual infinint get_position() const =0
get the current read/write position
virtual bool skip(const infinint &pos) override
skip at the absolute position
bool step_forward(const char *buffer_in, U_I &avail_in, bool shift_input, char *buffer_out, U_I &avail_out)
feed librsync using rs_job_iter
virtual void inherited_sync_write() override
write down any pending data
generic_file interface to librsync
virtual void inherited_flush_read() override
reset internal engine, flush caches in order to read the data at current position
virtual U_I inherited_read(char *a, U_I size) override
implementation of read() operation
virtual void inherited_terminate() override
destructor-like call, except that it is allowed to throw exceptions
contains all the excetion class thrown by libdar
virtual bool skip_relative(S_I x) override
skip relatively to the current position
virtual bool skip_to_eof() override
skip to the end of file
this is the interface class from which all other data transfer classes inherit
virtual bool skippable(skippability direction, const infinint &amount) override
whether the implementation is able to skip
virtual infinint get_position() const override
get the current read/write position
virtual void inherited_read_ahead(const infinint &amount) override
tells the object that several calls to read() will follow to probably obtain at least the given amoun...
the arbitrary large positive integer class
virtual void inherited_write(const char *a, U_I size) override
implementation of the write() operation
inode is saved but as delta binary from the content (delta signature) of what was found in the archiv...
pure virtual class defining interface of a CRC object
Definition: crc.hpp:46
libdar namespace encapsulate all libdar symbols
Definition: archive.hpp:46