1/* 2 * Copyright 2013, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef _PACKAGE__HPKG__PRIVATE__PACKAGE_FILE_HEAP_WRITER_H_ 6#define _PACKAGE__HPKG__PRIVATE__PACKAGE_FILE_HEAP_WRITER_H_ 7 8 9#include <Array.h> 10#include <package/hpkg/PackageFileHeapAccessorBase.h> 11 12 13class BCompressionParameters; 14 15namespace BPrivate { 16 template<typename Value> class RangeArray; 17} 18 19 20namespace BPackageKit { 21 22namespace BHPKG { 23 24 25class BDataReader; 26class BErrorOutput; 27 28 29namespace BPrivate { 30 31 32class PackageFileHeapReader; 33 34 35class PackageFileHeapWriter : public PackageFileHeapAccessorBase { 36public: 37 PackageFileHeapWriter(BErrorOutput* errorOutput, 38 BPositionIO* file, off_t heapOffset, 39 CompressionAlgorithmOwner* 40 compressionAlgorithm, 41 DecompressionAlgorithmOwner* 42 decompressionAlgorithm); 43 ~PackageFileHeapWriter(); 44 45 void Init(); 46 void Reinit(PackageFileHeapReader* heapReader); 47 48 status_t AddData(BDataReader& dataReader, off_t size, 49 uint64& _offset); 50 void AddDataThrows(const void* buffer, size_t size); 51 void RemoveDataRanges( 52 const ::BPrivate::RangeArray<uint64>& 53 ranges); 54 // doesn't truncate the file 55 status_t Finish(); 56 57protected: 58 virtual status_t ReadAndDecompressChunk(size_t chunkIndex, 59 void* compressedDataBuffer, 60 void* uncompressedDataBuffer); 61 62private: 63 struct Chunk; 64 struct ChunkSegment; 65 struct ChunkBuffer; 66 67 friend struct ChunkBuffer; 68 69private: 70 void _Uninit(); 71 72 status_t _FlushPendingData(); 73 status_t _WriteChunk(const void* data, size_t size, 74 bool mayCompress); 75 status_t _WriteDataCompressed(const void* data, 76 size_t size); 77 status_t _WriteDataUncompressed(const void* data, 78 size_t size); 79 80 void _PushChunks(ChunkBuffer& chunkBuffer, 81 uint64 startOffset, uint64 endOffset); 82 void _UnwriteLastPartialChunk(); 83 84private: 85 void* fPendingDataBuffer; 86 void* fCompressedDataBuffer; 87 size_t fPendingDataSize; 88 Array<uint64> fOffsets; 89 CompressionAlgorithmOwner* fCompressionAlgorithm; 90}; 91 92 93} // namespace BPrivate 94 95} // namespace BHPKG 96 97} // namespace BPackageKit 98 99 100#endif // _PACKAGE__HPKG__PRIVATE__PACKAGE_FILE_HEAP_WRITER_H_ 101