Added operator bool for ZipWriter, filling centralDirSize, padding zip via extraField

This commit is contained in:
Vladyslav Baranovskyi
2024-11-28 16:48:22 +02:00
parent 2d936096e7
commit ba9d37cc6f
2 changed files with 23 additions and 9 deletions

View File

@@ -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);
}