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:
+31
-43
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user