Mercurial > repos > IBBoard.WarFoundry.API
annotate api/Factories/AbstractNativeWarFoundryFactory.cs @ 8:613bc5eaac59
Re #9 - Make WarFoundry loading granular
* Remove specific staged loading classes
* Rework category loading for GameSystem and Race to make it use AddCategory(Category) method
* Promote staged loading from Native Factory to all Factories level
* Refactor XML Factory to use smaller methods
Also removed some commented code that isn't used any more
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sun, 04 Jan 2009 19:24:13 +0000 |
parents | 895c8a2378a1 |
children | 0770e5cbba7c |
rev | line source |
---|---|
0 | 1 // WarFoundryXmlFactory.cs |
2 // | |
3 // Copyright (C) 2007 IBBoard | |
4 // | |
5 // This library is free software; you can redistribute it and/or | |
6 // modify it under the terms of the GNU Lesser General Public | |
7 // License version 2.1 of the License as published by the Free | |
8 // Software Foundation. | |
9 // | |
10 // This library is distributed in the hope that it will be useful, | |
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 // Lesser General Public License for more details. | |
14 // | |
15 // You should have received a copy of the GNU Lesser General Public | |
16 // License along with this library; if not, write to the Free Software | |
17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 // | |
19 // | |
20 | |
21 using System; | |
22 using System.IO; | |
23 using System.Xml; | |
24 using System.Xml.Schema; | |
25 using System.Collections.Generic; | |
26 using System.Text; | |
27 using IBBoard; | |
28 using IBBoard.IO; | |
29 using IBBoard.Lang; | |
30 using IBBoard.Logging; | |
31 using IBBoard.Xml; | |
32 using IBBoard.WarFoundry.API.Objects; | |
33 using ICSharpCode.SharpZipLib.Zip; | |
34 | |
35 namespace IBBoard.WarFoundry.API.Factories | |
36 { | |
37 /// <summary> | |
38 /// Base abstract class for all factories that load native WarFoundry data. | |
39 /// </summary> | |
40 public abstract class AbstractNativeWarFoundryFactory : AbstractWarFoundryFactory<ZipFile>, INativeWarFoundryFactory | |
41 { | |
42 protected static readonly string SYSTEM_ZIP_IDENTIFIER = "WarFoundry_System"; | |
43 protected static readonly string RACE_ZIP_IDENTIFIER = "WarFoundry_Race"; | |
44 protected static readonly string ARMY_ZIP_IDENTIFIER = "WarFoundry_Army"; | |
45 | |
46 protected AbstractNativeWarFoundryFactory() | |
47 { | |
48 //Do nothing - just make the constructor non-public | |
49 } | |
8
613bc5eaac59
Re #9 - Make WarFoundry loading granular
IBBoard <dev@ibboard.co.uk>
parents:
7
diff
changeset
|
50 |
0 | 51 protected override ZipFile GetFileAsSupportedType (FileInfo file) |
52 { | |
53 ZipFile zip = null; | |
54 | |
55 try | |
56 { | |
57 zip = new ZipFile(file.FullName); | |
58 } | |
7
895c8a2378a1
Code cleanup - remove warning about unused exception
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
59 catch(ZipException) |
0 | 60 { |
61 //Silently dispose - we don't support the file and our other methods should handle that | |
62 } | |
63 | |
64 return zip; | |
65 } | |
66 | |
67 protected override bool CheckCanHandleFileFormat (ZipFile file) | |
68 { | |
69 bool canHandle = false; | |
70 | |
71 if (file!=null) | |
72 { | |
73 canHandle = CheckCanHandleAsSystem(file) || CheckCanHandleAsRace(file) || CheckCanHandleAsArmy(file); | |
74 } | |
75 | |
76 return canHandle; | |
77 } | |
78 | |
79 protected bool CheckCanHandleAsSystem(ZipFile file) | |
80 { | |
81 return file.ZipFileComment.StartsWith(SYSTEM_ZIP_IDENTIFIER) && CheckCanFindSystemFileContent(file); | |
82 } | |
83 | |
84 protected abstract bool CheckCanFindSystemFileContent(ZipFile file); | |
85 | |
86 protected bool CheckCanHandleAsRace(ZipFile file) | |
87 { | |
88 return file.ZipFileComment.StartsWith(RACE_ZIP_IDENTIFIER) && CheckCanFindRaceFileContent(file); | |
89 } | |
90 | |
91 protected abstract bool CheckCanFindRaceFileContent(ZipFile file); | |
92 | |
93 protected bool CheckCanHandleAsArmy(ZipFile file) | |
94 { | |
95 return file.ZipFileComment.StartsWith(ARMY_ZIP_IDENTIFIER) && CheckCanFindArmyFileContent(file); | |
96 } | |
97 | |
98 protected abstract bool CheckCanFindArmyFileContent(ZipFile file); | |
99 | |
100 protected override ICollection<IWarFoundryObject> DoCreateObjectsFromFile (ZipFile file) | |
101 { | |
102 ICollection<IWarFoundryObject> objects = null; | |
103 string comment = file.ZipFileComment; | |
104 IWarFoundryObject obj = null; | |
105 | |
106 if (comment.StartsWith(SYSTEM_ZIP_IDENTIFIER)) | |
107 { | |
108 obj = CreateGameSystemFromFile(file); | |
109 } | |
110 else if (comment.StartsWith(RACE_ZIP_IDENTIFIER)) | |
111 { | |
112 obj = CreateRaceFromFile(file); | |
113 } | |
114 else if (comment.StartsWith(ARMY_ZIP_IDENTIFIER)) | |
115 { | |
116 obj = CreateArmyFromFile(file); | |
117 } | |
118 | |
119 if (obj!=null) | |
120 { | |
121 objects = new List<IWarFoundryObject>(); | |
122 objects.Add(obj); | |
123 } | |
124 | |
125 return objects; | |
126 } | |
127 | |
128 | |
129 /* | |
130 public override bool CanHandleArmyFileFormat(FileInfo file) | |
131 { | |
132 bool canHandle = false; | |
133 | |
134 try | |
135 { | |
136 ZipFile zip = new ZipFile(file.FullName); | |
137 canHandle = zip.ZipFileComment.StartsWith(ARMY_ZIP_IDENTIFIER) && CanHandleArmyFileFormat(zip); | |
138 } | |
139 catch (ZipException) | |
140 { | |
141 //Not a valid zip file so we can't handle it | |
142 } | |
143 | |
144 return canHandle; | |
145 } | |
146 | |
147 public override bool CanHandleRaceFileFormat(FileInfo file) | |
148 { | |
149 bool canHandle = false; | |
150 | |
151 try | |
152 { | |
153 ZipFile zip = new ZipFile(file.FullName); | |
154 canHandle = zip.ZipFileComment.StartsWith(RACE_ZIP_IDENTIFIER) && CanHandleRaceFileFormat(zip); | |
155 } | |
156 catch (ZipException) | |
157 { | |
158 //Not a valid zip file so we can't handle it | |
159 } | |
160 | |
161 return canHandle; | |
162 } | |
163 | |
164 public override bool CanHandleSystemFileFormat(FileInfo file) | |
165 { | |
166 bool canHandle = false; | |
167 | |
168 try | |
169 { | |
170 ZipFile zip = new ZipFile(file.FullName); | |
171 canHandle = zip.ZipFileComment.StartsWith(SYSTEM_ZIP_IDENTIFIER) && CanHandleSystemFileFormat(zip); | |
172 } | |
173 catch (ZipException) | |
174 { | |
175 //Not a valid zip file so we can't handle it | |
176 } | |
177 | |
178 return canHandle; | |
179 } | |
180 | |
181 public abstract bool CanHandleArmyFileFormat(ZipFile file); | |
182 public abstract bool CanHandleRaceFileFormat(ZipFile file); | |
183 public abstract bool CanHandleSystemFileFormat(ZipFile file); | |
184 | |
185 public override Army CreateArmyFromFile (FileInfo file) | |
186 { | |
187 try | |
188 { | |
189 ZipFile zip = new ZipFile(file.FullName); | |
190 return CreateArmyFromFile(zip); | |
191 } | |
192 catch(ZipException ex) | |
193 { | |
194 throw new InvalidFileException(Translation.GetTranslation("InvalidArmyFileException", "Cannot get Army for file {0} as it was not a recognised Army file", file.Name), ex); | |
195 } | |
196 } | |
197 | |
198 public override Race CreateRaceFromFile (FileInfo file) | |
199 { | |
200 try | |
201 { | |
202 ZipFile zip = new ZipFile(file.FullName); | |
203 return CreateRaceFromFile(zip); | |
204 } | |
205 catch(ZipException ex) | |
206 { | |
207 throw new InvalidFileException(Translation.GetTranslation("InvalidRaceFileException", "Cannot get Race for file {0} as it was not a recognised Race file", file.Name), ex); | |
208 } | |
209 } | |
210 | |
211 public override GameSystem CreateGameSystemFromFile (FileInfo file) | |
212 { | |
213 try | |
214 { | |
215 ZipFile zip = new ZipFile(file.FullName); | |
216 return CreateGameSystemFromFile(zip); | |
217 } | |
218 catch(ZipException ex) | |
219 { | |
220 throw new InvalidFileException(Translation.GetTranslation("InvalidGameSystemFileException", "Cannot get Game System for file {0} as it was not a recognised Race file", file.Name), ex); | |
221 } | |
222 }*/ | |
223 | |
224 protected Army CreateArmyFromFile(ZipFile file) | |
225 { | |
226 Army army = CreateArmyFromStream(file, GetArmyDataStream(file)); | |
227 //throw new InvalidFileException(Translation.GetTranslation("InvalidArmyFileException", "Cannot get Army for file {0} as it was not an Army file", file.Name)); | |
228 return army; | |
229 } | |
230 | |
231 protected abstract Stream GetArmyDataStream(ZipFile file); | |
232 protected abstract Army CreateArmyFromStream(ZipFile file, Stream dataStream); | |
233 | |
234 protected Race CreateRaceFromFile(ZipFile file) | |
235 { | |
236 try | |
237 { | |
238 Race race = CreateRaceFromStream(file, GetRaceDataStream(file)); | |
239 //throw new InvalidFileException(Translation.GetTranslation("InvalidRaceFileException", "Cannot get Race for file {0} as it was not a Race file", file.Name)); | |
240 return race; | |
241 } | |
242 catch (InvalidFileException ex) | |
243 { | |
244 throw new InvalidFileException("Data file "+file.Name+" was not a valid race file", ex); | |
245 } | |
246 } | |
247 | |
248 protected abstract Stream GetRaceDataStream(ZipFile file); | |
249 protected abstract Race CreateRaceFromStream(ZipFile file, Stream dataStream); | |
250 | |
251 protected GameSystem CreateGameSystemFromFile(ZipFile file) | |
252 { | |
253 GameSystem system = CreateGameSystemFromStream(file, GetGameSystemDataStream(file)); | |
254 //throw new InvalidFileException(Translation.GetTranslation("InvalidGameSystemFileException", "Cannot get Game System for file {0} as it was not a Game System file", file.Name)); | |
255 return system; | |
256 } | |
257 | |
258 protected abstract Stream GetGameSystemDataStream(ZipFile file); | |
259 protected abstract GameSystem CreateGameSystemFromStream(ZipFile file, Stream dataStream); | |
260 | |
261 public override bool Equals (object o) | |
262 { | |
263 if (o == this) | |
264 { | |
265 return true; | |
266 } | |
267 else if (o == null || !(this.GetType().Equals(o.GetType()))) | |
268 { | |
269 return false; | |
270 } | |
271 | |
272 return true; | |
273 } | |
274 | |
275 public override int GetHashCode () | |
276 { | |
277 return GetType().FullName.GetHashCode(); | |
278 } | |
279 } | |
280 } |