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