1 // Copyright 2017 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef _BSDIFF_PATCH_WRITER_H_
6 #define _BSDIFF_PATCH_WRITER_H_
7 
8 #include <memory>
9 #include <string>
10 #include <vector>
11 
12 #include "bsdiff/compressor_interface.h"
13 #include "bsdiff/patch_writer_interface.h"
14 
15 namespace bsdiff {
16 
17 // A PatchWriterInterface class with three compressors and a 32-byte header.
18 class BsdiffPatchWriter : public PatchWriterInterface {
19  public:
20   // Create the patch writer using the upstream's "BSDIFF40" format. It uses
21   // bz2 as the compression algorithm and the file |patch_filename| to write
22   // the patch data.
23   explicit BsdiffPatchWriter(const std::string& patch_filename);
24 
25   // Create the patch writer using the "BSDF2" format. It uses the compressor
26   // with algorithm |type| and quality |quality|. This writer also writes the
27   // patch data to the file |patch_filename|.
28   BsdiffPatchWriter(const std::string& patch_filename,
29                     CompressorType type,
30                     int quality);
31 
32   // PatchWriterInterface overrides.
33   bool Init(size_t new_size) override;
34   bool WriteDiffStream(const uint8_t* data, size_t size) override;
35   bool WriteExtraStream(const uint8_t* data, size_t size) override;
36   bool AddControlEntry(const ControlEntry& entry) override;
37   bool Close() override;
38 
39  private:
40   // Write the BSDIFF patch header to the |fp_| given the size of the compressed
41   // control block and the compressed diff block.
42   bool WriteHeader(uint64_t ctrl_size, uint64_t diff_size);
43 
44   // Bytes of the new files already written. Needed to store the new length in
45   // the header of the file.
46   uint64_t written_output_{0};
47 
48   // The current file we are writing to.
49   FILE* fp_{nullptr};
50   std::string patch_filename_;
51 
52   // The format of bsdiff we're using.
53   BsdiffFormat format_;
54 
55   // The three internal compressed streams.
56   std::unique_ptr<CompressorInterface> ctrl_stream_{nullptr};
57   std::unique_ptr<CompressorInterface> diff_stream_{nullptr};
58   std::unique_ptr<CompressorInterface> extra_stream_{nullptr};
59 };
60 
61 }  // namespace bsdiff
62 
63 #endif  // _BSDIFF_PATCH_WRITER_H_
64