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_DIFF_ENCODER_H_ 6 #define _BSDIFF_DIFF_ENCODER_H_ 7 8 #include <stdint.h> 9 10 #include "bsdiff/bz2_compressor.h" 11 #include "bsdiff/patch_writer_interface.h" 12 13 namespace bsdiff { 14 15 // Helper class to encapsulate the diff and extra stream generation logic 16 // derived from the old and new file buffers. Using this class is impossible to 17 // produce an invalid or incomplete bsdiff patch, since it has checks in place 18 // verifying its correct usage. 19 20 class DiffEncoder { 21 public: 22 // Initialize the DiffEncoder with the old and new file buffers, as well as 23 // 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)24 DiffEncoder(PatchWriterInterface* patch, 25 const uint8_t* old_buf, 26 uint64_t old_size, 27 const uint8_t* new_buf, 28 uint64_t new_size) 29 : patch_(patch), 30 old_buf_(old_buf), 31 old_size_(old_size), 32 new_buf_(new_buf), 33 new_size_(new_size) {} 34 35 // Initialize the diff encoder and the underlying patch. 36 bool Init(); 37 38 // Add a new control triplet entry to the patch. The |entry.diff_size| bytes 39 // for the diff stream and the |entry.extra_size| bytes for the extra stream 40 // will be computed and added to the corresponding streams in the patch. 41 // Returns whether the operation succeeded. The operation can fail if either 42 // the old or new files are referenced out of bounds. 43 bool AddControlEntry(const ControlEntry& entry); 44 45 // Finalize the patch writing process and close the underlying patch writer. 46 bool Close(); 47 48 private: 49 // Pointer to the patch we are writing to. 50 PatchWriterInterface* patch_; 51 52 // Old and new file buffers. 53 const uint8_t* old_buf_; 54 uint64_t old_size_; 55 const uint8_t* new_buf_; 56 uint64_t new_size_; 57 58 // Bytes of the new_buf_ already written. 59 uint64_t written_output_{0}; 60 61 // The current position in the old buf. 62 int64_t old_pos_{0}; 63 }; 64 65 } // namespace bsdiff 66 67 #endif // _BSDIFF_DIFF_ENCODER_H_ 68