using System; using System.IO; using System.Text; using Microsoft.Xna.Framework; namespace Microsoft.Xna.Framework.Net { /// /// Reads network data packets in a format compatible with XNA's PacketReader. /// public class PacketReader : IDisposable { private readonly MemoryStream stream; private readonly BinaryReader reader; private bool disposed; /// /// Initializes a new PacketReader from byte data. /// internal PacketReader(byte[] data) { stream = new MemoryStream(data); reader = new BinaryReader(stream, Encoding.UTF8); } /// /// Initializes a new empty PacketReader. /// public PacketReader() { stream = new MemoryStream(); reader = new BinaryReader(stream, Encoding.UTF8); } /// /// Gets the length of the packet data. /// public int Length => (int)stream.Length; /// /// Gets the current position in the packet data. /// public int Position { get => (int)stream.Position; set => stream.Position = value; } /// /// Gets the number of bytes remaining to be read. /// public int BytesRemaining => Length - Position; /// /// Reads a boolean value. /// public bool ReadBoolean() { return reader.ReadBoolean(); } /// /// Reads a byte value. /// public byte ReadByte() { return reader.ReadByte(); } /// /// Reads a signed byte value. /// public sbyte ReadSByte() { return reader.ReadSByte(); } /// /// Reads a 16-bit integer. /// public short ReadInt16() { return reader.ReadInt16(); } /// /// Reads an unsigned 16-bit integer. /// public ushort ReadUInt16() { return reader.ReadUInt16(); } /// /// Reads a 32-bit integer. /// public int ReadInt32() { return reader.ReadInt32(); } /// /// Reads an unsigned 32-bit integer. /// public uint ReadUInt32() { return reader.ReadUInt32(); } /// /// Reads a 64-bit integer. /// public long ReadInt64() { return reader.ReadInt64(); } /// /// Reads an unsigned 64-bit integer. /// public ulong ReadUInt64() { return reader.ReadUInt64(); } /// /// Reads a single-precision floating point value. /// public float ReadSingle() { return reader.ReadSingle(); } /// /// Reads a double-precision floating point value. /// public double ReadDouble() { return reader.ReadDouble(); } /// /// Reads a string value. /// public string ReadString() { return reader.ReadString(); } /// /// Reads a Vector2 value. /// public Vector2 ReadVector2() { return new Vector2(reader.ReadSingle(), reader.ReadSingle()); } /// /// Reads a Vector3 value. /// public Vector3 ReadVector3() { return new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); } /// /// Reads a Vector4 value. /// public Vector4 ReadVector4() { return new Vector4(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); } /// /// Reads a Quaternion value. /// public Quaternion ReadQuaternion() { return new Quaternion(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); } /// /// Reads a Matrix value. /// public Matrix ReadMatrix() { return new Matrix( reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() ); } /// /// Reads a Color value. /// public Color ReadColor() { return new Color(reader.ReadByte(), reader.ReadByte(), reader.ReadByte(), reader.ReadByte()); } /// /// Reads a byte array. /// public byte[] ReadBytes() { int length = reader.ReadInt32(); return reader.ReadBytes(length); } /// /// Reads a specified number of bytes. /// public byte[] ReadBytes(int count) { return reader.ReadBytes(count); } /// /// Closes the packet reader. /// public void Close() { Dispose(); } /// /// Disposes the packet reader. /// public void Dispose() { if (!disposed) { reader?.Dispose(); stream?.Dispose(); disposed = true; } } } }