1 //
2 // This file is part of the aMule Project.
3 //
4 // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org )
5 //
6 // Any parts of this program derived from the xMule, lMule or eMule project,
7 // or contributed by third-party developers are copyrighted by their
8 // respective authors.
9 //
10 // This program is free software; you can redistribute it and/or modify
11 // it under the terms of the GNU General Public License as published by
12 // the Free Software Foundation; either version 2 of the License, or
13 // (at your option) any later version.
14 //
15 // This program is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 // GNU General Public License for more details.
19 //
20 // You should have received a copy of the GNU General Public License
21 // along with this program; if not, write to the Free Software
22 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
23 //
24 
25 #ifndef RLE_H
26 #define RLE_H
27 
28 
29 #include "Types.h"
30 
31 /*!
32  * General purpose RLE implementation. Just encode or create
33  * differential data with previous
34  */
35 class RLE_Data
36 {
37 public:
38 	RLE_Data(int len = 0, bool use_diff = true)	{ setup(len, use_diff); }
39 
40 	// those constructors are for stl containers
RLE_Data(const RLE_Data & obj)41 	RLE_Data(const RLE_Data & obj)	{ setup(obj.m_len, obj.m_use_diff, obj.m_buff); }
42 	RLE_Data &operator=(const RLE_Data &);
43 
44 	~RLE_Data();
45 
46 	const uint8 *Encode(const ArrayOfUInts16 &data, int &outlen, bool &changed);
47 	const uint8 *Encode(const ArrayOfUInts64 &data, int &outlen, bool &changed);
48 
49 	const uint8 *Decode(const uint8 *data, int len);
50 	void Decode(const uint8 *data, int len, ArrayOfUInts64 &outdata);
51 
52 	void ResetEncoder();
53 
54 	// decoder will need access to data
Buffer()55 	const uint8 *Buffer() const	{ return m_buff; }
Size()56 	int Size() const	{ return m_len; }
57 
58 private:
59 	void setup(int len, bool use_diff, uint8 * content = 0);
60 
61 	// change size of internal buffers
62 	// returns true if size was changed
63 	bool Realloc(int size);
64 
65 	//
66 	// Encode some raw data
67 	//
68 	// data:	block to encode
69 	// inlen:	number of bytes to encode. May be zero, then data can also be 0.
70 	// outlen:	here the number of encoded bytes gets stored (0 if inlen is 0)
71 	// changed:	becomes true if the size has changed or a change in the data occured,
72 	//          so the differential data (before encoding) is not all zero
73 	//
74 	// return:	new buffer with encoded data, must be deleted after use!
75 	//
76 	const uint8 *Encode(const uint8 *data, int inlen, int &outlen, bool &changed);
77 
78 	// Encode: source data (original or diff in diff mode)
79 	// Decode: store decoded data
80 	uint8 *m_buff;
81 	// Unpacked size
82 	int m_len;
83 	// Use differential encoding
84 	bool m_use_diff;
85 };
86 
87 
88 /*!
89  * Data difference is different for each EC client
90  */
91 class PartFileEncoderData {
92 protected:
93 	// number of sources for each part for progress bar colouring
94 	RLE_Data m_part_status;
95 	// gap list
96 	RLE_Data m_gap_status;
97 	// blocks requested for download
98 	RLE_Data m_req_status;
99 
100 public:
101 	//
102 	// decoder side - can be used everywhere
103 	void DecodeParts(const class CECTag * tag, ArrayOfUInts16 &outdata);
104 	void DecodeGaps(const class CECTag * tag, ArrayOfUInts64 &outdata);
105 	void DecodeReqs(const class CECTag * tag, ArrayOfUInts64 &outdata);
106 };
107 
108 #endif
109 
110 // File_checked_for_headers
111