1/*
2 * Copyright 2014, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <DataPositionIOWrapper.h>
8
9#include <stdio.h>
10
11
12BDataPositionIOWrapper::BDataPositionIOWrapper(BDataIO* io)
13	:
14	BPositionIO(),
15	fIO(io),
16	fPosition(0)
17{
18}
19
20
21BDataPositionIOWrapper::~BDataPositionIOWrapper()
22{
23}
24
25
26ssize_t
27BDataPositionIOWrapper::Read(void* buffer, size_t size)
28{
29	ssize_t bytesRead = fIO->Read(buffer, size);
30	if (bytesRead > 0)
31		fPosition += bytesRead;
32
33	return bytesRead;
34}
35
36
37ssize_t
38BDataPositionIOWrapper::Write(const void* buffer, size_t size)
39{
40	ssize_t bytesWritten = fIO->Write(buffer, size);
41	if (bytesWritten > 0)
42		fPosition += bytesWritten;
43
44	return bytesWritten;
45}
46
47
48ssize_t
49BDataPositionIOWrapper::ReadAt(off_t position, void* buffer, size_t size)
50{
51	if (position != fPosition)
52		return B_NOT_SUPPORTED;
53
54	return Read(buffer, size);
55}
56
57
58ssize_t
59BDataPositionIOWrapper::WriteAt(off_t position, const void* buffer,
60	size_t size)
61{
62	if (position != fPosition)
63		return B_NOT_SUPPORTED;
64
65	return Write(buffer, size);
66}
67
68
69off_t
70BDataPositionIOWrapper::Seek(off_t position, uint32 seekMode)
71{
72	switch (seekMode) {
73		case SEEK_CUR:
74			return position == 0 ? B_OK : B_NOT_SUPPORTED;
75		case SEEK_SET:
76			return position == fPosition ? B_OK : B_NOT_SUPPORTED;
77		case SEEK_END:
78			return B_NOT_SUPPORTED;
79		default:
80			return B_BAD_VALUE;
81	}
82}
83
84
85off_t
86BDataPositionIOWrapper::Position() const
87{
88	return fPosition;
89}
90
91
92status_t
93BDataPositionIOWrapper::SetSize(off_t size)
94{
95	return size == fPosition ? B_OK : B_NOT_SUPPORTED;
96}
97
98
99status_t
100BDataPositionIOWrapper::GetSize(off_t* size) const
101{
102	return B_NOT_SUPPORTED;
103}
104