// 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_