Mercurial > repos > IBBoard.WarFoundry.API
annotate api/Factories/Xml/WarFoundryXmlSaver.cs @ 108:2060f23abee9
Re #53: Create XML saver
* Add saving of unit equipment
* Add extra property to DTD to indicate whether equipment amount is fixed or a ratio
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Fri, 21 Aug 2009 20:12:27 +0000 |
parents | c4ee96a91018 |
children | 45f1db6356e9 |
rev | line source |
---|---|
104
2f3cafb69799
Re #121: Migrate to AGPL license
IBBoard <dev@ibboard.co.uk>
parents:
82
diff
changeset
|
1 // This file (WarFoundryXmlSaver.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2008, 2009 IBBoard. |
15 | 2 // |
104
2f3cafb69799
Re #121: Migrate to AGPL license
IBBoard <dev@ibboard.co.uk>
parents:
82
diff
changeset
|
3 // The file and the library/program it is in are licensed and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license. |
15 | 4 |
0 | 5 using System; |
6 using System.Collections.Generic; | |
7 using System.IO; | |
105
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
8 using System.Xml; |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
9 using System.Xml.Schema; |
0 | 10 using IBBoard.Lang; |
105
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
11 using IBBoard.WarFoundry.API.Factories.Xml.Zip; |
0 | 12 using IBBoard.WarFoundry.API.Objects; |
105
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
13 using IBBoard.WarFoundry.API.Savers; |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
14 using ICSharpCode.SharpZipLib.Zip; |
0 | 15 |
16 namespace IBBoard.WarFoundry.API.Factories.Xml | |
17 { | |
105
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
18 public class WarFoundryXmlSaver : IWarFoundryFileSaver |
0 | 19 { |
105
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
20 public bool Save(Army toSave, string savePath) |
0 | 21 { |
105
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
22 bool success = false; |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
23 ZipFile file = null; |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
24 |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
25 try |
0 | 26 { |
105
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
27 file = ZipFile.Create(savePath); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
28 file.BeginUpdate(); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
29 file.Add(new StringZipEntrySource(CreateXmlString(toSave)), "data.army"); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
30 file.CommitUpdate(); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
31 success = true; |
0 | 32 } |
105
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
33 finally |
0 | 34 { |
105
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
35 if (file != null) |
82 | 36 { |
105
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
37 file.Close(); |
0 | 38 } |
39 } | |
105
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
40 |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
41 return success; |
0 | 42 } |
105
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
43 |
0 | 44 private string CreateXmlString(WarFoundryObject toSave) |
45 { | |
108 | 46 string xmlString = ""; |
47 | |
48 if (toSave is Army) | |
49 { | |
50 xmlString = CreateArmyXmlString((Army)toSave); | |
51 } | |
52 | |
53 return xmlString; | |
54 } | |
55 | |
56 private string CreateArmyXmlString(Army toSave) | |
57 { | |
105
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
58 /* |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
59 <army id="12345" name="Sample Army" system="sampleSystem" race="Empire" maxPoints="500"> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
60 <units> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
61 <unit id="unit1" unitType="Empire1" unitName="General Eustace" size="1"> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
62 <equipment> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
63 <equipItem id="equip1" amount="1"/> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
64 </equipment> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
65 </unit> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
66 <unit id="unit2" unitType="Empire2" unitName="First Swordsmen" size="20"> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
67 <equipment> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
68 <equipItem id="equip1" amount="1"/> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
69 <equipItem id="equip2" amount="1"/> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
70 </equipment> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
71 </unit> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
72 <unit id="unit3" unitType="Empire2" unitName="First Greatswords" size="15"> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
73 <equipment> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
74 <equipItem id="equip3" amount="1"/> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
75 </equipment> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
76 </unit> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
77 </units> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
78 </army> |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
79 */ |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
80 XmlDocument doc = new XmlDocument(); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
81 XmlDeclaration declaration = doc.CreateXmlDeclaration("1.0", null, null); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
82 doc.AppendChild(declaration); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
83 XmlSchema schema = new XmlSchema(); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
84 schema.Namespaces.Add("xmlns", "http://ibboard.co.uk/warfoundry/army"); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
85 schema.Namespaces.Add("xmlns:core", "http://ibboard.co.uk/warfoundry/core"); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
86 doc.Schemas.Add(schema); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
87 XmlElement root = doc.CreateElement("army"); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
88 doc.AppendChild(root); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
89 root.SetAttribute("id", toSave.ID); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
90 root.SetAttribute("name", toSave.Name); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
91 root.SetAttribute("system", toSave.GameSystem.ID); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
92 root.SetAttribute("race", toSave.Race.ID); |
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
93 root.SetAttribute("maxPoints", toSave.MaxPoints.ToString()); |
106 | 94 XmlElement units = doc.CreateElement("units"); |
95 root.AppendChild(units); | |
96 | |
97 foreach (Unit unit in toSave.GetUnits()) | |
98 { | |
108 | 99 units.AppendChild(CreateUnitElement(unit, doc)); |
106 | 100 |
101 } | |
102 | |
105
f5aec697b8ea
Re #53: Make WarFoundry XML saver
IBBoard <dev@ibboard.co.uk>
parents:
104
diff
changeset
|
103 return doc.OuterXml; |
0 | 104 } |
108 | 105 |
106 private XmlElement CreateUnitElement(Unit unit, XmlDocument doc) | |
107 { | |
108 XmlElement unitElem = doc.CreateElement("unit"); | |
109 unitElem.SetAttribute("id", unit.ID); | |
110 unitElem.SetAttribute("unitName", unit.Name); | |
111 unitElem.SetAttribute("unitType", unit.UnitType.ID); | |
112 unitElem.SetAttribute("size", unit.Size.ToString()); | |
113 | |
114 if (!unit.Race.Equals(unit.Army.Race)) | |
115 { | |
116 unitElem.SetAttribute("race", unit.Race.ID); | |
117 } | |
118 | |
119 XmlElement equipmentElem = CreateEquipmentItemsElement(unit, doc); | |
120 | |
121 if (equipmentElem != null) | |
122 { | |
123 unitElem.AppendChild(equipmentElem); | |
124 } | |
125 | |
126 return unitElem; | |
127 } | |
128 | |
129 private XmlElement CreateEquipmentItemsElement(Unit unit, XmlDocument doc) | |
130 { | |
131 UnitEquipmentItem[] equipItems = unit.GetEquipment(); | |
132 int equipItemCount = equipItems.Length; | |
133 XmlElement equipmentElem = null; | |
134 | |
135 if (equipItemCount > 0) | |
136 { | |
137 equipmentElem = doc.CreateElement("equipment"); | |
138 | |
139 for (int i = 0; i < equipItemCount; i++) | |
140 { | |
141 equipmentElem.AppendChild(CreateEquipmentElement(equipItems[i], unit, doc)); | |
142 } | |
143 } | |
144 | |
145 return equipmentElem; | |
146 } | |
147 | |
148 private XmlElement CreateEquipmentElement(UnitEquipmentItem item, Unit unit, XmlDocument doc) | |
149 { | |
150 XmlElement equipmentItemElem = doc.CreateElement("equipItem"); | |
151 equipmentItemElem.SetAttribute("id", item.EquipmentItemID); | |
152 equipmentItemElem.SetAttribute("amount", unit.GetEquipmentAmount(item).ToString()); | |
153 equipmentItemElem.SetAttribute("amountType", unit.GetEquipmentAmountIsRatio(item) ? "ratio" : "fixed"); | |
154 return equipmentItemElem; | |
155 } | |
0 | 156 } |
157 } |