PPDecompressor.hpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /* Copyright (C) Teemu Suutari */
  2. #ifndef PPDECOMPRESSOR_HPP
  3. #define PPDECOMPRESSOR_HPP
  4. #include "Decompressor.hpp"
  5. #include "XPKDecompressor.hpp"
  6. namespace ancient::internal
  7. {
  8. class PPDecompressor : public Decompressor, public XPKDecompressor
  9. {
  10. private:
  11. class PPState : public XPKDecompressor::State
  12. {
  13. public:
  14. PPState(uint32_t mode);
  15. virtual ~PPState();
  16. uint32_t _cachedMode;
  17. };
  18. public:
  19. PPDecompressor(const Buffer &packedData,bool exactSizeKnown,bool verify);
  20. PPDecompressor(uint32_t hdr,uint32_t recursionLevel,const Buffer &packedData,std::shared_ptr<XPKDecompressor::State> &state,bool verify);
  21. virtual ~PPDecompressor();
  22. virtual const std::string &getName() const noexcept override final;
  23. virtual const std::string &getSubName() const noexcept override final;
  24. virtual size_t getPackedSize() const noexcept override final;
  25. virtual size_t getRawSize() const noexcept override final;
  26. virtual void decompressImpl(Buffer &rawData,bool verify) override final;
  27. virtual void decompressImpl(Buffer &rawData,const Buffer &previousData,bool verify) override final;
  28. static bool detectHeader(uint32_t hdr) noexcept;
  29. static bool detectHeaderXPK(uint32_t hdr) noexcept;
  30. static std::shared_ptr<Decompressor> create(const Buffer &packedData,bool exactSizeKnown,bool verify);
  31. static std::shared_ptr<XPKDecompressor> create(uint32_t hdr,uint32_t recursionLevel,const Buffer &packedData,std::shared_ptr<XPKDecompressor::State> &state,bool verify);
  32. private:
  33. const Buffer &_packedData;
  34. size_t _dataStart=0;
  35. size_t _rawSize=0;
  36. uint8_t _startShift=0;
  37. uint8_t _modeTable[4];
  38. bool _isXPK=false;
  39. };
  40. }
  41. #endif