using System.IO; using System.Threading.Tasks; namespace Passer.Control { public static class SiteServer { public static async Task ReceiveData(Stream dataStream, Client client) { while (true) { byte packetSize = (byte)dataStream.ReadByte(); if (packetSize == 0xFF) //Debug.Log("Receive timeout"); // Timeout ; else await ReceiveData(dataStream, client, packetSize); } } public static async Task ReceiveData(Stream dataStream, Client client, byte packetSize) { byte msgId = (byte)dataStream.ReadByte(); if (msgId == 0xFF) { // Timeout return; } bool result = false; switch (msgId) { case PoseMsg.Id: // Object Pose (16) result = await PoseMsg.Receive(dataStream, client, packetSize); break; case DestroyMsg.Id: // Destroy object (32) result = await DestroyMsg.Receive(dataStream, client, packetSize); break; case ThingMsg.Id: result = await ThingMsg.Receive(dataStream, client, packetSize); break; case InvestigateMsg.Id: result = await InvestigateMsg.Receive(dataStream, client, packetSize); break; case ModelUrlMsg.Id: // Model URL (144) result = await BytesMsg.Receive(dataStream, client, packetSize); break; case NameMsg.Id: // Object Name (145) result = await NameMsg.Receive(dataStream, client, packetSize); break; case ClientMsg.Id: result = await ClientMsg.Receive(dataStream, client, packetSize); break; case NetworkIdMsg.Id: result = await NetworkIdMsg.Receive(dataStream, client, packetSize); break; //case TextMsg.Id: // Text (176) // result = await TextMsg.Receive(dataStream, client, packetSize); // break; case BytesMsg.Id: result = await BytesMsg.Receive(dataStream, client, packetSize); break; default: break; } if (result == false) { packetSize = msgId; // skip 1 byte, msgId is possibly a packet size byte await ReceiveData(dataStream, client, packetSize); } } public static void ProcessMessage(ISiteServer site, Client client, IMessage msg) { switch (msg) { case NetworkIdMsg networkId: site.ProcessNetworkId(client, networkId); break; case ModelUrlMsg modelUrl: site.ProcessModelUrl(client, modelUrl); break; } } } public interface ISiteServer { public void ProcessNetworkId(Client client, NetworkIdMsg networkId); public void ProcessModelUrl(Client client, ModelUrlMsg modelUrl); } }