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;
}
}
}
}