public void RemoveMessage(IMessageReader message)
{
- var pool = ArrayPool.Rent(message.Buffer.Length);
+ // Offset of where to start removing.
+ var offsetStart = message.Offset - 3;
- try
- {
- var offsetHeader = message.Offset - 3;
- var offsetEnd = message.Offset + message.Length;
- var len = message.Buffer.Length - offsetEnd;
+ // Offset of where to end removing.
+ var offsetEnd = message.Offset + message.Length;
- Array.Copy(message.Buffer, offsetEnd, pool, 0, len);
- Array.Copy(pool, 0, this.Buffer, offsetHeader, len);
+ // The amount of bytes to copy over ourselves.
+ var lengthToCopy = message.Buffer.Length - offsetEnd;
- AdjustLength(message.Offset, message.Length + 3);
- }
- finally
- {
- ArrayPool.Return(pool);
- }
+ System.Buffer.BlockCopy(Buffer, offsetEnd, Buffer, offsetStart, lengthToCopy);
+
+ ((MessageReader) message).Parent.AdjustLength(message.Offset, message.Length + 3);
}
private void AdjustLength(int offset, int amount)
{
+ this.Length -= amount;
+
if (this.ReadPosition > offset)
{
this.Position -= amount;
if (Parent != null)
{
var lengthOffset = this.Offset - 3;
- var curLen = this.Buffer[lengthOffset]
- | (this.Buffer[lengthOffset + 1] << 8);
+ var curLen = this.Buffer[lengthOffset] |
+ (this.Buffer[lengthOffset + 1] << 8);
curLen -= amount;
- this.Length -= amount;
this.Buffer[lengthOffset] = (byte)curLen;
this.Buffer[lengthOffset + 1] = (byte)(this.Buffer[lengthOffset + 1] >> 8);
using System;
+using System.Linq;
using Impostor.Hazel;
using Impostor.Hazel.Extensions;
using Microsoft.Extensions.DependencyInjection;
namespace Impostor.Tests.Hazel
{
- public class BufferMessageReaderTests
+ public class MessageReaderTests
{
private ObjectPool<MessageReader> CreateReaderPool()
{
messageExpected.StartMessage(0);
messageExpected.StartMessage(1);
- messageExpected.Write("HiTest");
+ messageExpected.Write("HiTest1");
messageExpected.EndMessage();
messageExpected.StartMessage(2);
- messageExpected.Write("HiTest");
+ messageExpected.Write("HiTest2");
messageExpected.EndMessage();
messageExpected.EndMessage();
messageWriter.EndMessage();
messageWriter.EndMessage();
+ // Copy buffer.
+ var bufferCopy = new byte[messageWriter.Length];
+ Buffer.BlockCopy(messageWriter.Buffer, 0, bufferCopy, 0, bufferCopy.Length);
+
// Do the magic.
var readerPool = CreateReaderPool();
var reader = readerPool.Get();
- reader.Update(messageWriter.Buffer);
+ reader.Update(bufferCopy);
var inner = reader.ReadMessage();
while (inner.Position < inner.Length)
{
Assert.Equal("HiTest2", message.ReadString());
}
+ else
+ {
+ Assert.True(false, "Invalid tag was read.");
+ }
}
// Check if the magic was successful.
- Assert.Equal(messageExpected.ToByteArray(true), messageWriter.ToByteArray(true));
+ Assert.Equal(messageExpected.Length, reader.Length);
+ Assert.Equal(messageExpected.ToByteArray(true), reader.Buffer.Take(reader.Length).ToArray());
}
[Fact]