#pragma once
#include <whiteout/common_types.h>
#include <span>
#include <string>
#include <vector>
namespace whiteout::storages::mpq {
enum class AttributeFlag : u32 {
None = 0,
kCrc32 = 0x00000001, kFiletime = 0x00000002, kMd5 = 0x00000004, };
inline AttributeFlag operator|(AttributeFlag a, AttributeFlag b) noexcept {
return static_cast<AttributeFlag>(static_cast<u32>(a) | static_cast<u32>(b));
}
inline AttributeFlag operator&(AttributeFlag a, AttributeFlag b) noexcept {
return static_cast<AttributeFlag>(static_cast<u32>(a) & static_cast<u32>(b));
}
inline AttributeFlag& operator|=(AttributeFlag& a, AttributeFlag b) noexcept {
a = a | b;
return a;
}
inline bool hasFlag(AttributeFlag flags, AttributeFlag flag) noexcept {
return (flags & flag) != AttributeFlag::None;
}
[[nodiscard]] std::vector<std::string> parseListfile(std::span<const u8> data);
[[nodiscard]] std::vector<u8> buildListfile(const std::vector<std::string>& filenames);
struct FileAttributes {
std::vector<u32> crc32s; std::vector<u64> filetimes; std::vector<std::array<u8, 16>> md5s; };
[[nodiscard]] FileAttributes parseAttributes(std::span<const u8> data, u32 blockCount);
[[nodiscard]] std::vector<u8> buildAttributes(const FileAttributes& attrs, u32 version = 100);
}