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