public static bool TryRead(Stream stream, out HFSTreeNodeDescriptor?descriptor)
        {
            descriptor = null;

            uint fLink = ReadUInt32(stream);
            uint bLink = ReadUInt32(stream);

            sbyte rawKind = (sbyte)ReadUInt8(stream);

            if (!Enum.IsDefined(typeof(HFSTreeNodeKind), rawKind))
            {
                return(false);
            }
            var kind = (HFSTreeNodeKind)rawKind;

            byte height = ReadUInt8(stream);

            if (((kind == HFSTreeNodeKind.Header) || (kind == HFSTreeNodeKind.Map)) && (height != 0))
            {
                return(false);
            }
            if ((kind == HFSTreeNodeKind.Leaf) && (height != 1))
            {
                return(false);
            }

            ushort numRecords = ReadUInt16(stream);

            _ = ReadUInt16(stream); // reserved

            descriptor = new HFSTreeNodeDescriptor(fLink, bLink, kind, height, numRecords);
            return(true);
        }
Exemplo n.º 2
0
        private static (HFSHeaderTreeNode, IReadOnlyList <HFSTreeNode>) ReadTree(Stream stream, bool isHFSX)
        {
            if (!HFSTreeNodeDescriptor.TryRead(stream, out var headerDesc))
            {
                throw new InvalidFormatException(CorruptHFSMessage);
            }
            var header = HFSHeaderTreeNode.Read(headerDesc !, stream);

            var nodes = new HFSTreeNode[header.HeaderRecord.TotalNodes];

            nodes[0] = header;

            for (int i = 1; i < nodes.Length; i++)
            {
                if (!HFSTreeNode.TryRead(stream, header.HeaderRecord, isHFSX, out var node))
                {
                    throw new InvalidFormatException(CorruptHFSMessage);
                }

                nodes[i] = node !;
            }

            return(header, nodes);
        }
Exemplo n.º 3
0
 protected HFSTreeNode(HFSTreeNodeDescriptor descriptor)
 => Descriptor = descriptor;