// 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_