// Copyright 2016 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.

#include "bsdiff/buffer_file.h"

#include "bsdiff/bspatch.h"

namespace bsdiff {

BufferFile::BufferFile(std::unique_ptr<FileInterface> file, size_t size)
    : file_(std::move(file)) {
  buffer_.reserve(size);
}

BufferFile::~BufferFile() {
  Close();
}

bool BufferFile::Read(void* buf, size_t count, size_t* bytes_read) {
  return false;
}

bool BufferFile::Write(const void* buf, size_t count, size_t* bytes_written) {
  const uint8_t* data = static_cast<const uint8_t*>(buf);
  buffer_.insert(buffer_.end(), data, data + count);
  *bytes_written = count;
  return true;
}

bool BufferFile::Seek(off_t pos) {
  return false;
}

bool BufferFile::Close() {
  if (!WriteAll(file_, buffer_.data(), buffer_.size()))
    return false;
  // Prevent writing |buffer_| to |file_| again if Close() is called more than
  // once.
  buffer_.clear();
  return file_->Close();
}

bool BufferFile::GetSize(uint64_t* size) {
  *size = buffer_.size();
  return true;
}

}  // namespace bsdiff
