From ba9d37cc6f55370973ae1e4d62238d640241bf99 Mon Sep 17 00:00:00 2001 From: Vladyslav Baranovskyi Date: Thu, 28 Nov 2024 16:48:22 +0200 Subject: [PATCH] Added operator bool for ZipWriter, filling centralDirSize, padding zip via extraField --- openVulkanoCpp/IO/Archive/ZipWriter.cpp | 31 ++++++++++++++++++------- openVulkanoCpp/IO/Archive/ZipWriter.hpp | 1 + 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/openVulkanoCpp/IO/Archive/ZipWriter.cpp b/openVulkanoCpp/IO/Archive/ZipWriter.cpp index a5c12a8..b4b8a4f 100644 --- a/openVulkanoCpp/IO/Archive/ZipWriter.cpp +++ b/openVulkanoCpp/IO/Archive/ZipWriter.cpp @@ -179,23 +179,34 @@ namespace OpenVulkano time_t accessTime = modTime; // FileDescription doesn't have this field auto [dosTime, dosDate] = ConvertToDosTimeDate(modTime); - if (m_pad) - { - size_t headerSize = sizeof(LocalFileHeader) + fileNameLength; - size_t padding = 64 - ((ftell(m_file) + headerSize) & 63); - ZFill<64>(m_file, padding); - } - LocalFileHeader lfh; lfh.fileLastModTime = dosTime; lfh.fileLastModDate = dosDate; lfh.crc32 = crc32; lfh.compressedSize = lfh.uncompressedSize = fileSize; lfh.fileNameLength = fileNameLength; + + if (m_pad) + { + size_t headerSize = sizeof(LocalFileHeader) + fileNameLength; + size_t padding = 64 - ((ftell(m_file) + headerSize) & 63); + if (padding < 4) padding += 64; + lfh.extraFieldLength = padding; + } size_t headerOffset = ftell(m_file); fwrite(&lfh, sizeof(lfh), 1, m_file); fwrite(fileName, fileNameLength, 1, m_file); + + if (m_pad) + { + uint16_t marker = 6534; + uint16_t dataSize = lfh.extraFieldLength - 4; + fwrite(&marker, sizeof(uint16_t), 1, m_file); + fwrite(&dataSize, sizeof(uint16_t), 1, m_file); + ZFill<128>(m_file, dataSize); + } + fwrite(buffer, fileSize, 1, m_file); CentalDirectoryFileHeader cdfh; @@ -229,17 +240,19 @@ namespace OpenVulkano if (IsOpen()) { int centralDirsOffset = 0; + size_t centralDirsSize = m_centralDirs.size(); if (m_numFiles) { centralDirsOffset = ftell(m_file); - fwrite(m_centralDirs.data(), m_centralDirs.size(), 1, m_file); + fwrite(m_centralDirs.data(), centralDirsSize, 1, m_file); m_centralDirs.clear(); } EndOfCentralDirectoryHeader eocd; eocd.centralDirectoryEntries = eocd.totalCentralDirectoryEntries = m_numFiles; eocd.centralDirectoryOffset = centralDirsOffset; - + eocd.centralDirectorySize = centralDirsSize; + fwrite(&eocd, sizeof(eocd), 1, m_file); fclose(m_file); } diff --git a/openVulkanoCpp/IO/Archive/ZipWriter.hpp b/openVulkanoCpp/IO/Archive/ZipWriter.hpp index 24be87a..d93e6f1 100644 --- a/openVulkanoCpp/IO/Archive/ZipWriter.hpp +++ b/openVulkanoCpp/IO/Archive/ZipWriter.hpp @@ -25,6 +25,7 @@ namespace OpenVulkano ~ZipWriter(); bool IsOpen() const { return m_file != nullptr; } + operator bool() const { return IsOpen(); } void AddFile(const FileDescription& description, const void* buffer); void AddFile(const std::filesystem::path& fileName, const char* inArchiveName);