xref: /haiku/src/kits/package/hpkg/DataReader.cpp (revision c0936b5a0384bc6fe654d296ee54222a0f45d2b6)
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 #include <arch/user_memory.h>
15 #endif
16 
17 
18 namespace BPackageKit {
19 
20 namespace BHPKG {
21 
22 
23 // #pragma mark - BDataReader
24 
25 
26 BDataReader::~BDataReader()
27 {
28 }
29 
30 
31 // #pragma mark - BAbstractBufferedDataReader
32 
33 
34 BAbstractBufferedDataReader::~BAbstractBufferedDataReader()
35 {
36 }
37 
38 
39 status_t
40 BAbstractBufferedDataReader::ReadData(off_t offset, void* buffer, size_t size)
41 {
42 	BMemoryIO output(buffer, size);
43 	return ReadDataToOutput(offset, size, &output);
44 }
45 
46 
47 // #pragma mark - BBufferDataReader
48 
49 
50 BBufferDataReader::BBufferDataReader(const void* data, size_t size)
51 	:
52 	fData(data),
53 	fSize(size)
54 {
55 }
56 
57 
58 status_t
59 BBufferDataReader::ReadData(off_t offset, void* buffer, size_t size)
60 {
61 	if (size == 0)
62 		return B_OK;
63 
64 	if (offset < 0)
65 		return B_BAD_VALUE;
66 
67 	if (size > fSize || offset > (off_t)fSize - (off_t)size)
68 		return B_ERROR;
69 
70 #if defined(_KERNEL_MODE) && !defined(_BOOT_MODE)
71 	if (IS_USER_ADDRESS(buffer)) {
72 		if (user_memcpy(buffer, (const uint8*)fData + offset, size) != B_OK)
73 			return B_BAD_ADDRESS;
74 	} else
75 #endif
76 	memcpy(buffer, (const uint8*)fData + offset, size);
77 	return B_OK;
78 }
79 
80 
81 status_t
82 BBufferDataReader::ReadDataToOutput(off_t offset, size_t size, BDataIO* output)
83 {
84 	if (size == 0)
85 		return B_OK;
86 
87 	if (offset < 0)
88 		return B_BAD_VALUE;
89 
90 	if (size > fSize || offset > (off_t)fSize - (off_t)size)
91 		return B_ERROR;
92 
93 	return output->WriteExactly((const uint8*)fData + offset, size);
94 }
95 
96 
97 }	// namespace BHPKG
98 
99 }	// namespace BPackageKit
100