OpenTTD Source 20260108-master-g8ba1860eaa
base_media_base.h
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
10#ifndef BASE_MEDIA_BASE_H
11#define BASE_MEDIA_BASE_H
12
13#include "fileio_func.h"
14#include "textfile_type.h"
15#include "textfile_gui.h"
16#include "3rdparty/md5/md5.h"
17#include <unordered_map>
18
19struct IniFile;
20struct IniGroup;
21struct IniItem;
22struct ContentInfo;
23
25struct MD5File {
33
34 std::string filename;
35 MD5Hash hash;
36 std::string missing_warning;
38
39 ChecksumResult CheckMD5(Subdirectory subdir, size_t max_size) const;
40};
41
43template <class T> struct BaseSetTraits;
44
49template <class T>
50struct BaseSet {
51 virtual ~BaseSet() = default;
52
53 typedef std::unordered_map<std::string, std::string, StringHash, std::equal_to<>> TranslatedStrings;
54
56 static constexpr size_t NUM_FILES = BaseSetTraits<T>::num_files;
57
60
62 static constexpr std::string_view SET_TYPE = BaseSetTraits<T>::set_type;
63
64 std::string name;
65 std::string url;
66 TranslatedStrings description;
67 uint32_t shortname = 0;
68 std::vector<uint32_t> version;
69 bool fallback = false;
70
71 std::array<MD5File, BaseSet<T>::NUM_FILES> files{};
72 uint found_files = 0;
73 uint valid_files = 0;
74
79 int GetNumMissing() const
80 {
82 }
83
89 int GetNumInvalid() const
90 {
92 }
93
94 void LogError(std::string_view full_filename, std::string_view detail, int level = 0) const;
95 const IniItem *GetMandatoryItem(std::string_view full_filename, const IniGroup &group, std::string_view name) const;
96
97 bool FillSetDetails(const IniFile &ini, const std::string &path, const std::string &full_filename, bool allow_empty_filename = true);
98 void CopyCompatibleConfig([[maybe_unused]] const T &src) {}
99
108 const std::string &GetDescription(std::string_view isocode) const
109 {
110 if (!isocode.empty()) {
111 /* First the full ISO code */
112 auto desc = this->description.find(isocode);
113 if (desc != this->description.end()) return desc->second;
114
115 /* Then the first two characters */
116 desc = this->description.find(isocode.substr(0, 2));
117 if (desc != this->description.end()) return desc->second;
118 }
119 /* Then fall back */
120 return this->description.at(std::string{});
121 }
122
133 {
134 return file->CheckMD5(subdir, SIZE_MAX);
135 }
136
142 std::optional<std::string> GetTextfile(TextfileType type) const
143 {
144 for (const auto &file : this->files) {
145 auto textfile = ::GetTextfile(type, BASESET_DIR, file.filename);
146 if (textfile.has_value()) {
147 return textfile;
148 }
149 }
150 return std::nullopt;
151 }
152
157 static std::span<const std::string_view> GetFilenames();
158};
159
164template <class Tbase_set>
166protected:
167 static inline std::vector<std::unique_ptr<Tbase_set>> available_sets;
168 static inline std::vector<std::unique_ptr<Tbase_set>> duplicate_sets;
169 static inline const Tbase_set *used_set;
170
171 bool AddFile(const std::string &filename, size_t basepath_length, const std::string &tar_filename) override;
172
177 static std::string_view GetExtension();
178
183 static std::span<const std::unique_ptr<Tbase_set>> GetDuplicateSets() { return BaseMedia<Tbase_set>::duplicate_sets; }
184public:
190 static bool DetermineBestSet();
191
193 static uint FindSets()
194 {
196 /* Searching in tars is only done in the old "data" directories basesets. */
197 uint num = fs.Scan(GetExtension(), Tbase_set::SEARCH_IN_TARS ? OLD_DATA_DIR : OLD_GM_DIR, Tbase_set::SEARCH_IN_TARS);
198 return num + fs.Scan(GetExtension(), BASESET_DIR, Tbase_set::SEARCH_IN_TARS);
199 }
200
205 static std::span<const std::unique_ptr<Tbase_set>> GetAvailableSets() { return BaseMedia<Tbase_set>::available_sets; }
206
207 static bool SetSet(const Tbase_set *set);
208 static bool SetSetByName(const std::string &name);
209 static bool SetSetByShortname(uint32_t shortname);
210 static void GetSetsList(std::back_insert_iterator<std::string> &output_iterator);
211 static int GetNumSets();
212 static int GetIndexOfUsedSet();
213 static const Tbase_set *GetSet(int index);
214 static const Tbase_set *GetUsedSet();
215
222 static bool HasSet(const ContentInfo &ci, bool md5sum);
223};
224
232template <class Tbase_set>
233std::optional<std::string_view> TryGetBaseSetFile(const ContentInfo &ci, bool md5sum, std::span<const std::unique_ptr<Tbase_set>> sets);
234
235#endif /* BASE_MEDIA_BASE_H */
std::optional< std::string_view > TryGetBaseSetFile(const ContentInfo &ci, bool md5sum, std::span< const std::unique_ptr< Tbase_set > > sets)
Check whether there's a base set matching some information.
Base for all base media (graphics, sounds)
static const Tbase_set * GetUsedSet()
Return the used set.
static std::vector< std::unique_ptr< Tbase_set > > available_sets
All available sets.
bool AddFile(const std::string &filename, size_t basepath_length, const std::string &tar_filename) override
Add a file with the given filename.
static bool SetSetByShortname(uint32_t shortname)
Set the set to be used.
static void GetSetsList(std::back_insert_iterator< std::string > &output_iterator)
Returns a list with the sets.
static std::span< const std::unique_ptr< Tbase_set > > GetAvailableSets()
Return the available sets.
static int GetNumSets()
Count the number of available graphics sets.
static uint FindSets()
Do the scan for files.
static bool HasSet(const ContentInfo &ci, bool md5sum)
Check whether we have an set with the exact characteristics as ci.
static const Tbase_set * used_set
The currently used set.
static std::vector< std::unique_ptr< Tbase_set > > duplicate_sets
All sets that aren't available, but needed for not downloading base sets when a newer version than th...
static const Tbase_set * GetSet(int index)
Get the name of the graphics set at the specified index.
static int GetIndexOfUsedSet()
Get the index of the currently active graphics set.
static bool DetermineBestSet()
Determine the graphics pack that has to be used.
static bool SetSetByName(const std::string &name)
Set the set to be used.
static std::span< const std::unique_ptr< Tbase_set > > GetDuplicateSets()
Return the duplicate sets.
static bool SetSet(const Tbase_set *set)
Set the set to be used.
static std::string_view GetExtension()
Get the extension that is used to identify this set.
Helper for scanning for files with a given name.
Definition fileio_func.h:37
uint Scan(std::string_view extension, Subdirectory sd, bool tars=true, bool recursive=true)
Scan for files with the given extension in the given search path.
Definition fileio.cpp:1115
Functions for standard in/out file operations.
Subdirectory
The different kinds of subdirectories OpenTTD uses.
Definition fileio_type.h:88
@ OLD_DATA_DIR
Old subdirectory for the data.
Definition fileio_type.h:95
@ OLD_GM_DIR
Old subdirectory for the music.
Definition fileio_type.h:94
@ BASESET_DIR
Subdirectory for all base data (base sets, intro game)
Definition fileio_type.h:96
Defines the traits of a BaseSet type.
Information about a single base set.
uint found_files
Number of the files that could be found.
std::array< MD5File, BaseSet< T >::NUM_FILES > files
All files part of this set.
uint valid_files
Number of the files that could be found and are valid.
void LogError(std::string_view full_filename, std::string_view detail, int level=0) const
Log error from reading basesets.
const IniItem * GetMandatoryItem(std::string_view full_filename, const IniGroup &group, std::string_view name) const
Try to read a single piece of metadata and return nullptr if it doesn't exist.
std::string url
URL for information about the base set.
TranslatedStrings description
Description of the base set.
static constexpr size_t NUM_FILES
Number of files in this set.
std::optional< std::string > GetTextfile(TextfileType type) const
Search a textfile file next to this base media.
static constexpr bool SEARCH_IN_TARS
Whether to search in the tars or not.
static MD5File::ChecksumResult CheckMD5(const MD5File *file, Subdirectory subdir)
Calculate and check the MD5 hash of the supplied file.
static std::span< const std::string_view > GetFilenames()
Get the internal names of the files in this set.
static constexpr std::string_view SET_TYPE
BaseSet type name.
std::string name
The name of the base set.
bool fallback
This set is a fallback set, i.e. it should be used only as last resort.
bool FillSetDetails(const IniFile &ini, const std::string &path, const std::string &full_filename, bool allow_empty_filename=true)
Read the set information from a loaded ini.
int GetNumMissing() const
Get the number of missing files.
std::vector< uint32_t > version
The version of this base set.
uint32_t shortname
Four letter short variant of the name.
int GetNumInvalid() const
Get the number of invalid files.
const std::string & GetDescription(std::string_view isocode) const
Get the description for the given ISO code.
Container for all important information about a piece of content.
Ini file that supports both loading and saving.
Definition ini_type.h:86
A group within an ini file.
Definition ini_type.h:34
A single "line" in an ini file.
Definition ini_type.h:23
Structure holding filename and MD5 information about a single file.
std::string missing_warning
warning when this file is missing
ChecksumResult check_result
cached result of md5 check
ChecksumResult CheckMD5(Subdirectory subdir, size_t max_size) const
Calculate and check the MD5 hash of the supplied filename.
Definition gfxinit.cpp:444
ChecksumResult
The result of a checksum check.
@ CR_MATCH
The file did exist and the md5 checksum did match.
@ CR_MISMATCH
The file did exist, just the md5 checksum did not match.
@ CR_NO_FILE
The file did not exist.
@ CR_UNKNOWN
The file has not been checked yet.
MD5Hash hash
md5 sum of the file
std::string filename
filename
GUI functions related to textfiles.
Types related to textfiles.
TextfileType
Additional text files accompanying Tar archives.