| 928 | } |
| 929 | |
| 930 | bool PakWriter::AddFile(Stream& stream, StringView path, PakPreferredCompression preferredCompression) |
| 931 | { |
| 932 | DEATH_ASSERT(_outputStream->IsValid(), "Invalid output stream specified", false); |
| 933 | DEATH_ASSERT(!path.empty() && path[path.size() - 1] != '/' && path[path.size() - 1] != '\\', |
| 934 | ("\"{}\" is not valid file path", String::nullTerminatedView(path).data()), false); |
| 935 | |
| 936 | Array<PakFile::Item>* items = &_rootItems; |
| 937 | if (!_useHashIndex) { |
| 938 | PakFile::Item* parentItem = FindOrCreateParentItem(path); |
| 939 | if (parentItem != nullptr) { |
| 940 | items = &parentItem->ChildItems; |
| 941 | } |
| 942 | } |
| 943 | |
| 944 | for (PakFile::Item& item : *items) { |
| 945 | if (item.Name == path) { |
| 946 | // File already exists in the .pak file |
| 947 | LOGW("File \"{}\" already exists in the .pak file", path); |
| 948 | return false; |
| 949 | } |
| 950 | } |
| 951 | |
| 952 | PakFile::ItemFlags flags = PakFile::ItemFlags::None; |
| 953 | std::int64_t offset = _outputStream->GetPosition(); |
| 954 | std::int64_t uncompressedSize, size; |
| 955 | |
| 956 | switch (preferredCompression) { |
| 957 | #if defined(WITH_ZLIB) || defined(WITH_MINIZ) |
| 958 | case PakPreferredCompression::Deflate: { |
| 959 | CopyToDeflate(stream, *_outputStream, uncompressedSize); |
| 960 | size = _outputStream->GetPosition() - offset; |
| 961 | DEATH_DEBUG_ASSERT(size > 0); |
| 962 | flags |= PakFile::ItemFlags(std::uint32_t(PakPreferredCompression::Deflate) << PakFile::CompressionFlagsShift); |
| 963 | break; |
| 964 | } |
| 965 | #endif |
| 966 | #if defined(WITH_LZ4) |
| 967 | case PakPreferredCompression::Lz4: { |
| 968 | CopyToLz4(stream, *_outputStream, uncompressedSize); |
| 969 | size = _outputStream->GetPosition() - offset; |
| 970 | DEATH_DEBUG_ASSERT(size > 0); |
| 971 | flags |= PakFile::ItemFlags(std::uint32_t(PakPreferredCompression::Lz4) << PakFile::CompressionFlagsShift); |
| 972 | break; |
| 973 | } |
| 974 | #endif |
| 975 | #if defined(WITH_ZSTD) |
| 976 | case PakPreferredCompression::Zstd: { |
| 977 | CopyToZstd(stream, *_outputStream, uncompressedSize); |
| 978 | size = _outputStream->GetPosition() - offset; |
| 979 | DEATH_DEBUG_ASSERT(size > 0); |
| 980 | flags |= PakFile::ItemFlags(std::uint32_t(PakPreferredCompression::Zstd) << PakFile::CompressionFlagsShift); |
| 981 | break; |
| 982 | } |
| 983 | #endif |
| 984 | #if defined(WITH_LZMA2) |
| 985 | case PakPreferredCompression::Lzma2Compressed: { |
| 986 | CopyToLzma2(stream, *_outputStream, uncompressedSize); |
| 987 | size = _outputStream->GetPosition() - offset; |
no test coverage detected