1 | using System;
|
---|
2 | using System.Collections.Generic;
|
---|
3 | using Oni.Collections;
|
---|
4 |
|
---|
5 | namespace Oni
|
---|
6 | {
|
---|
7 | internal sealed class DatPacker
|
---|
8 | {
|
---|
9 | private readonly List<string> inputPaths = new List<string>();
|
---|
10 | private string targetFilePath;
|
---|
11 | private bool targetBigEndian;
|
---|
12 | private long targetTemplateChecksum;
|
---|
13 |
|
---|
14 | public List<string> InputPaths => inputPaths;
|
---|
15 |
|
---|
16 | public string TargetFilePath
|
---|
17 | {
|
---|
18 | get { return targetFilePath; }
|
---|
19 | set { targetFilePath = value; }
|
---|
20 | }
|
---|
21 |
|
---|
22 | public bool TargetBigEndian
|
---|
23 | {
|
---|
24 | get { return targetBigEndian; }
|
---|
25 | set { targetBigEndian = value; }
|
---|
26 | }
|
---|
27 |
|
---|
28 | public long TargetTemplateChecksum
|
---|
29 | {
|
---|
30 | get { return targetTemplateChecksum; }
|
---|
31 | set { targetTemplateChecksum = value; }
|
---|
32 | }
|
---|
33 |
|
---|
34 | public void Pack(InstanceFileManager fileManager, IEnumerable<string> filePaths)
|
---|
35 | {
|
---|
36 | var inputs = new List<InstanceFile>();
|
---|
37 | var seenFilePaths = new Set<string>(StringComparer.OrdinalIgnoreCase);
|
---|
38 |
|
---|
39 | foreach (string filePath in filePaths)
|
---|
40 | {
|
---|
41 | if (seenFilePaths.Add(filePath))
|
---|
42 | inputs.Add(fileManager.OpenFile(filePath));
|
---|
43 | }
|
---|
44 |
|
---|
45 | inputs.Reverse();
|
---|
46 |
|
---|
47 | var descriptors = GetImportedDescriptors(inputs);
|
---|
48 |
|
---|
49 | if (descriptors.Count > 0)
|
---|
50 | {
|
---|
51 | var writer = InstanceFileWriter.CreateV31(targetTemplateChecksum, targetBigEndian);
|
---|
52 | writer.AddDescriptors(descriptors, true);
|
---|
53 |
|
---|
54 | Console.WriteLine("Writing {0}", targetFilePath);
|
---|
55 |
|
---|
56 | writer.Write(targetFilePath);
|
---|
57 | }
|
---|
58 | }
|
---|
59 |
|
---|
60 | public void Import(InstanceFileManager fileManager, string[] inputDirPaths)
|
---|
61 | {
|
---|
62 | Console.WriteLine("Reading files from {0}", string.Join(";", inputDirPaths));
|
---|
63 |
|
---|
64 | var inputsFiles = fileManager.OpenDirectories(inputDirPaths);
|
---|
65 | var descriptors = GetImportedDescriptors(inputsFiles);
|
---|
66 |
|
---|
67 | if (descriptors.Count > 0)
|
---|
68 | {
|
---|
69 | var writer = InstanceFileWriter.CreateV31(targetTemplateChecksum, targetBigEndian);
|
---|
70 | writer.AddDescriptors(descriptors, true);
|
---|
71 |
|
---|
72 | Console.WriteLine("Writing {0}", targetFilePath);
|
---|
73 |
|
---|
74 | writer.Write(targetFilePath);
|
---|
75 | }
|
---|
76 | }
|
---|
77 |
|
---|
78 | private static List<InstanceDescriptor> GetImportedDescriptors(List<InstanceFile> inputFiles)
|
---|
79 | {
|
---|
80 | var namedDescriptors = new Set<string>(StringComparer.Ordinal);
|
---|
81 | var ignored = new Set<InstanceDescriptor>();
|
---|
82 |
|
---|
83 | foreach (var file in inputFiles)
|
---|
84 | {
|
---|
85 | foreach (var descriptor in file.GetNamedDescriptors())
|
---|
86 | {
|
---|
87 | if (namedDescriptors.Contains(descriptor.FullName))
|
---|
88 | {
|
---|
89 | //Console.Error.WriteLine("WARNING: More than one instance has name {0}, ignoring.", descriptor.FullName);
|
---|
90 | ignored.Add(descriptor);
|
---|
91 | }
|
---|
92 | else
|
---|
93 | {
|
---|
94 | namedDescriptors.Add(descriptor.FullName);
|
---|
95 | }
|
---|
96 | }
|
---|
97 | }
|
---|
98 |
|
---|
99 | inputFiles.Sort((x, y) => string.Compare(x.Descriptors[0].FullName, y.Descriptors[0].FullName, StringComparison.Ordinal));
|
---|
100 |
|
---|
101 | var descriptors = new List<InstanceDescriptor>(4096);
|
---|
102 |
|
---|
103 | foreach (var file in inputFiles)
|
---|
104 | {
|
---|
105 | foreach (var descriptor in file.Descriptors)
|
---|
106 | {
|
---|
107 | if (ignored.Contains(descriptor))
|
---|
108 | continue;
|
---|
109 |
|
---|
110 | if (descriptor.HasName)
|
---|
111 | {
|
---|
112 | if (descriptor.IsPlaceholder && namedDescriptors.Contains(descriptor.FullName))
|
---|
113 | continue;
|
---|
114 |
|
---|
115 | namedDescriptors.Add(descriptor.FullName);
|
---|
116 | }
|
---|
117 |
|
---|
118 | descriptors.Add(descriptor);
|
---|
119 | }
|
---|
120 | }
|
---|
121 |
|
---|
122 | descriptors.Sort((x, y) => x.Template.IsLeaf.CompareTo(y.Template.IsLeaf));
|
---|
123 |
|
---|
124 | return descriptors;
|
---|
125 | }
|
---|
126 | }
|
---|
127 | }
|
---|