- Removed ReadEntireFile
- ZipWriter now writes directly to a file when possible
- Added GetIndex to geometry
- Moved Usd and Obj generators to different files
- Removed unused procedures
- Deduplicated obj generators
- Updated tests for ZipWriter
This commit is contained in:
Vladyslav Baranovskyi
2024-11-22 15:45:57 +02:00
parent 35e80a99e6
commit ac843c0fe3
8 changed files with 330 additions and 417 deletions

View File

@@ -11,6 +11,7 @@
*/
#include "ZipWriter.hpp"
#include "Base/Utils.hpp"
#include "Math/CRC32.hpp"
#include <ctime>
@@ -91,22 +92,6 @@ namespace
static_assert(sizeof(EndOfCentralDirectoryHeader) == 22, "Well packed struct");
static_assert(sizeof(NtfsExtraField) == 36, "Well packed struct");
std::vector<uint8_t> ReadEntireFile(const std::string& fname)
{
FILE *file = fopen(fname.c_str(), "rb");
std::vector<uint8_t> buffer;
if(file)
{
fseek(file, 0, SEEK_END);
size_t size = ftell(file);
fseek(file, 0, SEEK_SET);
buffer.resize(size);
fread(buffer.data(), size, 1, file);
fclose(file);
}
return buffer;
}
template<typename T>
uint32_t Cat(std::vector<uint8_t>& dest, T* thing)
{
@@ -157,6 +142,15 @@ namespace
namespace OpenVulkano
{
ZipWriter::ZipWriter(const std::filesystem::path& filePath)
{
m_file = fopen(filePath.string().c_str(), "wb");
if (!m_file)
{
throw std::runtime_error("Unable to open file for writing: " + filePath.string());
}
}
void ZipWriter::AddFile(const FileDescription& description, const void* buffer)
{
size_t fileSize = description.size;
@@ -177,9 +171,10 @@ namespace OpenVulkano
lfh.compressedSize = lfh.uncompressedSize = fileSize;
lfh.fileNameLength = fileNameLength;
size_t headerOffset = Cat(m_headers, &lfh);
Cat(m_headers, fileNameLength, fileName);
Cat(m_headers, description.size, (uint8_t *)buffer);
size_t headerOffset = ftell(m_file);
fwrite(&lfh, sizeof(lfh), 1, m_file);
fwrite(fileName, fileNameLength, 1, m_file);
fwrite(buffer, fileSize, 1, m_file);
CentalDirectoryFileHeader cdfh;
cdfh.fileLastModTime = dosTime;
@@ -203,41 +198,28 @@ namespace OpenVulkano
m_numFiles += 1;
}
std::vector<uint8_t> ZipWriter::GetMemory()
void ZipWriter::AddFile(const std::filesystem::path& fileName, const char* inArchiveName)
{
std::vector<uint8_t> buffer = m_headers;
auto data = Utils::ReadFile(fileName.string());
auto desc = OpenVulkano::FileDescription::MakeDescriptionForFile(inArchiveName, data.Size());
AddFile(desc, data.Data());
}
void ZipWriter::Close()
{
int centralDirsOffset = 0;
if (m_numFiles)
{
int centralDirsOffset = Cat(buffer, m_centralDirs);
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 = m_headers.size();
eocd.centralDirectoryOffset = centralDirsOffset;
Cat(buffer, &eocd);
return buffer;
}
void ZipWriter::AddFile(const std::filesystem::path& fileName, const char* inArchiveName)
{
auto data = ReadEntireFile(fileName.string());
auto desc = OpenVulkano::FileDescription::MakeDescriptionForFile(inArchiveName, data.size());
AddFile(desc, data.data());
}
bool ZipWriter::Write(const std::filesystem::path& archivePath)
{
FILE* file = fopen(archivePath.string().c_str(), "wb");
if (file)
{
auto mem = GetMemory();
fwrite(mem.data(), mem.size(), 1, file);
fclose(file);
return true;
}
return false;
fwrite(&eocd, sizeof(eocd), 1, m_file);
fclose(m_file);
}
}