66 lines
1.7 KiB
C#
66 lines
1.7 KiB
C#
using ProtoBuf;
|
|
using Quasar.Common.Messages;
|
|
using System;
|
|
using System.IO;
|
|
|
|
namespace Quasar.Common.Networking
|
|
{
|
|
public class PayloadWriter : MemoryStream
|
|
{
|
|
private readonly Stream _innerStream;
|
|
public bool LeaveInnerStreamOpen { get; }
|
|
|
|
public PayloadWriter(Stream stream, bool leaveInnerStreamOpen)
|
|
{
|
|
_innerStream = stream;
|
|
LeaveInnerStreamOpen = leaveInnerStreamOpen;
|
|
}
|
|
|
|
public void WriteBytes(byte[] value)
|
|
{
|
|
_innerStream.Write(value, 0, value.Length);
|
|
}
|
|
|
|
public void WriteInteger(int value)
|
|
{
|
|
WriteBytes(BitConverter.GetBytes(value));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Writes a serialized message as payload to the stream.
|
|
/// </summary>
|
|
/// <param name="message">The message to write.</param>
|
|
/// <returns>The amount of written bytes to the stream.</returns>
|
|
public int WriteMessage(IMessage message)
|
|
{
|
|
using (MemoryStream ms = new MemoryStream())
|
|
{
|
|
Serializer.Serialize(ms, message);
|
|
byte[] payload = ms.ToArray();
|
|
WriteInteger(payload.Length);
|
|
WriteBytes(payload);
|
|
return sizeof(int) + payload.Length;
|
|
}
|
|
}
|
|
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
try
|
|
{
|
|
if (LeaveInnerStreamOpen)
|
|
{
|
|
_innerStream.Flush();
|
|
}
|
|
else
|
|
{
|
|
_innerStream.Close();
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
base.Dispose(disposing);
|
|
}
|
|
}
|
|
}
|
|
}
|