diff --git a/headers/os/package/hpkg/DataReader.h b/headers/os/package/hpkg/DataReader.h index c0668c0cfe..2590415fba 100644 --- a/headers/os/package/hpkg/DataReader.h +++ b/headers/os/package/hpkg/DataReader.h @@ -41,6 +41,8 @@ class BFDDataReader : public BDataReader { public: BFDDataReader(int fd); + void SetFD(int fd); + virtual status_t ReadData(off_t offset, void* buffer, size_t size); @@ -64,12 +66,14 @@ private: }; -class BBufferDataReader : public BDataReader { +class BBufferDataReader : public BAbstractBufferedDataReader { public: BBufferDataReader(const void* data, size_t size); virtual status_t ReadData(off_t offset, void* buffer, size_t size); + virtual status_t ReadDataToOutput(off_t offset, size_t size, + BDataOutput* output); private: const void* fData; diff --git a/src/kits/package/hpkg/DataReader.cpp b/src/kits/package/hpkg/DataReader.cpp index cc770e233d..b47f988a2f 100644 --- a/src/kits/package/hpkg/DataReader.cpp +++ b/src/kits/package/hpkg/DataReader.cpp @@ -68,6 +68,23 @@ BBufferDataReader::ReadData(off_t offset, void* buffer, size_t size) } +status_t +BBufferDataReader::ReadDataToOutput(off_t offset, size_t size, + BDataOutput* output) +{ + if (size == 0) + return B_OK; + + if (offset < 0) + return B_BAD_VALUE; + + if (size > fSize || offset > (off_t)fSize - (off_t)size) + return B_ERROR; + + return output->WriteData((const uint8*)fData + offset, size); +} + + } // namespace BHPKG } // namespace BPackageKit diff --git a/src/kits/package/hpkg/FDDataReader.cpp b/src/kits/package/hpkg/FDDataReader.cpp index c0ce13e921..5a20fc4bb2 100644 --- a/src/kits/package/hpkg/FDDataReader.cpp +++ b/src/kits/package/hpkg/FDDataReader.cpp @@ -22,6 +22,13 @@ BFDDataReader::BFDDataReader(int fd) } +void +BFDDataReader::SetFD(int fd) +{ + fFD = fd; +} + + status_t BFDDataReader::ReadData(off_t offset, void* buffer, size_t size) {