API.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /* Copyright (C) Teemu Suutari */
  2. #include "ancient.hpp"
  3. #include "Decompressor.hpp"
  4. #include "common/Buffer.hpp"
  5. #include "common/StaticBuffer.hpp"
  6. #include "common/WrappedVectorBuffer.hpp"
  7. #include <memory>
  8. namespace ancient
  9. {
  10. namespace internal
  11. {
  12. namespace APIv2
  13. {
  14. class DecompressorImpl
  15. {
  16. public:
  17. ConstStaticBuffer _buffer;
  18. std::shared_ptr<Decompressor> _decompressor;
  19. public:
  20. DecompressorImpl(const std::vector<uint8_t> &packedData,bool exactSizeKnown,bool verify) :
  21. _buffer(packedData.data(), packedData.size()),
  22. _decompressor(Decompressor::create(_buffer, exactSizeKnown, verify))
  23. {
  24. return;
  25. }
  26. DecompressorImpl(const uint8_t *packedData,size_t packedSize,bool exactSizeKnown,bool verify) :
  27. _buffer(packedData, packedSize),
  28. _decompressor(Decompressor::create(_buffer, exactSizeKnown, verify))
  29. {
  30. return;
  31. }
  32. };
  33. }
  34. }
  35. inline namespace APIv2
  36. {
  37. Error::Error() noexcept
  38. {
  39. // nothing needed
  40. }
  41. Error::~Error()
  42. {
  43. // nothing needed
  44. }
  45. InvalidFormatError::InvalidFormatError() noexcept
  46. {
  47. // nothing needed
  48. }
  49. InvalidFormatError::~InvalidFormatError()
  50. {
  51. // nothing needed
  52. }
  53. DecompressionError::DecompressionError() noexcept
  54. {
  55. // nothing needed
  56. }
  57. DecompressionError::~DecompressionError()
  58. {
  59. // nothing needed
  60. }
  61. VerificationError::VerificationError() noexcept
  62. {
  63. // nothing needed
  64. }
  65. VerificationError::~VerificationError()
  66. {
  67. // nothing needed
  68. }
  69. // ---
  70. bool Decompressor::detect(const std::vector<uint8_t> &packedData) noexcept
  71. {
  72. return internal::Decompressor::detect(internal::ConstStaticBuffer(packedData.data(), packedData.size()));
  73. }
  74. bool Decompressor::detect(const uint8_t *packedData, size_t packedSize) noexcept
  75. {
  76. return internal::Decompressor::detect(internal::ConstStaticBuffer(packedData, packedSize));
  77. }
  78. Decompressor::Decompressor(const std::vector<uint8_t> &packedData,bool exactSizeKnown,bool verify) :
  79. m_impl(std::make_unique<internal::APIv2::DecompressorImpl>(packedData, exactSizeKnown, verify))
  80. {
  81. return;
  82. }
  83. Decompressor::Decompressor(const uint8_t *packedData,size_t packedSize,bool exactSizeKnown,bool verify) :
  84. m_impl(std::make_unique<internal::APIv2::DecompressorImpl>(packedData, packedSize, exactSizeKnown, verify))
  85. {
  86. return;
  87. }
  88. const std::string &Decompressor::getName() const noexcept
  89. {
  90. return m_impl->_decompressor->getName();
  91. }
  92. size_t Decompressor::getMaxPackedSize() noexcept
  93. {
  94. return internal::Decompressor::getMaxPackedSize();
  95. }
  96. size_t Decompressor::getMaxRawSize() noexcept
  97. {
  98. return internal::Decompressor::getMaxRawSize();
  99. }
  100. std::optional<size_t> Decompressor::getPackedSize() const noexcept
  101. {
  102. size_t packedSize=m_impl->_decompressor->getPackedSize();
  103. if (packedSize==0)
  104. {
  105. return std::nullopt;
  106. }
  107. return packedSize;
  108. }
  109. std::optional<size_t> Decompressor::getRawSize() const noexcept
  110. {
  111. size_t rawSize=m_impl->_decompressor->getRawSize();
  112. if (rawSize==0)
  113. {
  114. return std::nullopt;
  115. }
  116. return rawSize;
  117. }
  118. std::optional<size_t> Decompressor::getImageSize() const noexcept
  119. {
  120. size_t imageSize=m_impl->_decompressor->getImageSize();
  121. size_t imageOffset=m_impl->_decompressor->getImageOffset();
  122. bool isImage=((imageSize>0)||(imageOffset>0));
  123. if (!isImage)
  124. {
  125. return std::nullopt;
  126. }
  127. return imageSize;
  128. }
  129. std::optional<size_t> Decompressor::getImageOffset() const noexcept
  130. {
  131. size_t imageSize=m_impl->_decompressor->getImageSize();
  132. size_t imageOffset=m_impl->_decompressor->getImageOffset();
  133. bool isImage=((imageSize>0)||(imageOffset>0));
  134. if (!isImage)
  135. {
  136. return std::nullopt;
  137. }
  138. return imageOffset;
  139. }
  140. std::vector<uint8_t> Decompressor::decompress(bool verify)
  141. {
  142. std::vector<uint8_t> result((m_impl->_decompressor->getRawSize())?m_impl->_decompressor->getRawSize():m_impl->_decompressor->getMaxRawSize());
  143. {
  144. internal::WrappedVectorBuffer buffer(result);
  145. m_impl->_decompressor->decompress(buffer, verify);
  146. }
  147. result.resize(m_impl->_decompressor->getRawSize());
  148. result.shrink_to_fit();
  149. return result;
  150. }
  151. Decompressor::~Decompressor()
  152. {
  153. // nothing needed
  154. }
  155. }
  156. }