Summary:
- 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:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user