Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ WriteAsync() [3/3]

override ValueTask System.Text.TranscodingStream.WriteAsync ( ReadOnlyMemory< byte > buffer,
CancellationToken cancellationToken )
inlinevirtual

Reimplemented from System.IO.Stream.

Definition at line 388 of file TranscodingStream.cs.

389 {
391 if (cancellationToken.IsCancellationRequested)
392 {
394 }
395 if (buffer.IsEmpty)
396 {
398 }
399 return WriteAsyncCore(buffer, cancellationToken);
400 async ValueTask WriteAsyncCore(ReadOnlyMemory<byte> remainingOuterEncodedBytes, CancellationToken cancellationToken)
401 {
402 int minimumLength = Math.Clamp(remainingOuterEncodedBytes.Length, 4096, 1048576);
403 char[] scratchChars = ArrayPool<char>.Shared.Rent(minimumLength);
404 byte[] scratchBytes = ArrayPool<byte>.Shared.Rent(minimumLength);
405 try
406 {
407 bool decoderFinished;
408 do
409 {
410 _thisDecoder.Convert(remainingOuterEncodedBytes.Span, scratchChars, flush: false, out var bytesUsed, out var charsUsed, out decoderFinished);
411 remainingOuterEncodedBytes = remainingOuterEncodedBytes.Slice(bytesUsed);
412 ArraySegment<char> decodedChars = new ArraySegment<char>(scratchChars, 0, charsUsed);
413 bool encoderFinished;
414 do
415 {
416 _innerEncoder.Convert(decodedChars, scratchBytes, flush: false, out var charsUsed2, out var bytesUsed2, out encoderFinished);
417 decodedChars = decodedChars.Slice(charsUsed2);
418 await _innerStream.WriteAsync(new ReadOnlyMemory<byte>(scratchBytes, 0, bytesUsed2), cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
419 }
420 while (!encoderFinished);
421 }
422 while (!decoderFinished);
423 }
424 finally
425 {
426 ArrayPool<char>.Shared.Return(scratchChars);
427 ArrayPool<byte>.Shared.Return(scratchBytes);
428 }
429 }
430 }
static ArrayPool< T > Shared
Definition ArrayPool.cs:7
Task WriteAsync(byte[] buffer, int offset, int count)
Definition Stream.cs:914
virtual void Convert(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex, int charCount, bool flush, out int bytesUsed, out int charsUsed, out bool completed)
Definition Decoder.cs:142
virtual void Convert(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex, int byteCount, bool flush, out int charsUsed, out int bytesUsed, out bool completed)
Definition Encoder.cs:135
new ConfiguredTaskAwaitable< TResult > ConfigureAwait(bool continueOnCapturedContext)
Definition Task.cs:226
static ValueTask CompletedTask
Definition ValueTask.cs:71
static ValueTask FromCanceled(CancellationToken cancellationToken)
Definition ValueTask.cs:180

References System.Text.TranscodingStream._innerEncoder, System.Text.TranscodingStream._innerStream, System.Text.TranscodingStream._thisDecoder, System.buffer, System.cancellationToken, System.Math.Clamp(), System.Threading.Tasks.ValueTask< TResult >.CompletedTask, System.Text.Decoder.Convert(), System.Text.Encoder.Convert(), System.Text.TranscodingStream.EnsurePreWriteConditions(), System.Threading.Tasks.ValueTask< TResult >.FromCanceled(), System.ReadOnlyMemory< T >.Length, System.Buffers.ArrayPool< T >.Shared, System.ArraySegment< T >.Slice(), System.ReadOnlyMemory< T >.Slice(), System.ReadOnlyMemory< T >.Span, and System.IO.Stream.WriteAsync().