diff --git a/engines/mads/mps_installer.cpp b/engines/mads/mps_installer.cpp index 44639ebed26..6d6e07a94cf 100644 --- a/engines/mads/mps_installer.cpp +++ b/engines/mads/mps_installer.cpp @@ -63,13 +63,8 @@ MpsInstaller* MpsInstaller::open(const Common::Path& baseName) { return new MpsInstaller(_files, baseName); } -// Use of \\ as path separator is a guess. Never seen an archive with subfolders -static Common::String translateName(const Common::Path &path) { - return Common::normalizePath(path.toString('\\'), '\\'); -} - bool MpsInstaller::hasFile(const Common::Path &path) const { - return _files.contains(translateName(path)); + return _files.contains(translatePath(path)); } int MpsInstaller::listMembers(Common::ArchiveMemberList &list) const { @@ -81,26 +76,21 @@ int MpsInstaller::listMembers(Common::ArchiveMemberList &list) const { } const Common::ArchiveMemberPtr MpsInstaller::getMember(const Common::Path &path) const { - Common::String translated = translateName(path); + Common::String translated = translatePath(path); if (!_files.contains(translated)) return nullptr; return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(_files.getVal(translated)._fileName, this)); } -// TODO: Make streams stay valid after destruction of archive -Common::SeekableReadStream *MpsInstaller::createReadStreamForMember(const Common::Path &path) const { - Common::String translated = translateName(path); +Common::SharedArchiveContents MpsInstaller::readContentsForPath(const Common::String& translated) const { if (!_files.contains(translated)) - return nullptr; + return Common::SharedArchiveContents(); FileDescriptor desc = _files.getVal(translated); - if (_cache.contains(desc._fileName)) { - return new Common::MemoryReadStream(_cache[desc._fileName].get(), desc._uncompressedSize, DisposeAfterUse::NO); - } if (desc._compressionAlgo != 0 && desc._compressionAlgo != 1) { debug ("Unsupported compression algorithm %d for %s", desc._compressionAlgo, desc._fileName.c_str()); - return nullptr; + return Common::SharedArchiveContents(); } @@ -115,14 +105,14 @@ Common::SeekableReadStream *MpsInstaller::createReadStreamForMember(const Common if (!fvol.open(volumePath)) { error("Failed to open volume %s.%03d", volumePath.toString().c_str(), vol); delete[] compressedBuf; - return nullptr; + return Common::SharedArchiveContents(); } fvol.seek(off); int32 actual = fvol.read(outptr, rem); if (actual <= 0) { warning("Read failure in volume %s.%03d", volumePath.toString().c_str(), vol); delete[] compressedBuf; - return nullptr; + return Common::SharedArchiveContents(); } rem -= actual; @@ -148,7 +138,7 @@ Common::SeekableReadStream *MpsInstaller::createReadStreamForMember(const Common delete[] compressedBuf; delete[] uncompressedBuf; error("Unable to decompress %s", desc._fileName.c_str()); - return nullptr; + return Common::SharedArchiveContents(); } delete[] compressedBuf; compressedBuf = nullptr; @@ -156,8 +146,7 @@ Common::SeekableReadStream *MpsInstaller::createReadStreamForMember(const Common break; } - _cache[desc._fileName].reset(uncompressedBuf); // TODO: Make it configurable to read directly from disk, at least in the uncompressed case - return new Common::MemoryReadStream(uncompressedBuf, desc._uncompressedSize, DisposeAfterUse::NO); + return Common::SharedArchiveContents(uncompressedBuf, desc._uncompressedSize); } } diff --git a/engines/mads/mps_installer.h b/engines/mads/mps_installer.h index 630ed8c3ca0..487ffa076c1 100644 --- a/engines/mads/mps_installer.h +++ b/engines/mads/mps_installer.h @@ -30,12 +30,12 @@ namespace MADS { -class MpsInstaller : public Common::Archive { +class MpsInstaller : public Common::MemcachingCaseInsensitiveArchive { public: bool hasFile(const Common::Path &path) const override; int listMembers(Common::ArchiveMemberList&) const override; const Common::ArchiveMemberPtr getMember(const Common::Path &path) const override; - Common::SeekableReadStream *createReadStreamForMember(const Common::Path &path) const override; + Common::SharedArchiveContents readContentsForPath(const Common::String& translatedPath) const override; static MpsInstaller* open(const Common::Path& baseName); @@ -79,7 +79,6 @@ private: const Common::Path& baseName) : _files(files), _baseName(baseName) {} FileMap _files; - mutable Common::HashMap>, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> _cache; Common::Path _baseName; }; }