[Scummvm-git-logs] scummvm master -> f38b73201296942e9c82db35a5b5a18ec00ddf8c

sev- noreply at scummvm.org
Wed Jul 19 16:51:42 UTC 2023


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
b8acbe6bee COMMON: Archive path refactoring, add getFileName and getPathInArchive that unambiguously return the filename or the ful
f38b732012 COMMON: Fix override without "override" qualifier warning


Commit: b8acbe6bee730a9024e73acc769b54285be9afde
    https://github.com/scummvm/scummvm/commit/b8acbe6bee730a9024e73acc769b54285be9afde
Author: elasota (ejlasota at gmail.com)
Date: 2023-07-19T18:51:37+02:00

Commit Message:
COMMON: Archive path refactoring, add getFileName and getPathInArchive that unambiguously return the filename or the full path

Changed paths:
    backends/platform/sdl/win32/win32.cpp
    common/archive.cpp
    common/archive.h
    common/compression/clickteam.cpp
    common/compression/gentee_installer.cpp
    common/compression/installshield_cab.cpp
    common/compression/installshieldv3_archive.cpp
    common/compression/stuffit.cpp
    common/compression/unarj.cpp
    common/compression/unzip.cpp
    common/compression/vise.cpp
    common/formats/prodos.cpp
    common/formats/prodos.h
    common/fs.cpp
    common/fs.h
    engines/director/game-quirks.cpp
    engines/director/resource.cpp
    engines/dreamweb/rnca_archive.cpp
    engines/glk/blorb.cpp
    engines/glk/comprehend/pics.cpp
    engines/glk/hugo/resource_archive.cpp
    engines/glk/zcode/pics.cpp
    engines/glk/zcode/sound_folder.cpp
    engines/grim/lab.h
    engines/grim/update/lang_filter.cpp
    engines/grim/update/mscab.cpp
    engines/hypno/libfile.cpp
    engines/kyra/resource/resource_intern.cpp
    engines/lastexpress/data/archive.cpp
    engines/lastexpress/resource.cpp
    engines/mads/mps_installer.cpp
    engines/mads/resources.cpp
    engines/mm/shared/utils/engine_data.cpp
    engines/mm/shared/xeen/cc_archive.cpp
    engines/mohawk/installer_archive.cpp
    engines/ngi/ngiarchive.cpp
    engines/parallaction/disk_ns.cpp
    engines/prince/archive.cpp
    engines/stark/formats/xarc.cpp
    engines/sword25/package/packagemanager.cpp
    engines/trecision/fastfile.cpp
    engines/ultima/shared/engine/data_archive.cpp
    engines/ultima/shared/engine/resources.cpp
    engines/ultima/ultima8/filesys/savegame.cpp
    engines/wintermute/base/file/base_file_entry.h
    engines/zvision/file/zfs_archive.cpp


diff --git a/backends/platform/sdl/win32/win32.cpp b/backends/platform/sdl/win32/win32.cpp
index d1bdbcd5772..088f65c1fb8 100644
--- a/backends/platform/sdl/win32/win32.cpp
+++ b/backends/platform/sdl/win32/win32.cpp
@@ -455,14 +455,13 @@ int Win32ResourceArchive::listMembers(Common::ArchiveMemberList &list) const {
 	int count = 0;
 
 	for (FilenameList::const_iterator i = _files.begin(); i != _files.end(); ++i, ++count)
-		list.push_back(Common::ArchiveMemberPtr(new Common::GenericArchiveMember(*i, this)));
+		list.push_back(Common::ArchiveMemberPtr(new Common::GenericArchiveMember(*i, *this)));
 
 	return count;
 }
 
 const Common::ArchiveMemberPtr Win32ResourceArchive::getMember(const Common::Path &path) const {
-	Common::String name = path.toString();
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(path, *this));
 }
 
 Common::SeekableReadStream *Win32ResourceArchive::createReadStreamForMember(const Common::Path &path) const {
diff --git a/common/archive.cpp b/common/archive.cpp
index 25e642e04a6..e455e344d01 100644
--- a/common/archive.cpp
+++ b/common/archive.cpp
@@ -29,16 +29,28 @@
 
 namespace Common {
 
-GenericArchiveMember::GenericArchiveMember(const String &name, const Archive *parent)
-	: _parent(parent), _name(name) {
+GenericArchiveMember::GenericArchiveMember(const String &pathStr, const Archive &parent)
+	: _parent(parent), _path(pathStr, parent.getPathSeparator()) {
+}
+
+GenericArchiveMember::GenericArchiveMember(const Path &path, const Archive &parent)
+	: _parent(parent), _path(path) {
 }
 
 String GenericArchiveMember::getName() const {
-	return _name;
+	return _path.toString(_parent.getPathSeparator());
+}
+
+Path GenericArchiveMember::getPathInArchive() const {
+	return _path;
+}
+
+String GenericArchiveMember::getFileName() const {
+	return _path.getLastComponent().toString(_parent.getPathSeparator());
 }
 
 SeekableReadStream *GenericArchiveMember::createReadStream() const {
-	return _parent->createReadStreamForMember(_name);
+	return _parent.createReadStreamForMember(_path);
 }
 
 
@@ -49,7 +61,10 @@ int Archive::listMatchingMembers(ArchiveMemberList &list, const Path &pattern, b
 
 	String patternString = pattern.toString();
 	int matches = 0;
-	const char *wildcardExclusions = matchPathComponents ? NULL : "/";
+
+	char pathSepString[2] = {getPathSeparator(), '\0'};
+
+	const char *wildcardExclusions = matchPathComponents ? NULL : pathSepString;
 
 	ArchiveMemberList::const_iterator it = allNames.begin();
 	for (; it != allNames.end(); ++it) {
diff --git a/common/archive.h b/common/archive.h
index e3e45bd7b49..868a9d029c0 100644
--- a/common/archive.h
+++ b/common/archive.h
@@ -58,7 +58,15 @@ class ArchiveMember {
 public:
 	virtual ~ArchiveMember() { }
 	virtual SeekableReadStream *createReadStream() const = 0; /*!< Create a read stream. */
-	virtual String getName() const = 0; /*!< Get the name of the archive member. */
+
+	/**
+	* @deprecated Get the name of the archive member.  This may be a file name or a full path depending on archive type.
+	 *            DEPRECATED: Use getFileName or getPathInArchive instead, which always returns one or the other.
+	 */
+	virtual String getName() const = 0;
+
+	virtual Path getPathInArchive() const = 0; /*!< Get the full path of the archive member relative to the containing archive root. */
+	virtual String getFileName() const = 0; /*!< Get the file name of the archive member relative to its containing directory within the archive. */
 	virtual U32String getDisplayName() const { return getName(); } /*!< Get the display name of the archive member. */
 };
 
@@ -86,12 +94,18 @@ class Archive;
  * is destroyed.
  */
 class GenericArchiveMember : public ArchiveMember {
-	const Archive *_parent;
-	const String _name;
 public:
-	GenericArchiveMember(const String &name, const Archive *parent); /*!< Create a generic archive member that belongs to the @p parent archive. */
-	String getName() const; /*!< Get the name of a generic archive member. */
-	SeekableReadStream *createReadStream() const; /*!< Create a read stream. */
+	GenericArchiveMember(const Common::String &pathStr, const Archive &parent); /*!< Create a generic archive member that belongs to the @p parent archive. */
+	GenericArchiveMember(const Common::Path &path, const Archive &parent); /*!< Create a generic archive member that belongs to the @p parent archive. */
+
+	String getName() const override;        /*!< Get the name of a generic archive member. */
+	Path getPathInArchive() const override;       /*!< Get the full path of the archive member relative to the containing archive root. */
+	String getFileName() const override; /*!< Get the file name of the archive member relative to its containing directory within the archive. */
+	SeekableReadStream *createReadStream() const override; /*!< Create a read stream. */
+
+private:
+	const Archive &_parent;
+	const Common::Path _path;
 };
 
 
diff --git a/common/compression/clickteam.cpp b/common/compression/clickteam.cpp
index 934dcb5025a..da96087a3f9 100644
--- a/common/compression/clickteam.cpp
+++ b/common/compression/clickteam.cpp
@@ -474,7 +474,7 @@ int ClickteamInstaller::listMembers(ArchiveMemberList &list) const {
 	for (Common::HashMap<Common::String, ClickteamFileDescriptor, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::const_iterator i = _files.begin(), end = _files.end();
 	     i != end; ++i) {
 		if (!i->_value._isReferenceMissing) {
-			list.push_back(ArchiveMemberList::value_type(new GenericArchiveMember(i->_key, this)));
+			list.push_back(ArchiveMemberList::value_type(new GenericArchiveMember(i->_key, *this)));
 			++members;
 		}
 	}
@@ -491,7 +491,7 @@ const ArchiveMemberPtr ClickteamInstaller::getMember(const Path &path) const {
 	if (el._isReferenceMissing)
 		return nullptr;
 
-	return Common::SharedPtr<Common::ArchiveMember>(new GenericArchiveMember(el._fileName, this));
+	return Common::SharedPtr<Common::ArchiveMember>(new GenericArchiveMember(el._fileName, *this));
 }
 
 Common::SharedArchiveContents ClickteamInstaller::readContentsForPath(const Common::String& translated) const {
diff --git a/common/compression/gentee_installer.cpp b/common/compression/gentee_installer.cpp
index 46f2640870d..ab0d71f5e80 100644
--- a/common/compression/gentee_installer.cpp
+++ b/common/compression/gentee_installer.cpp
@@ -586,6 +586,8 @@ public:
 
 	Common::SeekableReadStream *createReadStream() const override;
 	Common::String getName() const override;
+	Common::Path getPathInArchive() const override { return getName(); }
+	Common::String getFileName() const override { return getName(); }
 
 	const Common::String &getPath() const;
 
diff --git a/common/compression/installshield_cab.cpp b/common/compression/installshield_cab.cpp
index b377d5d3d33..2535e7497b4 100644
--- a/common/compression/installshield_cab.cpp
+++ b/common/compression/installshield_cab.cpp
@@ -278,8 +278,7 @@ int InstallShieldCabinet::listMembers(ArchiveMemberList &list) const {
 }
 
 const ArchiveMemberPtr InstallShieldCabinet::getMember(const Path &path) const {
-	String name = path.toString();
-	return ArchiveMemberPtr(new GenericArchiveMember(name, this));
+	return ArchiveMemberPtr(new GenericArchiveMember(path, *this));
 }
 
 SeekableReadStream *InstallShieldCabinet::createReadStreamForMember(const Path &path) const {
diff --git a/common/compression/installshieldv3_archive.cpp b/common/compression/installshieldv3_archive.cpp
index e52228b4aa6..983b48686d5 100644
--- a/common/compression/installshieldv3_archive.cpp
+++ b/common/compression/installshieldv3_archive.cpp
@@ -134,7 +134,7 @@ int InstallShieldV3::listMembers(Common::ArchiveMemberList &list) const {
 
 const Common::ArchiveMemberPtr InstallShieldV3::getMember(const Common::Path &path) const {
 	Common::String name = path.toString();
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *InstallShieldV3::createReadStreamForMember(const Common::Path &path) const {
diff --git a/common/compression/stuffit.cpp b/common/compression/stuffit.cpp
index aecbda59d9e..529fa07c928 100644
--- a/common/compression/stuffit.cpp
+++ b/common/compression/stuffit.cpp
@@ -279,8 +279,7 @@ int StuffItArchive::listMembers(Common::ArchiveMemberList &list) const {
 }
 
 const Common::ArchiveMemberPtr StuffItArchive::getMember(const Common::Path &path) const {
-	Common::String name = path.toString(':');
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(path, *this));
 }
 
 Common::SharedArchiveContents StuffItArchive::readContentsForPath(const Common::String& name) const {
diff --git a/common/compression/unarj.cpp b/common/compression/unarj.cpp
index b0e3530b20a..4329877809f 100644
--- a/common/compression/unarj.cpp
+++ b/common/compression/unarj.cpp
@@ -775,7 +775,7 @@ int ArjArchive::listMembers(ArchiveMemberList &list) const {
 
 	ArjHeadersMap::const_iterator it = _headers.begin();
 	for ( ; it != _headers.end(); ++it) {
-		list.push_back(ArchiveMemberList::value_type(new GenericArchiveMember(it->_value[0]._header->filename, this)));
+		list.push_back(ArchiveMemberList::value_type(new GenericArchiveMember(Common::String(it->_value[0]._header->filename), *this)));
 		matches++;
 	}
 
@@ -787,7 +787,7 @@ const ArchiveMemberPtr ArjArchive::getMember(const Path &path) const {
 	if (!hasFile(name))
 		return ArchiveMemberPtr();
 
-	return ArchiveMemberPtr(new GenericArchiveMember(name, this));
+	return ArchiveMemberPtr(new GenericArchiveMember(name, *this));
 }
 
 Common::SharedArchiveContents ArjArchive::readContentsForPath(const Common::String& name) const {
diff --git a/common/compression/unzip.cpp b/common/compression/unzip.cpp
index 93a02f178fb..6fa71882ed6 100644
--- a/common/compression/unzip.cpp
+++ b/common/compression/unzip.cpp
@@ -1025,7 +1025,7 @@ int ZipArchive::listMembers(ArchiveMemberList &list) const {
 	const unz_s *const archive = (const unz_s *)_zipFile;
 	for (ZipHash::const_iterator i = archive->_hash.begin(), end = archive->_hash.end();
 	     i != end; ++i) {
-		list.push_back(ArchiveMemberList::value_type(new GenericArchiveMember(i->_key, this)));
+		list.push_back(ArchiveMemberList::value_type(new GenericArchiveMember(i->_key, *this)));
 		++members;
 	}
 
@@ -1037,7 +1037,7 @@ const ArchiveMemberPtr ZipArchive::getMember(const Path &path) const {
 	if (!hasFile(name))
 		return ArchiveMemberPtr();
 
-	return ArchiveMemberPtr(new GenericArchiveMember(name, this));
+	return ArchiveMemberPtr(new GenericArchiveMember(path, *this));
 }
 
 Common::SharedArchiveContents ZipArchive::readContentsForPath(const Common::String& name) const {
diff --git a/common/compression/vise.cpp b/common/compression/vise.cpp
index 660049b8e08..0b107bee892 100644
--- a/common/compression/vise.cpp
+++ b/common/compression/vise.cpp
@@ -54,14 +54,14 @@ private:
 		uint16 containingDirectory;
 
 		Common::String name;
-		Common::String fullPath;
+		Common::Path fullPath;
 	};
 
 	struct DirectoryDesc {
 		uint16 containingDirectory;
 
 		Common::String name;
-		Common::String fullPath;
+		Common::Path fullPath;
 	};
 
 	class ArchiveMember : public Common::ArchiveMember {
@@ -76,6 +76,8 @@ private:
 
 		Common::SeekableReadStream *createReadStream() const override;
 		Common::String getName() const override;
+		Common::Path getPathInArchive() const override;
+		Common::String getFileName() const override;
 
 	private:
 		Common::SeekableReadStream *_archiveStream;
@@ -199,14 +201,27 @@ Common::SeekableReadStream *MacVISEArchive::ArchiveMember::createReadStream() co
 }
 
 Common::String MacVISEArchive::ArchiveMember::getName() const {
+	return getPathInArchive().getLastComponent().toString(':');
+}
+
+Common::Path MacVISEArchive::ArchiveMember::getPathInArchive() const {
 	if (_substreamType == kSubstreamTypeFinderInfo)
-		return _fileDesc->fullPath + ".finf";
+		return _fileDesc->fullPath.append(".finf", ':');
 	else if (_substreamType == kSubstreamTypeResource)
-		return _fileDesc->fullPath + ".rsrc";
+		return _fileDesc->fullPath.append(".rsrc", ':');
 	else
 		return _fileDesc->fullPath;
 }
 
+Common::String MacVISEArchive::ArchiveMember::getFileName() const {
+	if (_substreamType == kSubstreamTypeFinderInfo)
+		return _fileDesc->name + ".finf";
+	else if (_substreamType == kSubstreamTypeResource)
+		return _fileDesc->name + ".rsrc";
+	else
+		return _fileDesc->name;
+}
+
 MacVISEArchive::FileDesc::FileDesc() : type{0, 0, 0, 0}, creator{0, 0, 0, 0}, compressedDataSize(0), uncompressedDataSize(0), compressedResSize(0), uncompressedResSize(0), positionInArchive(0) {
 }
 
@@ -320,7 +335,7 @@ bool MacVISEArchive::loadCatalog() {
 			if (dirDesc.containingDirectory > _directoryDescs.size())
 				error("VISE 3 containing directory index was invalid");
 
-			dirDesc.fullPath = _directoryDescs[dirDesc.containingDirectory - 1].fullPath + ":" + dirDesc.name;
+			dirDesc.fullPath = _directoryDescs[dirDesc.containingDirectory - 1].fullPath.appendComponent(dirDesc.name);
 		}
 	}
 
@@ -331,7 +346,7 @@ bool MacVISEArchive::loadCatalog() {
 			if (fileDesc.containingDirectory > _directoryDescs.size())
 				error("VISE 3 containing directory index was invalid");
 
-			fileDesc.fullPath = _directoryDescs[fileDesc.containingDirectory - 1].fullPath + ":" + fileDesc.name;
+			fileDesc.fullPath = _directoryDescs[fileDesc.containingDirectory - 1].fullPath.appendComponent(fileDesc.name);
 		}
 	}
 
@@ -339,9 +354,8 @@ bool MacVISEArchive::loadCatalog() {
 }
 
 const MacVISEArchive::FileDesc *MacVISEArchive::getFileDesc(const Common::Path &path) const {
-	Common::String convertedPath = path.toString(':');
 	for (const FileDesc &desc : _fileDescs) {
-		if (desc.fullPath == convertedPath)
+		if (desc.fullPath == path)
 			return &desc;
 	}
 
@@ -396,7 +410,8 @@ char MacVISEArchive::getPathSeparator() const {
 }
 
 bool MacVISEArchive::getFileDescIndex(const Common::Path &path, uint &outIndex, ArchiveMember::SubstreamType &outSubstreamType) const {
-	Common::String convertedPath = path.toString(':');
+	Common::String convertedPath = path.toString(getPathSeparator());
+
 	ArchiveMember::SubstreamType substreamType = ArchiveMember::kSubstreamTypeData;
 	if (convertedPath.hasSuffix(".rsrc")) {
 		substreamType = ArchiveMember::kSubstreamTypeResource;
@@ -406,10 +421,12 @@ bool MacVISEArchive::getFileDescIndex(const Common::Path &path, uint &outIndex,
 		convertedPath = convertedPath.substr(0, convertedPath.size() - 5);
 	}
 
+	Common::Path filePath(convertedPath, getPathSeparator());
+
 	for (uint descIndex = 0; descIndex < _fileDescs.size(); descIndex++) {
 		const FileDesc &desc = _fileDescs[descIndex];
 
-		if (desc.fullPath == convertedPath) {
+		if (desc.fullPath == filePath) {
 			if (substreamType == ArchiveMember::SubstreamType::kSubstreamTypeData && desc.uncompressedDataSize == 0)
 				return false;
 			if (substreamType == ArchiveMember::SubstreamType::kSubstreamTypeResource && desc.uncompressedResSize == 0)
diff --git a/common/formats/prodos.cpp b/common/formats/prodos.cpp
index 9739ecac21a..1fa5e498eb0 100644
--- a/common/formats/prodos.cpp
+++ b/common/formats/prodos.cpp
@@ -50,6 +50,14 @@ Common::String ProDOSFile::getName() const {
 	return Common::String(_name);
 }
 
+Common::String ProDOSFile::getFileName() const {
+	return Common::String(_name);
+}
+
+Common::Path ProDOSFile::getPathInArchive() const {
+	return Common::Path(_name);
+}
+
 /* This method is used to get a single block of data from the disk,
  * but is not strictly 512 bytes. This is so that it can get only what
  * it needs when in the final block. It then adds it into the allocated
diff --git a/common/formats/prodos.h b/common/formats/prodos.h
index 1dd6784b724..085e0ec2c91 100644
--- a/common/formats/prodos.h
+++ b/common/formats/prodos.h
@@ -87,6 +87,8 @@ public:
 
 	// -- These are the Common::ArchiveMember related functions --
 	Common::String getName() const override;                              // Returns _name
+	Common::Path getPathInArchive() const override;                       // Returns _name
+	Common::String getFileName() const override;                          // Returns _name
 	Common::SeekableReadStream *createReadStream() const override;        // This is what the archive needs to create a file
 	void getDataBlock(byte *memOffset, int offset, int size) const;       // Gets data up to the size of a single data block (512 bytes)
 	int parseIndexBlock(byte *memOffset, int blockNum, int cSize) const;  // Uses getDataBlock() on every pointer in the index file, adding them to byte * memory block
diff --git a/common/fs.cpp b/common/fs.cpp
index e4c789bb4b2..7b24adac6f8 100644
--- a/common/fs.cpp
+++ b/common/fs.cpp
@@ -27,6 +27,46 @@
 
 namespace Common {
 
+// File-in-directory archive member that captures relative path
+class FSDirectoryFile : public ArchiveMember {
+public:
+	FSDirectoryFile(const Common::Path &pathInDirectory, const FSNode &fsNode);
+
+	SeekableReadStream *createReadStream() const override;
+	String getName() const override;
+	Path getPathInArchive() const override;
+	String getFileName() const override;
+	U32String getDisplayName() const override;
+
+private:
+	Common::Path _pathInDirectory;
+	FSNode _fsNode;
+};
+
+FSDirectoryFile::FSDirectoryFile(const Common::Path &pathInDirectory, const FSNode &fsNode) : _pathInDirectory(pathInDirectory), _fsNode(fsNode) {
+}
+
+SeekableReadStream *FSDirectoryFile::createReadStream() const {
+	return _fsNode.createReadStream();
+}
+
+String FSDirectoryFile::getName() const {
+	return _fsNode.getName();
+}
+
+Path FSDirectoryFile::getPathInArchive() const {
+	return _pathInDirectory;
+}
+
+String FSDirectoryFile::getFileName() const {
+	return _fsNode.getName();
+}
+
+U32String FSDirectoryFile::getDisplayName() const {
+	return _fsNode.getDisplayName();
+}
+
+
 FSNode::FSNode() {
 }
 
@@ -97,6 +137,14 @@ String FSNode::getName() const {
 	return punycode_decodefilename(_realNode->getName());
 }
 
+String FSNode::getFileName() const {
+	return getName();
+}
+
+Common::Path FSNode::getPathInArchive() const {
+	return getName();
+}
+
 String FSNode::getRealName() const {
 	assert(_realNode);
 	return _realNode->getName();
@@ -245,7 +293,7 @@ const ArchiveMemberPtr FSDirectory::getMember(const Path &path) const {
 		return ArchiveMemberPtr();
 	}
 
-	return ArchiveMemberPtr(new FSNode(*node));
+	return ArchiveMemberPtr(new FSDirectoryFile(path, *node));
 }
 
 SeekableReadStream *FSDirectory::createReadStreamForMember(const Path &path) const {
@@ -337,14 +385,14 @@ int FSDirectory::listMatchingMembers(ArchiveMemberList &list, const Path &patter
 	int matches = 0;
 	for (NodeCache::const_iterator it = _fileCache.begin(); it != _fileCache.end(); ++it) {
 		if (it->_key.matchPattern(pattern)) {
-			list.push_back(ArchiveMemberPtr(new FSNode(it->_value)));
+			list.push_back(ArchiveMemberPtr(new FSDirectoryFile(it->_key, it->_value)));
 			matches++;
 		}
 	}
 	if (_includeDirectories) {
 		for (NodeCache::const_iterator it = _subDirCache.begin(); it != _subDirCache.end(); ++it) {
 			if (it->_key.matchPattern(pattern)) {
-				list.push_back(ArchiveMemberPtr(new FSNode(it->_value)));
+				list.push_back(ArchiveMemberPtr(new FSDirectoryFile(it->_key, it->_value)));
 				matches++;
 			}
 		}
@@ -362,13 +410,13 @@ int FSDirectory::listMembers(ArchiveMemberList &list) const {
 
 	int files = 0;
 	for (NodeCache::const_iterator it = _fileCache.begin(); it != _fileCache.end(); ++it) {
-		list.push_back(ArchiveMemberPtr(new FSNode(it->_value)));
+		list.push_back(ArchiveMemberPtr(new FSDirectoryFile(it->_key, it->_value)));
 		++files;
 	}
 
 	if (_includeDirectories) {
 		for (NodeCache::const_iterator it = _subDirCache.begin(); it != _subDirCache.end(); ++it) {
-			list.push_back(ArchiveMemberPtr(new FSNode(it->_value)));
+			list.push_back(ArchiveMemberPtr(new FSDirectoryFile(it->_key, it->_value)));
 			++files;
 		}
 	}
diff --git a/common/fs.h b/common/fs.h
index a8faff095f0..8b4ffc8dbdb 100644
--- a/common/fs.h
+++ b/common/fs.h
@@ -156,7 +156,7 @@ public:
 	 *
 	 * @return The display name.
 	 */
-	virtual U32String getDisplayName() const;
+	U32String getDisplayName() const override;
 
 	/**
 	 * Return a string representation of the name of the file. This can be
@@ -166,7 +166,23 @@ public:
 	 *
 	 * @return The file name.
 	 */
-	virtual String getName() const;
+	String getName() const override;
+
+	/**
+	 * Return a string representation of the name of the file.
+	 *
+	 * @return The file name.
+	 */
+	String getFileName() const override;
+
+	/**
+	 * Return a string representation of the name of the file.  Since FSNode
+	 * parents are always the parent FSDirectory, this will not return a full
+	 * path, only the file name.
+	 *
+	 * @return The file name.
+	 */
+	Common::Path getPathInArchive() const override;
 
 	/**
 	 * Return a string representation of the name of the file, without any
diff --git a/engines/director/game-quirks.cpp b/engines/director/game-quirks.cpp
index e1ed785266d..f54d69a72ca 100644
--- a/engines/director/game-quirks.cpp
+++ b/engines/director/game-quirks.cpp
@@ -264,7 +264,7 @@ int CachedArchive::listMembers(Common::ArchiveMemberList &list) const {
 	int count = 0;
 
 	for (FileMap::const_iterator i = _files.begin(); i != _files.end(); ++i) {
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(i->_key, this)));
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(i->_key, *this)));
 		++count;
 	}
 
@@ -276,7 +276,7 @@ const Common::ArchiveMemberPtr CachedArchive::getMember(const Common::Path &path
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *CachedArchive::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/director/resource.cpp b/engines/director/resource.cpp
index 5489815544a..d040da44496 100644
--- a/engines/director/resource.cpp
+++ b/engines/director/resource.cpp
@@ -731,7 +731,7 @@ int ProjectorArchive::listMembers(Common::ArchiveMemberList &list) const {
 	int count = 0;
 
 	for (FileMap::const_iterator i = _files.begin(); i != _files.end(); ++i) {
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(i->_key, this)));
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(i->_key, *this)));
 		++count;
 	}
 
@@ -744,7 +744,7 @@ const Common::ArchiveMemberPtr ProjectorArchive::getMember(const Common::Path &p
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *ProjectorArchive::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/dreamweb/rnca_archive.cpp b/engines/dreamweb/rnca_archive.cpp
index 30a737d121a..e8062644347 100644
--- a/engines/dreamweb/rnca_archive.cpp
+++ b/engines/dreamweb/rnca_archive.cpp
@@ -73,7 +73,7 @@ bool RNCAArchive::hasFile(const Common::Path &path) const {
 
 int RNCAArchive::listMembers(Common::ArchiveMemberList &list) const {
 	for (FileMap::const_iterator i = _files.begin(), end = _files.end(); i != end; ++i) {
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(i->_key, this)));
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(i->_key, *this)));
 	}
 
 	return _files.size();
@@ -84,7 +84,7 @@ const Common::ArchiveMemberPtr RNCAArchive::getMember(const Common::Path &path)
 	if (!_files.contains(translated))
 		return nullptr;
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(_files.getVal(translated)._fileName, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(_files.getVal(translated)._fileName, *this));
 }
 
 Common::SharedArchiveContents RNCAArchive::readContentsForPath(const Common::String& translated) const {
diff --git a/engines/glk/blorb.cpp b/engines/glk/blorb.cpp
index bc0078d4e3f..6dad4516ccb 100644
--- a/engines/glk/blorb.cpp
+++ b/engines/glk/blorb.cpp
@@ -50,7 +50,7 @@ bool Blorb::hasFile(const Common::Path &path) const {
 
 int Blorb::listMembers(Common::ArchiveMemberList &list) const {
 	for (uint idx = 0; idx < _chunks.size(); ++idx) {
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(_chunks[idx]._filename, this)));
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(_chunks[idx]._filename, *this)));
 	}
 
 	return (int)_chunks.size();
@@ -61,7 +61,7 @@ const Common::ArchiveMemberPtr Blorb::getMember(const Common::Path &path) const
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *Blorb::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/glk/comprehend/pics.cpp b/engines/glk/comprehend/pics.cpp
index 31385ad7d85..e0a5a74966d 100644
--- a/engines/glk/comprehend/pics.cpp
+++ b/engines/glk/comprehend/pics.cpp
@@ -387,7 +387,7 @@ const Common::ArchiveMemberPtr Pics::getMember(const Common::Path &path) const {
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *Pics::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/glk/hugo/resource_archive.cpp b/engines/glk/hugo/resource_archive.cpp
index 1526d1744cc..a6546a452fb 100644
--- a/engines/glk/hugo/resource_archive.cpp
+++ b/engines/glk/hugo/resource_archive.cpp
@@ -64,7 +64,7 @@ const Common::ArchiveMemberPtr ResourceArchive::getMember(const Common::Path &pa
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(path, *this));
 }
 
 Common::SeekableReadStream *ResourceArchive::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/glk/zcode/pics.cpp b/engines/glk/zcode/pics.cpp
index fa559569060..438aa525e7c 100644
--- a/engines/glk/zcode/pics.cpp
+++ b/engines/glk/zcode/pics.cpp
@@ -124,7 +124,7 @@ bool Pics::hasFile(const Common::Path &path) const {
 
 int Pics::listMembers(Common::ArchiveMemberList &list) const {
 	for (uint idx = 0; idx < _index.size(); ++idx) {
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(_index[idx]._filename, this)));
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(_index[idx]._filename, *this)));
 	}
 
 	return (int)_index.size();
@@ -135,7 +135,7 @@ const Common::ArchiveMemberPtr Pics::getMember(const Common::Path &path) const {
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *Pics::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/glk/zcode/sound_folder.cpp b/engines/glk/zcode/sound_folder.cpp
index 0a27ced8791..151cd0607d9 100644
--- a/engines/glk/zcode/sound_folder.cpp
+++ b/engines/glk/zcode/sound_folder.cpp
@@ -55,7 +55,7 @@ bool SoundSubfolder::hasFile(const Common::Path &path) const {
 int SoundSubfolder::listMembers(Common::ArchiveMemberList &list) const {
 	int total = 0;
 	for (Common::StringMap::iterator i = _filenames.begin(); i != _filenames.end(); ++i) {
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember((*i)._key, this)));
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember((*i)._key, *this)));
 		++total;
 	}
 
@@ -67,7 +67,7 @@ const Common::ArchiveMemberPtr SoundSubfolder::getMember(const Common::Path &pat
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *SoundSubfolder::createReadStreamForMember(const Common::Path &path) const {
@@ -123,7 +123,7 @@ int SoundZip::listMembers(Common::ArchiveMemberList &list) const {
 	int total = 0;
 
 	for (Common::StringMap::iterator i = _filenames.begin(); i != _filenames.end(); ++i) {
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember((*i)._key, this)));
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember((*i)._key, *this)));
 		++total;
 	}
 
@@ -135,7 +135,7 @@ const Common::ArchiveMemberPtr SoundZip::getMember(const Common::Path &path) con
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 
 }
 
diff --git a/engines/grim/lab.h b/engines/grim/lab.h
index 87641abf7b7..6573ff43c03 100644
--- a/engines/grim/lab.h
+++ b/engines/grim/lab.h
@@ -39,6 +39,8 @@ class LabEntry : public Common::ArchiveMember {
 public:
 	LabEntry(const Common::String &name, uint32 offset, uint32 len, Lab *parent);
 	Common::String getName() const override { return _name; }
+	Common::String getFileName() const override { return _name; }
+	Common::Path getPathInArchive() const override { return _name; }
 	Common::SeekableReadStream *createReadStream() const override;
 	friend class Lab;
 };
diff --git a/engines/grim/update/lang_filter.cpp b/engines/grim/update/lang_filter.cpp
index 7985790a920..c02cc3973d3 100644
--- a/engines/grim/update/lang_filter.cpp
+++ b/engines/grim/update/lang_filter.cpp
@@ -110,8 +110,7 @@ int LangFilter::listMembers(Common::ArchiveMemberList &list) const {
 }
 
 const Common::ArchiveMemberPtr LangFilter::getMember(const Common::Path &path) const {
-	Common::String name = path.toString();
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(path, *this));
 }
 
 Common::SeekableReadStream *LangFilter::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/grim/update/mscab.cpp b/engines/grim/update/mscab.cpp
index 032283a2b43..3c0997e946e 100644
--- a/engines/grim/update/mscab.cpp
+++ b/engines/grim/update/mscab.cpp
@@ -159,7 +159,7 @@ int MsCabinet::listMembers(Common::ArchiveMemberList &list) const {
 
 const Common::ArchiveMemberPtr MsCabinet::getMember(const Common::Path &path) const {
 	Common::String name = path.toString();
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *MsCabinet::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/hypno/libfile.cpp b/engines/hypno/libfile.cpp
index dd008f0eccb..5e1e7f104ed 100644
--- a/engines/hypno/libfile.cpp
+++ b/engines/hypno/libfile.cpp
@@ -110,7 +110,7 @@ int LibFile::listMembers(Common::ArchiveMemberList &list) const {
 
 const Common::ArchiveMemberPtr LibFile::getMember(const Common::Path &path) const {
 	Common::String name = path.toString();
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *LibFile::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/kyra/resource/resource_intern.cpp b/engines/kyra/resource/resource_intern.cpp
index 68102f4f2d8..e69722b2add 100644
--- a/engines/kyra/resource/resource_intern.cpp
+++ b/engines/kyra/resource/resource_intern.cpp
@@ -47,7 +47,7 @@ int PlainArchive::listMembers(Common::ArchiveMemberList &list) const {
 	int count = 0;
 
 	for (FileMap::const_iterator i = _files.begin(); i != _files.end(); ++i) {
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(i->_key, this)));
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(i->_key, *this)));
 		++count;
 	}
 
@@ -59,7 +59,7 @@ const Common::ArchiveMemberPtr PlainArchive::getMember(const Common::Path &path)
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *PlainArchive::createReadStreamForMember(const Common::Path &path) const {
@@ -106,7 +106,7 @@ int TlkArchive::listMembers(Common::ArchiveMemberList &list) const {
 
 	for (; count < _entryCount; ++count) {
 		const Common::String name = Common::String::format("%08u.AUD", _fileEntries[count * 2 + 0]);
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(name, this)));
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(name, *this)));
 	}
 
 	return count;
@@ -117,7 +117,7 @@ const Common::ArchiveMemberPtr TlkArchive::getMember(const Common::Path &path) c
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *TlkArchive::createReadStreamForMember(const Common::Path &path) const {
@@ -202,7 +202,7 @@ int CachedArchive::listMembers(Common::ArchiveMemberList &list) const {
 	int count = 0;
 
 	for (FileMap::const_iterator i = _files.begin(); i != _files.end(); ++i) {
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(i->_key, this)));
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(i->_key, *this)));
 		++count;
 	}
 
@@ -214,7 +214,7 @@ const Common::ArchiveMemberPtr CachedArchive::getMember(const Common::Path &path
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *CachedArchive::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/lastexpress/data/archive.cpp b/engines/lastexpress/data/archive.cpp
index d16da1896cc..fd93ac7c178 100644
--- a/engines/lastexpress/data/archive.cpp
+++ b/engines/lastexpress/data/archive.cpp
@@ -82,7 +82,7 @@ int HPFArchive::listMembers(Common::ArchiveMemberList &list) const {
 	int numMembers = 0;
 
 	for (FileMap::const_iterator i = _files.begin(); i != _files.end(); ++i) {
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(i->_key, this)));
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(i->_key, *this)));
 		numMembers++;
 	}
 
@@ -94,7 +94,7 @@ const Common::ArchiveMemberPtr HPFArchive::getMember(const Common::Path &path) c
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *HPFArchive::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/lastexpress/resource.cpp b/engines/lastexpress/resource.cpp
index a835daffa47..31624ee590a 100644
--- a/engines/lastexpress/resource.cpp
+++ b/engines/lastexpress/resource.cpp
@@ -176,7 +176,7 @@ const Common::ArchiveMemberPtr ResourceManager::getMember(const Common::Path &pa
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *ResourceManager::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/mads/mps_installer.cpp b/engines/mads/mps_installer.cpp
index 37261ce0f15..06d52e1bbf0 100644
--- a/engines/mads/mps_installer.cpp
+++ b/engines/mads/mps_installer.cpp
@@ -69,7 +69,7 @@ bool MpsInstaller::hasFile(const Common::Path &path) const {
 
 int MpsInstaller::listMembers(Common::ArchiveMemberList &list) const {
 	for (FileMap::const_iterator i = _files.begin(), end = _files.end(); i != end; ++i) {
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(i->_key, this)));
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(i->_key, *this)));
 	}
 
 	return _files.size();
@@ -80,7 +80,7 @@ const Common::ArchiveMemberPtr MpsInstaller::getMember(const Common::Path &path)
 	if (!_files.contains(translated))
 		return nullptr;
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(_files.getVal(translated)._fileName, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(_files.getVal(translated)._fileName, *this));
 }
 
 Common::SharedArchiveContents MpsInstaller::readContentsForPath(const Common::String& translated) const {
diff --git a/engines/mads/resources.cpp b/engines/mads/resources.cpp
index a5f1298bd0b..f5debd0a670 100644
--- a/engines/mads/resources.cpp
+++ b/engines/mads/resources.cpp
@@ -114,7 +114,7 @@ int HagArchive::listMembers(Common::ArchiveMemberList &list) const {
 
 		for (i = hagIndex._entries.begin(); i != hagIndex._entries.end(); ++i) {
 			list.push_back(Common::ArchiveMemberList::value_type(
-				new Common::GenericArchiveMember((*i)._resourceName, this)));
+				new Common::GenericArchiveMember((*i)._resourceName, *this)));
 			++members;
 		}
 	}
@@ -127,7 +127,7 @@ const Common::ArchiveMemberPtr HagArchive::getMember(const Common::Path &path) c
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *HagArchive::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/mm/shared/utils/engine_data.cpp b/engines/mm/shared/utils/engine_data.cpp
index dae0ba11621..b37230e81ff 100644
--- a/engines/mm/shared/utils/engine_data.cpp
+++ b/engines/mm/shared/utils/engine_data.cpp
@@ -53,6 +53,8 @@ public:
 	Common::U32String getDisplayName() const override {
 		return _member->getDisplayName();
 	}
+	Common::String getFileName() const override { return getName(); }
+	Common::Path getPathInArchive() const override { return getName(); }
 };
 
 /**
@@ -197,7 +199,7 @@ const Common::ArchiveMemberPtr DataArchive::getMember(const Common::Path &path)
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(path, *this));
 }
 
 Common::SeekableReadStream *DataArchive::createReadStreamForMember(const Common::Path &path) const {
@@ -219,7 +221,7 @@ const Common::ArchiveMemberPtr DataArchiveProxy::getMember(const Common::Path &p
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(path, *this));
 }
 
 Common::SeekableReadStream *DataArchiveProxy::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/mm/shared/xeen/cc_archive.cpp b/engines/mm/shared/xeen/cc_archive.cpp
index 3cbad2a9e5d..ac136c7b82e 100644
--- a/engines/mm/shared/xeen/cc_archive.cpp
+++ b/engines/mm/shared/xeen/cc_archive.cpp
@@ -146,7 +146,7 @@ const Common::ArchiveMemberPtr BaseCCArchive::getMember(const Common::Path &path
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(Common::String(name), *this));
 }
 
 int BaseCCArchive::listMembers(Common::ArchiveMemberList &list) const {
diff --git a/engines/mohawk/installer_archive.cpp b/engines/mohawk/installer_archive.cpp
index 4920e53f028..a25dac1a166 100644
--- a/engines/mohawk/installer_archive.cpp
+++ b/engines/mohawk/installer_archive.cpp
@@ -120,7 +120,7 @@ int InstallerArchive::listMembers(Common::ArchiveMemberList &list) const {
 
 const Common::ArchiveMemberPtr InstallerArchive::getMember(const Common::Path &path) const {
 	Common::String name = path.toString();
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *InstallerArchive::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/ngi/ngiarchive.cpp b/engines/ngi/ngiarchive.cpp
index 0d26193f56f..1d40b125a28 100644
--- a/engines/ngi/ngiarchive.cpp
+++ b/engines/ngi/ngiarchive.cpp
@@ -109,7 +109,7 @@ int NGIArchive::listMembers(Common::ArchiveMemberList &list) const {
 
 	NgiHeadersMap::const_iterator it = _headers.begin();
 	for ( ; it != _headers.end(); ++it) {
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(it->_value->filename, this)));
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(Common::Path(it->_value->filename), *this)));
 		matches++;
 	}
 
@@ -121,7 +121,7 @@ const Common::ArchiveMemberPtr NGIArchive::getMember(const Common::Path &path) c
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *NGIArchive::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/parallaction/disk_ns.cpp b/engines/parallaction/disk_ns.cpp
index c5dd0077ca0..57919e1ebc5 100644
--- a/engines/parallaction/disk_ns.cpp
+++ b/engines/parallaction/disk_ns.cpp
@@ -149,7 +149,7 @@ bool NSArchive::hasFile(const Common::Path &path) const {
 
 int NSArchive::listMembers(Common::ArchiveMemberList &list) const {
 	for (uint32 i = 0; i < _numFiles; i++) {
-		list.push_back(Common::SharedPtr<Common::GenericArchiveMember>(new Common::GenericArchiveMember(_archiveDir[i], this)));
+		list.push_back(Common::SharedPtr<Common::GenericArchiveMember>(new Common::GenericArchiveMember(Common::String(_archiveDir[i]), *this)));
 	}
 	return _numFiles;
 }
@@ -163,7 +163,7 @@ const Common::ArchiveMemberPtr NSArchive::getMember(const Common::Path &path) co
 		item = _archiveDir[index];
 	}
 
-	return Common::SharedPtr<Common::GenericArchiveMember>(new Common::GenericArchiveMember(item, this));
+	return Common::SharedPtr<Common::GenericArchiveMember>(new Common::GenericArchiveMember(Common::String(item), *this));
 }
 
 
diff --git a/engines/prince/archive.cpp b/engines/prince/archive.cpp
index 76d9f127cce..91a48b891fc 100644
--- a/engines/prince/archive.cpp
+++ b/engines/prince/archive.cpp
@@ -139,7 +139,7 @@ int PtcArchive::listMembers(Common::ArchiveMemberList &list) const {
 	int matches = 0;
 
 	for (FileMap::const_iterator it = _items.begin(); it != _items.end(); ++it) {
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(it->_key, this)));
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(it->_key, *this)));
 		matches++;
 	}
 
@@ -151,7 +151,7 @@ const Common::ArchiveMemberPtr PtcArchive::getMember(const Common::Path &path) c
 	if (!_items.contains(name)) {
 		Common::ArchiveMemberPtr();
 	}
-	return Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *PtcArchive::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/stark/formats/xarc.cpp b/engines/stark/formats/xarc.cpp
index ff69b2caa03..be96aa84767 100644
--- a/engines/stark/formats/xarc.cpp
+++ b/engines/stark/formats/xarc.cpp
@@ -40,6 +40,8 @@ public:
 
 	Common::SeekableReadStream *createReadStream() const override;
 	Common::String getName() const override { return _name; }
+	Common::Path getPathInArchive() const { return _name; }
+	Common::String getFileName() const { return _name; }
 	uint32 getLength() const { return _length; }
 	uint32 getOffset() const { return _offset; }
 
diff --git a/engines/sword25/package/packagemanager.cpp b/engines/sword25/package/packagemanager.cpp
index ff7eb7ba9c5..ddf6c3ba211 100644
--- a/engines/sword25/package/packagemanager.cpp
+++ b/engines/sword25/package/packagemanager.cpp
@@ -308,7 +308,7 @@ int PackageManager::doSearch(Common::ArchiveMemberList &list, const Common::Stri
 				}
 
 				if (!found) {
-					list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(name, (*i)->archive)));
+					list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(name, *(*i)->archive)));
 					debug(9, "> %s", name.c_str());
 				}
 				num++;
diff --git a/engines/trecision/fastfile.cpp b/engines/trecision/fastfile.cpp
index 3826128703d..f7d7e93a8da 100644
--- a/engines/trecision/fastfile.cpp
+++ b/engines/trecision/fastfile.cpp
@@ -88,8 +88,7 @@ int FastFile::listMembers(Common::ArchiveMemberList &list) const {
 }
 
 const Common::ArchiveMemberPtr FastFile::getMember(const Common::Path &path) const {
-	Common::String name = path.toString();
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(path, *this));
 }
 
 Common::SeekableReadStream *FastFile::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/ultima/shared/engine/data_archive.cpp b/engines/ultima/shared/engine/data_archive.cpp
index e5192b99470..6cbcfb04634 100644
--- a/engines/ultima/shared/engine/data_archive.cpp
+++ b/engines/ultima/shared/engine/data_archive.cpp
@@ -52,6 +52,9 @@ public:
 	Common::U32String getDisplayName() const override {
 		return _member->getDisplayName();
 	}
+	
+	Common::String getFileName() const override { return getName(); }
+	Common::Path getPathInArchive() const override { return getName(); }
 };
 
 /*-------------------------------------------------------------------*/
@@ -164,7 +167,7 @@ const Common::ArchiveMemberPtr UltimaDataArchive::getMember(const Common::Path &
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *UltimaDataArchive::createReadStreamForMember(const Common::Path &path) const {
@@ -186,7 +189,7 @@ const Common::ArchiveMemberPtr UltimaDataArchiveProxy::getMember(const Common::P
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *UltimaDataArchiveProxy::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/ultima/shared/engine/resources.cpp b/engines/ultima/shared/engine/resources.cpp
index 0cc1fc03b1a..e36c5c616cc 100644
--- a/engines/ultima/shared/engine/resources.cpp
+++ b/engines/ultima/shared/engine/resources.cpp
@@ -65,7 +65,7 @@ bool Resources::hasFile(const Common::Path &path) const {
 
 int Resources::listMembers(Common::ArchiveMemberList &list) const {
 	for (uint idx = 0; idx < _localResources.size(); ++idx) {
-		list.push_back(Common::ArchiveMemberPtr(new Common::GenericArchiveMember(_localResources[idx]._name, this)));
+		list.push_back(Common::ArchiveMemberPtr(new Common::GenericArchiveMember(_localResources[idx]._name, *this)));
 	}
 
 	return _localResources.size();
@@ -76,7 +76,7 @@ const Common::ArchiveMemberPtr Resources::getMember(const Common::Path &path) co
 	if (!hasFile(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *Resources::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/ultima/ultima8/filesys/savegame.cpp b/engines/ultima/ultima8/filesys/savegame.cpp
index 7d4603cbd9d..4434182b1ee 100644
--- a/engines/ultima/ultima8/filesys/savegame.cpp
+++ b/engines/ultima/ultima8/filesys/savegame.cpp
@@ -80,7 +80,7 @@ bool FileEntryArchive::hasFile(const Common::Path &path) const {
 int FileEntryArchive::listMembers(Common::ArchiveMemberList &list) const {
 	list.clear();
 	for (Common::HashMap<Common::String, FileEntry>::const_iterator it = _index.begin(); it != _index.end(); ++it)
-		list.push_back(Common::ArchiveMemberPtr(new Common::GenericArchiveMember(it->_key, this)));
+		list.push_back(Common::ArchiveMemberPtr(new Common::GenericArchiveMember(it->_key, *this)));
 
 	return list.size();
 }
@@ -90,7 +90,7 @@ const Common::ArchiveMemberPtr FileEntryArchive::getMember(const Common::Path &p
 		return nullptr;
 
 	Common::String name = path.toString();
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *FileEntryArchive::createReadStreamForMember(const Common::Path &path) const {
diff --git a/engines/wintermute/base/file/base_file_entry.h b/engines/wintermute/base/file/base_file_entry.h
index a493ca3c5f3..f7e3d66b7df 100644
--- a/engines/wintermute/base/file/base_file_entry.h
+++ b/engines/wintermute/base/file/base_file_entry.h
@@ -40,6 +40,8 @@ class BaseFileEntry : public Common::ArchiveMember {
 public:
 	Common::SeekableReadStream *createReadStream() const override;
 	Common::String getName() const override { return _filename; }
+	Common::Path getPathInArchive() const override { return _filename; }
+	Common::String getFileName() const override { return _filename; }
 	uint32 _timeDate2;
 	uint32 _timeDate1;
 	uint32 _flags;
diff --git a/engines/zvision/file/zfs_archive.cpp b/engines/zvision/file/zfs_archive.cpp
index 45f66f0701a..7754f4e86c8 100644
--- a/engines/zvision/file/zfs_archive.cpp
+++ b/engines/zvision/file/zfs_archive.cpp
@@ -112,7 +112,7 @@ int ZfsArchive::listMembers(Common::ArchiveMemberList &list) const {
 	int matches = 0;
 
 	for (ZfsEntryHeaderMap::const_iterator it = _entryHeaders.begin(); it != _entryHeaders.end(); ++it) {
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(it->_value->name, this)));
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(it->_value->name, *this)));
 		matches++;
 	}
 
@@ -124,7 +124,7 @@ const Common::ArchiveMemberPtr ZfsArchive::getMember(const Common::Path &path) c
 	if (!_entryHeaders.contains(name))
 		return Common::ArchiveMemberPtr();
 
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, *this));
 }
 
 Common::SeekableReadStream *ZfsArchive::createReadStreamForMember(const Common::Path &path) const {


Commit: f38b73201296942e9c82db35a5b5a18ec00ddf8c
    https://github.com/scummvm/scummvm/commit/f38b73201296942e9c82db35a5b5a18ec00ddf8c
Author: elasota (ejlasota at gmail.com)
Date: 2023-07-19T18:51:37+02:00

Commit Message:
COMMON: Fix override without "override" qualifier warning

Changed paths:
    common/fs.h


diff --git a/common/fs.h b/common/fs.h
index 8b4ffc8dbdb..eb3e4ba03ee 100644
--- a/common/fs.h
+++ b/common/fs.h
@@ -258,7 +258,7 @@ public:
 	 *
 	 * @return Pointer to the stream object, 0 in case of a failure.
 	 */
-	virtual SeekableReadStream *createReadStream() const;
+	SeekableReadStream *createReadStream() const override;
 
 	/**
 	 * Create a WriteStream instance corresponding to the file




More information about the Scummvm-git-logs mailing list