From f3532081aa4f778e0ae6d820817222494cbbcea6 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Wed, 1 Aug 2012 13:07:31 +0200 Subject: [PATCH] Added a filesystem utility class for providing a fixed buffer. --- sortix/fs/util.cpp | 74 ++++++++++++++++++++++++++++++++++++++++++++++ sortix/fs/util.h | 27 +++++++++++++++++ 2 files changed, 101 insertions(+) diff --git a/sortix/fs/util.cpp b/sortix/fs/util.cpp index 96921faa..19f09cdb 100644 --- a/sortix/fs/util.cpp +++ b/sortix/fs/util.cpp @@ -141,5 +141,79 @@ bool DevLineCommand::IsWritable() return true; } + +DevMemoryBuffer::DevMemoryBuffer(uint8_t* buf, size_t bufsize, bool write, + bool deletebuf) +{ + this->buf = buf; + this->bufsize = bufsize; + this->write = write; + this->deletebuf = deletebuf; +} + +DevMemoryBuffer::~DevMemoryBuffer() +{ + if ( deletebuf ) + delete[] buf; +} + +size_t DevMemoryBuffer::BlockSize() +{ + return 1; +} + +uintmax_t DevMemoryBuffer::Size() +{ + return bufsize; +} + +uintmax_t DevMemoryBuffer::Position() +{ + return off; +} + +bool DevMemoryBuffer::Seek(uintmax_t position) +{ + off = position; + return true; +} + +bool DevMemoryBuffer::Resize(uintmax_t size) +{ + if ( size != bufsize ) { Error::Set(EPERM); return false; } + return true; +} + +ssize_t DevMemoryBuffer::Read(byte* dest, size_t count) +{ + if ( bufsize <= off ) { return 0; } + size_t available = bufsize - off; + if ( available < count ) { count = available; } + Memory::Copy(dest, buf + off, count); + off += count; + return count; +} + +ssize_t DevMemoryBuffer::Write(const byte* src, size_t count) +{ + if ( !write ) { Error::Set(EBADF); return -1; } + if ( bufsize <= off ) { Error::Set(EPERM); return -1; } + size_t available = bufsize - off; + if ( available < count ) { count = available; } + Memory::Copy(buf + off, src, count); + off += count; + return count; +} + +bool DevMemoryBuffer::IsReadable() +{ + return true; +} + +bool DevMemoryBuffer::IsWritable() +{ + return write; +} + } // namespace Sortix diff --git a/sortix/fs/util.h b/sortix/fs/util.h index cede9947..21257131 100644 --- a/sortix/fs/util.h +++ b/sortix/fs/util.h @@ -73,6 +73,33 @@ private: }; +class DevMemoryBuffer : public DevBuffer +{ +public: + DevMemoryBuffer(uint8_t* buf, size_t bufsize, bool write = true, + bool deletebuf = true); + ~DevMemoryBuffer(); + +private: + uint8_t* buf; + size_t bufsize; + size_t off; + bool write; + bool deletebuf; + +public: + virtual size_t BlockSize(); + virtual uintmax_t Size(); + virtual uintmax_t Position(); + virtual bool Seek(uintmax_t position); + virtual bool Resize(uintmax_t size); + virtual ssize_t Read(byte* dest, size_t count); + virtual ssize_t Write(const byte* src, size_t count); + virtual bool IsReadable(); + virtual bool IsWritable(); + +}; + } // namespace Sortix #endif