1/*
2 * Copyright 2014, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _COMPRESSION_ALGORITHM_H_
6#define _COMPRESSION_ALGORITHM_H_
7
8
9#include <DataIO.h>
10
11
12class BCompressionParameters {
13public:
14								BCompressionParameters();
15	virtual						~BCompressionParameters();
16};
17
18
19class BDecompressionParameters {
20public:
21								BDecompressionParameters();
22	virtual						~BDecompressionParameters();
23};
24
25
26class BCompressionAlgorithm {
27public:
28								BCompressionAlgorithm();
29	virtual						~BCompressionAlgorithm();
30
31	virtual	status_t			CreateCompressingInputStream(BDataIO* input,
32									const BCompressionParameters* parameters,
33									BDataIO*& _stream);
34	virtual	status_t			CreateCompressingOutputStream(BDataIO* output,
35									const BCompressionParameters* parameters,
36									BDataIO*& _stream);
37	virtual	status_t			CreateDecompressingInputStream(BDataIO* input,
38									const BDecompressionParameters* parameters,
39									BDataIO*& _stream);
40	virtual	status_t			CreateDecompressingOutputStream(BDataIO* output,
41									const BDecompressionParameters* parameters,
42									BDataIO*& _stream);
43
44	virtual	status_t			CompressBuffer(const void* input,
45									size_t inputSize, void* output,
46									size_t outputSize, size_t& _compressedSize,
47									const BCompressionParameters* parameters
48										= NULL);
49	virtual	status_t			DecompressBuffer(const void* input,
50									size_t inputSize, void* output,
51									size_t outputSize,
52									size_t& _uncompressedSize,
53									const BDecompressionParameters* parameters
54										= NULL);
55
56protected:
57			class BAbstractStream;
58			class BAbstractInputStream;
59			class BAbstractOutputStream;
60};
61
62
63class BCompressionAlgorithm::BAbstractStream : public BDataIO {
64public:
65								BAbstractStream();
66	virtual						~BAbstractStream();
67
68			status_t			Init(size_t bufferSize);
69
70protected:
71	virtual	status_t			ProcessData(const void* input, size_t inputSize,
72									void* output, size_t outputSize,
73									size_t& bytesConsumed,
74									size_t& bytesProduced) = 0;
75									// must consume or produce at least 1 byte
76									// or return an error
77	virtual	status_t			FlushPendingData(void* output,
78									size_t outputSize,
79									size_t& bytesProduced) = 0;
80
81protected:
82			uint8*				fBuffer;
83			size_t				fBufferCapacity;
84			size_t				fBufferOffset;
85			size_t				fBufferSize;
86};
87
88
89class BCompressionAlgorithm::BAbstractInputStream : public BAbstractStream {
90public:
91								BAbstractInputStream(BDataIO* input);
92	virtual						~BAbstractInputStream();
93
94	virtual	ssize_t				Read(void* buffer, size_t size);
95
96private:
97			BDataIO*			fInput;
98			bool				fEndOfInput;
99			bool				fNoMorePendingData;
100};
101
102
103class BCompressionAlgorithm::BAbstractOutputStream : public BAbstractStream {
104public:
105								BAbstractOutputStream(BDataIO* output);
106	virtual						~BAbstractOutputStream();
107
108	virtual	ssize_t				Write(const void* buffer, size_t size);
109
110	virtual	status_t			Flush();
111
112private:
113			ssize_t				_Write(const void* buffer, size_t size,
114									bool flush);
115
116private:
117			BDataIO*			fOutput;
118};
119
120
121#endif	// _COMPRESSION_ALGORITHM_H_
122