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