diff options
author | Andrew Arnott <andrewarnott@gmail.com> | 2020-01-27 07:40:11 +0300 |
---|---|---|
committer | Andrew Arnott <andrewarnott@gmail.com> | 2020-01-27 07:40:11 +0300 |
commit | 690336fec72f52781a36539679aeea79bd7d353e (patch) | |
tree | 600ab746000803b31efa2b061cda75740f267f34 | |
parent | 0a97ab02af39a4e31a08a2dce8b5da451a95ec48 (diff) |
Add MessagePackStreamReader.DiscardBufferedData method
3 files changed, 35 insertions, 0 deletions
diff --git a/src/MessagePack.UnityClient/Assets/Scripts/MessagePack/MessagePackStreamReader.cs b/src/MessagePack.UnityClient/Assets/Scripts/MessagePack/MessagePackStreamReader.cs index 3aa65cad..fb439ddc 100644 --- a/src/MessagePack.UnityClient/Assets/Scripts/MessagePack/MessagePackStreamReader.cs +++ b/src/MessagePack.UnityClient/Assets/Scripts/MessagePack/MessagePackStreamReader.cs @@ -90,6 +90,20 @@ namespace MessagePack } } + /// <summary> + /// Arranges for the next read operation to start by reading from the underlying <see cref="Stream"/> + /// instead of any data buffered from a previous read. + /// </summary> + /// <remarks> + /// This is appropriate if the underlying <see cref="Stream"/> has been repositioned such that + /// any previously buffered data is no longer applicable to what the caller wants to read. + /// </remarks> + public void DiscardBufferedData() + { + this.sequenceRental.Value.Reset(); + this.endOfLastMessage = default; + } + /// <inheritdoc/> public void Dispose() { diff --git a/src/MessagePack.UnityClient/Assets/Scripts/Tests/ShareTests/MessagePackStreamReaderTests.cs b/src/MessagePack.UnityClient/Assets/Scripts/Tests/ShareTests/MessagePackStreamReaderTests.cs index b5896e49..fddb4cad 100644 --- a/src/MessagePack.UnityClient/Assets/Scripts/Tests/ShareTests/MessagePackStreamReaderTests.cs +++ b/src/MessagePack.UnityClient/Assets/Scripts/Tests/ShareTests/MessagePackStreamReaderTests.cs @@ -140,6 +140,26 @@ namespace MessagePack.Tests } [Fact] + public async Task DiscardBufferedData() + { + var ms = new MemoryStream(this.twoMessages.ToArray()); + using (var reader = new MessagePackStreamReader(ms)) + { + var message1a = await reader.ReadAsync(this.TimeoutToken); + Assert.NotNull(message1a); + Assert.Equal(this.twoMessages.Slice(0, this.messagePositions[0]).ToArray(), message1a.Value.ToArray()); + + ms.Position = 0; + reader.DiscardBufferedData(); + + // Verify that we can read the message at the start of the new position. + var message1b = await reader.ReadAsync(this.TimeoutToken); + Assert.NotNull(message1b); + Assert.Equal(this.twoMessages.Slice(0, this.messagePositions[0]).ToArray(), message1b.Value.ToArray()); + } + } + + [Fact] public void DisposeClosesStream() { var ms = new MemoryStream(); diff --git a/src/MessagePack/PublicAPI.Unshipped.txt b/src/MessagePack/PublicAPI.Unshipped.txt index f5d69265..3c481910 100644 --- a/src/MessagePack/PublicAPI.Unshipped.txt +++ b/src/MessagePack/PublicAPI.Unshipped.txt @@ -7,6 +7,7 @@ MessagePack.MessagePackReader.ReadDateTime(MessagePack.ExtensionHeader header) - MessagePack.MessagePackReader.TryReadArrayHeader(out int count) -> bool MessagePack.MessagePackReader.TryReadExtensionFormatHeader(out MessagePack.ExtensionHeader extensionHeader) -> bool MessagePack.MessagePackReader.TryReadMapHeader(out int count) -> bool +MessagePack.MessagePackStreamReader.DiscardBufferedData() -> void MessagePack.MessagePackStreamReader.MessagePackStreamReader(System.IO.Stream stream, bool leaveOpen) -> void MessagePack.MessagePackStreamReader.ReadArrayAsync(System.Threading.CancellationToken cancellationToken) -> System.Collections.Generic.IAsyncEnumerable<System.Buffers.ReadOnlySequence<byte>> MessagePack.MessagePackWriter.WriteBinHeader(int length) -> void |