From 86271c3dd16cda2ace4f32ae11439868502f49e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Thu, 15 May 2014 11:36:24 +0200 Subject: [PATCH] use List instead of System.Text.StringBuilder add Deserialize methods for everything in Network.Session --- OpenRA.Game/Network/Session.cs | 72 ++++++++++++++++++------------- OpenRA.Game/Network/UnitOrders.cs | 8 ++-- OpenRA.Game/Server/Server.cs | 25 ++++++----- 3 files changed, 60 insertions(+), 45 deletions(-) diff --git a/OpenRA.Game/Network/Session.cs b/OpenRA.Game/Network/Session.cs index 7ee8d64bf5..15908ac281 100644 --- a/OpenRA.Game/Network/Session.cs +++ b/OpenRA.Game/Network/Session.cs @@ -31,27 +31,27 @@ namespace OpenRA.Network { var session = new Session(); - var ys = MiniYaml.FromString(data); - foreach (var y in ys) + var nodes = MiniYaml.FromString(data); + foreach (var node in nodes) { - var yy = y.Key.Split('@'); + var strings = node.Key.Split('@'); - switch (yy[0]) + switch (strings[0]) { case "Client": - session.Clients.Add(FieldLoader.Load(y.Value)); + session.Clients.Add(Client.Deserialize(node.Value)); break; case "ClientPing": - session.ClientPings.Add(FieldLoader.Load(y.Value)); + session.ClientPings.Add(ClientPing.Deserialize(node.Value)); break; case "GlobalSettings": - FieldLoader.Load(session.GlobalSettings, y.Value); + session.GlobalSettings = Global.Deserialize(node.Value); break; case "Slot": - var s = FieldLoader.Load(y.Value); + var s = Slot.Deserialize(node.Value); session.Slots.Add(s.PlayerReference, s); break; } @@ -113,11 +113,14 @@ namespace OpenRA.Network public bool IsInvalid { get { return State == ClientState.Invalid; } } public bool IsObserver { get { return Slot == null; } } - public string Serialize() + public MiniYamlNode Serialize() { - var clientData = new List(); - clientData.Add(new MiniYamlNode("Client@{0}".F(this.Index), FieldSaver.Save(this))); - return clientData.WriteToString(); + return new MiniYamlNode("Client@{0}".F(this.Index), FieldSaver.Save(this)); + } + + public static Client Deserialize(MiniYaml data) + { + return FieldLoader.Load(data); } } @@ -133,11 +136,14 @@ namespace OpenRA.Network public int LatencyJitter = -1; public int[] LatencyHistory = { }; - public string Serialize() + public MiniYamlNode Serialize() { - var clientData = new List(); - clientData.Add(new MiniYamlNode("ClientPing@{0}".F(this.Index), FieldSaver.Save(this))); - return clientData.WriteToString(); + return new MiniYamlNode("ClientPing@{0}".F(this.Index), FieldSaver.Save(this)); + } + + public static ClientPing Deserialize(MiniYaml data) + { + return FieldLoader.Load(data); } } @@ -153,11 +159,14 @@ namespace OpenRA.Network public bool LockSpawn; public bool Required; - public string Serialize() + public MiniYamlNode Serialize() { - var slotData = new List(); - slotData.Add(new MiniYamlNode("Slot@{0}".F(this.PlayerReference), FieldSaver.Save(this))); - return slotData.WriteToString(); + return new MiniYamlNode("Slot@{0}".F(this.PlayerReference), FieldSaver.Save(this)); + } + + public static Slot Deserialize(MiniYaml data) + { + return FieldLoader.Load(data); } } @@ -181,30 +190,33 @@ namespace OpenRA.Network public bool AllowVersionMismatch; public string GameUid; - public string Serialize() + public MiniYamlNode Serialize() { - var globalData = new List(); - globalData.Add(new MiniYamlNode("GlobalSettings", FieldSaver.Save(this))); - return globalData.WriteToString(); + return new MiniYamlNode("GlobalSettings", FieldSaver.Save(this)); + } + + public static Global Deserialize(MiniYaml data) + { + return FieldLoader.Load(data); } } public string Serialize() { - var sessionData = new System.Text.StringBuilder(); + var sessionData = new List(); foreach (var client in Clients) - sessionData.Append(client.Serialize()); + sessionData.Add(client.Serialize()); foreach (var clientPing in ClientPings) - sessionData.Append(clientPing.Serialize()); + sessionData.Add(clientPing.Serialize()); foreach (var slot in Slots) - sessionData.Append(slot.Value.Serialize()); + sessionData.Add(slot.Value.Serialize()); - sessionData.Append(GlobalSettings.Serialize()); + sessionData.Add(GlobalSettings.Serialize()); - return sessionData.ToString(); + return sessionData.WriteToString(); } } } diff --git a/OpenRA.Game/Network/UnitOrders.cs b/OpenRA.Game/Network/UnitOrders.cs index 94e7f95828..5631435b5b 100644 --- a/OpenRA.Game/Network/UnitOrders.cs +++ b/OpenRA.Game/Network/UnitOrders.cs @@ -176,7 +176,7 @@ namespace OpenRA.Network { var strings = node.Key.Split('@'); if (strings[0] == "Client") - clients.Add(FieldLoader.Load(node.Value)); + clients.Add(Session.Client.Deserialize(node.Value)); } orderManager.LobbyInfo.Clients = clients; @@ -193,7 +193,7 @@ namespace OpenRA.Network var strings = node.Key.Split('@'); if (strings[0] == "Slot") { - var slot = FieldLoader.Load(node.Value); + var slot = Session.Slot.Deserialize(node.Value); slots.Add(slot.PlayerReference, slot); } } @@ -210,7 +210,7 @@ namespace OpenRA.Network { var strings = node.Key.Split('@'); if (strings[0] == "GlobalSettings") - FieldLoader.Load(orderManager.LobbyInfo.GlobalSettings, node.Value); + orderManager.LobbyInfo.GlobalSettings = Session.Global.Deserialize(node.Value); } SetOrderLag(orderManager); @@ -226,7 +226,7 @@ namespace OpenRA.Network { var strings = node.Key.Split('@'); if (strings[0] == "ClientPing") - pings.Add(FieldLoader.Load(node.Value)); + pings.Add(Session.ClientPing.Deserialize(node.Value)); } orderManager.LobbyInfo.ClientPings = pings; diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index 325f5f4c35..5b69dd77c7 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -583,12 +583,12 @@ namespace OpenRA.Server return; // TODO: only need to sync the specific client that has changed to avoid conflicts - var clientData = new System.Text.StringBuilder(); + var clientData = new List(); foreach (var client in LobbyInfo.Clients) - clientData.Append(client.Serialize()); + clientData.Add(client.Serialize()); DispatchOrders(null, 0, - new ServerOrder("SyncLobbyClients", clientData.ToString()).Serialize()); + new ServerOrder("SyncLobbyClients", clientData.WriteToString()).Serialize()); foreach (var t in serverTraits.WithInterface()) t.LobbyInfoSynced(this); @@ -600,12 +600,12 @@ namespace OpenRA.Server return; // TODO: don't sync all the slots if just one changed - var slotData = new System.Text.StringBuilder(); + var slotData = new List(); foreach (var slot in LobbyInfo.Slots) - slotData.Append(slot.Value.Serialize()); + slotData.Add(slot.Value.Serialize()); DispatchOrders(null, 0, - new ServerOrder("SyncLobbySlots", slotData.ToString()).Serialize()); + new ServerOrder("SyncLobbySlots", slotData.WriteToString()).Serialize()); foreach (var t in serverTraits.WithInterface()) t.LobbyInfoSynced(this); @@ -616,8 +616,11 @@ namespace OpenRA.Server if (State != ServerState.WaitingPlayers) return; + var sessionData = new List(); + sessionData.Add(LobbyInfo.GlobalSettings.Serialize()); + DispatchOrders(null, 0, - new ServerOrder("SyncLobbyGlobalSettings", LobbyInfo.GlobalSettings.Serialize()).Serialize()); + new ServerOrder("SyncLobbyGlobalSettings", sessionData.WriteToString()).Serialize()); foreach (var t in serverTraits.WithInterface()) t.LobbyInfoSynced(this); @@ -626,12 +629,12 @@ namespace OpenRA.Server public void SyncClientPing() { // TODO: split this further into per client ping orders - var clientPings = new System.Text.StringBuilder(); + var clientPings = new List(); foreach (var ping in LobbyInfo.ClientPings) - clientPings.Append(ping.Serialize()); + clientPings.Add(ping.Serialize()); DispatchOrders(null, 0, - new ServerOrder("SyncClientPings", clientPings.ToString()).Serialize()); + new ServerOrder("SyncClientPings", clientPings.WriteToString()).Serialize()); foreach (var t in serverTraits.WithInterface()) t.LobbyInfoSynced(this); @@ -669,7 +672,7 @@ namespace OpenRA.Server foreach (var t in serverTraits.WithInterface()) t.GameStarted(this); - + // Check TimeOut if (Settings.TimeOut > 10000) {