Added operator bool for ZipWriter, filling centralDirSize, padding zip via extraField
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user