aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHein-Pieter van Braam2017-05-28 11:40:07 +0200
committerGitHub2017-05-28 11:40:07 +0200
commitd6645f3fc9bbd74174be544417780185fd9a9743 (patch)
tree1772e01b194ee6dc70b077025d5aa451cbb41760
parent379314c27d3eae18b903bc4ca7500c7d3500c4f9 (diff)
parent159e5a97ce4f04eddd3d91a00aee2f3131b13a50 (diff)
downloadscummvm-rg350-d6645f3fc9bbd74174be544417780185fd9a9743.tar.gz
scummvm-rg350-d6645f3fc9bbd74174be544417780185fd9a9743.tar.bz2
scummvm-rg350-d6645f3fc9bbd74174be544417780185fd9a9743.zip
Merge pull request #949 from csnover/advanceddetector-fullpaths
ENGINES: Allow detection entries to match on full paths
-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;