diff --git a/openVulkanoCpp/IO/Archive/ZipWriter.cpp b/openVulkanoCpp/IO/Archive/ZipWriter.cpp index a9c1375..77994c4 100644 --- a/openVulkanoCpp/IO/Archive/ZipWriter.cpp +++ b/openVulkanoCpp/IO/Archive/ZipWriter.cpp @@ -12,6 +12,7 @@ #include "ZipWriter.hpp" #include "Base/Utils.hpp" +#include "IO/MemMappedFile.hpp" #include "Math/CRC32.hpp" #include @@ -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 - uint32_t Cat(std::vector& 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& dest, size_t size, uint8_t* thing) { uint32_t startOffset = dest.size(); @@ -107,16 +113,15 @@ namespace return startOffset; } - uint32_t Cat(std::vector& dest, const std::vector& thing) + template + uint32_t Cat(std::vector& dest, T* thing) { - uint32_t startOffset = Cat(dest, thing.size(), (uint8_t*)thing.data()); - return startOffset; + return Cat(dest, sizeof(T), reinterpret_cast(thing)); } - void TimetToFileTime(time_t t, uint64_t* lpWinFileTime) + uint32_t Cat(std::vector& dest, const std::vector& thing) { - // See references for details - *lpWinFileTime = (t * 10000000LL) + 116444736000000000LL; + return Cat(dest, thing.size(), const_cast(thing.data())); } std::pair 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); } } \ No newline at end of file diff --git a/openVulkanoCpp/IO/Archive/ZipWriter.hpp b/openVulkanoCpp/IO/Archive/ZipWriter.hpp index 7b25be8..0ae044c 100644 --- a/openVulkanoCpp/IO/Archive/ZipWriter.hpp +++ b/openVulkanoCpp/IO/Archive/ZipWriter.hpp @@ -21,9 +21,9 @@ namespace OpenVulkano public: ZipWriter(const std::filesystem::path& filePath); + ~ZipWriter(); void AddFile(const FileDescription& description, const void* buffer); void AddFile(const std::filesystem::path& fileName, const char* inArchiveName); - void Close(); }; } \ No newline at end of file