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)); } /// /// Writes a serialized message as payload to the stream. /// /// The message to write. /// The amount of written bytes to the stream. 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); } } } }