using System; using System.IO; namespace TrueCraft.Core.Networking { /// /// Queues all writes until Stream.Flush() is called. This is different than System.IO.BufferedStream. /// public class BufferedStream : Stream { public BufferedStream(Stream baseStream) { BaseStream = baseStream; PendingStream = new MemoryStream(512); WriteImmediately = false; } public Stream BaseStream { get; set; } public MemoryStream PendingStream { get; set; } /// /// Used by PacketReader to insert the ID and length into the stream before the packet contents. /// internal bool WriteImmediately { get; set; } public override bool CanRead { get { return BaseStream.CanRead; } } public override bool CanSeek { get { return BaseStream.CanSeek; } } public override bool CanWrite { get { return BaseStream.CanWrite; } } public override void Flush() { BaseStream.Write(PendingStream.GetBuffer(), 0, (int)PendingStream.Position); PendingStream.Position = 0; } public long PendingWrites { get { return PendingStream.Position; } } public override long Length { get { return BaseStream.Length; } } public override long Position { get { return BaseStream.Position; } set { BaseStream.Position = value; } } public override int Read(byte[] buffer, int offset, int count) { return BaseStream.Read(buffer, offset, count); } public override long Seek(long offset, SeekOrigin origin) { return BaseStream.Seek(offset, origin); } public override void SetLength(long value) { BaseStream.SetLength(value); } public override void Write(byte[] buffer, int offset, int count) { if (WriteImmediately) BaseStream.Write(buffer, offset, count); else PendingStream.Write(buffer, offset, count); } } }