#include <stdio.h>
#include "OffsetFile.h"
OffsetFile::OffsetFile()
: fFile(),
fOffset(0),
fCurrentPosition(0)
{
}
OffsetFile::OffsetFile(const BFile& file, off_t offset)
: fFile(),
fOffset(0),
fCurrentPosition(0)
{
SetTo(file, offset);
}
OffsetFile::~OffsetFile()
{
}
status_t
OffsetFile::SetTo(const BFile& file, off_t offset)
{
Unset();
fFile = file;
fOffset = offset;
return fFile.InitCheck();
}
void
OffsetFile::Unset()
{
fFile.Unset();
fOffset = 0;
fCurrentPosition = 0;
}
status_t
OffsetFile::InitCheck() const
{
return fFile.InitCheck();
}
ssize_t
OffsetFile::ReadAt(off_t pos, void *buffer, size_t size)
{
return fFile.ReadAt(pos + fOffset, buffer, size);
}
ssize_t
OffsetFile::WriteAt(off_t pos, const void *buffer, size_t size)
{
return fFile.WriteAt(pos + fOffset, buffer, size);
}
off_t
OffsetFile::Seek(off_t position, uint32 seekMode)
{
off_t result = B_BAD_VALUE;
switch (seekMode) {
case SEEK_SET:
if (position >= 0)
result = fCurrentPosition = position;
break;
case SEEK_END:
{
off_t size;
status_t error = GetSize(&size);
if (size + position >= 0)
result = fCurrentPosition = size + position;
else
result = error;
break;
}
case SEEK_CUR:
if (fCurrentPosition + position >= 0)
result = fCurrentPosition += position;
break;
default:
break;
}
return result;
}
off_t
OffsetFile::Position() const
{
return fCurrentPosition;
}
status_t
OffsetFile::SetSize(off_t size)
{
status_t error = (size >= 0 ? B_OK : B_BAD_VALUE );
if (error == B_OK)
error = fFile.SetSize(size + fOffset);
return error;
}
status_t
OffsetFile::GetSize(off_t* size)
{
status_t error = fFile.GetSize(size);
if (error == B_OK)
*size -= fOffset;
return error;
}
off_t
OffsetFile::GetOffset() const
{
return fOffset;
}