diff --git a/Lidgren.Network/NetIncomingMessage.Stream.cs b/Lidgren.Network/NetIncomingMessage.Stream.cs new file mode 100644 index 0000000..caec916 --- /dev/null +++ b/Lidgren.Network/NetIncomingMessage.Stream.cs @@ -0,0 +1,63 @@ +using System; +using System.IO; + +namespace Lidgren.Network +{ + public partial class NetIncomingMessage : Stream + { + public override bool CanRead { get { return true; } } + public override bool CanSeek { get { return true; } } + public override bool CanWrite { get { return false; } } + + public override void Flush() + { + // no op + } + + /// + /// Gets the length in bytes + /// + public override long Length + { + get { return LengthBytes; } + } + + public override int Read(byte[] buffer, int offset, int count) + { + // limit amount to remaining + int remainingBytes = NetUtility.BytesToHoldBits(m_bitLength - m_readPosition); + if (count > remainingBytes) + count = remainingBytes; + if (count < 1) + return 0; + + ReadBytes(buffer, offset, count); + return count; + } + + /// + /// Sets the position in the stream, in bytes + /// + public override long Seek(long offset, SeekOrigin origin) + { + switch (origin) + { + case SeekOrigin.Begin: + Position = (offset * 8); + break; + case SeekOrigin.Current: + Position = Position + (offset * 8); + break; + case SeekOrigin.End: + Position = (LengthBytes - offset) * 8; + break; + } + throw new NotImplementedException("Bad SeekOrigin"); + } + + public override void SetLength(long value) + { + throw new NetException("It's not possible to set the length of the NetIncomingMessage"); + } + } +} diff --git a/Lidgren.Network/NetOutgoingMessage.Stream.cs b/Lidgren.Network/NetOutgoingMessage.Stream.cs new file mode 100644 index 0000000..d7fc94b --- /dev/null +++ b/Lidgren.Network/NetOutgoingMessage.Stream.cs @@ -0,0 +1,52 @@ +using System; +using System.IO; + +namespace Lidgren.Network +{ + public partial class NetOutgoingMessage : Stream + { + public override bool CanRead { get { return false; } } + public override bool CanSeek { get { return false; } } + public override bool CanWrite { get { return true; } } + + public override void Flush() + { + // no op + } + + /// + /// Gets the length of the stream, in bytes + /// + public override long Length + { + get { return (long)LengthBytes; } + } + + public override long Position + { + get + { + throw new NetException("Position in bytes is not relevant since the bit count can vary"); + } + set + { + throw new NetException("It's not possible to seek in this message"); + } + } + + public override int Read(byte[] buffer, int offset, int count) + { + throw new NetException("It's not possible to read from this message"); + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NetException("It's not possible to seek in this message"); + } + + public override void SetLength(long value) + { + throw new NetException("It's not possible to set the length of this message"); + } + } +}