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

sev- noreply at scummvm.org
Sun Nov 20 13:20:33 UTC 2022


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

Summary:
b3c70aa1ba COMMON: Add Macintosh Finder Info types and add parsing of it to StuffItArchive.


Commit: b3c70aa1ba79ad56b8a053d09906268451fd3338
    https://github.com/scummvm/scummvm/commit/b3c70aa1ba79ad56b8a053d09906268451fd3338
Author: elasota (ejlasota at gmail.com)
Date: 2022-11-20T14:20:30+01:00

Commit Message:
COMMON: Add Macintosh Finder Info types and add parsing of it to StuffItArchive.

Changed paths:
    common/macresman.cpp
    common/macresman.h
    common/stuffit.cpp


diff --git a/common/macresman.cpp b/common/macresman.cpp
index 706fa183af9..d7d4ce8481f 100644
--- a/common/macresman.cpp
+++ b/common/macresman.cpp
@@ -37,6 +37,49 @@
 
 namespace Common {
 
+MacFinderInfo::MacFinderInfo() : type{0, 0, 0, 0}, creator{0, 0, 0, 0}, flags(0), position(0, 0), windowID(0) {
+}
+
+MacFinderInfo::MacFinderInfo(const MacFinderInfoData &data) {
+	memcpy(type, data.data + 0, 4);
+	memcpy(creator, data.data + 4, 4);
+	flags = READ_BE_UINT16(data.data + 8);
+	position.y = READ_BE_INT16(data.data + 10);
+	position.x = READ_BE_INT16(data.data + 12);
+	windowID = READ_BE_INT16(data.data + 14);
+}
+
+MacFinderInfoData MacFinderInfo::toData() const {
+	MacFinderInfoData data;
+	memcpy(data.data + 0, type, 4);
+	memcpy(data.data + 4, creator, 4);
+	WRITE_BE_UINT16(data.data + 8, flags);
+	WRITE_BE_INT16(data.data + 10, position.y);
+	WRITE_BE_INT16(data.data + 12, position.x);
+	WRITE_BE_INT16(data.data + 14, windowID);
+
+	return data;
+}
+
+MacFinderExtendedInfo::MacFinderExtendedInfo() : iconID(0), commentID(0), homeDirectoryID(0) {
+}
+
+MacFinderExtendedInfo::MacFinderExtendedInfo(const MacFinderExtendedInfoData &data) {
+	iconID = READ_BE_INT16(data.data + 0);
+	commentID = READ_BE_INT16(data.data + 10);
+	homeDirectoryID = READ_BE_INT32(data.data + 12);
+}
+
+MacFinderExtendedInfoData MacFinderExtendedInfo::toData() const {
+	MacFinderExtendedInfoData data;
+	WRITE_BE_INT16(data.data + 0, iconID);
+	memset(data.data + 2, 0, 8);
+	WRITE_BE_INT16(data.data + 10, commentID);
+	WRITE_BE_INT32(data.data + 12, homeDirectoryID);
+
+	return data;
+}
+
 #define MBI_ZERO1 0
 #define MBI_NAMELEN 1
 #define MBI_ZERO2 74
diff --git a/common/macresman.h b/common/macresman.h
index 50fed875f41..9b858a25269 100644
--- a/common/macresman.h
+++ b/common/macresman.h
@@ -26,6 +26,7 @@
 
 #include "common/array.h"
 #include "common/fs.h"
+#include "common/rect.h"
 #include "common/str.h"
 #include "common/str-array.h"
 
@@ -41,8 +42,11 @@ namespace Common {
  * @brief API for Macintosh resource fork manager.
  *
  * @details Used in engines:
+ *          - director
  *          - groovie
+ *          - kyra
  *          - mohawk
+ *          - mtropolis
  *          - pegasus
  *          - sci
  *          - scumm
@@ -52,6 +56,68 @@ namespace Common {
 typedef Array<uint16> MacResIDArray;
 typedef Array<uint32> MacResTagArray;
 
+/**
+ * Class containing the raw data bytes for a Macintosh Finder Info data block.
+ */
+struct MacFinderInfoData {
+	byte data[16];
+};
+
+/**
+ * Class containing the raw data bytes for a Macintosh Extended Finder Info data block.
+ */
+struct MacFinderExtendedInfoData {
+	byte data[16];
+};
+
+/**
+ * Class containing Macintosh Finder Info.
+ */
+struct MacFinderInfo {
+	enum FinderFlags {
+		kFinderFlagAlias = (1 << 15),
+		kFinderFlagInvisible = (1 << 14),
+		kFinderFlagBundle = (1 << 13),
+		kFinderFlagNameLocked = (1 << 12),
+		kFinderFlagStationery = (1 << 11),
+		kFinderFlagCustomIcon = (1 << 10),
+		kFinderFlagInited = (1 << 8),
+		kFinderFlagNoInit = (1 << 7),
+		kFinderFlagShared = (1 << 6),
+
+		kFinderFlagColorBit2 = (1 << 3),
+		kFinderFlagColorBit1 = (1 << 2),
+		kFinderFlagColorBit0 = (1 << 1),
+	};
+
+	MacFinderInfo();
+	explicit MacFinderInfo(const MacFinderInfoData &data);
+
+	MacFinderInfoData toData() const;
+
+	byte type[4];
+	byte creator[4];
+	uint16 flags;
+	Common::Point position;
+	int16 windowID;
+};
+
+/**
+ * Class containing Macintosh Extended Finder Info.
+ */
+struct MacFinderExtendedInfo {
+	static const uint kDataSize = 16;
+
+	MacFinderExtendedInfo();
+	explicit MacFinderExtendedInfo(const MacFinderExtendedInfoData &data);
+
+	MacFinderExtendedInfoData toData() const;
+
+	int16 iconID;
+	int16 commentID;
+	int32 homeDirectoryID;
+};
+
 /**
  * Class for handling Mac data and resource forks.
  * It can read from raw, MacBinary, and AppleDouble formats.
diff --git a/common/stuffit.cpp b/common/stuffit.cpp
index 97ff1dcab96..6a4311564d3 100644
--- a/common/stuffit.cpp
+++ b/common/stuffit.cpp
@@ -29,6 +29,7 @@
 #include "common/debug.h"
 #include "common/hash-str.h"
 #include "common/hashmap.h"
+#include "common/macresman.h"
 #include "common/memstream.h"
 #include "common/substream.h"
 
@@ -65,6 +66,9 @@ private:
 	typedef Common::HashMap<Common::String, FileEntry, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> FileMap;
 	FileMap _map;
 
+	typedef Common::HashMap<Common::String, Common::MacFinderInfoData, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> MetadataMap;
+	MetadataMap _metadataMap;
+
 	// Decompression Functions
 	Common::SeekableReadStream *decompress14(Common::SeekableReadStream *src, uint32 uncompressedSize) const;
 
@@ -145,9 +149,11 @@ bool StuffItArchive::open(Common::SeekableReadStream *stream) {
 		// Skip remaining bytes
 		_stream->skip(63 - fileNameLength);
 
-		/* uint32 fileType = */ _stream->readUint32BE();
-		/* uint32 fileCreator = */ _stream->readUint32BE();
-		/* uint16 finderFlags = */ _stream->readUint16BE();
+		MacFinderInfo finfo;
+
+		_stream->read(finfo.type, 4);
+		_stream->read(finfo.creator, 4);
+		finfo.flags = _stream->readUint16BE();
 		/* uint32 creationDate = */ _stream->readUint32BE();
 		/* uint32 modificationDate = */ _stream->readUint32BE();
 		uint32 resForkUncompressedSize = _stream->readUint32BE();
@@ -163,6 +169,8 @@ bool StuffItArchive::open(Common::SeekableReadStream *stream) {
 		if (dataForkCompression == 32 || dataForkCompression == 33)
 			continue;
 
+		_metadataMap[name + ".finf"] = finfo.toData();
+
 		if (dataForkUncompressedSize != 0) {
 			// We have a data fork
 
@@ -224,8 +232,14 @@ const Common::ArchiveMemberPtr StuffItArchive::getMember(const Common::Path &pat
 
 Common::SeekableReadStream *StuffItArchive::createReadStreamForMember(const Common::Path &path) const {
 	Common::String name = path.toString();
-	if (!_stream || !_map.contains(name))
+
+	if (!_stream || !_map.contains(name)) {
+		if (_metadataMap.contains(name)) {
+			const Common::MacFinderInfoData &metadata = _metadataMap[name];
+			return new Common::MemoryReadStream(reinterpret_cast<const byte *>(&metadata), sizeof(Common::MacFinderInfoData), DisposeAfterUse::NO);
+		}
 		return nullptr;
+	}
 
 	const FileEntry &entry = _map[name];
 




More information about the Scummvm-git-logs mailing list