Compression.cpp (3267B)
1 // Copyright (c) Microsoft Corporation. 2 // Licensed under the MIT License. 3 #include "pch.h" 4 #include "Public/winget/Compression.h" 5 6 namespace AppInstaller::Compression 7 { 8 Compressor::Compressor(DWORD algorithm) 9 { 10 THROW_IF_WIN32_BOOL_FALSE(CreateCompressor(algorithm, nullptr, &m_compressor)); 11 } 12 13 std::vector<uint8_t> Compressor::Compress(std::string_view data) 14 { 15 std::vector<uint8_t> result; 16 17 if (!data.empty()) 18 { 19 SIZE_T compressedBufferSize = 0; 20 THROW_HR_IF(E_UNEXPECTED, ::Compress(m_compressor.get(), data.data(), data.size(), nullptr, 0, &compressedBufferSize)); 21 THROW_LAST_ERROR_IF(GetLastError() != ERROR_INSUFFICIENT_BUFFER); 22 23 result.resize(compressedBufferSize); 24 25 SIZE_T compressedDataSize = 0; 26 THROW_IF_WIN32_BOOL_FALSE(::Compress(m_compressor.get(), data.data(), data.size(), &result[0], result.size(), &compressedDataSize)); 27 28 result.resize(compressedDataSize); 29 } 30 31 return result; 32 } 33 34 void Compressor::Reset() 35 { 36 THROW_IF_WIN32_BOOL_FALSE(ResetCompressor(m_compressor.get())); 37 } 38 39 void Compressor::SetInformation(COMPRESS_INFORMATION_CLASS information, DWORD value) 40 { 41 THROW_IF_WIN32_BOOL_FALSE(SetCompressorInformation(m_compressor.get(), information, &value, sizeof(value))); 42 } 43 44 DWORD Compressor::GetInformation(COMPRESS_INFORMATION_CLASS information) 45 { 46 DWORD result = 0; 47 THROW_IF_WIN32_BOOL_FALSE(QueryCompressorInformation(m_compressor.get(), information, &result, sizeof(result))); 48 return result; 49 } 50 51 Decompressor::Decompressor(DWORD algorithm) 52 { 53 THROW_IF_WIN32_BOOL_FALSE(CreateDecompressor(algorithm, nullptr, &m_decompressor)); 54 } 55 56 std::vector<uint8_t> Decompressor::Decompress(const std::vector<uint8_t>& data) 57 { 58 std::vector<uint8_t> result; 59 60 if (!data.empty()) 61 { 62 SIZE_T decompressedBufferSize = 0; 63 THROW_HR_IF(E_UNEXPECTED, ::Decompress(m_decompressor.get(), data.data(), data.size(), nullptr, 0, &decompressedBufferSize)); 64 THROW_LAST_ERROR_IF(GetLastError() != ERROR_INSUFFICIENT_BUFFER); 65 66 result.resize(decompressedBufferSize); 67 68 SIZE_T decompressedDataSize = 0; 69 THROW_IF_WIN32_BOOL_FALSE(::Decompress(m_decompressor.get(), data.data(), data.size(), &result[0], result.size(), &decompressedDataSize)); 70 71 result.resize(decompressedDataSize); 72 } 73 74 return result; 75 } 76 77 void Decompressor::Reset() 78 { 79 THROW_IF_WIN32_BOOL_FALSE(ResetDecompressor(m_decompressor.get())); 80 } 81 82 void Decompressor::SetInformation(COMPRESS_INFORMATION_CLASS information, DWORD value) 83 { 84 THROW_IF_WIN32_BOOL_FALSE(SetDecompressorInformation(m_decompressor.get(), information, &value, sizeof(value))); 85 } 86 87 DWORD Decompressor::GetInformation(COMPRESS_INFORMATION_CLASS information) 88 { 89 DWORD result = 0; 90 THROW_IF_WIN32_BOOL_FALSE(QueryDecompressorInformation(m_decompressor.get(), information, &result, sizeof(result))); 91 return result; 92 } 93 }