Skip to content

Commit 80da927

Browse files
committed
Allow extensibility in end-user code.
1 parent 029d318 commit 80da927

3 files changed

Lines changed: 57 additions & 57 deletions

File tree

Kaitai.Struct.Runtime.Async/KaitaiAsyncStream.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,25 @@ namespace Kaitai.Async
88
{
99
public class KaitaiAsyncStream : KaitaiStreamBase, IKaitaiAsyncStream
1010
{
11-
private readonly IReaderContext _readerContext;
11+
protected readonly IReaderContext ReaderContext;
1212
private ulong _bits;
1313
private int _bitsLeft;
1414

1515
#region Constructors
1616

1717
public KaitaiAsyncStream(IReaderContext readerContext)
1818
{
19-
_readerContext = readerContext;
19+
ReaderContext = readerContext;
2020
}
2121

2222
public KaitaiAsyncStream(PipeReader pipeReader)
2323
{
24-
_readerContext = new PipeReaderContext(pipeReader);
24+
ReaderContext = new PipeReaderContext(pipeReader);
2525
}
2626

2727
public KaitaiAsyncStream(Stream stream)
2828
{
29-
_readerContext = new StreamReaderContext(stream);
29+
ReaderContext = new StreamReaderContext(stream);
3030
}
3131

3232
/// <summary>
@@ -51,18 +51,18 @@ public KaitaiAsyncStream(byte[] bytes) : this(new MemoryStream(bytes))
5151
#region Stream positioning
5252

5353
public override bool IsEof =>
54-
_readerContext.IsEofAsync().GetAwaiter().GetResult() && _bitsLeft == 0;
54+
ReaderContext.IsEofAsync().GetAwaiter().GetResult() && _bitsLeft == 0;
5555

56-
public async ValueTask<bool> IsEofAsync() => await _readerContext.IsEofAsync() && _bitsLeft == 0;
56+
public async ValueTask<bool> IsEofAsync() => await ReaderContext.IsEofAsync() && _bitsLeft == 0;
5757

58-
public ValueTask<long> GetSizeAsync() => _readerContext.GetSizeAsync();
58+
public ValueTask<long> GetSizeAsync() => ReaderContext.GetSizeAsync();
5959

60-
public virtual async Task SeekAsync(long position) => await _readerContext.SeekAsync(position);
60+
public virtual async Task SeekAsync(long position) => await ReaderContext.SeekAsync(position);
6161
public virtual async Task SeekAsync(ulong position) => await SeekAsync((long)position);
6262

63-
public override long Pos => _readerContext.Position;
63+
public override long Pos => ReaderContext.Position;
6464

65-
public override long Size => _readerContext.GetSizeAsync().GetAwaiter().GetResult();
65+
public override long Size => ReaderContext.GetSizeAsync().GetAwaiter().GetResult();
6666

6767
#endregion
6868

@@ -96,7 +96,7 @@ public KaitaiAsyncStream(byte[] bytes) : this(new MemoryStream(bytes))
9696

9797
#region Unsigned
9898

99-
public async Task<byte> ReadU1Async() => await _readerContext.ReadByteAsync();
99+
public async Task<byte> ReadU1Async() => await ReaderContext.ReadByteAsync();
100100

101101
#region Big-endian
102102

@@ -222,7 +222,7 @@ public async Task<ulong> ReadBitsIntLeAsync(int n)
222222

223223
#region Byte arrays
224224

225-
public async Task<byte[]> ReadBytesAsync(long count) => await _readerContext.ReadBytesAsync(count);
225+
public async Task<byte[]> ReadBytesAsync(long count) => await ReaderContext.ReadBytesAsync(count);
226226

227227
public async Task<byte[]> ReadBytesAsync(ulong count)
228228
{
@@ -271,7 +271,7 @@ protected async Task<byte[]> ReadBytesNormalisedBigEndianAsync(int count)
271271
/// Read all the remaining bytes from the stream until the end is reached
272272
/// </summary>
273273
/// <returns></returns>
274-
public virtual async Task<byte[]> ReadBytesFullAsync() => await _readerContext.ReadBytesFullAsync();
274+
public virtual async Task<byte[]> ReadBytesFullAsync() => await ReaderContext.ReadBytesFullAsync();
275275

276276
/// <summary>
277277
/// Read a terminated string from the stream

Kaitai.Struct.Runtime.Async/ReaderContext/PipeReaderContext.cs

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,42 +6,42 @@
66

77
namespace Kaitai.Async
88
{
9-
internal class PipeReaderContext : IReaderContext
9+
public class PipeReaderContext : IReaderContext
1010
{
11-
private readonly PipeReader _pipeReader;
12-
private ReadResult _readResult;
11+
protected readonly PipeReader PipeReader;
12+
protected ReadResult ReadResult;
1313

1414
public PipeReaderContext(PipeReader pipeReader)
1515
{
16-
_pipeReader = pipeReader;
16+
PipeReader = pipeReader;
1717
}
1818

19-
private long RemainingBytesInReadResult => _readResult.Buffer.Length - Position;
19+
protected long RemainingBytesInReadResult => ReadResult.Buffer.Length - Position;
2020

21-
public long Position { get; private set; }
21+
public long Position { get; protected set; }
2222

23-
public async ValueTask<long> GetSizeAsync()
23+
public virtual async ValueTask<long> GetSizeAsync()
2424
{
2525
await FillReadResultBufferToTheEnd();
2626

27-
return _readResult.Buffer.Length;
27+
return ReadResult.Buffer.Length;
2828
}
2929

30-
public async ValueTask<bool> IsEofAsync()
30+
public virtual async ValueTask<bool> IsEofAsync()
3131
{
3232
await EnsureReadResultIsNotDefault();
3333

34-
if (Position >= _readResult.Buffer.Length && !_readResult.IsCompleted)
34+
if (Position >= ReadResult.Buffer.Length && !ReadResult.IsCompleted)
3535
{
36-
_pipeReader.AdvanceTo(_readResult.Buffer.Start, _readResult.Buffer.GetPosition(Position));
37-
_readResult = await _pipeReader.ReadAsync();
36+
PipeReader.AdvanceTo(ReadResult.Buffer.Start, ReadResult.Buffer.GetPosition(Position));
37+
ReadResult = await PipeReader.ReadAsync();
3838
}
3939

40-
return Position >= _readResult.Buffer.Length && _readResult.IsCompleted;
40+
return Position >= ReadResult.Buffer.Length && ReadResult.IsCompleted;
4141
}
4242

4343

44-
public async ValueTask SeekAsync(long position)
44+
public virtual async ValueTask SeekAsync(long position)
4545
{
4646
if (position <= Position)
4747
{
@@ -51,49 +51,49 @@ public async ValueTask SeekAsync(long position)
5151
{
5252
await EnsureReadResultIsNotDefault();
5353

54-
while (_readResult.Buffer.Length < position && !_readResult.IsCompleted)
54+
while (ReadResult.Buffer.Length < position && !ReadResult.IsCompleted)
5555
{
56-
_pipeReader.AdvanceTo(_readResult.Buffer.Start, _readResult.Buffer.End);
57-
_readResult = await _pipeReader.ReadAsync();
56+
PipeReader.AdvanceTo(ReadResult.Buffer.Start, ReadResult.Buffer.End);
57+
ReadResult = await PipeReader.ReadAsync();
5858
}
5959

60-
if (_readResult.Buffer.Length <= position)
60+
if (ReadResult.Buffer.Length <= position)
6161
{
6262
Position = position;
6363
return;
6464
}
6565

66-
if (_readResult.IsCompleted)
66+
if (ReadResult.IsCompleted)
6767
{
6868
throw new EndOfStreamException(
6969
$"requested {position} bytes, but got only {RemainingBytesInReadResult} bytes");
7070
}
7171
}
7272
}
7373

74-
public async ValueTask<byte> ReadByteAsync()
74+
public virtual async ValueTask<byte> ReadByteAsync()
7575
{
7676
await EnsureReadResultIsNotDefault();
7777

7878
var value = byte.MinValue;
79-
while (!TryReadByte(out value) && !_readResult.IsCompleted)
79+
while (!TryReadByte(out value) && !ReadResult.IsCompleted)
8080
{
81-
_pipeReader.AdvanceTo(_readResult.Buffer.Start, _readResult.Buffer.GetPosition(Position));
82-
_readResult = await _pipeReader.ReadAsync();
81+
PipeReader.AdvanceTo(ReadResult.Buffer.Start, ReadResult.Buffer.GetPosition(Position));
82+
ReadResult = await PipeReader.ReadAsync();
8383
}
8484

8585
Position += 1;
8686
return value;
8787

8888
bool TryReadByte(out byte readValue)
8989
{
90-
var sequenceReader = new SequenceReader<byte>(_readResult.Buffer);
90+
var sequenceReader = new SequenceReader<byte>(ReadResult.Buffer);
9191
sequenceReader.Advance(Position);
9292
return sequenceReader.TryRead(out readValue);
9393
}
9494
}
9595

96-
public async ValueTask<byte[]> ReadBytesAsync(long count)
96+
public virtual async ValueTask<byte[]> ReadBytesAsync(long count)
9797
{
9898
if (count < 0 || count > int.MaxValue)
9999
{
@@ -107,14 +107,14 @@ public async ValueTask<byte[]> ReadBytesAsync(long count)
107107

108108
while (!TryRead(out value, count))
109109
{
110-
if (_readResult.IsCompleted)
110+
if (ReadResult.IsCompleted)
111111
{
112112
throw new EndOfStreamException(
113113
$"requested {count} bytes, but got only {RemainingBytesInReadResult} bytes");
114114
}
115115

116-
_pipeReader.AdvanceTo(_readResult.Buffer.Start, _readResult.Buffer.GetPosition(Position));
117-
_readResult = await _pipeReader.ReadAsync();
116+
PipeReader.AdvanceTo(ReadResult.Buffer.Start, ReadResult.Buffer.GetPosition(Position));
117+
ReadResult = await PipeReader.ReadAsync();
118118
}
119119

120120
Position += count;
@@ -128,7 +128,7 @@ bool TryRead(out byte[] readBytes, long readBytesCount)
128128
return false;
129129
}
130130

131-
readBytes = _readResult.Buffer.Slice(Position, readBytesCount).ToArray();
131+
readBytes = ReadResult.Buffer.Slice(Position, readBytesCount).ToArray();
132132
return true;
133133
}
134134
}
@@ -137,8 +137,8 @@ public virtual async ValueTask<byte[]> ReadBytesFullAsync()
137137
{
138138
await FillReadResultBufferToTheEnd();
139139

140-
_pipeReader.AdvanceTo(_readResult.Buffer.Start, _readResult.Buffer.End);
141-
var value = _readResult.Buffer.Slice(Position, _readResult.Buffer.End).ToArray();
140+
PipeReader.AdvanceTo(ReadResult.Buffer.Start, ReadResult.Buffer.End);
141+
var value = ReadResult.Buffer.Slice(Position, ReadResult.Buffer.End).ToArray();
142142
Position += value.Length;
143143
return value;
144144
}
@@ -147,18 +147,18 @@ private async ValueTask FillReadResultBufferToTheEnd()
147147
{
148148
await EnsureReadResultIsNotDefault();
149149

150-
while (!_readResult.IsCompleted)
150+
while (!ReadResult.IsCompleted)
151151
{
152-
_pipeReader.AdvanceTo(_readResult.Buffer.Start, _readResult.Buffer.End);
153-
_readResult = await _pipeReader.ReadAsync();
152+
PipeReader.AdvanceTo(ReadResult.Buffer.Start, ReadResult.Buffer.End);
153+
ReadResult = await PipeReader.ReadAsync();
154154
}
155155
}
156156

157157
private async ValueTask EnsureReadResultIsNotDefault()
158158
{
159-
if (_readResult.Equals(default(ReadResult)))
159+
if (ReadResult.Equals(default(ReadResult)))
160160
{
161-
_readResult = await _pipeReader.ReadAsync();
161+
ReadResult = await PipeReader.ReadAsync();
162162
}
163163
}
164164
}

Kaitai.Struct.Runtime.Async/ReaderContext/StreamReaderContext.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,32 @@
55

66
namespace Kaitai.Async
77
{
8-
internal class StreamReaderContext : IReaderContext
8+
public class StreamReaderContext : IReaderContext
99
{
1010
private readonly Stream _baseStream;
11+
protected readonly AsyncBinaryReader AsyncBinaryReader;
1112

1213
public StreamReaderContext(Stream stream)
1314
{
1415
_baseStream = stream;
1516
AsyncBinaryReader = new AsyncBinaryReader(_baseStream);
1617
}
1718

18-
protected AsyncBinaryReader AsyncBinaryReader { get; }
1919
public long Position => _baseStream.Position;
20-
public ValueTask<long> GetSizeAsync() => new ValueTask<long>(_baseStream.Length);
20+
public virtual ValueTask<long> GetSizeAsync() => new ValueTask<long>(_baseStream.Length);
2121

22-
public ValueTask<bool> IsEofAsync() =>
22+
public virtual ValueTask<bool> IsEofAsync() =>
2323
new ValueTask<bool>(_baseStream.Position >= _baseStream.Length);
2424

25-
public ValueTask SeekAsync(long position)
25+
public virtual ValueTask SeekAsync(long position)
2626
{
2727
_baseStream.Seek(position, SeekOrigin.Begin);
2828
return new ValueTask();
2929
}
3030

31-
public async ValueTask<byte> ReadByteAsync() => (byte) await AsyncBinaryReader.ReadSByteAsync();
31+
public virtual async ValueTask<byte> ReadByteAsync() => (byte) await AsyncBinaryReader.ReadSByteAsync();
3232

33-
public async ValueTask<byte[]> ReadBytesAsync(long count)
33+
public virtual async ValueTask<byte[]> ReadBytesAsync(long count)
3434
{
3535
if (count < 0 || count > int.MaxValue)
3636
{
@@ -47,7 +47,7 @@ public async ValueTask<byte[]> ReadBytesAsync(long count)
4747
return bytes;
4848
}
4949

50-
public async ValueTask<byte[]> ReadBytesFullAsync() =>
50+
public virtual async ValueTask<byte[]> ReadBytesFullAsync() =>
5151
await ReadBytesAsync(_baseStream.Length - _baseStream.Position);
5252
}
5353
}

0 commit comments

Comments
 (0)