Beispiel #1
0
 public RemapStream(Stream baseStream, RemapSegment segment)
 {
     BaseStream   = baseStream;
     Segment      = segment;
     CurrentEntry = segment.Entries[0];
     Length       = segment.Length;
 }
Beispiel #2
0
        private static RemapSegment[] InitSegments(RemapHeader header, MapEntry[] mapEntries)
        {
            var segments = new RemapSegment[header.MapSegmentCount];
            int entryIdx = 0;

            for (int i = 0; i < header.MapSegmentCount; i++)
            {
                var seg = new RemapSegment();
                seg.Entries.Add(mapEntries[entryIdx]);
                seg.Offset = mapEntries[entryIdx].VirtualOffset;
                mapEntries[entryIdx].Segment = seg;
                entryIdx++;

                while (entryIdx < mapEntries.Length &&
                       mapEntries[entryIdx - 1].VirtualOffsetEnd == mapEntries[entryIdx].VirtualOffset)
                {
                    mapEntries[entryIdx].Segment  = seg;
                    mapEntries[entryIdx - 1].Next = mapEntries[entryIdx];
                    seg.Entries.Add(mapEntries[entryIdx]);
                    entryIdx++;
                }

                seg.Length  = seg.Entries[seg.Entries.Count - 1].VirtualOffsetEnd - seg.Entries[0].VirtualOffset;
                segments[i] = seg;
            }

            return(segments);
        }
Beispiel #3
0
        public RemapStream(Stream baseStream, MapEntry[] entries, int segmentCount)
        {
            BaseStream = baseStream;
            MapEntries = entries;
            Segments   = new RemapSegment[segmentCount];

            int entryIdx = 0;

            for (int i = 0; i < segmentCount; i++)
            {
                var seg = new RemapSegment();
                seg.Entries.Add(MapEntries[entryIdx]);
                seg.Offset = MapEntries[entryIdx].VirtualOffset;
                MapEntries[entryIdx].Segment = seg;
                entryIdx++;

                while (entryIdx < MapEntries.Length &&
                       MapEntries[entryIdx - 1].VirtualOffsetEnd == MapEntries[entryIdx].VirtualOffset)
                {
                    MapEntries[entryIdx].Segment  = seg;
                    MapEntries[entryIdx - 1].Next = MapEntries[entryIdx];
                    seg.Entries.Add(MapEntries[entryIdx]);
                    entryIdx++;
                }

                seg.Length  = seg.Entries[seg.Entries.Count - 1].VirtualOffsetEnd - seg.Entries[0].VirtualOffset;
                Segments[i] = seg;
            }

            CurrentEntry = GetMapEntry(0);
            UpdateBaseStreamPosition();
        }
Beispiel #4
0
        public Stream OpenStream(long offset, long size)
        {
            int  segmentIdx    = GetSegmentFromVirtualOffset(offset);
            long segmentOffset = GetOffsetFromVirtualOffset(offset);

            if (segmentIdx > Segments.Length)
            {
                throw new ArgumentOutOfRangeException(nameof(offset));
            }

            RemapSegment segment = Segments[GetSegmentFromVirtualOffset(offset)];

            if (segmentOffset > segment.Length)
            {
                throw new ArgumentOutOfRangeException(nameof(offset));
            }

            Stream stream = new RemapStream(StreamSource.CreateStream(), segment);

            return(new SubStream(stream, offset, size));
        }