1*a3a45f30SXin Li // Copyright 2016 The Chromium OS Authors. All rights reserved. 2*a3a45f30SXin Li // Use of this source code is governed by a BSD-style license that can be 3*a3a45f30SXin Li // found in the LICENSE file. 4*a3a45f30SXin Li 5*a3a45f30SXin Li #ifndef _BSDIFF_BUFFER_FILE_H_ 6*a3a45f30SXin Li #define _BSDIFF_BUFFER_FILE_H_ 7*a3a45f30SXin Li 8*a3a45f30SXin Li #include <memory> 9*a3a45f30SXin Li #include <vector> 10*a3a45f30SXin Li 11*a3a45f30SXin Li #include "bsdiff/file_interface.h" 12*a3a45f30SXin Li 13*a3a45f30SXin Li namespace bsdiff { 14*a3a45f30SXin Li 15*a3a45f30SXin Li class BufferFile : public FileInterface { 16*a3a45f30SXin Li public: 17*a3a45f30SXin Li // Creates a write only BufferFile based on the underlying |file| passed. 18*a3a45f30SXin Li // The BufferFile will cache all the write in a buffer and write everything 19*a3a45f30SXin Li // to |file| at once upon closing. Read and Seek are not supported. 20*a3a45f30SXin Li // |size| should be the estimated total file size, it is used to reserve 21*a3a45f30SXin Li // buffer space. 22*a3a45f30SXin Li BufferFile(std::unique_ptr<FileInterface> file, size_t size); 23*a3a45f30SXin Li 24*a3a45f30SXin Li ~BufferFile() override; 25*a3a45f30SXin Li 26*a3a45f30SXin Li // FileInterface overrides. 27*a3a45f30SXin Li bool Read(void* buf, size_t count, size_t* bytes_read) override; 28*a3a45f30SXin Li bool Write(const void* buf, size_t count, size_t* bytes_written) override; 29*a3a45f30SXin Li bool Seek(off_t pos) override; 30*a3a45f30SXin Li bool Close() override; 31*a3a45f30SXin Li bool GetSize(uint64_t* size) override; 32*a3a45f30SXin Li 33*a3a45f30SXin Li private: 34*a3a45f30SXin Li // The underlying FileInterace instance. 35*a3a45f30SXin Li std::unique_ptr<FileInterface> file_ = nullptr; 36*a3a45f30SXin Li std::vector<uint8_t> buffer_; 37*a3a45f30SXin Li }; 38*a3a45f30SXin Li 39*a3a45f30SXin Li } // namespace bsdiff 40*a3a45f30SXin Li 41*a3a45f30SXin Li #endif // _BSDIFF_BUFFER_FILE_H_ 42