From 351b6bb1eac186adcec9f597e499b306db0c0fc1 Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 2 Jan 2025 17:36:03 +0100 Subject: [PATCH] feat: write iwi data to specified iwds --- src/ObjCompiling/Iwd/IwdCreator.cpp | 64 ++++++++++++++++++- src/ObjWriting/ObjContainer/IWD/IWDWriter.cpp | 0 src/ObjWriting/ObjContainer/IWD/IWDWriter.h | 0 3 files changed, 62 insertions(+), 2 deletions(-) delete mode 100644 src/ObjWriting/ObjContainer/IWD/IWDWriter.cpp delete mode 100644 src/ObjWriting/ObjContainer/IWD/IWDWriter.h diff --git a/src/ObjCompiling/Iwd/IwdCreator.cpp b/src/ObjCompiling/Iwd/IwdCreator.cpp index 96dd7adb..833e7dfe 100644 --- a/src/ObjCompiling/Iwd/IwdCreator.cpp +++ b/src/ObjCompiling/Iwd/IwdCreator.cpp @@ -2,8 +2,11 @@ #include "Utils/FileToZlibWrapper.h" +#include #include +#include #include +#include IwdToCreate::IwdToCreate(std::string name) : m_name(std::move(name)) @@ -17,10 +20,63 @@ void IwdToCreate::AddFile(std::string filePath) void IwdToCreate::Build(ISearchPath& searchPath, const std::filesystem::path& outPath) { - std::cout << std::format("Creating iwd {} with {} entries:\n", m_name, m_file_paths.size()); + auto filePath = outPath / std::format("{}.iwd", m_name); + std::ofstream file(filePath, std::ios::out | std::ios::binary); + if (!file.is_open()) + { + std::cerr << std::format("Failed to open file for iwd {}\n", m_name); + return; + } + + auto functions = FileToZlibWrapper::CreateFunctions32ForFile(&file); + + auto zipFile = zipOpen2(filePath.c_str(), APPEND_STATUS_CREATE, nullptr, &functions); + if (!zipFile) + { + std::cerr << std::format("Failed to open file as zip for iwd {}\n", m_name); + return; + } for (const auto& filePath : m_file_paths) - std::cout << std::format(" {}\n", filePath); + { + auto readFile = searchPath.Open(filePath); + if (!readFile.IsOpen()) + { + std::cerr << std::format("Failed to open file for iwd: {}\n", filePath); + continue; + } + + auto localNow = std::chrono::zoned_time{std::chrono::current_zone(), std::chrono::system_clock::now()}.get_local_time(); + auto nowDays = std::chrono::floor(localNow); + std::chrono::year_month_day ymd(std::chrono::floor(localNow)); + std::chrono::hh_mm_ss hms(std::chrono::floor(localNow - nowDays)); + + zip_fileinfo fileInfo{}; + fileInfo.dosDate = 0u; + fileInfo.tmz_date.tm_year = static_cast(ymd.year()); + fileInfo.tmz_date.tm_mon = static_cast(static_cast(ymd.month()) - static_cast(std::chrono::January)); + fileInfo.tmz_date.tm_mday = static_cast(static_cast(ymd.day())); + fileInfo.tmz_date.tm_hour = static_cast(hms.hours().count()); + fileInfo.tmz_date.tm_min = static_cast(hms.minutes().count()); + fileInfo.tmz_date.tm_sec = static_cast(hms.seconds().count()); + zipOpenNewFileInZip(zipFile, filePath.c_str(), &fileInfo, nullptr, 0, nullptr, 0, nullptr, Z_DEFLATED, Z_DEFAULT_COMPRESSION); + + char tempBuffer[0x1000]; + + do + { + readFile.m_stream->read(tempBuffer, sizeof(tempBuffer)); + const auto readCount = readFile.m_stream->gcount(); + if (readCount > 0) + zipWriteInFileInZip(zipFile, tempBuffer, readCount); + } while (!readFile.m_stream->eof()); + + zipCloseFileInZip(zipFile); + } + + zipClose(zipFile, nullptr); + + std::cout << std::format("Created iwd {} with {} entries\n", m_name, m_file_paths.size()); } IwdToCreate* IwdCreator::GetOrAddIwd(const std::string& iwdName) @@ -38,6 +94,10 @@ IwdToCreate* IwdCreator::GetOrAddIwd(const std::string& iwdName) void IwdCreator::Finalize(ISearchPath& searchPath, const std::filesystem::path& outPath) { + std::cout << std::format("Writing {} iwd files to disk\n", m_iwds.size()); for (const auto& iwdToCreate : m_iwds) iwdToCreate->Build(searchPath, outPath); + + m_iwds.clear(); + m_iwd_lookup.clear(); } diff --git a/src/ObjWriting/ObjContainer/IWD/IWDWriter.cpp b/src/ObjWriting/ObjContainer/IWD/IWDWriter.cpp deleted file mode 100644 index e69de29b..00000000 diff --git a/src/ObjWriting/ObjContainer/IWD/IWDWriter.h b/src/ObjWriting/ObjContainer/IWD/IWDWriter.h deleted file mode 100644 index e69de29b..00000000