using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace OpenRa.Network { static class OrderIO { public static void Write(this Stream s, byte[] buf) { s.Write(buf, 0, buf.Length); } public static void WriteFrameData(this Stream s, IEnumerable orders, int frameNumber) { var bytes = Serialize( orders, frameNumber ); s.Write( BitConverter.GetBytes( (int)bytes.Length ) ); s.Write( bytes ); } public static byte[] Serialize( this IEnumerable orders, int frameNumber ) { var ms = new MemoryStream(); ms.Write( BitConverter.GetBytes( frameNumber ) ); foreach( var o in orders.Select( o => o.Serialize() ) ) ms.Write( o ); return ms.ToArray(); } public static List ToOrderList(this byte[] bytes, World world) { var ms = new MemoryStream(bytes, 4, bytes.Length - 4); var reader = new BinaryReader(ms); var ret = new List(); while( ms.Position < ms.Length ) { var o = Order.Deserialize( world, reader ); if( o != null ) ret.Add( o ); } return ret; } } }