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