SourcePP
Several modern C++20 libraries for sanely parsing Valve's formats.
Toggle main menu visibility
Loading...
Searching...
No Matches
GCF.h
Go to the documentation of this file.
1
// ReSharper disable CppRedundantQualifier
2
3
#pragma once
4
5
#include "
../PackFile.h
"
6
7
namespace
vpkpp
{
8
9
constexpr
std::string_view
GCF_EXTENSION
=
".gcf"
;
10
11
class
GCF
:
public
PackFileReadOnly
{
12
protected
:
13
#pragma pack(push, 1)
14
struct
Header
{
15
uint32_t
dummy1
;
16
uint32_t
dummy2
;
17
uint32_t
gcfversion
;
18
uint32_t
appid
;
19
uint32_t
appversion
;
20
uint32_t
dummy3
;
21
uint32_t
dummy4
;
22
uint32_t
filesize
;
23
uint32_t
blocksize
;
24
uint32_t
blockcount
;
25
uint32_t
dummy5
;
26
};
27
28
// second header with info about blocks inside the file
29
// appears only ONCE not before every block!
30
struct
BlockHeader
{
31
uint32_t
count
;
32
uint32_t
used
;
33
uint32_t
dummy1
;
34
uint32_t
dummy2
;
35
uint32_t
dummy3
;
36
uint32_t
dummy4
;
37
uint32_t
dummy5
;
38
uint32_t
checksum
;
39
};
40
41
struct
Block
{
42
enum class
CompressionType
: uint32_t {
43
UNCOMPRESSED
= 0,
44
COMPRESSED
,
// compressed on the server, client automatically extracts it so not really
45
COMPRESSED_AND_ENCRYPTED
,
46
ENCRYPTED
,
47
};
48
49
uint16_t
flags
;
50
uint16_t
open
;
51
uint32_t
file_data_offset
;
52
uint32_t
file_data_size
;
53
uint32_t
first_data_block_index
;
54
uint32_t
next_block_entry_index
;
55
uint32_t
prev_block_entry_index
;
56
uint32_t
dir_index
;
57
58
[[nodiscard]]
CompressionType
getCompressionType
()
const
{
59
static
constexpr
std::array compressionTypeLUT = {
60
CompressionType::UNCOMPRESSED
,
61
CompressionType::COMPRESSED
,
62
CompressionType::COMPRESSED_AND_ENCRYPTED
,
63
CompressionType::UNCOMPRESSED
,
64
CompressionType::ENCRYPTED
,
65
};
66
if
(
const
uint16_t idx = this->flags & 0x111; idx < compressionTypeLUT.size()) {
67
return
compressionTypeLUT[idx];
68
}
69
return
CompressionType::UNCOMPRESSED
;
70
}
71
72
[[nodiscard]]
bool
isEncrypted
()
const
{
73
return
static_cast<
uint32_t
>
(this->
getCompressionType
()) - 2 <= 1;
74
}
75
};
76
77
struct
DirectoryHeader
{
78
uint32_t
dummy1
;
79
uint32_t
cacheid
;
80
uint32_t
gcfversion
;
81
uint32_t
itemcount
;
82
uint32_t
filecount
;
83
uint32_t
dummy2
;
84
uint32_t
dirsize
;
85
uint32_t
namesize
;
86
uint32_t
info1count
;
87
uint32_t
copycount
;
88
uint32_t
localcount
;
89
uint32_t
dummy3
;
90
uint32_t
dummy4
;
91
uint32_t
checksum
;
92
};
93
94
struct
DirectoryEntry
{
95
uint32_t
nameoffset
;
96
uint32_t
itemsize
;
97
uint32_t
fileid
;
98
uint32_t
dirtype
;
99
uint32_t
parentindex
;
100
uint32_t
nextindex
;
101
uint32_t
firstindex
;
102
};
103
104
struct
DirectoryEntry2
{
105
DirectoryEntry
entry_real
{};
106
std::string
filename
;
107
};
108
109
struct
DirectoryMapHeader
{
110
uint32_t
dummy1
;
111
uint32_t
dummy2
;
112
};
113
114
struct
DirectoryMapEntry
{
115
uint32_t
firstblockindex
;
116
};
117
118
struct
DataBlockHeader
{
119
uint32_t
appversion
;
120
uint32_t
blockcount
;
121
uint32_t
blocksize
;
122
uint32_t
firstblockoffset
;
123
uint32_t
used
;
124
uint32_t
checksum
;
125
};
126
127
struct
ChecksumMapHeader
{
128
uint32_t
dummy1
;
129
uint32_t
dummy2
;
130
uint32_t
item_count
;
131
uint32_t
checksum_count
;
132
};
133
134
struct
ChecksumMapEntry
{
135
uint32_t
count
;
136
uint32_t
firstindex
;
137
};
138
#pragma pack(pop)
139
140
public
:
141
[[nodiscard]]
static
std::unique_ptr<PackFile>
open
(
const
std::string& path,
const
EntryCallback
& callback =
nullptr
,
const
OpenPropertyRequest
& requestProperty =
nullptr
);
142
143
[[nodiscard]]
constexpr
bool
hasEntryChecksums
()
const override
{
144
return
true
;
145
}
146
147
[[nodiscard]] std::vector<std::string>
verifyEntryChecksums
()
const override
;
148
149
[[nodiscard]]
constexpr
bool
isCaseSensitive
()
const override
{
150
return
true
;
151
}
152
153
[[nodiscard]] std::optional<std::vector<std::byte>>
readEntry
(
const
std::string& path_)
const override
;
154
155
[[nodiscard]]
Attribute
getSupportedEntryAttributes
()
const override
;
156
157
[[nodiscard]]
explicit
operator
std::string()
const override
;
158
159
[[nodiscard]] uint32_t
getVersion
()
const
;
160
161
[[nodiscard]] uint32_t
getAppID
()
const
;
162
163
[[nodiscard]] uint32_t
getAppVersion
()
const
;
164
165
protected
:
166
using
PackFileReadOnly::PackFileReadOnly
;
167
168
Header
header
{};
169
BlockHeader
blockheader
{};
170
std::vector<Block>
blockdata
{};
171
std::vector<uint32_t>
fragmap
{};
172
DirectoryHeader
dirheader
{};
173
//std::vector<DirectoryEntry2> direntries{};
174
std::vector<DirectoryMapEntry>
dirmap_entries
{};
175
DataBlockHeader
datablockheader
{};
176
std::vector<ChecksumMapEntry>
chksum_map
{};
177
std::vector<uint32_t>
checksums
{};
178
std::array<std::byte, 16>
decryption_key
;
179
private
:
180
VPKPP_REGISTER_PACKFILE_OPEN
(
GCF_EXTENSION
, &
GCF::open
);
181
};
182
183
}
// namespace vpkpp
PackFile.h
VPKPP_REGISTER_PACKFILE_OPEN
#define VPKPP_REGISTER_PACKFILE_OPEN(extension, function)
Definition
PackFile.h:254
vpkpp::GCF
Definition
GCF.h:11
vpkpp::GCF::open
static std::unique_ptr< PackFile > open(const std::string &path, const EntryCallback &callback=nullptr, const OpenPropertyRequest &requestProperty=nullptr)
Definition
GCF.cpp:16
vpkpp::GCF::header
Header header
Definition
GCF.h:168
vpkpp::GCF::dirmap_entries
std::vector< DirectoryMapEntry > dirmap_entries
Definition
GCF.h:174
vpkpp::GCF::blockdata
std::vector< Block > blockdata
Definition
GCF.h:170
vpkpp::GCF::blockheader
BlockHeader blockheader
Definition
GCF.h:169
vpkpp::GCF::chksum_map
std::vector< ChecksumMapEntry > chksum_map
Definition
GCF.h:176
vpkpp::GCF::decryption_key
std::array< std::byte, 16 > decryption_key
Definition
GCF.h:178
vpkpp::GCF::getVersion
uint32_t getVersion() const
Definition
GCF.cpp:357
vpkpp::GCF::verifyEntryChecksums
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 ...
Definition
GCF.cpp:203
vpkpp::GCF::getAppVersion
uint32_t getAppVersion() const
Definition
GCF.cpp:365
vpkpp::GCF::datablockheader
DataBlockHeader datablockheader
Definition
GCF.h:175
vpkpp::GCF::isCaseSensitive
constexpr bool isCaseSensitive() const override
Does the format support case-sensitive file names?
Definition
GCF.h:149
vpkpp::GCF::hasEntryChecksums
constexpr bool hasEntryChecksums() const override
Returns true if the format has a checksum for each entry.
Definition
GCF.h:143
vpkpp::GCF::dirheader
DirectoryHeader dirheader
Definition
GCF.h:172
vpkpp::GCF::getSupportedEntryAttributes
Attribute getSupportedEntryAttributes() const override
Returns a list of supported entry attributes Mostly for GUI programs that show entries and their meta...
Definition
GCF.cpp:348
vpkpp::GCF::checksums
std::vector< uint32_t > checksums
Definition
GCF.h:177
vpkpp::GCF::getAppID
uint32_t getAppID() const
Definition
GCF.cpp:361
vpkpp::GCF::readEntry
std::optional< std::vector< std::byte > > readEntry(const std::string &path_) const override
Try to read the entry's data to a bytebuffer.
Definition
GCF.cpp:228
vpkpp::GCF::fragmap
std::vector< uint32_t > fragmap
Definition
GCF.h:171
vpkpp::GCF::PackFileReadOnly
PackFileReadOnly(const std::string &fullFilePath_)
Definition
PackFile.cpp:755
vpkpp::PackFileReadOnly::PackFileReadOnly
PackFileReadOnly(const std::string &fullFilePath_)
Definition
PackFile.cpp:755
vpkpp::PackFile::EntryCallback
EntryCallbackBase< void > EntryCallback
Definition
PackFile.h:38
vpkpp::PackFile::OpenPropertyRequest
std::function< std::vector< std::byte >(PackFile *packFile, OpenProperty property)> OpenPropertyRequest
Definition
PackFile.h:33
vpkpp
Definition
Attribute.h:5
vpkpp::Attribute
Attribute
Definition
Attribute.h:7
vpkpp::GCF_EXTENSION
constexpr std::string_view GCF_EXTENSION
Definition
GCF.h:9
vpkpp::GCF::BlockHeader
Definition
GCF.h:30
vpkpp::GCF::BlockHeader::checksum
uint32_t checksum
Definition
GCF.h:38
vpkpp::GCF::BlockHeader::dummy5
uint32_t dummy5
Definition
GCF.h:37
vpkpp::GCF::BlockHeader::dummy4
uint32_t dummy4
Definition
GCF.h:36
vpkpp::GCF::BlockHeader::used
uint32_t used
Definition
GCF.h:32
vpkpp::GCF::BlockHeader::dummy2
uint32_t dummy2
Definition
GCF.h:34
vpkpp::GCF::BlockHeader::count
uint32_t count
Definition
GCF.h:31
vpkpp::GCF::BlockHeader::dummy3
uint32_t dummy3
Definition
GCF.h:35
vpkpp::GCF::BlockHeader::dummy1
uint32_t dummy1
Definition
GCF.h:33
vpkpp::GCF::Block
Definition
GCF.h:41
vpkpp::GCF::Block::file_data_offset
uint32_t file_data_offset
Definition
GCF.h:51
vpkpp::GCF::Block::file_data_size
uint32_t file_data_size
Definition
GCF.h:52
vpkpp::GCF::Block::isEncrypted
bool isEncrypted() const
Definition
GCF.h:72
vpkpp::GCF::Block::CompressionType
CompressionType
Definition
GCF.h:42
vpkpp::GCF::Block::CompressionType::COMPRESSED_AND_ENCRYPTED
@ COMPRESSED_AND_ENCRYPTED
Definition
GCF.h:45
vpkpp::GCF::Block::CompressionType::ENCRYPTED
@ ENCRYPTED
Definition
GCF.h:46
vpkpp::GCF::Block::CompressionType::COMPRESSED
@ COMPRESSED
Definition
GCF.h:44
vpkpp::GCF::Block::CompressionType::UNCOMPRESSED
@ UNCOMPRESSED
Definition
GCF.h:43
vpkpp::GCF::Block::flags
uint16_t flags
Definition
GCF.h:49
vpkpp::GCF::Block::dir_index
uint32_t dir_index
Definition
GCF.h:56
vpkpp::GCF::Block::next_block_entry_index
uint32_t next_block_entry_index
Definition
GCF.h:54
vpkpp::GCF::Block::getCompressionType
CompressionType getCompressionType() const
Definition
GCF.h:58
vpkpp::GCF::Block::open
uint16_t open
Definition
GCF.h:50
vpkpp::GCF::Block::prev_block_entry_index
uint32_t prev_block_entry_index
Definition
GCF.h:55
vpkpp::GCF::Block::first_data_block_index
uint32_t first_data_block_index
Definition
GCF.h:53
vpkpp::GCF::ChecksumMapEntry
Definition
GCF.h:134
vpkpp::GCF::ChecksumMapEntry::firstindex
uint32_t firstindex
Definition
GCF.h:136
vpkpp::GCF::ChecksumMapEntry::count
uint32_t count
Definition
GCF.h:135
vpkpp::GCF::ChecksumMapHeader
Definition
GCF.h:127
vpkpp::GCF::ChecksumMapHeader::item_count
uint32_t item_count
Definition
GCF.h:130
vpkpp::GCF::ChecksumMapHeader::dummy2
uint32_t dummy2
Definition
GCF.h:129
vpkpp::GCF::ChecksumMapHeader::checksum_count
uint32_t checksum_count
Definition
GCF.h:131
vpkpp::GCF::ChecksumMapHeader::dummy1
uint32_t dummy1
Definition
GCF.h:128
vpkpp::GCF::DataBlockHeader
Definition
GCF.h:118
vpkpp::GCF::DataBlockHeader::blockcount
uint32_t blockcount
Definition
GCF.h:120
vpkpp::GCF::DataBlockHeader::checksum
uint32_t checksum
Definition
GCF.h:124
vpkpp::GCF::DataBlockHeader::firstblockoffset
uint32_t firstblockoffset
Definition
GCF.h:122
vpkpp::GCF::DataBlockHeader::blocksize
uint32_t blocksize
Definition
GCF.h:121
vpkpp::GCF::DataBlockHeader::used
uint32_t used
Definition
GCF.h:123
vpkpp::GCF::DataBlockHeader::appversion
uint32_t appversion
Definition
GCF.h:119
vpkpp::GCF::DirectoryEntry2
Definition
GCF.h:104
vpkpp::GCF::DirectoryEntry2::filename
std::string filename
Definition
GCF.h:106
vpkpp::GCF::DirectoryEntry2::entry_real
DirectoryEntry entry_real
Definition
GCF.h:105
vpkpp::GCF::DirectoryEntry
Definition
GCF.h:94
vpkpp::GCF::DirectoryEntry::nameoffset
uint32_t nameoffset
Definition
GCF.h:95
vpkpp::GCF::DirectoryEntry::nextindex
uint32_t nextindex
Definition
GCF.h:100
vpkpp::GCF::DirectoryEntry::dirtype
uint32_t dirtype
Definition
GCF.h:98
vpkpp::GCF::DirectoryEntry::fileid
uint32_t fileid
Definition
GCF.h:97
vpkpp::GCF::DirectoryEntry::firstindex
uint32_t firstindex
Definition
GCF.h:101
vpkpp::GCF::DirectoryEntry::parentindex
uint32_t parentindex
Definition
GCF.h:99
vpkpp::GCF::DirectoryEntry::itemsize
uint32_t itemsize
Definition
GCF.h:96
vpkpp::GCF::DirectoryHeader
Definition
GCF.h:77
vpkpp::GCF::DirectoryHeader::localcount
uint32_t localcount
Definition
GCF.h:88
vpkpp::GCF::DirectoryHeader::dirsize
uint32_t dirsize
Definition
GCF.h:84
vpkpp::GCF::DirectoryHeader::dummy1
uint32_t dummy1
Definition
GCF.h:78
vpkpp::GCF::DirectoryHeader::checksum
uint32_t checksum
Definition
GCF.h:91
vpkpp::GCF::DirectoryHeader::itemcount
uint32_t itemcount
Definition
GCF.h:81
vpkpp::GCF::DirectoryHeader::dummy2
uint32_t dummy2
Definition
GCF.h:83
vpkpp::GCF::DirectoryHeader::dummy4
uint32_t dummy4
Definition
GCF.h:90
vpkpp::GCF::DirectoryHeader::info1count
uint32_t info1count
Definition
GCF.h:86
vpkpp::GCF::DirectoryHeader::gcfversion
uint32_t gcfversion
Definition
GCF.h:80
vpkpp::GCF::DirectoryHeader::filecount
uint32_t filecount
Definition
GCF.h:82
vpkpp::GCF::DirectoryHeader::copycount
uint32_t copycount
Definition
GCF.h:87
vpkpp::GCF::DirectoryHeader::dummy3
uint32_t dummy3
Definition
GCF.h:89
vpkpp::GCF::DirectoryHeader::namesize
uint32_t namesize
Definition
GCF.h:85
vpkpp::GCF::DirectoryHeader::cacheid
uint32_t cacheid
Definition
GCF.h:79
vpkpp::GCF::DirectoryMapEntry
Definition
GCF.h:114
vpkpp::GCF::DirectoryMapEntry::firstblockindex
uint32_t firstblockindex
Definition
GCF.h:115
vpkpp::GCF::DirectoryMapHeader
Definition
GCF.h:109
vpkpp::GCF::DirectoryMapHeader::dummy2
uint32_t dummy2
Definition
GCF.h:111
vpkpp::GCF::DirectoryMapHeader::dummy1
uint32_t dummy1
Definition
GCF.h:110
vpkpp::GCF::Header
Definition
GCF.h:14
vpkpp::GCF::Header::dummy5
uint32_t dummy5
Definition
GCF.h:25
vpkpp::GCF::Header::filesize
uint32_t filesize
Definition
GCF.h:22
vpkpp::GCF::Header::appversion
uint32_t appversion
Definition
GCF.h:19
vpkpp::GCF::Header::blocksize
uint32_t blocksize
Definition
GCF.h:23
vpkpp::GCF::Header::appid
uint32_t appid
Definition
GCF.h:18
vpkpp::GCF::Header::dummy4
uint32_t dummy4
Definition
GCF.h:21
vpkpp::GCF::Header::blockcount
uint32_t blockcount
Definition
GCF.h:24
vpkpp::GCF::Header::dummy2
uint32_t dummy2
Definition
GCF.h:16
vpkpp::GCF::Header::dummy1
uint32_t dummy1
Definition
GCF.h:15
vpkpp::GCF::Header::gcfversion
uint32_t gcfversion
Definition
GCF.h:17
vpkpp::GCF::Header::dummy3
uint32_t dummy3
Definition
GCF.h:20
include
vpkpp
format
GCF.h
Generated on
for SourcePP by
1.17.0