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