From 05b565f4f25a8d0fd482a7697ded510c29630aab Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sun, 13 Jul 2014 01:07:34 +0200 Subject: [PATCH] Add private BDataPositionIOWrapper Implements the BPositionIO interface on top of a BDataIO, requiring the {Read,Write}At() accesses to be sequential. --- .../private/support/DataPositionIOWrapper.h | 1 + .../private/support/DataPositionIOWrapper.h | 37 +++++++ src/build/libbe/support/Jamfile | 1 + src/kits/support/DataPositionIOWrapper.cpp | 103 ++++++++++++++++++ src/kits/support/Jamfile | 1 + 5 files changed, 143 insertions(+) create mode 100644 headers/build/private/support/DataPositionIOWrapper.h create mode 100644 headers/private/support/DataPositionIOWrapper.h create mode 100644 src/kits/support/DataPositionIOWrapper.cpp diff --git a/headers/build/private/support/DataPositionIOWrapper.h b/headers/build/private/support/DataPositionIOWrapper.h new file mode 100644 index 0000000000..1f687c762b --- /dev/null +++ b/headers/build/private/support/DataPositionIOWrapper.h @@ -0,0 +1 @@ +#include <../private/support/DataPositionIOWrapper.h> diff --git a/headers/private/support/DataPositionIOWrapper.h b/headers/private/support/DataPositionIOWrapper.h new file mode 100644 index 0000000000..03478e3881 --- /dev/null +++ b/headers/private/support/DataPositionIOWrapper.h @@ -0,0 +1,37 @@ +/* + * Copyright 2014, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ +#ifndef _DATA_POSITION_IO_WRAPPER_H_ +#define _DATA_POSITION_IO_WRAPPER_H_ + + +#include + + +class BDataPositionIOWrapper : public BPositionIO { +public: + BDataPositionIOWrapper(BDataIO* io); + ~BDataPositionIOWrapper(); + + virtual ssize_t Read(void* buffer, size_t size); + virtual ssize_t Write(const void* buffer, size_t size); + + virtual ssize_t ReadAt(off_t position, void* buffer, + size_t size); + virtual ssize_t WriteAt(off_t position, const void* buffer, + size_t size); + + virtual off_t Seek(off_t position, uint32 seekMode); + virtual off_t Position() const; + + virtual status_t SetSize(off_t size); + virtual status_t GetSize(off_t* size) const; + +private: + BDataIO* fIO; + off_t fPosition; +}; + + +#endif // _DATA_POSITION_IO_WRAPPER_H_ diff --git a/src/build/libbe/support/Jamfile b/src/build/libbe/support/Jamfile index 145c9eca3f..0b8bdad86a 100644 --- a/src/build/libbe/support/Jamfile +++ b/src/build/libbe/support/Jamfile @@ -12,6 +12,7 @@ BuildPlatformMergeObjectPIC support_kit.o : ByteOrder.cpp CompressionAlgorithm.cpp DataIO.cpp + DataPositionIOWrapper.cpp Flattenable.cpp List.cpp Locker.cpp diff --git a/src/kits/support/DataPositionIOWrapper.cpp b/src/kits/support/DataPositionIOWrapper.cpp new file mode 100644 index 0000000000..ea2312bfee --- /dev/null +++ b/src/kits/support/DataPositionIOWrapper.cpp @@ -0,0 +1,103 @@ +/* + * Copyright 2014, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + + +#include + +#include + + +BDataPositionIOWrapper::BDataPositionIOWrapper(BDataIO* io) + : + BPositionIO(), + fIO(io), + fPosition(0) +{ +} + + +BDataPositionIOWrapper::~BDataPositionIOWrapper() +{ +} + + +ssize_t +BDataPositionIOWrapper::Read(void* buffer, size_t size) +{ + ssize_t bytesRead = fIO->Read(buffer, size); + if (bytesRead > 0) + fPosition += bytesRead; + + return bytesRead; +} + + +ssize_t +BDataPositionIOWrapper::Write(const void* buffer, size_t size) +{ + ssize_t bytesWritten = fIO->Write(buffer, size); + if (bytesWritten > 0) + fPosition += bytesWritten; + + return bytesWritten; +} + + +ssize_t +BDataPositionIOWrapper::ReadAt(off_t position, void* buffer, size_t size) +{ + if (position != fPosition) + return B_NOT_SUPPORTED; + + return Read(buffer, size); +} + + +ssize_t +BDataPositionIOWrapper::WriteAt(off_t position, const void* buffer, + size_t size) +{ + if (position != fPosition) + return B_NOT_SUPPORTED; + + return Write(buffer, size); +} + + +off_t +BDataPositionIOWrapper::Seek(off_t position, uint32 seekMode) +{ + switch (seekMode) { + case SEEK_CUR: + return position == 0 ? B_OK : B_NOT_SUPPORTED; + case SEEK_SET: + return position == fPosition ? B_OK : B_NOT_SUPPORTED; + case SEEK_END: + return B_NOT_SUPPORTED; + default: + return B_BAD_VALUE; + } +} + + +off_t +BDataPositionIOWrapper::Position() const +{ + return fPosition; +} + + +status_t +BDataPositionIOWrapper::SetSize(off_t size) +{ + return size == fPosition ? B_OK : B_NOT_SUPPORTED; +} + + +status_t +BDataPositionIOWrapper::GetSize(off_t* size) const +{ + return B_NOT_SUPPORTED; +} diff --git a/src/kits/support/Jamfile b/src/kits/support/Jamfile index 43007f4a3a..76b3d5e030 100644 --- a/src/kits/support/Jamfile +++ b/src/kits/support/Jamfile @@ -26,6 +26,7 @@ for architectureObject in [ MultiArchSubDirSetup ] { ByteOrder.cpp CompressionAlgorithm.cpp DataIO.cpp + DataPositionIOWrapper.cpp DateTime.cpp Flattenable.cpp List.cpp