using System;
using System.IO;
using System.Text;
using Microsoft.Xna.Framework;
namespace Microsoft.Xna.Framework.Net
{
///
/// Writes network data packets in a format compatible with XNA's PacketWriter.
///
public class PacketWriter : IDisposable
{
private readonly MemoryStream stream;
private readonly BinaryWriter writer;
private bool disposed;
///
/// Initializes a new PacketWriter.
///
public PacketWriter()
{
stream = new MemoryStream();
writer = new BinaryWriter(stream, Encoding.UTF8);
}
///
/// Gets the length of the packet data.
///
public int Length => (int)stream.Length;
///
/// Gets the position in the packet data.
///
public int Position
{
get => (int)stream.Position;
set => stream.Position = value;
}
///
/// Writes a boolean value.
///
public void Write(bool value)
{
writer.Write(value);
}
///
/// Writes a byte value.
///
public void Write(byte value)
{
writer.Write(value);
}
///
/// Writes a signed byte value.
///
public void Write(sbyte value)
{
writer.Write(value);
}
///
/// Writes a 16-bit integer.
///
public void Write(short value)
{
writer.Write(value);
}
///
/// Writes an unsigned 16-bit integer.
///
public void Write(ushort value)
{
writer.Write(value);
}
///
/// Writes a 32-bit integer.
///
public void Write(int value)
{
writer.Write(value);
}
///
/// Writes an unsigned 32-bit integer.
///
public void Write(uint value)
{
writer.Write(value);
}
///
/// Writes a 64-bit integer.
///
public void Write(long value)
{
writer.Write(value);
}
///
/// Writes an unsigned 64-bit integer.
///
public void Write(ulong value)
{
writer.Write(value);
}
///
/// Writes a single-precision floating point value.
///
public void Write(float value)
{
writer.Write(value);
}
///
/// Writes a double-precision floating point value.
///
public void Write(double value)
{
writer.Write(value);
}
///
/// Writes a string value.
///
public void Write(string value)
{
if (value == null)
throw new ArgumentNullException(nameof(value));
writer.Write(value);
}
///
/// Writes a Vector2 value.
///
public void Write(Vector2 value)
{
writer.Write(value.X);
writer.Write(value.Y);
}
///
/// Writes a Vector3 value.
///
public void Write(Vector3 value)
{
writer.Write(value.X);
writer.Write(value.Y);
writer.Write(value.Z);
}
///
/// Writes a Vector4 value.
///
public void Write(Vector4 value)
{
writer.Write(value.X);
writer.Write(value.Y);
writer.Write(value.Z);
writer.Write(value.W);
}
///
/// Writes a Quaternion value.
///
public void Write(Quaternion value)
{
writer.Write(value.X);
writer.Write(value.Y);
writer.Write(value.Z);
writer.Write(value.W);
}
///
/// Writes a Matrix value.
///
public void Write(Matrix value)
{
writer.Write(value.M11); writer.Write(value.M12); writer.Write(value.M13); writer.Write(value.M14);
writer.Write(value.M21); writer.Write(value.M22); writer.Write(value.M23); writer.Write(value.M24);
writer.Write(value.M31); writer.Write(value.M32); writer.Write(value.M33); writer.Write(value.M34);
writer.Write(value.M41); writer.Write(value.M42); writer.Write(value.M43); writer.Write(value.M44);
}
///
/// Writes a Color value.
///
public void Write(Color value)
{
writer.Write(value.R);
writer.Write(value.G);
writer.Write(value.B);
writer.Write(value.A);
}
///
/// Writes raw byte data.
///
public void Write(byte[] buffer)
{
if (buffer == null)
throw new ArgumentNullException(nameof(buffer));
writer.Write(buffer.Length);
writer.Write(buffer);
}
///
/// Writes a portion of a byte array.
///
public void Write(byte[] buffer, int offset, int count)
{
if (buffer == null)
throw new ArgumentNullException(nameof(buffer));
writer.Write(count);
writer.Write(buffer, offset, count);
}
///
/// Gets the packet data as a byte array.
///
internal byte[] GetData()
{
return stream.ToArray();
}
///
/// Creates a packet reader for the current data.
///
internal PacketReader CreateReader()
{
return new PacketReader(GetData());
}
///
/// Closes the packet writer.
///
public void Close()
{
Dispose();
}
///
/// Disposes the packet writer.
///
public void Dispose()
{
if (!disposed)
{
writer?.Dispose();
stream?.Dispose();
disposed = true;
}
}
}
}