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;
            }
        }
Beispiel #2
0
        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++;
                }
            }
        }
Beispiel #3
0
        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++;
                }
            }
        }
Beispiel #4
0
        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;
            }
        }