⛏️ index : haiku.git

/*
 * Copyright 2014, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */


#include <DataPositionIOWrapper.h>

#include <stdio.h>


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;
}