24#if defined(libzip_FOUND)
26using zip_t =
struct zip;
37 enum : UnderlyingType {
66 explicit Compression(
const decltype(raw) raw,
const UInt32 level) : raw(raw), level(level) {}
69 [[nodiscard]]
bool isCompressionSupported() const noexcept;
72 [[nodiscard]]
bool isDecompressionSupported() const noexcept;
77 struct Encryption final : public StructEnum<Encryption> {
78 enum : UnderlyingType {
93 explicit Encryption(
const decltype(raw) raw, UInt32 level) : raw(raw) {}
96 [[nodiscard]]
bool isEncryptionSupported() const noexcept;
99 [[nodiscard]]
bool isDecryptionSupported() const noexcept;
103 enum class OpenFlag {
109 Truncate = (1u << 1u),
112 ReadOnly = (1u << 2u),
119 FailIfExists = (1u << 4u),
125 using OpenFlags = Flags<OpenFlag>;
128 enum class LocateFlag {
132 IgnoreCase = (1u << 0u),
136 IgnoreDirectories = (1u << 1u),
142 using LocateFlags = Flags<LocateFlag>;
146 enum class CreateFlag {
148 Overwrite = (1u << 0u),
154 using CreateFlags = Flags<CreateFlag>;
158 enum class OpenStreamFlag {
164 OriginalData = (1u << 1u),
170 using OpenStreamFlags = Flags<OpenStreamFlag>;
173 using ExtraFieldID =
UInt16;
176 enum class ExtraFieldLocation {
190 friend class ZIPArchive;
193 ZIPArchive* mArchive =
nullptr;
199 Entry(
const Entry&) =
default;
200 Entry& operator=(
const Entry&) =
default;
201 Entry(Entry&&) noexcept = default;
202 Entry& operator=(Entry&&) noexcept = default;
205 explicit Entry(ZIPArchive* archive, const UInt32 index) : mArchive(archive), mIndex(index) {}
212 void setContent(InputStream stream);
215 [[nodiscard]] Compression getCompression()
const;
219 void setCompression(
const Compression& compression);
222 [[nodiscard]]
bool isCompressed()
const;
225 [[nodiscard]] Encryption getEncryption()
const;
229 void setEncryption(
const Encryption& encryption,
const String& password);
232 [[nodiscard]]
bool isEncrypted();
235 [[nodiscard]]
UInt64 getCompressedSize()
const;
238 [[nodiscard]]
UInt64 getSize()
const;
241 [[nodiscard]] FilePath getPath()
const;
244 void setPath(
const FilePath& path);
254 void setComment(StringView comment);
257 [[nodiscard]]
Date getModificationDate()
const;
262 void setModificationDate(
const Date& modificationDate);
270 [[nodiscard]]
bool hasExtraField(ExtraFieldID
id, UInt16 index = 0, ExtraFieldLocation location = ExtraFieldLocation::Local)
const;
277 [[nodiscard]] MemoryView<const Byte> getExtraField(ExtraFieldID
id, UInt16 index = 0, ExtraFieldLocation location = ExtraFieldLocation::Local)
const;
280 template<
typename T> [[nodiscard]] Optional<T> getExtraField(
const ExtraFieldID
id,
const UInt16 index = 0,
const ExtraFieldLocation location = ExtraFieldLocation::Local)
const {
281 static_assert(std::is_trivially_copyable_v<T>);
282 const MemoryView<const T> memoryView = getExtraField(
id, index, location).as<
const T>();
283 if(memoryView.empty()) {
286 return memoryView[0];
290 template<> [[nodiscard]] Optional<String> getExtraField(
const ExtraFieldID
id,
const UInt16 index,
const ExtraFieldLocation location)
const {
291 const MemoryView<const char> memoryView = getExtraField(
id, index, location).as<
const char>();
292 if(memoryView.empty()) {
295 return String(memoryView.data(), memoryView.size());
304 void setExtraField(MemoryView<const Byte> data, ExtraFieldID
id, UInt16 index = 0, ExtraFieldLocation location = ExtraFieldLocation::Local);
307 template<
typename T>
void setExtraField(
const T& data,
const ExtraFieldID
id,
const UInt16 index = 0,
const ExtraFieldLocation location = ExtraFieldLocation::Local) {
308 static_assert(std::is_trivially_copyable_v<T>);
309 setExtraField(
make_memory_view(&data, 1).
template as<const Byte>(),
id, index, location);
313 template<>
void setExtraField(
const String& data,
const ExtraFieldID
id,
const UInt16 index,
const ExtraFieldLocation location) {
314 setExtraField(
make_memory_view(data.data(), data.size()).template as<const Byte>(),
id, index, location);
321 [[nodiscard]]
UInt16 getExtraFieldCount(ExtraFieldID
id, ExtraFieldLocation location = ExtraFieldLocation::Local)
const;
328 void removeExtraField(ExtraFieldID
id, UInt16 index = 0, ExtraFieldLocation location = ExtraFieldLocation::Local);
332 [[nodiscard]] InputStream openInputStream(
const OpenStreamFlags& flags = OpenStreamFlag::Default)
const;
335 [[nodiscard]] InputStream openInputStream(
const String& password,
const OpenStreamFlags& flags = OpenStreamFlag::Default)
const;
338 explicit operator bool()
const {
return mArchive !=
nullptr && mIndex != -1; }
345 explicit ZIPArchive(
const FilePath& path,
const OpenFlags& flags = OpenFlag::Default);
350 explicit ZIPArchive(DataStream dataStream,
const OpenFlags& flags = OpenFlag::Create);
355 explicit ZIPArchive(InputStream inputStream,
const OpenFlags& flags = OpenFlag::ReadOnly);
359 ~ZIPArchive() noexcept;
365 [[nodiscard]] Entry locate(const FilePath& path, const LocateFlags& flags = LocateFlag::Default);
369 [[nodiscard]] Generator<Entry> entries();
372 Entry createDirectory(const FilePath& path, const CreateFlags& flags = CreateFlag::Default);
376 Entry createFile(const FilePath& path, InputStream stream, const Compression& compression = Compression::Default,
377 const CreateFlags& flags = CreateFlag::Default);
380 [[nodiscard]] StringView getComment() const;
384 void setComment(StringView comment);
389 using ProgressCallbackFunctionView = FunctionView<
void(
double) const>;
392 void commit(ProgressCallbackFunctionView progressCallback =
nullptr,
double precision = 0.01);
398 void rollback(const Entry& entry);
402 [[nodiscard]] Pimpl* pimpl() const noexcept {
return m.get(); };
#define CE_FLAGS_OPERATORS(Enum)
Defines global operators for a Flags<Enum, Storage> implementation.
Definition Flags.hpp:216
#define CE_EXCEPTION_DECL2(Name, Parent)
Definition Exception.hpp:100
#define CE_STRUCT_ENUM_DECL(T)
Definition StructEnum.hpp:49
Definition Application.hpp:19
TDate< SystemClock, TimeInterval > Date
Represents a point in time.
Definition Chrono.hpp:83
std::uint64_t UInt64
Definition DataTypes.hpp:26
BasicStringView< char > StringView
Narrow string view used for handling narrow encoded text in UTF-8.
Definition String.hpp:190
auto zip(Args &&... args)
Returns an iterable object where all argument iterators are traversed simultaneously.
Definition Iterator.hpp:369
@ Store
Stores the outcome in the respective render target attachment.
std::uint16_t UInt16
Definition DataTypes.hpp:20
std::int64_t Int64
Definition DataTypes.hpp:24
MemoryView< T > make_memory_view(T *ptr, size_t size)
Makes a new memory from a raw pointer and length.
Definition MemoryView.hpp:359
@ Create
Creates the file if it doesn't exist.
@ Compressed
If set, the texture is compressed on the GPU.
std::uint32_t UInt32
Definition DataTypes.hpp:23
BasicString< char > String
Narrow string used for handling narrow encoded text in UTF-8.
Definition String.hpp:163
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25