NtfsExtraField constructor & helper static method, Cat refactoring, writing zip archive in destructor, using MemMappedFile
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user