changeset 109:45f1db6356e9

Fixes #53: Make XML file saver * force file extension * Make sure IDs are in valid XML format * Remove commented example of file * Output contained units
author IBBoard <dev@ibboard.co.uk>
date Sat, 22 Aug 2009 10:51:50 +0000
parents 2060f23abee9
children f0fb96d0cfe9
files api/Factories/Xml/WarFoundryXmlSaver.cs
diffstat 1 files changed, 45 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/api/Factories/Xml/WarFoundryXmlSaver.cs	Fri Aug 21 20:12:27 2009 +0000
+++ b/api/Factories/Xml/WarFoundryXmlSaver.cs	Sat Aug 22 10:51:50 2009 +0000
@@ -8,6 +8,7 @@
 using System.Xml;
 using System.Xml.Schema;
 using IBBoard.Lang;
+using IBBoard.Xml;
 using IBBoard.WarFoundry.API.Factories.Xml.Zip;
 using IBBoard.WarFoundry.API.Objects;
 using IBBoard.WarFoundry.API.Savers;
@@ -17,10 +18,17 @@
 {
 	public class WarFoundryXmlSaver : IWarFoundryFileSaver
 	{
+		public const string ARMY_FILE_EXTENSION = ".army";
+		
 		public bool Save(Army toSave, string savePath)
 		{
 			bool success = false;
 			ZipFile file = null;
+			
+			if (!savePath.EndsWith(ARMY_FILE_EXTENSION))
+			{
+				savePath = savePath + ARMY_FILE_EXTENSION;
+			}
 
 			try
 			{
@@ -55,28 +63,6 @@
 
 		private string CreateArmyXmlString(Army toSave)
 		{
-			/*
-<army id="12345" name="Sample Army" system="sampleSystem" race="Empire" maxPoints="500">
-	<units>
-		<unit id="unit1" unitType="Empire1" unitName="General Eustace" size="1">
-			<equipment>
-				<equipItem id="equip1" amount="1"/>
-			</equipment>
-		</unit>
-		<unit id="unit2" unitType="Empire2" unitName="First Swordsmen" size="20">
-			<equipment>
-				<equipItem id="equip1" amount="1"/>
-				<equipItem id="equip2" amount="1"/>
-			</equipment>
-		</unit>
-		<unit id="unit3" unitType="Empire2" unitName="First Greatswords" size="15">
-			<equipment>
-				<equipItem id="equip3" amount="1"/>
-			</equipment>
-		</unit>
-	</units>
-</army>
-*/
 			XmlDocument doc = new XmlDocument();
 			XmlDeclaration declaration = doc.CreateXmlDeclaration("1.0", null, null);
 			doc.AppendChild(declaration);
@@ -86,8 +72,10 @@
 			doc.Schemas.Add(schema);
 			XmlElement root = doc.CreateElement("army");
 			doc.AppendChild(root);
-			root.SetAttribute("id", toSave.ID);
+			root.SetAttribute("id", XmlTools.GetAsciiXmlIdForString(toSave.ID));
 			root.SetAttribute("name", toSave.Name);
+			//Don't convert system and race to ID format as they could be stored in non-XML file formats
+			//If they are in XML files then they'll already be valid
 			root.SetAttribute("system", toSave.GameSystem.ID);
 			root.SetAttribute("race", toSave.Race.ID);
 			root.SetAttribute("maxPoints", toSave.MaxPoints.ToString());
@@ -97,7 +85,6 @@
 			foreach (Unit unit in toSave.GetUnits())
 			{
 				units.AppendChild(CreateUnitElement(unit, doc));
-				
 			}
 			
 			return doc.OuterXml;
@@ -106,7 +93,7 @@
 		private XmlElement CreateUnitElement(Unit unit, XmlDocument doc)
 		{
 			XmlElement unitElem = doc.CreateElement("unit");
-			unitElem.SetAttribute("id", unit.ID);
+			unitElem.SetAttribute("id", XmlTools.GetAsciiXmlIdForString(unit.ID));
 			unitElem.SetAttribute("unitName", unit.Name);
 			unitElem.SetAttribute("unitType", unit.UnitType.ID);
 			unitElem.SetAttribute("size", unit.Size.ToString());
@@ -123,6 +110,13 @@
 				unitElem.AppendChild(equipmentElem);
 			}
 			
+			XmlElement containedElem = CreateContainedUnitsElement(unit, doc);
+
+			if (containedElem != null)
+			{
+				unitElem.AppendChild(containedElem);
+			}
+			
 			return unitElem;
 		}
 
@@ -153,5 +147,31 @@
 			equipmentItemElem.SetAttribute("amountType", unit.GetEquipmentAmountIsRatio(item) ? "ratio" : "fixed");
 			return equipmentItemElem;
 		}
+		
+		private XmlElement CreateContainedUnitsElement(Unit unit, XmlDocument doc)
+		{
+			Unit[] containedUnits = unit.ContainedUnits;
+			int containedCount = containedUnits.Length;
+			XmlElement containedElem = null;
+
+			if (containedCount > 0)
+			{
+				containedElem = doc.CreateElement("contained");
+				
+				for (int i = 0; i < containedCount; i++)
+				{
+					containedElem.AppendChild(CreateContainedUnitElement(containedUnits[i], doc));
+				}
+			}
+
+			return containedElem;
+		}
+
+		private XmlElement CreateContainedUnitElement(Unit unit,  XmlDocument doc)
+		{
+			XmlElement containedUnitElem = doc.CreateElement("containedUnit");
+			containedUnitElem.SetAttribute("containedID", XmlTools.GetAsciiXmlIdForString(unit.ID));
+			return containedUnitElem;
+		}
 	}
 }