diff options
-rw-r--r-- | engines/advancedDetector.cpp | 9 | ||||
-rw-r--r-- | engines/advancedDetector.h | 13 |
2 files changed, 17 insertions, 5 deletions
diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index 8b6dc0c0d9..64f462a936 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -345,7 +345,7 @@ void AdvancedMetaEngine::reportUnknown(const Common::FSNode &path, const ADFileP g_system->logMessage(LogMessageType::kInfo, report.c_str()); } -void AdvancedMetaEngine::composeFileHashMap(FileMap &allFiles, const Common::FSList &fslist, int depth) const { +void AdvancedMetaEngine::composeFileHashMap(FileMap &allFiles, const Common::FSList &fslist, int depth, const Common::String &parentName) const { if (depth <= 0) return; @@ -353,6 +353,8 @@ void AdvancedMetaEngine::composeFileHashMap(FileMap &allFiles, const Common::FSL return; for (Common::FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { + Common::String tstr = (_matchFullPaths && !parentName.empty() ? parentName + "/" : "") + file->getName(); + if (file->isDirectory()) { Common::FSList files; @@ -372,11 +374,9 @@ void AdvancedMetaEngine::composeFileHashMap(FileMap &allFiles, const Common::FSL if (!file->getChildren(files, Common::FSNode::kListAll)) continue; - composeFileHashMap(allFiles, files, depth - 1); + composeFileHashMap(allFiles, files, depth - 1, tstr); } - Common::String tstr = file->getName(); - // Strip any trailing dot if (tstr.lastChar() == '.') tstr.deleteLastChar(); @@ -625,6 +625,7 @@ AdvancedMetaEngine::AdvancedMetaEngine(const void *descs, uint descItemSize, con _guiOptions = GUIO_NONE; _maxScanDepth = 1; _directoryGlobs = NULL; + _matchFullPaths = false; } void AdvancedMetaEngine::initSubSystems(const ADGameDescription *gameDesc) const { diff --git a/engines/advancedDetector.h b/engines/advancedDetector.h index ab3ec22bdc..e218c41b52 100644 --- a/engines/advancedDetector.h +++ b/engines/advancedDetector.h @@ -251,6 +251,17 @@ protected: */ const char * const *_directoryGlobs; + /** + * If true, filenames will be matched against the entire path, relative to + * the root detection directory (e.g. "foo/bar.000" for a file at + * "<root>/foo/bar.000"). Otherwise, filenames only match the basename + * (e.g. "bar.000" for the same file). + * + * @note _maxScanDepth and _directoryGlobs must still be configured to allow + * the detector to find files inside subdirectories. + */ + bool _matchFullPaths; + public: AdvancedMetaEngine(const void *descs, uint descItemSize, const PlainGameDescriptor *gameIds, const ADExtraGuiOptionsMap *extraGuiOptions = 0); @@ -326,7 +337,7 @@ protected: * Compose a hashmap of all files in fslist. * Includes nifty stuff like removing trailing dots and ignoring case. */ - void composeFileHashMap(FileMap &allFiles, const Common::FSList &fslist, int depth) const; + void composeFileHashMap(FileMap &allFiles, const Common::FSList &fslist, int depth, const Common::String &parentName = Common::String()) const; /** Get the properties (size and MD5) of this file. */ bool getFileProperties(const Common::FSNode &parent, const FileMap &allFiles, const ADGameDescription &game, const Common::String fname, ADFileProperties &fileProps) const; |