diff --git a/src/libs/utils/impl/Zipper.cpp b/src/libs/utils/impl/Zipper.cpp index 8c0f901e..b189fd28 100644 --- a/src/libs/utils/impl/Zipper.cpp +++ b/src/libs/utils/impl/Zipper.cpp @@ -176,8 +176,22 @@ namespace Zip throw ZipperException {"Cannot get file size for '" + filePath.string() + "': " + ec.message()}; _files[filename] = std::move(fileContext); + + _totalZipSize += LocalFileHeader::getHeaderSize(); + _totalZipSize += filename.size(); + if (fileContext.fileSize > 0) + { + _totalZipSize += fileContext.fileSize; + _totalZipSize += DataDescriptor::getHeaderSize(); + _totalZipSize += CentralDirectoryHeader::getHeaderSize(); + _totalZipSize += filename.size(); + } } + _totalZipSize += EndOfCentralDirectoryRecord::getHeaderSize(); + if (_totalZipSize > UINT32_MAX) + throw ZipperException {"Cannot create a zip file which is larger than " + std::to_string(UINT32_MAX) + " bytes!"}; + _currentFile = std::begin(_files); } diff --git a/src/libs/utils/include/utils/Zipper.hpp b/src/libs/utils/include/utils/Zipper.hpp index 57281078..d464abe2 100644 --- a/src/libs/utils/include/utils/Zipper.hpp +++ b/src/libs/utils/include/utils/Zipper.hpp @@ -39,12 +39,16 @@ namespace Zip { public: + using SizeZype = std::uint64_t; + Zipper(const std::map& files); static constexpr std::size_t minOutputBufferSize = 64; std::size_t writeSome(std::byte* buffer, std::size_t bufferSize); bool isComplete() const; + SizeZype getTotalZipFile() const { return _totalZipSize; } + private: void setComplete(); @@ -79,6 +83,7 @@ namespace Zip Complete, }; + SizeZype _totalZipSize {}; WriteState _writeState {WriteState::LocalFileHeader}; FileContainer::iterator _currentFile; std::size_t _currentOffset {}; diff --git a/src/tools/zipper/LmsZipper.cpp b/src/tools/zipper/LmsZipper.cpp index bbeb8403..7ec889e1 100644 --- a/src/tools/zipper/LmsZipper.cpp +++ b/src/tools/zipper/LmsZipper.cpp @@ -57,15 +57,25 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } - Zipper zipper {files}; - - while (!zipper.isComplete()) + try { - //std::array buffer; - std::array buffer; + Zipper zipper {files}; - std::size_t nbWrittenBytes {zipper.writeSome(buffer.data(), buffer.size())}; - ofs.write(reinterpret_cast(buffer.data()), nbWrittenBytes); + while (!zipper.isComplete()) + { + //std::array buffer; + std::array buffer; + + std::size_t nbWrittenBytes {zipper.writeSome(buffer.data(), buffer.size())}; + ofs.write(reinterpret_cast(buffer.data()), nbWrittenBytes); + } + + std::cout << "Total zip size = " << zipper.getTotalZipFile() << std::endl; + } + catch (const ZipperException& e) + { + std::cerr << "Caught Zipper exception: " << e.what() << std::endl; + return EXIT_FAILURE; } return EXIT_SUCCESS;