diff options
Diffstat (limited to 'engines/advancedDetector.cpp')
-rw-r--r-- | engines/advancedDetector.cpp | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index b149b43ad7..f4932a1055 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -340,24 +340,24 @@ static void reportUnknown(const Common::FSNode &path, const SizeMD5Map &filesSiz static ADGameDescList detectGameFilebased(const FileMap &allFiles, const ADParams ¶ms); -static ADGameDescList detectGame(const Common::FSList &fslist, const ADParams ¶ms, Common::Language language, Common::Platform platform, const Common::String &extra) { - FileMap allFiles; - SizeMD5Map filesSizeMD5; - - const ADGameFileDescription *fileDesc; - const ADGameDescription *g; - const byte *descPtr; +static void composeFileHashMap(const Common::FSList &fslist, FileMap &allFiles, int depth) { + if (depth == 0) + return; if (fslist.empty()) - return ADGameDescList(); - Common::FSNode parent = fslist.begin()->getParent(); - debug(3, "Starting detection in dir '%s'", parent.getPath().c_str()); + 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()) - continue; + if (file->isDirectory()) { + Common::FSList files; + + if (!file->getChildren(files, Common::FSNode::kListAll)) + continue; + + composeFileHashMap(files, allFiles, depth - 1); + } Common::String tstr = file->getName(); @@ -367,6 +367,24 @@ static ADGameDescList detectGame(const Common::FSList &fslist, const ADParams &p allFiles[tstr] = *file; // Record the presence of this file } +} + +static ADGameDescList detectGame(const Common::FSList &fslist, const ADParams ¶ms, Common::Language language, Common::Platform platform, const Common::String &extra) { + FileMap allFiles; + SizeMD5Map filesSizeMD5; + + const ADGameFileDescription *fileDesc; + const ADGameDescription *g; + const byte *descPtr; + + if (fslist.empty()) + return ADGameDescList(); + Common::FSNode parent = fslist.begin()->getParent(); + 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)); // Check which files are included in some ADGameDescription *and* present // in fslist. Compute MD5s and file sizes for these files. |