1/*
2 * Copyright 2009-2014, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <package/hpkg/DataReader.h>
8
9#include <DataIO.h>
10
11#include <string.h>
12
13#if defined(_KERNEL_MODE) && !defined(_BOOT_MODE)
14// for user_memcpy() and IS_USER_ADDRESS()
15#include <KernelExport.h>
16
17#include <kernel.h>
18#endif
19
20
21namespace BPackageKit {
22
23namespace BHPKG {
24
25
26// #pragma mark - BDataReader
27
28
29BDataReader::~BDataReader()
30{
31}
32
33
34// #pragma mark - BAbstractBufferedDataReader
35
36
37BAbstractBufferedDataReader::~BAbstractBufferedDataReader()
38{
39}
40
41
42status_t
43BAbstractBufferedDataReader::ReadData(off_t offset, void* buffer, size_t size)
44{
45	BMemoryIO output(buffer, size);
46	return ReadDataToOutput(offset, size, &output);
47}
48
49
50// #pragma mark - BBufferDataReader
51
52
53BBufferDataReader::BBufferDataReader(const void* data, size_t size)
54	:
55	fData(data),
56	fSize(size)
57{
58}
59
60
61status_t
62BBufferDataReader::ReadData(off_t offset, void* buffer, size_t size)
63{
64	if (size == 0)
65		return B_OK;
66
67	if (offset < 0)
68		return B_BAD_VALUE;
69
70	if (size > fSize || offset > (off_t)fSize - (off_t)size)
71		return B_ERROR;
72
73#if defined(_KERNEL_MODE) && !defined(_BOOT_MODE)
74	if (IS_USER_ADDRESS(buffer)) {
75		if (user_memcpy(buffer, (const uint8*)fData + offset, size) != B_OK)
76			return B_BAD_ADDRESS;
77	} else
78#endif
79	memcpy(buffer, (const uint8*)fData + offset, size);
80	return B_OK;
81}
82
83
84status_t
85BBufferDataReader::ReadDataToOutput(off_t offset, size_t size, BDataIO* output)
86{
87	if (size == 0)
88		return B_OK;
89
90	if (offset < 0)
91		return B_BAD_VALUE;
92
93	if (size > fSize || offset > (off_t)fSize - (off_t)size)
94		return B_ERROR;
95
96	return output->WriteExactly((const uint8*)fData + offset, size);
97}
98
99
100}	// namespace BHPKG
101
102}	// namespace BPackageKit
103