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 }