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