| // 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 SRC_MEMORY_STREAM_H_ |
| #define SRC_MEMORY_STREAM_H_ |
| |
| #include <string> |
| #include <utility> |
| |
| #include "puffin/common.h" |
| #include "puffin/stream.h" |
| |
| namespace puffin { |
| |
| // A very simple class for reading and writing into memory. |
| class MemoryStream : public StreamInterface { |
| public: |
| ~MemoryStream() override = default; |
| |
| // Creates a stream for reading. |
| static UniqueStreamPtr CreateForRead(const Buffer& memory); |
| |
| // Creates a stream for writing. This function will clear the |memory| if |
| // |clear| is true. An instance of this class does not retain the ownership of |
| // the |memory|. |
| static UniqueStreamPtr CreateForWrite(Buffer* memory); |
| |
| bool GetSize(uint64_t* size) const override; |
| bool GetOffset(uint64_t* offset) const override; |
| bool Seek(uint64_t offset) override; |
| bool Read(void* buffer, size_t length) override; |
| bool Write(const void* buffer, size_t length) override; |
| bool Close() override; |
| |
| private: |
| // Ctor. Exactly one of the |read_memory| or |write_memory| should be nullptr. |
| MemoryStream(const Buffer* read_memory, Buffer* write_memory); |
| |
| // The memory buffer for reading. |
| const Buffer* read_memory_; |
| |
| // The memory buffer for writing. It can grow as we write into it. |
| Buffer* write_memory_; |
| |
| // The current offset. |
| uint64_t offset_; |
| |
| // True if the stream is open. |
| bool open_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MemoryStream); |
| }; |
| |
| } // namespace puffin |
| |
| #endif // SRC_MEMORY_STREAM_H_ |