Skip to content

Commit 2cfd2ef

Browse files
committed
Unified exception messages and read buffer management
1 parent 6a135cd commit 2cfd2ef

File tree

6 files changed

+232
-126
lines changed

6 files changed

+232
-126
lines changed

src/DotNext.IO/Buffers/IBufferedReader.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
namespace DotNext.Buffers;
22

3+
/// <summary>
4+
/// Represents buffered reader.
5+
/// </summary>
36
public interface IBufferedReader : IBufferedChannel
47
{
58
/// <summary>

src/DotNext.IO/ExceptionMessages.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ internal static string DirectoryNotFound(string path)
2222

2323
internal static string WriterInReadMode => (string)Resources.Get();
2424

25-
internal static string NoConsumerProvided => (string)Resources.Get();
26-
2725
internal static string FileHandleClosed => (string)Resources.Get();
26+
27+
internal static string ReadBufferNotEmpty => (string)Resources.Get();
28+
29+
internal static string WriteBufferNotEmpty => (string)Resources.Get();
2830
}

src/DotNext.IO/ExceptionMessages.restext

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ StreamNotWritable=Stream is not writable
33
StreamNotReadable=Stream is not readable
44
DirectoryNotFound=Directory {0} doesn't exist
55
WriterInReadMode=The writer is in read-only mode. Dispose active memory manager obtained from writer
6-
NoConsumerProvided=No actual consumer is provided
7-
FileHandleClosed=The file handle is closed
6+
FileHandleClosed=The file handle is closed
7+
ReadBufferNotEmpty=The internal buffer has unconsumed data to read
8+
WriteBufferNotEmpty=The internal buffer has data to flush

src/DotNext.IO/IO/FileReader.cs

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public long FilePosition
7575
ArgumentOutOfRangeException.ThrowIfNegative(value);
7676

7777
if (HasBufferedData)
78-
throw new InvalidOperationException();
78+
throw new InvalidOperationException(ExceptionMessages.ReadBufferNotEmpty);
7979

8080
fileOffset = value;
8181
}
@@ -199,25 +199,32 @@ public ValueTask<bool> ReadAsync(CancellationToken token = default)
199199

200200
private ValueTask<int> ReadCoreAsync(CancellationToken token)
201201
{
202-
Memory<byte> buffer;
202+
return PrepareReadBuffer(out var readBuffer)
203+
? RandomAccess.ReadAsync(handle, readBuffer.Slice(bufferEnd), fileOffset + bufferEnd, token)
204+
: ValueTask.FromException<int>(new InternalBufferOverflowException());
205+
}
206+
207+
private bool PrepareReadBuffer(out Memory<byte> readBuffer)
208+
{
203209
switch (bufferStart)
204210
{
205211
case 0 when bufferEnd == maxBufferSize:
206-
return ValueTask.FromException<int>(new InternalBufferOverflowException());
212+
readBuffer = default;
213+
return false;
207214
case > 0:
208-
buffer = this.buffer.Memory;
215+
readBuffer = buffer.Memory;
209216

210217
// compact buffer
211-
buffer[bufferStart..bufferEnd].CopyTo(buffer);
218+
readBuffer[bufferStart..bufferEnd].CopyTo(readBuffer);
212219
bufferEnd -= bufferStart;
213220
bufferStart = 0;
214221
break;
215222
default:
216-
buffer = EnsureBufferAllocated().Memory;
223+
readBuffer = EnsureBufferAllocated().Memory;
217224
break;
218225
}
219226

220-
return RandomAccess.ReadAsync(handle, buffer.Slice(bufferEnd), fileOffset + bufferEnd, token);
227+
return true;
221228
}
222229

223230
/// <summary>
@@ -238,24 +245,10 @@ public bool Read()
238245

239246
private bool ReadCore()
240247
{
241-
Span<byte> buffer;
242-
switch (bufferStart)
243-
{
244-
case 0 when bufferEnd == maxBufferSize:
245-
throw new InternalBufferOverflowException();
246-
case > 0:
247-
// compact buffer
248-
buffer = this.buffer.Span;
249-
buffer[bufferStart..bufferEnd].CopyTo(buffer);
250-
bufferEnd -= bufferStart;
251-
bufferStart = 0;
252-
break;
253-
default:
254-
buffer = EnsureBufferAllocated().Span;
255-
break;
256-
}
248+
if (!PrepareReadBuffer(out var readBuffer))
249+
throw new InternalBufferOverflowException();
257250

258-
var count = RandomAccess.Read(handle, buffer.Slice(bufferEnd), fileOffset + bufferEnd);
251+
var count = RandomAccess.Read(handle, readBuffer.Span.Slice(bufferEnd), fileOffset + bufferEnd);
259252
bufferEnd += count;
260253

261254
ResetIfNeeded();

src/DotNext.IO/IO/FileWriter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ public long FilePosition
169169
ArgumentOutOfRangeException.ThrowIfNegative(value);
170170

171171
if (HasBufferedData)
172-
throw new InvalidOperationException();
172+
throw new InvalidOperationException(ExceptionMessages.WriteBufferNotEmpty);
173173

174174
fileOffset = value;
175175
}

0 commit comments

Comments
 (0)