protected IEnumerable <HexSpan> GetValidSpansReverse(HexBuffer buffer, HexPosition start, HexPosition lowerBounds) { var pos = start; bool fullSpan = true; for (;;) { var span = buffer.GetPreviousValidSpan(pos, lowerBounds, fullSpan); if (span == null) { break; } var newStart = HexPosition.Max(lowerBounds, span.Value.Start); var newEnd = HexPosition.Min(pos + 1, span.Value.End); if (newStart < newEnd) { yield return(HexSpan.FromBounds(newStart, newEnd)); } if (span.Value.Start == 0) { break; } pos = span.Value.Start - 1; fullSpan = false; } }
public override void OnBufferChanged(NormalizedHexChangeCollection changes) { base.OnBufferChanged(changes); if (TreeNode.Children.Count == 0) { return; } foreach (var change in changes) { if (!changes.OverlapsWith(Span)) { continue; } var start = HexPosition.Max(Span.Start, change.OldSpan.Start); var end = HexPosition.Min(Span.End, change.OldSpan.End); int i = (int)((start - Span.Start).ToUInt64() / (ulong)TableInfo.RowSize); int endi = (int)((end - 1 - Span.Start).ToUInt64() / (ulong)TableInfo.RowSize); Debug.Assert(0 <= i && i <= endi && endi < TreeNode.Children.Count); while (i <= endi) { var obj = (MetadataTableRecordNode)TreeNode.Children[i].Data; obj.OnBufferChanged(changes); i++; } } }
public override void OnBufferChanged(NormalizedHexChangeCollection changes) { foreach (var change in changes) { if (!change.OldSpan.OverlapsWith(Span)) { continue; } var start = HexPosition.Max(Span.Start, change.OldSpan.Start); var end = HexPosition.Min(Span.End, change.OldSpan.End); int i = (int)((start - Span.Start).ToUInt64() / (ulong)TableInfo.RowSize); int endi = (int)((end - 1 - Span.Start).ToUInt64() / (ulong)TableInfo.RowSize); Debug.Assert(0 <= i && i <= endi && endi < Collection.Count); while (i <= endi) { var obj = Collection.TryGet(i); if (obj != null) { obj.OnBufferChanged(changes); } i++; } } }
bool Read() { var pos = MetadataSpan.Start + 0x0C; var versionStringLength = file.Buffer.ReadUInt32(pos); var endPos = pos + 4 + versionStringLength; if (!file.Span.Contains(pos + 4) || !file.Span.Contains(endPos - 1)) { return(false); } VersionStringSpan = HexSpan.FromBounds(pos + 4, endPos); StorageSignatureSpan = HexSpan.FromBounds(MetadataSpan.Start, VersionStringSpan.End); if (!file.Span.Contains(VersionStringSpan.End + 4)) { return(false); } StorageHeaderSpan = HexSpan.FromBounds(VersionStringSpan.End, VersionStringSpan.End + 4); StreamCount = file.Buffer.ReadUInt16(StorageHeaderSpan.End - 2); StorageStreamHeaders = new StorageStreamHeader[StreamCount]; pos = StorageHeaderSpan.End; var sb = new StringBuilder(); var lastStreamOffset = MetadataSpan.Start; for (int i = 0; i < StorageStreamHeaders.Length; i++) { var stream = ReadStorageStreamHeader(pos, sb); if (stream is null) { return(false); } StorageStreamHeaders[i] = stream.Value; pos = stream.Value.Span.End; lastStreamOffset = HexPosition.Max(lastStreamOffset, stream.Value.DataSpan.End); } MetadataHeaderSpan = HexSpan.FromBounds(MetadataSpan.Start, pos); MetadataSpan = HexSpan.FromBounds(MetadataSpan.Start, lastStreamOffset); return(true); }
protected IEnumerable <HexSpan> GetValidSpans(HexBuffer buffer, HexPosition start, HexPosition upperBounds) { var pos = start; bool fullSpan = true; while (pos < HexPosition.MaxEndPosition) { var span = buffer.GetNextValidSpan(pos, upperBounds, fullSpan); if (span == null) { break; } var newStart = HexPosition.Max(pos, span.Value.Start); var newEnd = HexPosition.Min(upperBounds, span.Value.End); if (newStart < newEnd) { yield return(HexSpan.FromBounds(newStart, newEnd)); } pos = span.Value.End; fullSpan = false; } }