SourcePP
Several modern C++20 libraries for sanely parsing Valve's formats.
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
7namespace vpkpp {
8
9constexpr std::string_view GCF_EXTENSION = ".gcf";
10
11class GCF : public PackFileReadOnly {
12protected:
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 {
44 COMPRESSED, // compressed on the server, client automatically extracts it so not really
47 };
48
49 uint16_t flags;
50 uint16_t open;
56 uint32_t dir_index;
57
58 [[nodiscard]] CompressionType getCompressionType() const {
59 static constexpr std::array compressionTypeLUT = {
64 };
65 const auto idx = (static_cast<std::uint8_t>(flags) & 7) - 1;
66 if (idx <= 3) {
67 return compressionTypeLUT[idx];
68 }
70 }
71
72 [[nodiscard]] bool isEncrypted() const {
73 return static_cast<uint32_t>(this->getCompressionType()) - 2 <= 1;
74 }
75 };
76
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
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
108
110 uint32_t dummy1;
111 uint32_t dummy2;
112 };
113
116 };
117
119 uint32_t appversion;
120 uint32_t blockcount;
121 uint32_t blocksize;
123 uint32_t used;
124 uint32_t checksum;
125 };
126
128 uint32_t dummy1;
129 uint32_t dummy2;
130 uint32_t item_count;
132 };
133
135 uint32_t count;
136 uint32_t firstindex;
137 };
138#pragma pack(pop)
139
140public:
141 [[nodiscard]] static std::unique_ptr<PackFile> open(const std::string& path, const EntryCallback& callback = nullptr, const OpenPropertyRequest& requestProperty = nullptr);
142
143 static constexpr std::string_view GUID = "0C088488F666451E9361297528F2446D";
144
145 [[nodiscard]] constexpr std::string_view getGUID() const override {
146 return GCF::GUID;
147 }
148
149 [[nodiscard]] constexpr bool hasEntryChecksums() const override {
150 return true;
151 }
152
153 [[nodiscard]] std::vector<std::string> verifyEntryChecksums() const override;
154
155 [[nodiscard]] constexpr bool isCaseSensitive() const override {
156 return true;
157 }
158
159 [[nodiscard]] std::optional<std::vector<std::byte>> readEntry(const std::string& path_) const override;
160
161 [[nodiscard]] Attribute getSupportedEntryAttributes() const override;
162
163 [[nodiscard]] explicit operator std::string() const override;
164
165 [[nodiscard]] uint32_t getVersion() const;
166
167 [[nodiscard]] uint32_t getAppID() const;
168
169 [[nodiscard]] uint32_t getAppVersion() const;
170
171protected:
173
176 std::vector<Block> blockdata{};
177 std::vector<uint32_t> fragmap{};
179 //std::vector<DirectoryEntry2> direntries{};
180 std::vector<DirectoryMapEntry> dirmap_entries{};
182 std::vector<ChecksumMapEntry> chksum_map{};
183 std::vector<uint32_t> checksums{};
184 std::array<std::byte, 16> decryption_key;
185private:
187};
188
189} // namespace vpkpp
#define VPKPP_REGISTER_PACKFILE_OPEN(extension, function)
Definition PackFile.h:255
static std::unique_ptr< PackFile > open(const std::string &path, const EntryCallback &callback=nullptr, const OpenPropertyRequest &requestProperty=nullptr)
Definition GCF.cpp:17
Header header
Definition GCF.h:174
std::vector< DirectoryMapEntry > dirmap_entries
Definition GCF.h:180
std::vector< Block > blockdata
Definition GCF.h:176
BlockHeader blockheader
Definition GCF.h:175
std::vector< ChecksumMapEntry > chksum_map
Definition GCF.h:182
std::array< std::byte, 16 > decryption_key
Definition GCF.h:184
uint32_t getVersion() const
Definition GCF.cpp:366
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:204
uint32_t getAppVersion() const
Definition GCF.cpp:374
constexpr std::string_view getGUID() const override
Get the GUID corresponding to the pack file type.
Definition GCF.h:145
DataBlockHeader datablockheader
Definition GCF.h:181
constexpr bool isCaseSensitive() const override
Does the format support case-sensitive file names?
Definition GCF.h:155
constexpr bool hasEntryChecksums() const override
Returns true if the format has a checksum for each entry.
Definition GCF.h:149
static constexpr std::string_view GUID
Definition GCF.h:143
DirectoryHeader dirheader
Definition GCF.h:178
Attribute getSupportedEntryAttributes() const override
Returns a list of supported entry attributes Mostly for GUI programs that show entries and their meta...
Definition GCF.cpp:354
std::vector< uint32_t > checksums
Definition GCF.h:183
uint32_t getAppID() const
Definition GCF.cpp:370
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:229
std::vector< uint32_t > fragmap
Definition GCF.h:177
PackFileReadOnly(const std::string &fullFilePath_)
Definition PackFile.cpp:728
PackFileReadOnly(const std::string &fullFilePath_)
Definition PackFile.cpp:728
EntryCallbackBase< void > EntryCallback
Definition PackFile.h:38
std::function< std::vector< std::byte >(PackFile *packFile, OpenProperty property)> OpenPropertyRequest
Definition PackFile.h:33
Attribute
Definition Attribute.h:7
constexpr std::string_view GCF_EXTENSION
Definition GCF.h:9
uint32_t checksum
Definition GCF.h:38
uint32_t dummy5
Definition GCF.h:37
uint32_t dummy4
Definition GCF.h:36
uint32_t dummy2
Definition GCF.h:34
uint32_t dummy3
Definition GCF.h:35
uint32_t dummy1
Definition GCF.h:33
uint32_t file_data_offset
Definition GCF.h:51
uint32_t file_data_size
Definition GCF.h:52
bool isEncrypted() const
Definition GCF.h:72
uint16_t flags
Definition GCF.h:49
uint32_t dir_index
Definition GCF.h:56
uint32_t next_block_entry_index
Definition GCF.h:54
CompressionType getCompressionType() const
Definition GCF.h:58
uint16_t open
Definition GCF.h:50
uint32_t prev_block_entry_index
Definition GCF.h:55
uint32_t first_data_block_index
Definition GCF.h:53
uint32_t firstblockoffset
Definition GCF.h:122
std::string filename
Definition GCF.h:106
DirectoryEntry entry_real
Definition GCF.h:105
uint32_t dummy5
Definition GCF.h:25
uint32_t filesize
Definition GCF.h:22
uint32_t appversion
Definition GCF.h:19
uint32_t blocksize
Definition GCF.h:23
uint32_t appid
Definition GCF.h:18
uint32_t dummy4
Definition GCF.h:21
uint32_t blockcount
Definition GCF.h:24
uint32_t dummy2
Definition GCF.h:16
uint32_t dummy1
Definition GCF.h:15
uint32_t gcfversion
Definition GCF.h:17
uint32_t dummy3
Definition GCF.h:20