Added embedded libzip

Prefixed all libzip zip_ funcs to fs_zip_ to avoid clashes and link errors due to assimp
Zip pack and zip writer work with libzip now
This commit was merged in pull request #2.
This commit is contained in:
catalinvasile
2024-07-16 12:57:03 +02:00
parent 5ec1fddf57
commit 56c367a3c4
144 changed files with 16978 additions and 1330 deletions
+31 -43
View File
@@ -1,77 +1,65 @@
#pragma once
#include "ZipBase.h"
#include "fs/Api.h"
#include <tl/memory_buffer.h>
#include <tl/span.h>
#include <tl/vector.h>
#include <tl/result.h>
#include <tl/optional.h>
#include "fs/zip/ZipPack.h"
namespace fs
{
//////////////////////////////////////////////////////////////////////////
class IStreamSource;
class ISource;
class IStreamSink;
class ISink;
//////////////////////////////////////////////////////////////////////////
class FS_API ZipWriter : public ZipBase
class FS_API ZipWriter
{
public:
struct DataWriterPayload
{
CompressionMethod compressionMethod;
uint32_t uncompressedCRC32 = 0; //mandatory!!!
uint64_t uncompressedSize = 0; //optional, will be set to the written size if == 0
};
//0 - no compression (Store)
//9 - max compression (Deflate)
using Compression = uint8_t;
using DataWriterError = tl::generic_error;
using DataWriterResult = tl::result<DataWriterPayload, DataWriterError>;
ZipWriter(ISink& sink);
~ZipWriter();
using DataWriter = tl::function<DataWriterResult(IStreamSink& sink)>;
ZipWriter(ISink& sink, size_t fileDataAlignment);
~ZipWriter() = default;
tl::result<void> addFile(tl::string name, const DataWriter& dataWriter);
tl::result<void> addFile(tl::string name, tl::optional<time_t> lastModificationTime, const DataWriter& dataWriter);
tl::result<void> addBuffer(tl::string name, Compression compression, tl::span<const uint8_t> buffer);
tl::result<void> addBuffer(tl::string name, time_t lastModificationTime, Compression compression, tl::span<const uint8_t> buffer);
tl::result<void> addBuffer(tl::string name,
tl::span<const uint8_t> comment,
tl::span<const uint8_t> extraField,
time_t lastModificationTime,
Compression compression,
tl::span<const uint8_t> buffer);
tl::result<void> addFile(tl::string name, Compression compression, ISource& source);
tl::result<void> addFile(tl::string name, time_t lastModificationTime, Compression compression, ISource& source);
tl::result<void> addFile(tl::string name,
tl::span<const uint8_t> comment,
tl::span<const uint8_t> extraField,
GeneralBitFlags generalBitFlags,
tl::optional<time_t> lastModificationTime,
const DataWriter& dataWriter);
tl::span<const uint8_t> comment,
tl::span<const uint8_t> extraField,
time_t lastModificationTime,
Compression compression,
ISource& source);
void finish();
private:
uint64_t computePadding(uint64_t offset, const LocalFileHeader& header) const;
tl::result<uint64_t> _addSource(tl::string name,
tl::span<const uint8_t> comment,
tl::span<const uint8_t> extraField,
time_t lastModificationTime,
Compression compression,
zip_source* source);
ISink& m_sink;
size_t m_fileDataAlignment = 0;
struct CentralDirectoryRecord
{
uint64_t compressedSize = 0;
uint64_t uncompressedSize = 0;
uint64_t localHeaderOffset = 0;
CentralDirectoryFileHeader header;
tl::string name;
tl::memory_buffer comment;
tl::memory_buffer extraField;
bool zip64 = false;
};
tl::vector<CentralDirectoryRecord> m_records;
tl::memory_buffer m_buffer;
tl::unique_ptr<zip> m_zipArchive;
};
//////////////////////////////////////////////////////////////////////////
}