Use CFile for ZipWriter

This commit is contained in:
Georg Hagen
2025-11-16 18:39:11 +01:00
parent c6d23886be
commit 74d369869f
2 changed files with 22 additions and 23 deletions

View File

@@ -157,27 +157,26 @@ namespace
namespace OpenVulkano
{
ZipWriter::ZipWriter(const std::filesystem::path& filePath, bool alignHeadersBy64)
ZipWriter::ZipWriter(const std::filesystem::path& filePath, const bool alignHeadersBy64)
: m_file(filePath, CFile::WRITE_BINARY), m_pad(alignHeadersBy64)
{
m_file = fopen(filePath.string().c_str(), "wb");
if (!m_file)
{
throw std::runtime_error("Unable to open file for writing: " + filePath.string());
}
m_pad = alignHeadersBy64;
}
void ZipWriter::AddFile(const FileDescription& description, const void* buffer)
{
size_t fileSize = description.size;
size_t fileNameLength = description.path.size();
uint8_t *fileName = (uint8_t*)description.path.data();
const size_t fileSize = description.size;
const size_t fileNameLength = description.path.size();
const uint8_t* fileName = (uint8_t*)description.path.data();
CRC32 crc;
crc.Update(fileSize, (const uint8_t *)buffer);
uint32_t crc32 = crc.GetValue();
time_t createTime = description.createTime;
time_t modTime = description.modTime;
time_t accessTime = modTime; // FileDescription doesn't have this field
crc.Update(fileSize, (const uint8_t*)buffer);
const uint32_t crc32 = crc.GetValue();
const time_t createTime = description.createTime;
const time_t modTime = description.modTime;
const time_t accessTime = modTime; // FileDescription doesn't have this field
auto [dosTime, dosDate] = ConvertToDosTimeDate(modTime);
LocalFileHeader lfh;
@@ -196,19 +195,19 @@ namespace OpenVulkano
}
size_t headerOffset = ftell(m_file);
fwrite(&lfh, sizeof(lfh), 1, m_file);
fwrite(fileName, fileNameLength, 1, m_file);
m_file.Write(&lfh, sizeof(lfh), 1);
m_file.Write(fileName, fileNameLength);
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);
m_file.Write(&marker, sizeof(uint16_t));
m_file.Write(&dataSize, sizeof(uint16_t));
ZFill<128>(m_file, dataSize);
}
fwrite(buffer, fileSize, 1, m_file);
m_file.Write(buffer, fileSize);
CentralDirectoryFileHeader cdfh;
cdfh.fileLastModTime = dosTime;
@@ -241,11 +240,11 @@ namespace OpenVulkano
if (IsOpen())
{
int centralDirsOffset = 0;
size_t centralDirsSize = m_centralDirs.size();
const size_t centralDirsSize = m_centralDirs.size();
if (m_numFiles)
{
centralDirsOffset = ftell(m_file);
fwrite(m_centralDirs.data(), centralDirsSize, 1, m_file);
m_file.Write(m_centralDirs.data(), centralDirsSize);
m_centralDirs.clear();
}
@@ -254,8 +253,7 @@ namespace OpenVulkano
eocd.centralDirectoryOffset = centralDirsOffset;
eocd.centralDirectorySize = centralDirsSize;
fwrite(&eocd, sizeof(eocd), 1, m_file);
fclose(m_file);
m_file.Write(&eocd, sizeof(eocd));
}
}
}

View File

@@ -5,6 +5,7 @@
*/
#pragma once
#include "IO/CFile.hpp"
#include "IO/FileDescription.hpp"
#include <string>
@@ -18,13 +19,13 @@ namespace OpenVulkano
std::vector<uint8_t> m_centralDirs;
int m_numFiles = 0;
bool m_pad = false;
FILE* m_file;
CFile m_file;
public:
ZipWriter(const std::filesystem::path& filePath, bool alignHeadersby64 = false);
ZipWriter(const std::filesystem::path& filePath, bool alignHeadersBy64 = false);
~ZipWriter();
bool IsOpen() const { return m_file != nullptr; }
bool IsOpen() const { return m_file; }
operator bool() const { return IsOpen(); }
void AddFile(const FileDescription& description, const void* buffer);