root/src/kits/support/DataPositionIOWrapper.cpp
/*
 * 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;
}