85 lines
3.3 KiB
C#
85 lines
3.3 KiB
C#
|
|
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);
|
|
}
|
|
} |