Use CFile for ZipWriter
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user