Mercurial > repos > IBBoard.WarFoundry.API
annotate api/Factories/AbstractNativeWarFoundryFactory.cs @ 313:f00a57369aaa
Re #253: Allow multiple data files in a single zip
* Add event-based mechanism to allow GameSystem to be registered before Race is loaded from a single zip
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sun, 27 Feb 2011 15:54:13 +0000 |
parents | 3854c26073c4 |
children |
rev | line source |
---|---|
104
2f3cafb69799
Re #121: Migrate to AGPL license
IBBoard <dev@ibboard.co.uk>
parents:
82
diff
changeset
|
1 // This file (AbstractNativeWarFoundryFactory.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2007, 2008, 2009 IBBoard. |
0 | 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. |
0 | 4 |
5 using System; | |
82 | 6 using System.IO; |
0 | 7 using System.Xml; |
8 using System.Xml.Schema; | |
9 using System.Collections.Generic; | |
10 using System.Text; | |
11 using IBBoard; | |
12 using IBBoard.IO; | |
13 using IBBoard.Lang; | |
14 using IBBoard.Logging; | |
15 using IBBoard.Xml; | |
16 using IBBoard.WarFoundry.API.Objects; | |
82 | 17 using ICSharpCode.SharpZipLib.Zip; |
18 | |
19 namespace IBBoard.WarFoundry.API.Factories | |
20 { | |
21 /// <summary> | |
22 /// Base abstract class for all factories that load native WarFoundry data. | |
23 /// </summary> | |
24 public abstract class AbstractNativeWarFoundryFactory : AbstractWarFoundryFactory<ZipFile>, INativeWarFoundryFactory | |
236
ca2905c9b225
Fixes #252: Remove need for text in zip file comments
IBBoard <dev@ibboard.co.uk>
parents:
223
diff
changeset
|
25 { |
82 | 26 protected AbstractNativeWarFoundryFactory() |
0 | 27 { |
82 | 28 //Do nothing - just make the constructor non-public |
0 | 29 } |
8
613bc5eaac59
Re #9 - Make WarFoundry loading granular
IBBoard <dev@ibboard.co.uk>
parents:
7
diff
changeset
|
30 |
0 | 31 protected override ZipFile GetFileAsSupportedType (FileInfo file) |
32 { | |
33 ZipFile zip = null; | |
34 | |
35 try | |
36 { | |
37 zip = new ZipFile(file.FullName); | |
38 } | |
7
895c8a2378a1
Code cleanup - remove warning about unused exception
IBBoard <dev@ibboard.co.uk>
parents:
0
diff
changeset
|
39 catch(ZipException) |
0 | 40 { |
14
0770e5cbba7c
Closes #21 - File loading in order
IBBoard <dev@ibboard.co.uk>
parents:
8
diff
changeset
|
41 //Silently dispose as per spec for the method |
0 | 42 } |
27 | 43 catch (IOException) |
44 { | |
45 //Silently dispose as per spec for the method | |
46 } | |
0 | 47 |
48 return zip; | |
49 } | |
50 | |
51 protected override bool CheckCanHandleFileFormat (ZipFile file) | |
14
0770e5cbba7c
Closes #21 - File loading in order
IBBoard <dev@ibboard.co.uk>
parents:
8
diff
changeset
|
52 { |
0770e5cbba7c
Closes #21 - File loading in order
IBBoard <dev@ibboard.co.uk>
parents:
8
diff
changeset
|
53 return CheckCanHandleFileAsGameSystem(file) || CheckCanHandleFileAsRace(file) || CheckCanHandleFileAsArmy(file); |
0 | 54 } |
55 | |
14
0770e5cbba7c
Closes #21 - File loading in order
IBBoard <dev@ibboard.co.uk>
parents:
8
diff
changeset
|
56 protected override bool CheckCanHandleFileAsGameSystem(ZipFile file) |
0 | 57 { |
236
ca2905c9b225
Fixes #252: Remove need for text in zip file comments
IBBoard <dev@ibboard.co.uk>
parents:
223
diff
changeset
|
58 return CheckCanFindSystemFileContent(file); |
0 | 59 } |
60 | |
61 protected abstract bool CheckCanFindSystemFileContent(ZipFile file); | |
62 | |
14
0770e5cbba7c
Closes #21 - File loading in order
IBBoard <dev@ibboard.co.uk>
parents:
8
diff
changeset
|
63 protected override bool CheckCanHandleFileAsRace(ZipFile file) |
0 | 64 { |
236
ca2905c9b225
Fixes #252: Remove need for text in zip file comments
IBBoard <dev@ibboard.co.uk>
parents:
223
diff
changeset
|
65 return CheckCanFindRaceFileContent(file); |
0 | 66 } |
67 | |
68 protected abstract bool CheckCanFindRaceFileContent(ZipFile file); | |
69 | |
14
0770e5cbba7c
Closes #21 - File loading in order
IBBoard <dev@ibboard.co.uk>
parents:
8
diff
changeset
|
70 protected override bool CheckCanHandleFileAsArmy(ZipFile file) |
0 | 71 { |
236
ca2905c9b225
Fixes #252: Remove need for text in zip file comments
IBBoard <dev@ibboard.co.uk>
parents:
223
diff
changeset
|
72 return CheckCanFindArmyFileContent(file); |
0 | 73 } |
74 | |
75 protected abstract bool CheckCanFindArmyFileContent(ZipFile file); | |
76 | |
77 protected override ICollection<IWarFoundryObject> DoCreateObjectsFromFile (ZipFile file) | |
78 { | |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
79 ICollection<IWarFoundryObject> objects = new List<IWarFoundryObject>(); |
200 | 80 |
81 try | |
82 { | |
236
ca2905c9b225
Fixes #252: Remove need for text in zip file comments
IBBoard <dev@ibboard.co.uk>
parents:
223
diff
changeset
|
83 if (CheckCanFindSystemFileContent(file)) |
200 | 84 { |
313
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
85 foreach (GameSystem system in CreateGameSystemsFromFile(file)) |
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
86 { |
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
87 OnGameSystemLoaded(system); |
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
88 objects.Add(system); |
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
89 } |
200 | 90 } |
313
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
91 |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
92 if (CheckCanFindRaceFileContent(file)) |
200 | 93 { |
313
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
94 foreach(Race race in CreateRacesFromFile(file)) |
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
95 { |
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
96 OnRaceLoaded(race); |
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
97 objects.Add(race); |
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
98 } |
200 | 99 } |
313
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
100 |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
101 if (CheckCanFindArmyFileContent(file)) |
200 | 102 { |
313
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
103 foreach (Army army in CreateArmiesFromFile(file)) |
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
104 { |
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
105 OnArmyLoaded(army); |
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
106 objects.Add(army); |
f00a57369aaa
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
312
diff
changeset
|
107 } |
200 | 108 } |
109 } | |
110 finally | |
111 { | |
112 file.Close(); | |
0 | 113 } |
114 | |
115 return objects; | |
116 } | |
117 | |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
118 protected ICollection<Army> CreateArmiesFromFile(ZipFile file) |
151
1d13820b3d96
Fixes #176: Bug when saving recently edited army
IBBoard <dev@ibboard.co.uk>
parents:
150
diff
changeset
|
119 { |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
120 ICollection<ZipEntry> dataStreams = GetArmyZipEntries(file); |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
121 ICollection<Army> armies = new List<Army>(); |
148
8e636443aa8e
Re #176: Bug when saving recently edited army
IBBoard <dev@ibboard.co.uk>
parents:
115
diff
changeset
|
122 |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
123 foreach (ZipEntry entry in dataStreams) |
0 | 124 { |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
125 using (Stream dataStream = file.GetInputStream(entry)) |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
126 { |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
127 armies.Add(CreateArmyFromStream(file, dataStream)); |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
128 } |
0 | 129 } |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
130 |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
131 return armies; |
0 | 132 } |
133 | |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
134 protected abstract ICollection<ZipEntry> GetArmyZipEntries(ZipFile file); |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
135 protected abstract Army CreateArmyFromStream(ZipFile file, Stream dataStream); |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
136 |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
137 protected ICollection<Race> CreateRacesFromFile(ZipFile file) |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
138 { |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
139 ICollection<ZipEntry> dataStreams = GetRaceZipEntries(file); |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
140 ICollection<Race> races = new List<Race>(); |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
141 |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
142 foreach (ZipEntry entry in dataStreams) |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
143 { |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
144 using (Stream dataStream = file.GetInputStream(entry)) |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
145 { |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
146 races.Add(CreateRaceFromStream(file, dataStream)); |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
147 } |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
148 } |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
149 |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
150 return races; |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
151 } |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
152 |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
153 protected abstract ICollection<ZipEntry> GetRaceZipEntries(ZipFile file); |
0 | 154 protected abstract Race CreateRaceFromStream(ZipFile file, Stream dataStream); |
155 | |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
156 protected ICollection<GameSystem> CreateGameSystemsFromFile(ZipFile file) |
151
1d13820b3d96
Fixes #176: Bug when saving recently edited army
IBBoard <dev@ibboard.co.uk>
parents:
150
diff
changeset
|
157 { |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
158 ICollection<ZipEntry> dataStreams = GetGameSystemZipEntries(file); |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
159 ICollection<GameSystem> systems = new List<GameSystem>(); |
151
1d13820b3d96
Fixes #176: Bug when saving recently edited army
IBBoard <dev@ibboard.co.uk>
parents:
150
diff
changeset
|
160 |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
161 foreach (ZipEntry entry in dataStreams) |
151
1d13820b3d96
Fixes #176: Bug when saving recently edited army
IBBoard <dev@ibboard.co.uk>
parents:
150
diff
changeset
|
162 { |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
163 using (Stream dataStream = file.GetInputStream(entry)) |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
164 { |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
165 systems.Add(CreateGameSystemFromStream(file, dataStream)); |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
166 } |
151
1d13820b3d96
Fixes #176: Bug when saving recently edited army
IBBoard <dev@ibboard.co.uk>
parents:
150
diff
changeset
|
167 } |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
168 |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
169 return systems; |
0 | 170 } |
171 | |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
172 protected abstract ICollection<ZipEntry> GetGameSystemZipEntries(ZipFile file); |
82 | 173 protected abstract GameSystem CreateGameSystemFromStream(ZipFile file, Stream dataStream); |
0 | 174 |
175 public override bool Equals (object o) | |
176 { | |
177 if (o == this) | |
178 { | |
179 return true; | |
180 } | |
181 else if (o == null || !(this.GetType().Equals(o.GetType()))) | |
182 { | |
183 return false; | |
184 } | |
185 | |
186 return true; | |
187 } | |
188 | |
189 public override int GetHashCode () | |
190 { | |
191 return GetType().FullName.GetHashCode(); | |
82 | 192 } |
193 } | |
194 } |