1// OffsetFile.cpp 2 3#include <stdio.h> 4 5#include "OffsetFile.h" 6 7// constructor 8OffsetFile::OffsetFile() 9 : fFile(), 10 fOffset(0), 11 fCurrentPosition(0) 12{ 13} 14 15// constructor 16OffsetFile::OffsetFile(const BFile& file, off_t offset) 17 : fFile(), 18 fOffset(0), 19 fCurrentPosition(0) 20{ 21 SetTo(file, offset); 22} 23 24// destructor 25OffsetFile::~OffsetFile() 26{ 27} 28 29// SetTo 30status_t 31OffsetFile::SetTo(const BFile& file, off_t offset) 32{ 33 Unset(); 34 fFile = file; 35 fOffset = offset; 36 return fFile.InitCheck(); 37} 38 39// Unset 40void 41OffsetFile::Unset() 42{ 43 fFile.Unset(); 44 fOffset = 0; 45 fCurrentPosition = 0; 46} 47 48// InitCheck 49status_t 50OffsetFile::InitCheck() const 51{ 52 return fFile.InitCheck(); 53} 54 55// Read 56//ssize_t 57//OffsetFile::Read(void *buffer, size_t size) 58//{ 59// return fFile.Read(buffer, size); 60//} 61 62// Write 63//ssize_t 64//OffsetFile::Write(const void *buffer, size_t size) 65//{ 66// return fFile.Write(buffer, size); 67//} 68 69// ReadAt 70ssize_t 71OffsetFile::ReadAt(off_t pos, void *buffer, size_t size) 72{ 73//printf("ReadAt(%Lx + %Lx, %lu)\n", pos, fOffset, size); 74 return fFile.ReadAt(pos + fOffset, buffer, size); 75} 76 77// WriteAt 78ssize_t 79OffsetFile::WriteAt(off_t pos, const void *buffer, size_t size) 80{ 81 return fFile.WriteAt(pos + fOffset, buffer, size); 82} 83 84// Seek 85off_t 86OffsetFile::Seek(off_t position, uint32 seekMode) 87{ 88// off_t result = fFile.Seek(position + fOffset, seekMode); 89// if (result >= 0) 90// result -= fOffset; 91// return result; 92 off_t result = B_BAD_VALUE; 93 switch (seekMode) { 94 case SEEK_SET: 95 if (position >= 0) 96 result = fCurrentPosition = position; 97 break; 98 case SEEK_END: 99 { 100 off_t size; 101 status_t error = GetSize(&size); 102 if (size + position >= 0) 103 result = fCurrentPosition = size + position; 104 else 105 result = error; 106 break; 107 } 108 case SEEK_CUR: 109 if (fCurrentPosition + position >= 0) 110 result = fCurrentPosition += position; 111 break; 112 default: 113 break; 114 } 115 return result; 116} 117 118// Position 119off_t 120OffsetFile::Position() const 121{ 122// off_t result = fFile.Position(); 123// if (result >= 0) 124// result -= fOffset; 125// return result; 126 return fCurrentPosition; 127} 128 129// SetSize 130status_t 131OffsetFile::SetSize(off_t size) 132{ 133 status_t error = (size >= 0 ? B_OK : B_BAD_VALUE ); 134 if (error == B_OK) 135 error = fFile.SetSize(size + fOffset); 136 return error; 137} 138 139// GetSize 140status_t 141OffsetFile::GetSize(off_t* size) 142{ 143 status_t error = fFile.GetSize(size); 144 if (error == B_OK) 145 *size -= fOffset; 146 return error; 147} 148 149// GetOffset 150off_t 151OffsetFile::GetOffset() const 152{ 153 return fOffset; 154} 155 156