1 // Copyright © 2017 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #ifndef GZIP_FORMAT_H
5 #define GZIP_FORMAT_H
6 
7 #include <string>
8 
9 namespace gzip {
10 	struct GZipException {};
11 	struct DecompressionFailedException : public GZipException {};
12 	struct CompressionFailedException : public GZipException {};
13 
14 	// Checks if the data block could plausibly be a GZip file.
15 	// This really just checks for the magic GZip bytes and a basic length check.
16 	bool IsGZipFormat(const unsigned char *data, size_t length);
17 
18 	// Decompresses a compressed block.
19 	// If the input starts with GZip header marker bytes then it will interpret the input as GZip data.
20 	// If the input does not start with the GZip header marker then it will assume it's a plain DEFLATE
21 	// input and decompress it as such.
22 	std::string DecompressDeflateOrGZip(const unsigned char *data, size_t length);
23 
24 	// Decompress GZip format data.
25 	// This tries to follow RFC 1952 (GZip format).
26 	// If the input fails format or CRC checks then it will throw an exception.
27 	std::string DecompressGZip(const unsigned char *data, size_t length);
28 
29 	// Wrapper for miniz inflate function; assumes no header.
30 	std::string DecompressRawDeflate(const unsigned char *data, size_t length);
31 
32 	// Compresses a block of data and adds a GZip format header.
33 	// This tries to follow RFC 1952 (GZip format).
34 	// If compression fails it throws an exception.
35 	// Parameter 'inner_file_name' is the name written in the GZip header as the file name of the compressed block.
36 	std::string CompressGZip(const std::string &data, const std::string &inner_file_name);
37 } // namespace gzip
38 
39 #endif
40