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_SINK_FILE_H_ 6*a3a45f30SXin Li #define _BSDIFF_SINK_FILE_H_ 7*a3a45f30SXin Li 8*a3a45f30SXin Li #include <stdint.h> 9*a3a45f30SXin Li 10*a3a45f30SXin Li #include <functional> 11*a3a45f30SXin Li 12*a3a45f30SXin Li #include "bsdiff/file_interface.h" 13*a3a45f30SXin Li 14*a3a45f30SXin Li using sink_func = std::function<size_t(const uint8_t*, size_t)>; 15*a3a45f30SXin Li 16*a3a45f30SXin Li namespace bsdiff { 17*a3a45f30SXin Li 18*a3a45f30SXin Li class SinkFile : public FileInterface { 19*a3a45f30SXin Li public: 20*a3a45f30SXin Li // Creates a SinkFile based on the underlying |sink| function passed. 21*a3a45f30SXin Li // The SinkFile will call |sink| function upon write. 22*a3a45f30SXin Li // Read, Seek and GetSize are not supported. 23*a3a45f30SXin Li explicit SinkFile(const sink_func& sink); 24*a3a45f30SXin Li 25*a3a45f30SXin Li ~SinkFile() = default; 26*a3a45f30SXin Li 27*a3a45f30SXin Li // FileInterface overrides. 28*a3a45f30SXin Li bool Read(void* buf, size_t count, size_t* bytes_read) override; 29*a3a45f30SXin Li bool Write(const void* buf, size_t count, size_t* bytes_written) override; 30*a3a45f30SXin Li bool Seek(off_t pos) override; 31*a3a45f30SXin Li bool Close() override; 32*a3a45f30SXin Li bool GetSize(uint64_t* size) override; 33*a3a45f30SXin Li 34*a3a45f30SXin Li private: 35*a3a45f30SXin Li // The sink() function used to write data. 36*a3a45f30SXin Li const sink_func sink_; 37*a3a45f30SXin Li }; 38*a3a45f30SXin Li 39*a3a45f30SXin Li } // namespace bsdiff 40*a3a45f30SXin Li 41*a3a45f30SXin Li #endif // _BSDIFF_SINK_FILE_H_ 42