From 98f178c58f81e0e9aca5d967cb774cdd522fb5ba Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko Date: Thu, 27 Oct 2022 03:18:09 +0200 Subject: [PATCH] DETECTOR: Allow detecting with MacBinary with no resource fork --- common/macresman.cpp | 19 +++++++++++++------ engines/advancedDetector.cpp | 9 +++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/common/macresman.cpp b/common/macresman.cpp index d7d4ce8481f..2a3074149fc 100644 --- a/common/macresman.cpp +++ b/common/macresman.cpp @@ -133,7 +133,7 @@ bool MacResManager::hasDataFork() const { } bool MacResManager::hasResFork() const { - return !_baseFileName.empty() && _mode != kResForkNone; + return !_baseFileName.empty() && _mode != kResForkNone && _resForkSize != 0; } uint32 MacResManager::getResForkDataSize() const { @@ -446,13 +446,15 @@ bool MacResManager::loadFromMacBinary(SeekableReadStream *stream) { _resForkOffset = MBI_INFOHDR + dataSizePad; _resForkSize = rsrcSize; } + + if (_resForkOffset < 0) + return false; + + _mode = kResForkMacBinary; + return load(stream); } - if (_resForkOffset < 0) - return false; - - _mode = kResForkMacBinary; - return load(stream); + return false; } bool MacResManager::loadFromRawFork(SeekableReadStream *stream) { @@ -472,6 +474,11 @@ bool MacResManager::load(SeekableReadStream *stream) { if (_mode == kResForkNone) return false; + if (_resForkSize == 0) { + _stream = stream; + return true; + } + stream->seek(_resForkOffset); _dataOffset = stream->readUint32BE() + _resForkOffset; diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index 7b915a8636b..dc99a8eb0c3 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -557,6 +557,15 @@ static bool getFilePropertiesIntern(uint md5Bytes, const AdvancedMetaEngine::Fil if (fileProps.size != 0) return true; + + Common::SeekableReadStream *dataFork = macResMan.getDataFork(); + if (dataFork && dataFork->size()) { + fileProps.size = dataFork->size(); + fileProps.md5 = Common::computeStreamMD5AsString(*dataFork, md5Bytes); + delete dataFork; + return true; + } + delete dataFork; } if (!allFiles.contains(fname))