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

View File

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