1 | using System;
|
---|
2 | using System.IO;
|
---|
3 |
|
---|
4 | namespace Oni
|
---|
5 | {
|
---|
6 | internal sealed class InstanceFileHeader
|
---|
7 | {
|
---|
8 | public const long OniPCTemplateChecksum = 0x0003bcdf33dc271f;
|
---|
9 | public const long OniMacTemplateChecksum = 0x0003bcdf23c13061;
|
---|
10 | public const int Version31 = 0x56523331;
|
---|
11 | public const int Version32 = 0x56523332;
|
---|
12 | public const long Signature = 0x0008001000140040;
|
---|
13 |
|
---|
14 | #region Private data
|
---|
15 | private long templateChecksum;
|
---|
16 | private int version;
|
---|
17 | private long signature;
|
---|
18 | private int instanceCount;
|
---|
19 | private int nameCount;
|
---|
20 | private int templateCount;
|
---|
21 | private int dataTableOffset;
|
---|
22 | private int dataTableSize;
|
---|
23 | private int nameTableOffset;
|
---|
24 | private int nameTableSize;
|
---|
25 | private int rawTableOffset;
|
---|
26 | private int rawTableSize;
|
---|
27 | #endregion
|
---|
28 |
|
---|
29 | internal static InstanceFileHeader Read(BinaryReader reader)
|
---|
30 | {
|
---|
31 | var header = new InstanceFileHeader
|
---|
32 | {
|
---|
33 | templateChecksum = reader.ReadInt64(),
|
---|
34 | version = reader.ReadInt32(),
|
---|
35 | signature = reader.ReadInt64()
|
---|
36 | };
|
---|
37 |
|
---|
38 | ValidateHeader(header);
|
---|
39 |
|
---|
40 | header.instanceCount = reader.ReadInt32();
|
---|
41 | header.nameCount = reader.ReadInt32();
|
---|
42 | header.templateCount = reader.ReadInt32();
|
---|
43 | header.dataTableOffset = reader.ReadInt32();
|
---|
44 | header.dataTableSize = reader.ReadInt32();
|
---|
45 | header.nameTableOffset = reader.ReadInt32();
|
---|
46 | header.nameTableSize = reader.ReadInt32();
|
---|
47 |
|
---|
48 | if (header.version == Version32)
|
---|
49 | {
|
---|
50 | header.rawTableOffset = reader.ReadInt32();
|
---|
51 | header.rawTableSize = reader.ReadInt32();
|
---|
52 |
|
---|
53 | reader.Skip(8);
|
---|
54 | }
|
---|
55 | else
|
---|
56 | {
|
---|
57 | reader.Skip(16);
|
---|
58 | }
|
---|
59 |
|
---|
60 | return header;
|
---|
61 | }
|
---|
62 |
|
---|
63 | private static void ValidateHeader(InstanceFileHeader header)
|
---|
64 | {
|
---|
65 | if (header.templateChecksum != OniPCTemplateChecksum && header.templateChecksum != OniMacTemplateChecksum)
|
---|
66 | {
|
---|
67 | header.templateChecksum = OniMacTemplateChecksum;
|
---|
68 | //throw new InvalidDataException("Invalid template checksum");
|
---|
69 | }
|
---|
70 |
|
---|
71 | if (header.version != Version31 && header.version != Version32)
|
---|
72 | throw new InvalidDataException("Unknown file version");
|
---|
73 |
|
---|
74 | if (header.version == Version31 && header.signature != Signature)
|
---|
75 | throw new InvalidDataException("Invalid file signature");
|
---|
76 | }
|
---|
77 |
|
---|
78 | public long TemplateChecksum => templateChecksum;
|
---|
79 | public int Version => version;
|
---|
80 | public int InstanceCount => instanceCount;
|
---|
81 | public int NameCount => nameCount;
|
---|
82 | public int TemplateCoun => templateCount;
|
---|
83 | public int DataTableOffset => dataTableOffset;
|
---|
84 | public int DataTableSize => dataTableSize;
|
---|
85 | public int NameTableOffset => nameTableOffset;
|
---|
86 | public int NameTableSize => nameTableSize;
|
---|
87 | public int RawTableOffset => rawTableOffset;
|
---|
88 | public int RawTableSize => rawTableSize;
|
---|
89 | }
|
---|
90 | }
|
---|