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); }
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); }
protected HFSTreeNode(HFSTreeNodeDescriptor descriptor) => Descriptor = descriptor;