aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/advancedDetector.cpp9
-rw-r--r--engines/advancedDetector.h13
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;