Mercurial > repos > IBBoard.ArmyBuilder.API
comparison Loaders/ArmyBuilderABFileLoader.cs @ 0:1a5205612b72
Add initial work on ArmyBuilder API project\nno-open-ticket
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sun, 19 Apr 2009 11:24:10 +0000 |
parents | |
children | d5ba733cd289 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1a5205612b72 |
---|---|
1 // This file (ArmyBuilderFileLoader.cs) is a part of the IBBoard.ArmyBuilder.API project and is copyright 2009 IBBoard | |
2 // | |
3 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license. | |
4 // | |
5 | |
6 using System; | |
7 using System.IO; | |
8 | |
9 namespace IBBoard.ArmyBuilder.API.Loaders | |
10 { | |
11 public class ArmyBuilderABFileLoader | |
12 { | |
13 private static byte HEADER_DELIMITER = 0x09; | |
14 | |
15 public static ABFile LoadFile(FileInfo file) | |
16 { | |
17 ABFile abFile = new ABFile(file); | |
18 LoadData(abFile); | |
19 return abFile; | |
20 } | |
21 | |
22 private static void LoadData(ABFile abFile) | |
23 { | |
24 BinaryReaderBigEndian reader = new BinaryReaderBigEndian(abFile.File.OpenRead()); | |
25 | |
26 try | |
27 { | |
28 ReadFileInfo(abFile, reader); | |
29 ReadFileTable(abFile, reader); | |
30 } | |
31 finally | |
32 { | |
33 reader.Close(); | |
34 } | |
35 } | |
36 | |
37 private static void ReadFileInfo(ABFile abFile, BinaryReaderBigEndian reader) | |
38 { | |
39 int tableOffset = reader.ReadInt(); | |
40 reader.Move(tableOffset); | |
41 ushort fileTableOffset = reader.ReadUShort(); | |
42 abFile.Header = reader.ReadDelimitedString(HEADER_DELIMITER); | |
43 abFile.GameName = reader.ReadDelimitedString(HEADER_DELIMITER); | |
44 abFile.FolderName = reader.ReadDelimitedString(HEADER_DELIMITER); | |
45 abFile.ReleaseMajor = reader.ReadDelimitedString(HEADER_DELIMITER); | |
46 abFile.ReleaseMinor = reader.ReadDelimitedString(HEADER_DELIMITER); | |
47 abFile.RequiredMajorVersion = reader.ReadDelimitedString(HEADER_DELIMITER); | |
48 abFile.RequiredMinorVersion = reader.ReadDelimitedString(HEADER_DELIMITER); | |
49 abFile.UnknownNumber = reader.ReadDelimitedString(HEADER_DELIMITER); | |
50 abFile.Exporter = reader.ReadDelimitedString(HEADER_DELIMITER); | |
51 int bytesRead = CalculateFileInfoSize(abFile); | |
52 | |
53 if (fileTableOffset > bytesRead) | |
54 { | |
55 abFile.Comment = reader.ReadString(fileTableOffset - bytesRead); | |
56 } | |
57 } | |
58 | |
59 private static int CalculateFileInfoSize(ABFile file) | |
60 { | |
61 return file.Header.Length + file.GameName.Length + file.FolderName.Length + file.ReleaseMajor.Length + file.ReleaseMinor.Length + | |
62 file.RequiredMajorVersion.Length + file.RequiredMinorVersion.Length + file.UnknownNumber.Length + file.Exporter.Length + 9; | |
63 } | |
64 | |
65 private static void ReadFileTable(ABFile abFile, BinaryReaderBigEndian reader) | |
66 { | |
67 FileTableEntry entry = null; | |
68 | |
69 do | |
70 { | |
71 entry = ReadFileTableEntry(reader); | |
72 abFile.AddFileTableEntry(entry); | |
73 } | |
74 while (entry!=null); | |
75 } | |
76 | |
77 private static FileTableEntry ReadFileTableEntry(BinaryReaderBigEndian reader) | |
78 { | |
79 FileTableEntry entry = null; | |
80 string name = reader.ReadUShortLengthString(); | |
81 | |
82 if (name!="" && name!=null) | |
83 { | |
84 entry = new FileTableEntry(name); | |
85 entry.FirstBytes = reader.ReadBytes(8); | |
86 entry.FileSize = reader.ReadInt(); | |
87 entry.CompressedSize = reader.ReadInt(); | |
88 entry.MidBytes = reader.ReadBytes(4); | |
89 entry.Location = reader.ReadInt(); | |
90 entry.EndBytes = reader.ReadBytes(8); | |
91 } | |
92 | |
93 return entry; | |
94 } | |
95 } | |
96 } |