Pyrogenesis trunk
CacheLoader.h
Go to the documentation of this file.
1/* Copyright (C) 2018 Wildfire Games.
2 * This file is part of 0 A.D.
3 *
4 * 0 A.D. is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * 0 A.D. is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef INCLUDED_CACHELOADER
19#define INCLUDED_CACHELOADER
20
21#include "lib/file/vfs/vfs.h"
22
23class MD5;
24
25/**
26 * Helper class for systems that have an expensive cacheable conversion process
27 * when loading files.
28 *
29 * Conversion output can be automatically cached as loose files, indexed by a hash
30 * of the file's timestamp and size plus any other data the caller provides.
31 * This allows developers and modders to easily produce new files, with the conversion
32 * happening transparently.
33 *
34 * For release packages, files can be precached by appending ".cached.{extension}"
35 * to their name, which will be used instead of doing runtime conversion.
36 * These cache files will typically be packed into an archive for faster loading;
37 * if no archive cache is available then the source file will be converted and stored
38 * as a loose cache file instead.
39 */
41{
42public:
43 CCacheLoader(PIVFS vfs, const std::wstring& fileExtension);
44
45 /**
46 * Attempts to find a valid cached which can be loaded.
47 * Returns INFO::OK and sets loadPath to the cached file if there is one.
48 * Returns INFO::SKIPPED and sets loadPath to the desire loose cache name if there isn't one.
49 * Returns a value < 0 on error (e.g. the source file doesn't exist). No error is logged or thrown.
50 */
51 Status TryLoadingCached(const VfsPath& sourcePath, const MD5& initialHash, u32 version, VfsPath& loadPath);
52
53 /**
54 * Determines whether we can safely use the archived cache file, or need to
55 * re-convert the source file.
56 */
57 bool CanUseArchiveCache(const VfsPath& sourcePath, const VfsPath& archiveCachePath);
58
59 /**
60 * Return the path of the archive cache for the given source file.
61 */
62 VfsPath ArchiveCachePath(const VfsPath& sourcePath) const;
63
64 /**
65 * Return the path of the loose cache for the given source file.
66 */
67 VfsPath LooseCachePath(const VfsPath& sourcePath, const MD5& initialHash, u32 version);
68
69private:
71 std::wstring m_FileExtension;
72};
73
74#endif // INCLUDED_CACHELOADER
Helper class for systems that have an expensive cacheable conversion process when loading files.
Definition: CacheLoader.h:41
bool CanUseArchiveCache(const VfsPath &sourcePath, const VfsPath &archiveCachePath)
Determines whether we can safely use the archived cache file, or need to re-convert the source file.
Definition: CacheLoader.cpp:72
Status TryLoadingCached(const VfsPath &sourcePath, const MD5 &initialHash, u32 version, VfsPath &loadPath)
Attempts to find a valid cached which can be loaded.
Definition: CacheLoader.cpp:33
std::wstring m_FileExtension
Definition: CacheLoader.h:71
VfsPath ArchiveCachePath(const VfsPath &sourcePath) const
Return the path of the archive cache for the given source file.
Definition: CacheLoader.cpp:113
PIVFS m_VFS
Definition: CacheLoader.h:70
CCacheLoader(PIVFS vfs, const std::wstring &fileExtension)
Definition: CacheLoader.cpp:28
VfsPath LooseCachePath(const VfsPath &sourcePath, const MD5 &initialHash, u32 version)
Return the path of the loose cache for the given source file.
Definition: CacheLoader.cpp:118
MD5 hashing algorithm.
Definition: MD5.h:28
Definition: path.h:80
Definition: vfs_util.cpp:39
i64 Status
Error handling system.
Definition: status.h:173
uint32_t u32
Definition: types.h:39
std::shared_ptr< IVFS > PIVFS
Definition: vfs.h:220