public RemapStream(Stream baseStream, RemapSegment segment) { BaseStream = baseStream; Segment = segment; CurrentEntry = segment.Entries[0]; Length = segment.Length; }
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); }
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(); }
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)); }