Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
PeekStream.cs
浏览该文件的文档.
1namespace Engine.Media {
2 public class PeekStream : Stream {
3 Stream m_stream;
4
5 byte[] m_buffer;
6
8
9 int m_end;
10
11 public override bool CanRead => true;
12
13 public override bool CanWrite => false;
14
15 public override bool CanSeek => m_stream.CanSeek;
16
17 public override long Length => m_stream.Length;
18
19 public override long Position {
20 get => CanSeek ? m_position : throw new NotSupportedException();
21 set {
22 if (CanSeek) {
23 m_position = value;
24 m_stream.Position = Math.Max(m_position, m_end);
25 return;
26 }
27 throw new NotSupportedException();
28 }
29 }
30
31 public PeekStream(Stream stream, int peekSize) {
32 ArgumentNullException.ThrowIfNull(stream);
33 if (!stream.CanRead) {
34 throw new ArgumentException("Stream is not readable.");
35 }
36 ArgumentOutOfRangeException.ThrowIfNegative(peekSize);
37 m_stream = stream;
38 m_buffer = new byte[peekSize];
39 m_end = stream.Read(m_buffer, 0, peekSize);
40 }
41
42 public MemoryStream GetInitialBytesStream() => new(m_buffer, 0, m_end, false);
43
44 public override long Seek(long offset, SeekOrigin origin) {
45 switch (origin) {
46 case SeekOrigin.Begin: Position = offset; break;
47 case SeekOrigin.End: Position = Length + offset; break;
48 case SeekOrigin.Current: Position += offset; break;
49 default: throw new ArgumentException("Invalid origin.", nameof(origin));
50 }
51 return Position;
52 }
53
54 public override void SetLength(long value) {
55 m_stream.SetLength(value);
56 }
57
58 public override int Read(byte[] buffer, int offset, int count) {
59 ArgumentNullException.ThrowIfNull(buffer);
60 if (offset < 0) {
61 throw new ArgumentOutOfRangeException(nameof(offset));
62 }
63 if (offset + count > buffer.Length) {
64 throw new ArgumentOutOfRangeException(nameof(count));
65 }
66 int num = 0;
67 if (m_position < m_end) {
68 int num2 = MathUtils.Min(m_end - (int)m_position, count);
69 Array.Copy(m_buffer, (int)m_position, buffer, offset, num2);
70 m_position += num2;
71 offset += num2;
72 count -= num2;
73 num += num2;
74 }
75 if (count > 0) {
76 int num3 = m_stream.Read(buffer, offset, count);
77 num += num3;
78 m_position += num3;
79 }
80 return num;
81 }
82
83 public override void Write(byte[] buffer, int offset, int count) {
84 throw new InvalidOperationException();
85 }
86
87 public override int ReadByte() {
88 if (m_position < m_end) {
89 return m_buffer[m_position++];
90 }
91 int num = m_stream.ReadByte();
92 if (num >= 0) {
93 m_position++;
94 }
95 return num;
96 }
97
98 public override void Flush() {
99 m_stream.Flush();
100 }
101
102 protected override void Dispose(bool disposing) {
103 if (disposing) {
104 m_stream.Dispose();
105 }
106 base.Dispose(disposing);
107 }
108 }
109}
static int Min(int x1, int x2)
override long Seek(long offset, SeekOrigin origin)
override void Dispose(bool disposing)
override void SetLength(long value)
override int Read(byte[] buffer, int offset, int count)
PeekStream(Stream stream, int peekSize)
override void Write(byte[] buffer, int offset, int count)
MemoryStream GetInitialBytesStream()