22#ifndef ENGINES_ADVANCED_DETECTOR_H
23#define ENGINES_ADVANCED_DETECTOR_H
25#include "engines/metaengine.h"
26#include "engines/engine.h"
28#include "common/hash-str.h"
30#include "common/gui_options.h"
46namespace ADDynamicDescription {
48static inline uint32 strSizeBuffer(
const char *
const &field) {
49 return field ? (uint32)strlen(field) + 1 : 0;
51static inline void *strToBuffer(
void *buffer,
const char *&field) {
53 int len = (int)strlen(field) + 1;
54 memcpy((
char *)buffer, field, len);
55 field = (
const char *)buffer;
56 buffer = (
char *)buffer + len;
61static inline uint32 alignSizeBuffer() {
63 return sizeof(
void *) - 1;
65static inline void *alignToBuffer(
void *buffer) {
67 uintptr tmp = (uintptr)buffer +
sizeof(
void *) - 1;
68 return (
void *)(tmp & -(int)
sizeof(
void *));
84 uint32 sizeBuffer()
const {
86 ret += ADDynamicDescription::strSizeBuffer(
fileName);
87 ret += ADDynamicDescription::strSizeBuffer(
md5);
91 void *toBuffer(
void *buffer) {
92 buffer = ADDynamicDescription::strToBuffer(buffer,
fileName);
93 buffer = ADDynamicDescription::strToBuffer(buffer,
md5);
98#define AD_NO_SIZE ((uint32)-1)
104#define AD_LISTEND {NULL, 0, NULL, 0}
110#define AD_ENTRY1(f, x) {{ f, 0, x, AD_NO_SIZE}, AD_LISTEND}
116#define AD_ENTRY1s(f, x, s) {{ f, 0, x, s}, AD_LISTEND}
122#define AD_ENTRY2s(f1, x1, s1, f2, x2, s2) {{f1, 0, x1, s1}, {f2, 0, x2, s2}, AD_LISTEND}
128#define AD_ENTRY3s(f1, x1, s1, f2, x2, s2, f3, x3, s3) {{f1, 0, x1, s1}, {f2, 0, x2, s2}, {f3, 0, x3, s3}, AD_LISTEND}
129#define AD_ENTRY4s(f1, x1, s1, f2, x2, s2, f3, x3, s3, f4, x4, s4) {{f1, 0, x1, s1}, {f2, 0, x2, s2}, {f3, 0, x3, s3}, {f4, 0, x4, s4}, AD_LISTEND}
130#define AD_ENTRY5s(f1, x1, s1, f2, x2, s2, f3, x3, s3, f4, x4, s4, f5, x5, s5) {{f1, 0, x1, s1}, {f2, 0, x2, s2}, {f3, 0, x3, s3}, {f4, 0, x4, s4}, {f5, 0, x5, s5}, AD_LISTEND}
131#define AD_ENTRY6s(f1, x1, s1, f2, x2, s2, f3, x3, s3, f4, x4, s4, f5, x5, s5, f6, x6, s6) {{f1, 0, x1, s1}, {f2, 0, x2, s2}, {f3, 0, x3, s3}, {f4, 0, x4, s4}, {f5, 0, x5, s5}, {f6, 0, x6, s6}, AD_LISTEND}
223 ret += ADDynamicDescription::strSizeBuffer(
gameId);
224 ret += ADDynamicDescription::strSizeBuffer(
extra);
228 ret += ADDynamicDescription::strSizeBuffer(
guiOptions);
240 buffer = ADDynamicDescription::strToBuffer(buffer,
gameId);
241 buffer = ADDynamicDescription::strToBuffer(buffer,
extra);
245 buffer = ADDynamicDescription::strToBuffer(buffer,
guiOptions);
256#define AD_GAME_DESCRIPTION_HELPERS(field) \
257 uint32 sizeBuffer() const { \
258 return field.sizeBuffer(); \
260 void *toBuffer(void *buffer) { \
261 return field.toBuffer(buffer); \
275 memcpy(
static_cast<T*
>(
this), other,
sizeof(T));
280 uint32 sz = other->sizeBuffer();
281 _buffer =
new byte[sz];
285 void *end = this->toBuffer(_buffer);
286 assert(end <= _buffer + sz);
328#define AD_TABLE_END_MARKER \
329 { NULL, NULL, { { NULL, 0, NULL, 0 } }, Common::UNK_LANG, Common::kPlatformUnknown, ADGF_NO_FLAGS, GUIO0() }
405#define AD_EXTRA_GUI_OPTIONS_TERMINATOR { 0, { 0, 0, 0, 0, 0, 0 } }
549 void preprocessDescriptions();
552 void detectClashes()
const;
557 bool _hashMapsInited;
607 friend class FileMapArchive;
610template<
class Descriptor>
727template<
class Descriptor>
732 return createInstance(syst, engine,
static_cast<const Descriptor *
>(desc));
738 const_cast<void *
>(meDescriptor));
752 md5HashMap.setVal(fname, md5);
756 return md5HashMap.
getVal(fname);
760 sizeHashMap.setVal(fname, size);
764 return sizeHashMap.
getVal(fname);
777 if (archiveHashMap.
contains(filename)) {
778 delete archiveHashMap[filename];
781 archiveHashMap.setVal(filename, archivePtr);
785 return archiveHashMap.getValOrDefault(node.getPath(),
nullptr);
792 void clearArchives() {
793 for (
auto &entry : archiveHashMap) {
796 archiveHashMap.clear(
true);
800 md5HashMap.
clear(
true);
801 sizeHashMap.
clear(
true);
817#define ADCacheMan AdvancedDetectorCacheManager::instance()
Definition: advancedDetector.h:271
Definition: advancedDetector.h:749
Definition: archive.h:141
ErrorCode getCode() const
Definition: error.h:112
Definition: singleton.h:42
@ kNoError
No error occurred.
Definition: error.h:48
bool contains(const Key &key) const
Definition: hashmap.h:598
Val & getVal(const Key &key)
Definition: hashmap.h:637
void clear(bool shrinkArray=0)
Definition: hashmap.h:431
Language
Definition: language.h:45
#define ARRAYSIZE(x)
Definition: util.h:114
ADGameFlags
Definition: advancedDetector.h:138
Common::Array< ADDetectedGame > ADDetectedGames
Definition: advancedDetector.h:322
ADFlags
Definition: advancedDetector.h:346
@ ADGF_DEMO
Add "-demo" to gameid.
Definition: advancedDetector.h:157
@ ADGF_DVD
Add "-dvd" to gameid.
Definition: advancedDetector.h:156
@ ADGF_USEEXTRAASTITLE
Use ADGameDescription::extra as the main game title, not gameid.
Definition: advancedDetector.h:152
@ ADGF_ADDON
An add-on game, that cannot be run independently without its base game.
Definition: advancedDetector.h:140
@ ADGF_AUTOGENTARGET
Automatically generate gameid from ADGameDescription::extra.
Definition: advancedDetector.h:142
@ ADGF_REMASTERED
Add "-remastered' to gameid.
Definition: advancedDetector.h:158
@ ADGF_NO_FLAGS
No flags.
Definition: advancedDetector.h:139
@ ADGF_DROPPLATFORM
Do not add platform to gameid.
Definition: advancedDetector.h:154
@ ADGF_UNSUPPORTED
Definition: advancedDetector.h:146
@ ADGF_CD
Add "-cd" to gameid.
Definition: advancedDetector.h:155
@ ADGF_DROPLANGUAGE
Do not add language to gameid.
Definition: advancedDetector.h:153
@ ADGF_TESTING
Flag to designate not yet officially supported games that are fit for public testing.
Definition: advancedDetector.h:144
@ ADGF_WARNING
Definition: advancedDetector.h:148
@ ADGF_TAILMD5
Calculate the MD5 for this entry from the end of the file.
Definition: advancedDetector.h:141
@ ADGF_MACRESFORK
Calculate the MD5 for this entry from the resource fork.
Definition: advancedDetector.h:151
@ ADGF_UNSTABLE
Flag to designate not yet officially supported games that are not fit for public testing.
Definition: advancedDetector.h:143
@ ADGF_ADDENGLISH
Always add English as a language option.
Definition: advancedDetector.h:150
@ ADGF_PIRATED
Flag to designate well-known pirated versions with cracks.
Definition: advancedDetector.h:145
@ kADFlagUseExtraAsHint
Definition: advancedDetector.h:357
@ kADFlagCanPlayUnknownVariants
Definition: advancedDetector.h:387
@ kADFlagCanTranscodeTraditionalChineseToSimplified
Definition: advancedDetector.h:392
@ kADFlagPreferFallbackDetection
Definition: advancedDetector.h:380
@ kADFlagMatchFullPaths
Definition: advancedDetector.h:370
MD5Properties
Definition: game.h:106
Definition: algorithm.h:29
Definition: advancedDetector.h:309
ADDetectedGame(const ADGameDescription *d)
Definition: advancedDetector.h:318
const ADGameDescription * desc
Definition: advancedDetector.h:312
bool hasUnknownFiles
Definition: advancedDetector.h:310
FilePropertiesMap matchedFiles
Definition: advancedDetector.h:311
Definition: advancedDetector.h:331
const ADGameDescription * desc
Definition: advancedDetector.h:336
const char * filenames[10]
Definition: advancedDetector.h:342
Definition: advancedDetector.h:164
const char * guiOptions
Definition: advancedDetector.h:216
uint32 sizeBuffer() const
Definition: advancedDetector.h:221
const char * extra
Definition: advancedDetector.h:181
uint32 flags
Definition: advancedDetector.h:207
Common::Platform platform
Definition: advancedDetector.h:199
const char * gameId
Definition: advancedDetector.h:170
ADGameFileDescription filesDescriptions[14]
Definition: advancedDetector.h:189
void * toBuffer(void *buffer)
Definition: advancedDetector.h:239
Common::Language language
Definition: advancedDetector.h:194
Definition: advancedDetector.h:78
uint16 fileType
Optional. Not used during detection, only by engines.
Definition: advancedDetector.h:80
const char * md5
MD5 of (the beginning of) the described file. Optional. Set to NULL to ignore.
Definition: advancedDetector.h:81
const char * fileName
Name of the described file.
Definition: advancedDetector.h:79
uint32 fileSize
Size of the described file. Set to AD_NO_SIZE to ignore.
Definition: advancedDetector.h:82