NtfsExtraField constructor & helper static method, Cat refactoring, writing zip archive in destructor, using MemMappedFile

This commit is contained in:
Vladyslav Baranovskyi
2024-11-25 19:32:53 +02:00
parent 2a331011d5
commit 7ede43d1c2
2 changed files with 40 additions and 35 deletions

View File

@@ -12,6 +12,7 @@
#include "ZipWriter.hpp"
#include "Base/Utils.hpp"
#include "IO/MemMappedFile.hpp"
#include "Math/CRC32.hpp"
#include <ctime>
@@ -71,6 +72,19 @@ namespace
uint64_t modTime; // 64-bit NTFS file last modification time
uint64_t acTime; // 64-bit NTFS file last access time
uint64_t crTime; // 64-bit NTFS file creation time
static uint64_t TimetToWinFileTime(time_t t)
{
// See references for details
return (t * 10000000LL) + 116444736000000000LL;
}
NtfsExtraField(time_t modTime, time_t acTime, time_t crTime)
{
this->modTime = TimetToWinFileTime(modTime);
this->acTime = TimetToWinFileTime(acTime);
this->crTime = TimetToWinFileTime(crTime);
}
};
struct EndOfCentralDirectoryHeader
@@ -92,14 +106,6 @@ namespace
static_assert(sizeof(EndOfCentralDirectoryHeader) == 22, "Well packed struct");
static_assert(sizeof(NtfsExtraField) == 36, "Well packed struct");
template<typename T>
uint32_t Cat(std::vector<uint8_t>& dest, T* thing)
{
uint32_t startOffset = dest.size();
dest.insert(dest.end(), (uint8_t *)thing, (uint8_t *)(thing + 1));
return startOffset;
}
uint32_t Cat(std::vector<uint8_t>& dest, size_t size, uint8_t* thing)
{
uint32_t startOffset = dest.size();
@@ -107,16 +113,15 @@ namespace
return startOffset;
}
uint32_t Cat(std::vector<uint8_t>& dest, const std::vector<uint8_t>& thing)
template<typename T>
uint32_t Cat(std::vector<uint8_t>& dest, T* thing)
{
uint32_t startOffset = Cat(dest, thing.size(), (uint8_t*)thing.data());
return startOffset;
return Cat(dest, sizeof(T), reinterpret_cast<uint8_t*>(thing));
}
void TimetToFileTime(time_t t, uint64_t* lpWinFileTime)
uint32_t Cat(std::vector<uint8_t>& dest, const std::vector<uint8_t>& thing)
{
// See references for details
*lpWinFileTime = (t * 10000000LL) + 116444736000000000LL;
return Cat(dest, thing.size(), const_cast<uint8_t*>(thing.data()));
}
std::pair<uint16_t, uint16_t> ConvertToDosTimeDate(time_t time)
@@ -186,10 +191,7 @@ namespace OpenVulkano
cdfh.externalFileAttribs = 32; // NOTE(vb): I've no idea wtf is this value mean
cdfh.relativeOffsetOfLocalFileHeader = headerOffset;
NtfsExtraField ntfs;
TimetToFileTime(modTime, &ntfs.modTime);
TimetToFileTime(accessTime, &ntfs.acTime);
TimetToFileTime(createTime, &ntfs.crTime);
NtfsExtraField ntfs(modTime, accessTime, createTime);
Cat(m_centralDirs, &cdfh);
Cat(m_centralDirs, fileNameLength, fileName);
@@ -200,26 +202,29 @@ namespace OpenVulkano
void ZipWriter::AddFile(const std::filesystem::path& fileName, const char* inArchiveName)
{
auto data = Utils::ReadFile(fileName.string());
auto desc = OpenVulkano::FileDescription::MakeDescriptionForFile(inArchiveName, data.Size());
AddFile(desc, data.Data());
MemMappedFile file = MemMappedFile(fileName.string());
auto desc = OpenVulkano::FileDescription::MakeDescriptionForFile(inArchiveName, file.Size());
AddFile(desc, file.Data());
}
void ZipWriter::Close()
ZipWriter::~ZipWriter()
{
int centralDirsOffset = 0;
if (m_numFiles)
if (m_file)
{
centralDirsOffset = ftell(m_file);
fwrite(m_centralDirs.data(), m_centralDirs.size(), 1, m_file);
m_centralDirs.clear();
int centralDirsOffset = 0;
if (m_numFiles)
{
centralDirsOffset = ftell(m_file);
fwrite(m_centralDirs.data(), m_centralDirs.size(), 1, m_file);
m_centralDirs.clear();
}
EndOfCentralDirectoryHeader eocd;
eocd.centralDirectoryEntries = eocd.totalCentralDirectoryEntries = m_numFiles;
eocd.centralDirectoryOffset = centralDirsOffset;
fwrite(&eocd, sizeof(eocd), 1, m_file);
fclose(m_file);
}
EndOfCentralDirectoryHeader eocd;
eocd.centralDirectoryEntries = eocd.totalCentralDirectoryEntries = m_numFiles;
eocd.centralDirectoryOffset = centralDirsOffset;
fwrite(&eocd, sizeof(eocd), 1, m_file);
fclose(m_file);
}
}