Mercurial > repos > IBDev-IBBoard.WarFoundry.API
annotate api/Factories/AbstractNativeWarFoundryFactory.cs @ 312:3854c26073c4
Re #253: Allow multiple data files in a single zip
* Rebuild file loading to start to allow multiple files in a native file
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sat, 26 Feb 2011 20:15:12 +0000 |
parents | ca2905c9b225 |
children | f00a57369aaa |
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 { |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
85 AddAll(objects, CreateGameSystemsFromFile(file)); |
200 | 86 } |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
87 if (CheckCanFindRaceFileContent(file)) |
200 | 88 { |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
89 AddAll(objects, CreateRacesFromFile(file)); |
200 | 90 } |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
91 if (CheckCanFindArmyFileContent(file)) |
200 | 92 { |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
93 AddAll(objects, CreateArmiesFromFile(file)); |
200 | 94 } |
95 } | |
96 finally | |
97 { | |
98 file.Close(); | |
0 | 99 } |
100 | |
101 return objects; | |
102 } | |
103 | |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
104 private void AddAll <NEW_ITEM_TYPE>(ICollection<IWarFoundryObject> collection, ICollection<NEW_ITEM_TYPE> newItems) where NEW_ITEM_TYPE : IWarFoundryObject |
0 | 105 { |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
106 foreach (IWarFoundryObject obj in newItems) |
151
1d13820b3d96
Fixes #176: Bug when saving recently edited army
IBBoard <dev@ibboard.co.uk>
parents:
150
diff
changeset
|
107 { |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
108 collection.Add(obj); |
148
8e636443aa8e
Re #176: Bug when saving recently edited army
IBBoard <dev@ibboard.co.uk>
parents:
115
diff
changeset
|
109 } |
0 | 110 } |
111 | |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
112 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
|
113 { |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
114 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
|
115 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
|
116 |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
117 foreach (ZipEntry entry in dataStreams) |
0 | 118 { |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
119 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
|
120 { |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
121 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
|
122 } |
0 | 123 } |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
124 |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
125 return armies; |
0 | 126 } |
127 | |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
128 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
|
129 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
|
130 |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
131 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
|
132 { |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
133 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
|
134 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
|
135 |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
136 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
|
137 { |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
138 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
|
139 { |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
140 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
|
141 } |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
142 } |
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 return races; |
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 |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
147 protected abstract ICollection<ZipEntry> GetRaceZipEntries(ZipFile file); |
0 | 148 protected abstract Race CreateRaceFromStream(ZipFile file, Stream dataStream); |
149 | |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
150 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
|
151 { |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
152 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
|
153 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
|
154 |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
155 foreach (ZipEntry entry in dataStreams) |
151
1d13820b3d96
Fixes #176: Bug when saving recently edited army
IBBoard <dev@ibboard.co.uk>
parents:
150
diff
changeset
|
156 { |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
157 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
|
158 { |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
159 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
|
160 } |
151
1d13820b3d96
Fixes #176: Bug when saving recently edited army
IBBoard <dev@ibboard.co.uk>
parents:
150
diff
changeset
|
161 } |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
162 |
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
163 return systems; |
0 | 164 } |
165 | |
312
3854c26073c4
Re #253: Allow multiple data files in a single zip
IBBoard <dev@ibboard.co.uk>
parents:
236
diff
changeset
|
166 protected abstract ICollection<ZipEntry> GetGameSystemZipEntries(ZipFile file); |
82 | 167 protected abstract GameSystem CreateGameSystemFromStream(ZipFile file, Stream dataStream); |
0 | 168 |
169 public override bool Equals (object o) | |
170 { | |
171 if (o == this) | |
172 { | |
173 return true; | |
174 } | |
175 else if (o == null || !(this.GetType().Equals(o.GetType()))) | |
176 { | |
177 return false; | |
178 } | |
179 | |
180 return true; | |
181 } | |
182 | |
183 public override int GetHashCode () | |
184 { | |
185 return GetType().FullName.GetHashCode(); | |
82 | 186 } |
187 } | |
188 } |