| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 | /* Copyright (C) Teemu Suutari */#ifndef ANCIENT_ANCIENT_HPP#define ANCIENT_ANCIENT_HPP#ifndef ANCIENT_API#if defined(ANCIENT_API_DECLSPEC_DLLEXPORT)#define ANCIENT_API __declspec(dllexport)#endif#if defined(ANCIENT_API_DECLSPEC_DLLIMPORT)#define ANCIENT_API __declspec(dllimport)#endif#if defined(ANCIENT_API_VISIBILITY_DEFAULT_USED)#define ANCIENT_API __attribute__((visibility("default"))) __attribute__((used))#endif#if defined(ANCIENT_API_VISIBILITY_DEFAULT)#define ANCIENT_API __attribute__((visibility("default")))#endif#if defined(ANCIENT_API_VISIBILITY_HIDDEN)#define ANCIENT_API __attribute__((visibility("hidden")))#endif#ifndef ANCIENT_API#define ANCIENT_API#endif#endif#include <exception>#include <memory>#include <optional>#include <string>#include <vector>#include <cstddef>#include <cstdint>namespace ancient{namespace internal{namespace APIv2{class DecompressorImpl;}}inline namespace APIv2{// just a base class to easily catch all the errorsclass ANCIENT_API Error : public std::exception{public:	Error() noexcept;	virtual ~Error();};class ANCIENT_API InvalidFormatError : public Error{public:	InvalidFormatError() noexcept;	virtual ~InvalidFormatError();};class ANCIENT_API DecompressionError : public Error{public:	DecompressionError() noexcept;	virtual ~DecompressionError();};class ANCIENT_API VerificationError : public Error{public:	VerificationError() noexcept;	virtual ~VerificationError();};class ANCIENT_API Decompressor final{public:	// Detect signature whether it matches to any known compressor	// This does not guarantee the data is decompressable though, only signature is read	static bool detect(const std::vector<uint8_t> &packedData) noexcept;	static bool detect(const uint8_t *packedData,size_t packedSize) noexcept;	// Main entrypoint	// if verify=true then check the packedData for errors: CRC or other checksum if available	// check exactSizeKnown from size documentation	// can throw InvalidFormatError if stream is not recognized or it is invalid	// can throw VerificationError if verify enabled and checksum does not match	explicit Decompressor(const std::vector<uint8_t> &packedData,bool exactSizeKnown,bool verify);	explicit Decompressor(const uint8_t *packedData,size_t packedSize,bool exactSizeKnown,bool verify);	// Name returned is human readable long name	const std::string &getName() const noexcept;	// the functions are there to protect against "accidental" large files when parsing headers	// a.k.a. 16M should be enough for everybody (sizes do not have to accurate i.e.	// compressors can exclude header content for simplification)	// This entirely ok for the context of "old computers" and their files,	// for other usages these need to be tuned up	static size_t getMaxPackedSize() noexcept;	static size_t getMaxRawSize() noexcept;	// PackedSize or RawSize are taken from the stream if available, std::nullopt otherwise.	// for those compressors having no known sizes, running decompression will update	// the values.	// There are exceptions: Some decompressors need to exact size of the packed data	// in order to decompress. For those providing a indefinitely size packed stream	// will not work	// use the "exactSizeKnown" flag for create to tell whether you know the size or not	std::optional<size_t> getPackedSize() const noexcept;	std::optional<size_t> getRawSize() const noexcept;	// in case of disk image based formats the data does not necessarily start	// from logical beginnig of the image but it is offsetted inside the logical image (f.e. DMS).	// getDataOffset will return the offset which can also be 0, or std::nullopt if not image-based format.	// getImageSize will return the size of the the logical image, or std::nullopt if not image-based format.	std::optional<size_t> getImageSize() const noexcept;	std::optional<size_t> getImageOffset() const noexcept;	// Actual decompression.	// verify checksum if verify==true	// can throw DecompressionError if stream cant be unpacked	// can throw VerificationError if verify enabled and checksum does not match	std::vector<uint8_t> decompress(bool verify);	~Decompressor();private:	std::unique_ptr<internal::APIv2::DecompressorImpl> m_impl;private:	Decompressor(const Decompressor&)=delete;	Decompressor& operator=(const Decompressor&)=delete;};}}#endif
 |