xref: /aosp_15_r20/external/bsdiff/sink_file.h (revision a3a45f308bd90ef1a6e6a5e8fb92fe449b895909)
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