using System.Threading.Tasks; using System.IO; namespace Passer.RoboidControl { public class IMessage { public IMessage() { } public IMessage(byte[] buffer) { Deserialize(buffer); } public virtual byte Serialize(ref byte[] buffer) { return 0; } public virtual void Deserialize(byte[] buffer) { } public bool SendTo(Participant client) { Serialize(ref client.buffer); return client.SendBuffer(client.buffer.Length); } public static bool SendMsg(Participant client, IMessage msg) { msg.Serialize(ref client.buffer); return client.SendBuffer(client.buffer.Length); } public static bool PublishMsg(Participant client, IMessage msg) { msg.Serialize(ref client.buffer); return client.PublishBuffer(client.buffer.Length); } public static async Task Receive(Stream dataStream, byte packetSize) { byte[] buffer = new byte[packetSize - 1]; // without msgId int byteCount = dataStream.Read(buffer, 0, packetSize - 1); while (byteCount < packetSize - 1) { // not all bytes have been read, wait and try again await Task.Delay(1); byteCount += dataStream.Read(buffer, byteCount, packetSize - 1 - byteCount); } return buffer; } } }