SourcePP
Several modern C++20 libraries for sanely parsing Valve's formats.
Loading...
Searching...
No Matches
vpkpp::GCF Class Reference

#include <GCF.h>

Inheritance diagram for vpkpp::GCF:
Collaboration diagram for vpkpp::GCF:

Classes

struct  Block
 
struct  BlockHeader
 
struct  ChecksumMapEntry
 
struct  ChecksumMapHeader
 
struct  DataBlockHeader
 
struct  DirectoryEntry
 
struct  DirectoryEntry2
 
struct  DirectoryHeader
 
struct  DirectoryMapEntry
 
struct  DirectoryMapHeader
 
struct  Header
 

Public Member Functions

constexpr std::string_view getGUID () const override
 Get the GUID corresponding to the pack file type.
 
constexpr bool hasEntryChecksums () const override
 Returns true if the format has a checksum for each entry.
 
std::vector< std::string > verifyEntryChecksums () const override
 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.
 
constexpr bool isCaseSensitive () const override
 Does the format support case-sensitive file names?
 
std::optional< std::vector< std::byte > > readEntry (const std::string &path_) const override
 Try to read the entry's data to a bytebuffer.
 
Attribute getSupportedEntryAttributes () const override
 Returns a list of supported entry attributes Mostly for GUI programs that show entries and their metadata in a table ;)
 
 operator std::string () const override
 
- Public Member Functions inherited from vpkpp::PackFileReadOnly
constexpr bool isReadOnly () const noexcept final
 
 operator std::string () const override
 
- Public Member Functions inherited from vpkpp::PackFile
 PackFile (const PackFile &other)=delete
 
PackFileoperator= (const PackFile &other)=delete
 
 PackFile (PackFile &&other) noexcept=default
 
PackFileoperator= (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< EntryfindEntry (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 EntryTriegetBakedEntries () const
 Get entries saved to disk.
 
const EntryTriegetUnbakedEntries () 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< PackFileopen (const std::string &path, const EntryCallback &callback=nullptr)
 
- Static Public Member Functions inherited from vpkpp::PackFile
static std::unique_ptr< PackFileopen (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.
 

Static Public Attributes

static constexpr std::string_view GUID = "0C088488F666451E9361297528F2446D"
 

Protected Member Functions

 PackFileReadOnly (const std::string &fullFilePath_)
 
- Protected Member Functions inherited from vpkpp::PackFileReadOnly
 PackFileReadOnly (const std::string &fullFilePath_)
 
void addEntryInternal (Entry &entry, const std::string &path, std::vector< std::byte > &buffer, EntryOptions options) final
 
bool bake (const std::string &outputDir_, BakeOptions options, const EntryCallback &callback) final
 If output folder is an empty string, it will overwrite the original.
 
- Protected Member Functions inherited from vpkpp::PackFile
 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
 

Protected Attributes

Header header {}
 
BlockHeader blockheader {}
 
std::vector< Blockblockdata {}
 
std::vector< uint32_t > fragmap {}
 
DirectoryHeader dirheader {}
 
std::vector< DirectoryMapEntrydirmap_entries {}
 
DataBlockHeader datablockheader {}
 
std::vector< ChecksumMapEntrychksum_map {}
 
std::vector< uint32_t > checksums {}
 
- Protected Attributes inherited from vpkpp::PackFile
std::string fullFilePath
 
EntryTrie entries
 
EntryTrie unbakedEntries
 

Additional Inherited Members

- Public Types inherited from vpkpp::PackFile
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 >
 
- Protected Types inherited from vpkpp::PackFile
using OpenFactoryFunction = std::function< std::unique_ptr< PackFile >(const std::string &path, const EntryCallback &callback)>
 
- Static Protected Member Functions inherited from vpkpp::PackFile
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 OpenFactoryFunctionregisterOpenExtensionForTypeFactory (std::string_view extension, const OpenFactoryFunction &factory)
 

Detailed Description

Definition at line 9 of file GCF.h.

Member Function Documentation

◆ getGUID()

constexpr std::string_view vpkpp::GCF::getGUID ( ) const
inlineconstexproverridevirtual

Get the GUID corresponding to the pack file type.

Implements vpkpp::PackFile.

Definition at line 117 of file GCF.h.

◆ getSupportedEntryAttributes()

Attribute GCF::getSupportedEntryAttributes ( ) const
overridevirtual

Returns a list of supported entry attributes Mostly for GUI programs that show entries and their metadata in a table ;)

Reimplemented from vpkpp::PackFile.

Definition at line 273 of file GCF.cpp.

◆ hasEntryChecksums()

constexpr bool vpkpp::GCF::hasEntryChecksums ( ) const
inlineconstexproverridevirtual

Returns true if the format has a checksum for each entry.

Reimplemented from vpkpp::PackFile.

Definition at line 121 of file GCF.h.

◆ isCaseSensitive()

constexpr bool vpkpp::GCF::isCaseSensitive ( ) const
inlineconstexproverridevirtual

Does the format support case-sensitive file names?

Reimplemented from vpkpp::PackFile.

Definition at line 127 of file GCF.h.

◆ open()

std::unique_ptr< PackFile > GCF::open ( const std::string &  path,
const EntryCallback callback = nullptr 
)
static

This should NEVER occur when reading a "normal" gcf file. It will only be false if a) the gcf file isn't a gcf file b) the gcf file is from a beta steam version that used a different format that there are no public docs for (v6 was used throughout 2004-2013)

struct FragMapHeader { uint32_t blockcount; uint32_t dummy0; uint32_t dummy1; uint32_t checksum; };

Definition at line 13 of file GCF.cpp.

◆ operator std::string()

GCF::operator std::string ( ) const
explicitoverridevirtual

Reimplemented from vpkpp::PackFile.

Definition at line 278 of file GCF.cpp.

◆ PackFileReadOnly()

PackFileReadOnly::PackFileReadOnly ( const std::string &  fullFilePath_)
explicitprotected

Definition at line 233 of file PackFile.cpp.

◆ readEntry()

std::optional< std::vector< std::byte > > GCF::readEntry ( const std::string &  path_) const
overridevirtual

Try to read the entry's data to a bytebuffer.

Implements vpkpp::PackFile.

Definition at line 214 of file GCF.cpp.

◆ verifyEntryChecksums()

std::vector< std::string > GCF::verifyEntryChecksums ( ) const
overridevirtual

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 from vpkpp::PackFile.

Definition at line 189 of file GCF.cpp.

Member Data Documentation

◆ blockdata

std::vector<Block> vpkpp::GCF::blockdata {}
protected

Definition at line 142 of file GCF.h.

◆ blockheader

BlockHeader vpkpp::GCF::blockheader {}
protected

Definition at line 141 of file GCF.h.

◆ checksums

std::vector<uint32_t> vpkpp::GCF::checksums {}
protected

Definition at line 149 of file GCF.h.

◆ chksum_map

std::vector<ChecksumMapEntry> vpkpp::GCF::chksum_map {}
protected

Definition at line 148 of file GCF.h.

◆ datablockheader

DataBlockHeader vpkpp::GCF::datablockheader {}
protected

Definition at line 147 of file GCF.h.

◆ dirheader

DirectoryHeader vpkpp::GCF::dirheader {}
protected

Definition at line 144 of file GCF.h.

◆ dirmap_entries

std::vector<DirectoryMapEntry> vpkpp::GCF::dirmap_entries {}
protected

Definition at line 146 of file GCF.h.

◆ fragmap

std::vector<uint32_t> vpkpp::GCF::fragmap {}
protected

Definition at line 143 of file GCF.h.

◆ GUID

constexpr std::string_view vpkpp::GCF::GUID = "0C088488F666451E9361297528F2446D"
inlinestaticconstexpr

Definition at line 115 of file GCF.h.

◆ header

Header vpkpp::GCF::header {}
protected

Definition at line 140 of file GCF.h.


The documentation for this class was generated from the following files: