summaryrefslogtreecommitdiff
path: root/diff_encoder.h
blob: 3d992df8d2cee5e0e2bf79e8bc37fa29937f44b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// Copyright 2017 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef _BSDIFF_DIFF_ENCODER_H_
#define _BSDIFF_DIFF_ENCODER_H_

#include <stdint.h>

#include "bsdiff/bz2_compressor.h"
#include "bsdiff/patch_writer_interface.h"

namespace bsdiff {

// Helper class to encapsulate the diff and extra stream generation logic
// derived from the old and new file buffers. Using this class is impossible to
// produce an invalid or incomplete bsdiff patch, since it has checks in place
// verifying its correct usage.

class DiffEncoder {
 public:
  // Initialize the DiffEncoder with the old and new file buffers, as well as
  // the path writer used. The |patch| will be initialized when calling Init().
  DiffEncoder(PatchWriterInterface* patch,
              const uint8_t* old_buf,
              uint64_t old_size,
              const uint8_t* new_buf,
              uint64_t new_size)
      : patch_(patch),
        old_buf_(old_buf),
        old_size_(old_size),
        new_buf_(new_buf),
        new_size_(new_size) {}

  // Initialize the diff encoder and the underlying patch.
  bool Init();

  // Add a new control triplet entry to the patch. The |entry.diff_size| bytes
  // for the diff stream and the |entry.extra_size| bytes for the extra stream
  // will be computed and added to the corresponding streams in the patch.
  // Returns whether the operation succeeded. The operation can fail if either
  // the old or new files are referenced out of bounds.
  bool AddControlEntry(const ControlEntry& entry);

  // Finalize the patch writing process and close the underlying patch writer.
  bool Close();

 private:
  // Pointer to the patch we are writing to.
  PatchWriterInterface* patch_;

  // Old and new file buffers.
  const uint8_t* old_buf_;
  uint64_t old_size_;
  const uint8_t* new_buf_;
  uint64_t new_size_;

  // Bytes of the new_buf_ already written.
  uint64_t written_output_{0};

  // The current position in the old buf.
  int64_t old_pos_{0};
};

}  // namespace bsdiff

#endif  // _BSDIFF_DIFF_ENCODER_H_