148 lines
3.6 KiB
C#
Raw Permalink Normal View History

2016-11-12 19:02:48 +03:00
using System;
using System.IO;
2017-04-17 19:06:29 +03:00
using System.Linq;
2016-11-12 19:02:48 +03:00
namespace SonicAudioLib.IO
{
public sealed class SubStream : Stream
2016-11-12 19:02:48 +03:00
{
private Stream baseStream;
private long basePosition;
private long baseLength;
2016-11-12 19:02:48 +03:00
public override bool CanRead
{
get
{
return baseStream.CanRead;
}
}
public override bool CanSeek
{
get
{
return baseStream.CanSeek;
}
}
public override bool CanWrite
{
get
{
return baseStream.CanWrite;
2016-11-12 19:02:48 +03:00
}
}
public override long Length
{
get
{
return baseLength;
2016-11-12 19:02:48 +03:00
}
}
public override long Position
{
get
{
return baseStream.Position - basePosition;
2016-11-12 19:02:48 +03:00
}
set
{
baseStream.Position = basePosition + value;
2016-11-12 19:02:48 +03:00
}
}
public override void Flush()
{
baseStream.Flush();
2016-11-12 19:02:48 +03:00
}
public override int Read(byte[] buffer, int offset, int count)
{
if (baseStream.Position >= basePosition + baseLength)
2016-11-12 19:02:48 +03:00
{
count = 0;
}
else if (baseStream.Position + count > basePosition + baseLength)
2016-11-12 19:02:48 +03:00
{
count = (int)(basePosition + baseLength - baseStream.Position);
2016-11-12 19:02:48 +03:00
}
return baseStream.Read(buffer, offset, count);
}
public override long Seek(long offset, SeekOrigin origin)
{
if (origin == SeekOrigin.Begin)
{
offset += basePosition;
2016-11-12 19:02:48 +03:00
}
else if (origin == SeekOrigin.End)
{
offset = basePosition + baseLength - offset;
2016-11-12 19:02:48 +03:00
origin = SeekOrigin.Begin;
}
return baseStream.Seek(offset, origin);
}
public override void SetLength(long value)
{
baseLength = value;
if (basePosition + baseLength > baseStream.Length)
{
baseStream.SetLength(basePosition + baseLength);
}
2016-11-12 19:02:48 +03:00
}
public override void Write(byte[] buffer, int offset, int count)
{
if (baseStream.Position >= basePosition + baseLength)
{
count = 0;
}
2016-11-12 19:02:48 +03:00
else if (baseStream.Position + count > basePosition + baseLength)
{
count = (int)(basePosition + baseLength - baseStream.Position);
}
baseStream.Write(buffer, 0, count);
2016-11-12 19:02:48 +03:00
}
public byte[] ToArray()
{
long previousPosition = baseStream.Position;
baseStream.Seek(basePosition, SeekOrigin.Begin);
using (MemoryStream memoryStream = new MemoryStream())
2016-11-12 19:02:48 +03:00
{
CopyTo(memoryStream);
baseStream.Seek(previousPosition, SeekOrigin.Begin);
return memoryStream.ToArray();
2016-11-12 19:02:48 +03:00
}
}
public SubStream(Stream baseStream, long basePosition) : this(baseStream, basePosition, baseStream.Length - basePosition)
2016-11-12 19:02:48 +03:00
{
}
public SubStream(Stream baseStream, long basePosition, long baseLength)
2016-11-12 19:02:48 +03:00
{
this.baseStream = baseStream;
this.basePosition = basePosition;
this.baseLength = baseLength;
2016-11-12 19:02:48 +03:00
baseStream.Seek(this.basePosition, SeekOrigin.Begin);
2016-11-12 19:02:48 +03:00
}
}
}