diff options
-rw-r--r-- | engines/advancedDetector.cpp | 104 | ||||
-rw-r--r-- | engines/advancedDetector.h | 50 |
2 files changed, 79 insertions, 75 deletions
diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index 06f6c79db6..b0a304aad9 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -33,51 +33,7 @@ #include "engines/advancedDetector.h" -/** - * A list of pointers to ADGameDescription structs (or subclasses thereof). - */ -typedef Common::Array<const ADGameDescription*> ADGameDescList; - - -/** - * Detect games in specified directory. - * Parameters language and platform are used to pass on values - * specified by the user. I.e. this is used to restrict search scope. - * - * @param fslist FSList to scan or NULL for scanning all specified - * default directories. - * @param params a ADParams struct containing various parameters - * @param language restrict results to specified language only - * @param platform restrict results to specified platform only - * @return list of ADGameDescription (or subclass) pointers corresponding to matched games - */ -static ADGameDescList detectGame(const Common::FSList &fslist, const ADParams ¶ms, Common::Language language, Common::Platform platform, const Common::String &extra); - - -/** - * Returns list of targets supported by the engine. - * Distinguishes engines with single ID - */ -static GameList gameIDList(const ADParams ¶ms) { - if (params.singleid != NULL) { - GameList gl; - - const PlainGameDescriptor *g = params.gameDescriptors; - while (g->gameid) { - if (0 == scumm_stricmp(params.singleid, g->gameid)) { - gl.push_back(GameDescriptor(g->gameid, g->description)); - - return gl; - } - g++; - } - error("Engine %s doesn't have its singleid specified in ids list", params.singleid); - } - - return GameList(params.gameDescriptors); -} - -static void upgradeTargetIfNecessary(const ADParams ¶ms) { +void AdvancedMetaEngine::upgradeTargetIfNecessary() const { if (params.obsoleteList == 0) return; @@ -189,7 +145,7 @@ static Common::String generatePreferredTarget(const Common::String &id, const AD return res; } -static void AdvancedMetaEngine::updateGameDescriptor(GameDescriptor &desc, const ADGameDescription *realDesc) { +void AdvancedMetaEngine::updateGameDescriptor(GameDescriptor &desc, const ADGameDescription *realDesc) const { if (params.singleid != NULL) { desc["preferredtarget"] = desc["gameid"]; desc["gameid"] = params.singleid; @@ -234,7 +190,7 @@ bool cleanupPirated(ADGameDescList &matched) { GameList AdvancedMetaEngine::detectGames(const Common::FSList &fslist) const { - ADGameDescList matches = detectGame(fslist, params, Common::UNK_LANG, Common::kPlatformUnknown, ""); + ADGameDescList matches = detectGame(fslist, Common::UNK_LANG, Common::kPlatformUnknown, ""); GameList detectedGames; if (cleanupPirated(matches)) @@ -245,14 +201,14 @@ GameList AdvancedMetaEngine::detectGames(const Common::FSList &fslist) const { const ADGameDescription *fallbackDesc = fallbackDetect(fslist); if (fallbackDesc != 0) { GameDescriptor desc(toGameDescriptor(*fallbackDesc, params.gameDescriptors)); - updateGameDescriptor(desc, fallbackDesc, params); + updateGameDescriptor(desc, fallbackDesc); detectedGames.push_back(desc); } } else { // Otherwise use the found matches for (uint i = 0; i < matches.size(); i++) { GameDescriptor desc(toGameDescriptor(*matches[i], params.gameDescriptors)); - updateGameDescriptor(desc, matches[i], params); + updateGameDescriptor(desc, matches[i]); detectedGames.push_back(desc); } } @@ -262,7 +218,7 @@ GameList AdvancedMetaEngine::detectGames(const Common::FSList &fslist) const { Common::Error AdvancedMetaEngine::createInstance(OSystem *syst, Engine **engine) const { assert(engine); - upgradeTargetIfNecessary(params); + upgradeTargetIfNecessary(); const ADGameDescription *agdDesc = 0; Common::Language language = Common::UNK_LANG; @@ -305,7 +261,7 @@ Common::Error AdvancedMetaEngine::createInstance(OSystem *syst, Engine **engine) return Common::kNoGameDataFoundError; } - ADGameDescList matches = detectGame(files, params, language, platform, extra); + ADGameDescList matches = detectGame(files, language, platform, extra); if (cleanupPirated(matches)) return Common::kNoGameDataFoundError; @@ -357,7 +313,6 @@ struct SizeMD5 { }; typedef Common::HashMap<Common::String, SizeMD5, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> SizeMD5Map; -typedef Common::HashMap<Common::String, Common::FSNode, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> FileMap; static void reportUnknown(const Common::FSNode &path, const SizeMD5Map &filesSizeMD5) { // TODO: This message should be cleaned up / made more specific. @@ -379,26 +334,22 @@ static void reportUnknown(const Common::FSNode &path, const SizeMD5Map &filesSiz g_system->logMessage(LogMessageType::kInfo, report.c_str()); } -static ADGameDescList detectGameFilebased(const FileMap &allFiles, const ADParams ¶ms); - -static void composeFileHashMap(const Common::FSList &fslist, FileMap &allFiles, int depth, const char * const *directoryGlobs) { +void AdvancedMetaEngine::composeFileHashMap(const Common::FSList &fslist, FileMap &allFiles, int depth) const { if (depth <= 0) return; if (fslist.empty()) return; - // First we compose a hashmap of all files in fslist. - // Includes nifty stuff like removing trailing dots and ignoring case. for (Common::FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { if (file->isDirectory()) { Common::FSList files; - if (!directoryGlobs) + if (!params.directoryGlobs) continue; bool matched = false; - for (const char * const *glob = directoryGlobs; *glob; glob++) + for (const char * const *glob = params.directoryGlobs; *glob; glob++) if (file->getName().matchString(*glob, true)) { matched = true; break; @@ -410,7 +361,7 @@ static void composeFileHashMap(const Common::FSList &fslist, FileMap &allFiles, if (!file->getChildren(files, Common::FSNode::kListAll)) continue; - composeFileHashMap(files, allFiles, depth - 1, directoryGlobs); + composeFileHashMap(files, allFiles, depth - 1); } Common::String tstr = file->getName(); @@ -423,7 +374,7 @@ static void composeFileHashMap(const Common::FSList &fslist, FileMap &allFiles, } } -static ADGameDescList detectGame(const Common::FSList &fslist, const ADParams ¶ms, Common::Language language, Common::Platform platform, const Common::String &extra) { +ADGameDescList AdvancedMetaEngine::detectGame(const Common::FSList &fslist, Common::Language language, Common::Platform platform, const Common::String &extra) const { FileMap allFiles; SizeMD5Map filesSizeMD5; @@ -437,8 +388,7 @@ static ADGameDescList detectGame(const Common::FSList &fslist, const ADParams &p debug(3, "Starting detection in dir '%s'", parent.getPath().c_str()); // First we compose a hashmap of all files in fslist. - // Includes nifty stuff like removing trailing dots and ignoring case. - composeFileHashMap(fslist, allFiles, (params.depth == 0 ? 1 : params.depth), params.directoryGlobs); + composeFileHashMap(fslist, allFiles, (params.depth == 0 ? 1 : params.depth)); // Check which files are included in some ADGameDescription *and* present // in fslist. Compute MD5s and file sizes for these files. @@ -576,19 +526,13 @@ static ADGameDescList detectGame(const Common::FSList &fslist, const ADParams &p // Filename based fallback if (params.fileBasedFallback != 0) - matched = detectGameFilebased(allFiles, params); + matched = detectGameFilebased(allFiles); } return matched; } -/** - * Check for each ADFileBasedFallback record whether all files listed - * in it are present. If multiple pass this test, we pick the one with - * the maximal number of matching files. In case of a tie, the entry - * coming first in the list is chosen. - */ -static ADGameDescList detectGameFilebased(const FileMap &allFiles, const ADParams ¶ms) { +ADGameDescList AdvancedMetaEngine::detectGameFilebased(const FileMap &allFiles) const { const ADFileBasedFallback *ptr; const char* const* filenames; @@ -642,8 +586,24 @@ static ADGameDescList detectGameFilebased(const FileMap &allFiles, const ADParam } GameList AdvancedMetaEngine::getSupportedGames() const { - return gameIDList(params); + if (params.singleid != NULL) { + GameList gl; + + const PlainGameDescriptor *g = params.gameDescriptors; + while (g->gameid) { + if (0 == scumm_stricmp(params.singleid, g->gameid)) { + gl.push_back(GameDescriptor(g->gameid, g->description)); + + return gl; + } + g++; + } + error("Engine %s doesn't have its singleid specified in ids list", params.singleid); + } + + return GameList(params.gameDescriptors); } + GameDescriptor AdvancedMetaEngine::findGame(const char *gameid) const { return AdvancedDetector::findGameID(gameid, params.gameDescriptors, params.obsoleteList); } diff --git a/engines/advancedDetector.h b/engines/advancedDetector.h index e3a408701c..e5922bea4a 100644 --- a/engines/advancedDetector.h +++ b/engines/advancedDetector.h @@ -71,6 +71,11 @@ struct ADGameDescription { }; /** + * A list of pointers to ADGameDescription structs (or subclasses thereof). + */ +typedef Common::Array<const ADGameDescription*> ADGameDescList; + +/** * End marker for a table of ADGameDescription structs. Use this to * terminate a list to be passed to the AdvancedDetector API. */ @@ -214,7 +219,7 @@ namespace AdvancedDetector { */ GameDescriptor findGameID( const char *gameid, - const PlainGameDescriptor *list, + const PlainGameDescriptor *gameDescriptors, const ADObsoleteGameID *obsoleteList = 0 ); @@ -230,12 +235,20 @@ public: AdvancedMetaEngine(const ADParams &dp) : params(dp) {} AdvancedMetaEngine(const void *descs, uint descItemSize, const PlainGameDescriptor *gameDescriptors); + /** + * Returns list of targets supported by the engine. + * Distinguishes engines with single ID + */ virtual GameList getSupportedGames() const; + virtual GameDescriptor findGame(const char *gameid) const; + virtual GameList detectGames(const Common::FSList &fslist) const; + virtual Common::Error createInstance(OSystem *syst, Engine **engine) const; - // To be provided by subclasses +protected: + // To be implemented by subclasses virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const = 0; /** @@ -248,7 +261,38 @@ public: } protected: - void updateGameDescriptor(GameDescriptor &desc, const ADGameDescription *realDesc); + typedef Common::HashMap<Common::String, Common::FSNode, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> FileMap; + + /** + * Detect games in specified directory. + * Parameters language and platform are used to pass on values + * specified by the user. I.e. this is used to restrict search scope. + * + * @param fslist FSList to scan or NULL for scanning all specified + * default directories. + * @param language restrict results to specified language only + * @param platform restrict results to specified platform only + * @return list of ADGameDescription (or subclass) pointers corresponding to matched games + */ + ADGameDescList detectGame(const Common::FSList &fslist, Common::Language language, Common::Platform platform, const Common::String &extra) const; + + /** + * Check for each ADFileBasedFallback record whether all files listed + * in it are present. If multiple pass this test, we pick the one with + * the maximal number of matching files. In case of a tie, the entry + * coming first in the list is chosen. + */ + ADGameDescList detectGameFilebased(const FileMap &allFiles) const; + + void upgradeTargetIfNecessary() const; + + void updateGameDescriptor(GameDescriptor &desc, const ADGameDescription *realDesc) const; + + /** + * Compose a hashmap of all files in fslist. + * Includes nifty stuff like removing trailing dots and ignoring case. + */ + void composeFileHashMap(const Common::FSList &fslist, FileMap &allFiles, int depth) const; }; #endif |