![]() |
SourcePP
Several modern C++20 libraries for sanely parsing Valve's formats.
|
#include <PackFile.h>
Public Types | |
template<typename R > | |
using | EntryCallbackBase = std::function< R(const std::string &path, const Entry &entry)> |
Accepts the entry's path and metadata. | |
using | EntryCallback = EntryCallbackBase< void > |
using | EntryPredicate = EntryCallbackBase< bool > |
using | EntryCreation = std::function< EntryOptions(const std::string &path)> |
using | EntryTrie = tsl::htrie_map< char, Entry > |
Public Member Functions | |
PackFile (const PackFile &other)=delete | |
PackFile & | operator= (const PackFile &other)=delete |
PackFile (PackFile &&other) noexcept=default | |
PackFile & | operator= (PackFile &&other) noexcept=default |
virtual | ~PackFile ()=default |
virtual constexpr std::string_view | getGUID () const =0 |
Get the GUID corresponding to the pack file type. | |
template<typename T > requires requires (const T&) {{T::GUID} -> std::convertible_to<std::string_view>;} | |
bool | isInstanceOf () const |
Check if the pack file is an instance of the given pack file class. | |
virtual constexpr bool | hasEntryChecksums () const |
Returns true if the format has a checksum for each entry. | |
virtual std::vector< std::string > | verifyEntryChecksums () const |
Verify the checksums of each file, if a file fails the check its path will be added to the vector If there is no checksum ability in the format, it will return an empty vector. | |
virtual bool | hasPackFileChecksum () const |
Returns true if the entire file has a checksum. | |
virtual bool | verifyPackFileChecksum () const |
Verify the checksum of the entire file, returns true on success Will return true if there is no checksum ability in the format. | |
virtual bool | hasPackFileSignature () const |
Returns true if the file is signed. | |
virtual bool | verifyPackFileSignature () const |
Verify the file signature, returns true on success Will return true if there is no signature ability in the format. | |
virtual constexpr bool | isCaseSensitive () const |
Does the format support case-sensitive file names? | |
bool | hasEntry (const std::string &path, bool includeUnbaked=true) const |
Check if an entry exists given the file path. | |
std::optional< Entry > | findEntry (const std::string &path_, bool includeUnbaked=true) const |
Try to find an entry given the file path. | |
virtual std::optional< std::vector< std::byte > > | readEntry (const std::string &path_) const =0 |
Try to read the entry's data to a bytebuffer. | |
std::optional< std::string > | readEntryText (const std::string &path) const |
Try to read the entry's data to a string. | |
virtual constexpr bool | isReadOnly () const noexcept |
void | addEntry (const std::string &entryPath, const std::string &filepath, EntryOptions options={}) |
Add a new entry from a file path - the first parameter is the path in the PackFile, the second is the path on disk. | |
void | addEntry (const std::string &path, std::vector< std::byte > &&buffer, EntryOptions options={}) |
Add a new entry from a buffer. | |
void | addEntry (const std::string &path, const std::byte *buffer, uint64_t bufferLen, EntryOptions options={}) |
Add a new entry from a buffer. | |
void | addDirectory (const std::string &entryBaseDir, const std::string &dir, EntryOptions options={}) |
Adds new entries using the contents of a given directory. | |
void | addDirectory (const std::string &entryBaseDir, const std::string &dir, const EntryCreation &creation) |
Adds new entries using the contents of a given directory. | |
virtual bool | renameEntry (const std::string &oldPath_, const std::string &newPath_) |
Rename an existing entry. | |
virtual bool | renameDirectory (const std::string &oldDir_, const std::string &newDir_) |
Rename an existing directory. | |
virtual bool | removeEntry (const std::string &path_) |
Remove an entry. | |
virtual std::size_t | removeDirectory (const std::string &dirName_) |
Remove a directory. | |
virtual bool | bake (const std::string &outputDir_, BakeOptions options, const EntryCallback &callback)=0 |
If output folder is an empty string, it will overwrite the original. | |
bool | extractEntry (const std::string &entryPath, const std::string &filepath) const |
Extract the given entry to disk at the given file path. | |
bool | extractDirectory (const std::string &dir_, const std::string &outputDir) const |
Extract the given directory to disk under the given output directory. | |
bool | extractAll (const std::string &outputDir, bool createUnderPackFileDir=true) const |
Extract the contents of the pack file to disk at the given directory. | |
bool | extractAll (const std::string &outputDir, const EntryPredicate &predicate, bool stripSharedDirs=true) const |
Extract the contents of the pack file to disk at the given directory - only entries which match the predicate are extracted. | |
const EntryTrie & | getBakedEntries () const |
Get entries saved to disk. | |
const EntryTrie & | getUnbakedEntries () const |
Get entries that have been added but not yet baked. | |
std::size_t | getEntryCount (bool includeUnbaked=true) const |
Get the number of entries in the pack file. | |
void | runForAllEntries (const EntryCallback &operation, bool includeUnbaked=true) const |
Run a callback for each entry in the pack file. | |
void | runForAllEntries (const std::string &parentDir, const EntryCallback &operation, bool recursive=true, bool includeUnbaked=true) const |
Run a callback for each entry in the pack file under the parent directory. | |
std::string_view | getFilepath () const |
/home/user/pak01_dir.vpk | |
std::string | getTruncatedFilepath () const |
/home/user/pak01_dir.vpk -> /home/user/pak01 | |
std::string | getFilename () const |
/home/user/pak01_dir.vpk -> pak01_dir.vpk | |
std::string | getTruncatedFilename () const |
/home/user/pak01_dir.vpk -> pak01.vpk | |
std::string | getFilestem () const |
/home/user/pak01_dir.vpk -> pak01_dir | |
virtual std::string | getTruncatedFilestem () const |
/home/user/pak01_dir.vpk -> pak01 | |
virtual Attribute | getSupportedEntryAttributes () const |
Returns a list of supported entry attributes Mostly for GUI programs that show entries and their metadata in a table ;) | |
virtual | operator std::string () const |
Static Public Member Functions | |
static std::unique_ptr< PackFile > | open (const std::string &path, const EntryCallback &callback=nullptr) |
Open a generic pack file. The parser is selected based on the file extension. | |
static std::vector< std::string > | getOpenableExtensions () |
Returns a sorted list of supported extensions for opening, e.g. {".bsp", ".vpk"}. | |
static std::string | escapeEntryPathForWrite (const std::string &path) |
On Windows, some characters and file names are invalid - this escapes the given entry path. | |
Protected Types | |
using | OpenFactoryFunction = std::function< std::unique_ptr< PackFile >(const std::string &path, const EntryCallback &callback)> |
Protected Member Functions | |
PackFile (std::string fullFilePath_) | |
void | runForAllEntriesInternal (const std::function< void(const std::string &, Entry &)> &operation, bool includeUnbaked=true) |
void | runForAllEntriesInternal (const std::string &parentDir, const std::function< void(const std::string &, Entry &)> &operation, bool recursive=true, bool includeUnbaked=true) |
std::vector< std::string > | verifyEntryChecksumsUsingCRC32 () const |
virtual void | addEntryInternal (Entry &entry, const std::string &path, std::vector< std::byte > &buffer, EntryOptions options)=0 |
std::string | getBakeOutputDir (const std::string &outputDir) const |
void | mergeUnbakedEntries () |
void | setFullFilePath (const std::string &outputDir) |
std::string | cleanEntryPath (const std::string &path) const |
Static Protected Member Functions | |
static Entry | createNewEntry () |
static std::optional< std::vector< std::byte > > | readUnbakedEntry (const Entry &entry) |
static std::unordered_map< std::string, std::vector< OpenFactoryFunction > > & | getOpenExtensionRegistry () |
static const OpenFactoryFunction & | registerOpenExtensionForTypeFactory (std::string_view extension, const OpenFactoryFunction &factory) |
Protected Attributes | |
std::string | fullFilePath |
EntryTrie | entries |
EntryTrie | unbakedEntries |
Definition at line 25 of file PackFile.h.
using vpkpp::PackFile::EntryCallback = EntryCallbackBase<void> |
Definition at line 30 of file PackFile.h.
using vpkpp::PackFile::EntryCallbackBase = std::function<R(const std::string& path, const Entry& entry)> |
Accepts the entry's path and metadata.
Definition at line 29 of file PackFile.h.
using vpkpp::PackFile::EntryCreation = std::function<EntryOptions(const std::string& path)> |
Definition at line 34 of file PackFile.h.
using vpkpp::PackFile::EntryPredicate = EntryCallbackBase<bool> |
Definition at line 31 of file PackFile.h.
using vpkpp::PackFile::EntryTrie = tsl::htrie_map<char, Entry> |
Definition at line 36 of file PackFile.h.
|
protected |
Definition at line 213 of file PackFile.h.
|
delete |
|
defaultnoexcept |
|
virtualdefault |
|
explicitprotected |
Definition at line 109 of file PackFile.cpp.
void PackFile::addDirectory | ( | const std::string & | entryBaseDir, |
const std::string & | dir, | ||
const EntryCreation & | creation | ||
) |
Adds new entries using the contents of a given directory.
Definition at line 238 of file PackFile.cpp.
void PackFile::addDirectory | ( | const std::string & | entryBaseDir, |
const std::string & | dir, | ||
EntryOptions | options = {} |
||
) |
Adds new entries using the contents of a given directory.
Definition at line 232 of file PackFile.cpp.
void PackFile::addEntry | ( | const std::string & | entryPath, |
const std::string & | filepath, | ||
EntryOptions | options = {} |
||
) |
Add a new entry from a file path - the first parameter is the path in the PackFile, the second is the path on disk.
Definition at line 190 of file PackFile.cpp.
void PackFile::addEntry | ( | const std::string & | path, |
const std::byte * | buffer, | ||
uint64_t | bufferLen, | ||
EntryOptions | options = {} |
||
) |
Add a new entry from a buffer.
Definition at line 223 of file PackFile.cpp.
void PackFile::addEntry | ( | const std::string & | path, |
std::vector< std::byte > && | buffer, | ||
EntryOptions | options = {} |
||
) |
Add a new entry from a buffer.
Definition at line 208 of file PackFile.cpp.
|
protectedpure virtual |
Implemented in vpkpp::PackFileReadOnly, vpkpp::GMA, vpkpp::PAK, vpkpp::PCK, vpkpp::VPK, vpkpp::VPK_VTMB, vpkpp::WAD3, vpkpp::ZIP, and vpkpp::EXAMPLE.
|
pure virtual |
If output folder is an empty string, it will overwrite the original.
Implemented in vpkpp::PackFileReadOnly, vpkpp::GMA, vpkpp::PAK, vpkpp::PCK, vpkpp::VPK, vpkpp::VPK_VTMB, vpkpp::WAD3, vpkpp::ZIP, vpkpp::EXAMPLE, and bsppp::PakLump.
|
protected |
Definition at line 677 of file PackFile.cpp.
|
staticprotected |
Definition at line 686 of file PackFile.cpp.
|
static |
On Windows, some characters and file names are invalid - this escapes the given entry path.
Definition at line 616 of file PackFile.cpp.
bool PackFile::extractAll | ( | const std::string & | outputDir, |
bool | createUnderPackFileDir = true |
||
) | const |
Extract the contents of the pack file to disk at the given directory.
Definition at line 395 of file PackFile.cpp.
bool PackFile::extractAll | ( | const std::string & | outputDir, |
const EntryPredicate & | predicate, | ||
bool | stripSharedDirs = true |
||
) | const |
Extract the contents of the pack file to disk at the given directory - only entries which match the predicate are extracted.
Definition at line 417 of file PackFile.cpp.
bool PackFile::extractDirectory | ( | const std::string & | dir_, |
const std::string & | outputDir | ||
) | const |
Extract the given directory to disk under the given output directory.
Definition at line 370 of file PackFile.cpp.
bool PackFile::extractEntry | ( | const std::string & | entryPath, |
const std::string & | filepath | ||
) | const |
Extract the given entry to disk at the given file path.
Definition at line 351 of file PackFile.cpp.
std::optional< Entry > PackFile::findEntry | ( | const std::string & | path_, |
bool | includeUnbaked = true |
||
) | const |
Try to find an entry given the file path.
Definition at line 163 of file PackFile.cpp.
const PackFile::EntryTrie & PackFile::getBakedEntries | ( | ) | const |
Get entries saved to disk.
Definition at line 482 of file PackFile.cpp.
|
protected |
Definition at line 640 of file PackFile.cpp.
std::size_t PackFile::getEntryCount | ( | bool | includeUnbaked = true | ) | const |
Get the number of entries in the pack file.
Definition at line 490 of file PackFile.cpp.
std::string PackFile::getFilename | ( | ) | const |
/home/user/pak01_dir.vpk -> pak01_dir.vpk
Definition at line 591 of file PackFile.cpp.
std::string_view PackFile::getFilepath | ( | ) | const |
/home/user/pak01_dir.vpk
Definition at line 583 of file PackFile.cpp.
std::string PackFile::getFilestem | ( | ) | const |
/home/user/pak01_dir.vpk -> pak01_dir
Definition at line 600 of file PackFile.cpp.
|
constexprpure virtual |
Get the GUID corresponding to the pack file type.
Implemented in vpkpp::EXAMPLE, bsppp::PakLump, vpkpp::FPX, vpkpp::GCF, vpkpp::GMA, vpkpp::HOG, vpkpp::OL, vpkpp::OO7, vpkpp::ORE, vpkpp::PAK, vpkpp::PCK, vpkpp::VPK, vpkpp::VPK_VTMB, vpkpp::VPP, vpkpp::WAD3, vpkpp::XZP, and vpkpp::ZIP.
|
static |
Returns a sorted list of supported extensions for opening, e.g. {".bsp", ".vpk"}.
Definition at line 128 of file PackFile.cpp.
|
staticprotected |
Definition at line 705 of file PackFile.cpp.
|
virtual |
Returns a list of supported entry attributes Mostly for GUI programs that show entries and their metadata in a table ;)
Reimplemented in vpkpp::GCF, vpkpp::GMA, vpkpp::HOG, vpkpp::OL, vpkpp::OO7, vpkpp::ORE, vpkpp::PAK, vpkpp::PCK, vpkpp::VPK, vpkpp::VPK_VTMB, vpkpp::VPP, vpkpp::WAD3, vpkpp::XZP, vpkpp::ZIP, and vpkpp::EXAMPLE.
Definition at line 608 of file PackFile.cpp.
std::string PackFile::getTruncatedFilename | ( | ) | const |
/home/user/pak01_dir.vpk -> pak01.vpk
Definition at line 595 of file PackFile.cpp.
std::string PackFile::getTruncatedFilepath | ( | ) | const |
/home/user/pak01_dir.vpk -> /home/user/pak01
Definition at line 587 of file PackFile.cpp.
|
virtual |
/home/user/pak01_dir.vpk -> pak01
Reimplemented in vpkpp::VPK, and vpkpp::VPK_VTMB.
Definition at line 604 of file PackFile.cpp.
const PackFile::EntryTrie & PackFile::getUnbakedEntries | ( | ) | const |
Get entries that have been added but not yet baked.
Definition at line 486 of file PackFile.cpp.
bool PackFile::hasEntry | ( | const std::string & | path, |
bool | includeUnbaked = true |
||
) | const |
Check if an entry exists given the file path.
Definition at line 159 of file PackFile.cpp.
|
inlineconstexprvirtual |
Returns true if the format has a checksum for each entry.
Reimplemented in vpkpp::GCF, vpkpp::GMA, vpkpp::VPK, and vpkpp::ZIP.
Definition at line 63 of file PackFile.h.
|
virtual |
Returns true if the entire file has a checksum.
Reimplemented in vpkpp::GMA, vpkpp::OO7, and vpkpp::VPK.
Definition at line 143 of file PackFile.cpp.
|
virtual |
Returns true if the file is signed.
Reimplemented in vpkpp::VPK.
Definition at line 151 of file PackFile.cpp.
|
inlineconstexprvirtual |
Does the format support case-sensitive file names?
Reimplemented in bsppp::PakLump, vpkpp::EXAMPLE, vpkpp::GCF, vpkpp::OL, vpkpp::OO7, vpkpp::PCK, and vpkpp::ZIP.
Definition at line 86 of file PackFile.h.
|
inline |
Check if the pack file is an instance of the given pack file class.
Definition at line 58 of file PackFile.h.
|
inlineconstexprvirtualnoexcept |
Reimplemented in vpkpp::PackFileReadOnly.
Definition at line 102 of file PackFile.h.
|
protected |
Definition at line 656 of file PackFile.cpp.
|
static |
Open a generic pack file. The parser is selected based on the file extension.
Definition at line 114 of file PackFile.cpp.
|
explicitvirtual |
Reimplemented in bsppp::PakLump, vpkpp::GCF, vpkpp::GMA, vpkpp::OO7, vpkpp::PCK, vpkpp::VPK, vpkpp::PackFileReadOnly, and vpkpp::EXAMPLE.
Definition at line 612 of file PackFile.cpp.
|
pure virtual |
Try to read the entry's data to a bytebuffer.
Implemented in vpkpp::GCF, vpkpp::GMA, vpkpp::HOG, vpkpp::OL, vpkpp::OO7, vpkpp::ORE, vpkpp::PAK, vpkpp::PCK, vpkpp::VPK, vpkpp::VPK_VTMB, vpkpp::VPP, vpkpp::WAD3, vpkpp::XZP, vpkpp::ZIP, and vpkpp::EXAMPLE.
std::optional< std::string > PackFile::readEntryText | ( | const std::string & | path | ) | const |
Try to read the entry's data to a string.
Definition at line 176 of file PackFile.cpp.
|
staticprotected |
Definition at line 690 of file PackFile.cpp.
|
staticprotected |
Definition at line 710 of file PackFile.cpp.
|
virtual |
|
virtual |
|
virtual |
Rename an existing directory.
Definition at line 287 of file PackFile.cpp.
|
virtual |
Rename an existing entry.
Definition at line 268 of file PackFile.cpp.
void PackFile::runForAllEntries | ( | const EntryCallback & | operation, |
bool | includeUnbaked = true |
||
) | const |
Run a callback for each entry in the pack file.
Definition at line 499 of file PackFile.cpp.
void PackFile::runForAllEntries | ( | const std::string & | parentDir, |
const EntryCallback & | operation, | ||
bool | recursive = true , |
||
bool | includeUnbaked = true |
||
) | const |
Run a callback for each entry in the pack file under the parent directory.
Definition at line 513 of file PackFile.cpp.
|
protected |
Definition at line 541 of file PackFile.cpp.
|
protected |
Definition at line 555 of file PackFile.cpp.
|
protected |
Definition at line 672 of file PackFile.cpp.
|
virtual |
Verify the checksums of each file, if a file fails the check its path will be added to the vector If there is no checksum ability in the format, it will return an empty vector.
Reimplemented in vpkpp::GCF, vpkpp::GMA, vpkpp::VPK, and vpkpp::ZIP.
Definition at line 139 of file PackFile.cpp.
|
protected |
Definition at line 626 of file PackFile.cpp.
|
virtual |
Verify the checksum of the entire file, returns true on success Will return true if there is no checksum ability in the format.
Reimplemented in vpkpp::GMA, vpkpp::OO7, and vpkpp::VPK.
Definition at line 147 of file PackFile.cpp.
|
virtual |
Verify the file signature, returns true on success Will return true if there is no signature ability in the format.
Reimplemented in vpkpp::VPK.
Definition at line 155 of file PackFile.cpp.
|
protected |
Definition at line 220 of file PackFile.h.
|
protected |
Definition at line 219 of file PackFile.h.
|
protected |
Definition at line 221 of file PackFile.h.