| 1 | using System; | 
 
 
 
 
 | 2 | using System.Collections.Generic; | 
 
 
 
 
 | 3 | using System.Globalization; | 
 
 
 
 
 | 4 | using System.IO; | 
 
 
 
 
 | 5 | using System.Text; | 
 
 
 
 
 | 6 |  | 
 
 
 
 
 | 7 | namespace Oni | 
 
 
 
 
 | 8 | { | 
 
 
 
 
 | 9 | internal abstract class Importer | 
 
 
 
 
 | 10 | { | 
 
 
 
 
 | 11 | private readonly ImporterFile file; | 
 
 
 
 
 | 12 | private Dictionary<string, ImporterTask> dependencies; | 
 
 
 
 
 | 13 |  | 
 
 
 
 
 | 14 | public Importer() | 
 
 
 
 
 | 15 | { | 
 
 
 
 
 | 16 | this.file = new ImporterFile(); | 
 
 
 
 
 | 17 | } | 
 
 
 
 
 | 18 |  | 
 
 
 
 
 | 19 | protected Importer(long templateChecksum) | 
 
 
 
 
 | 20 | { | 
 
 
 
 
 | 21 | this.file = new ImporterFile(templateChecksum); | 
 
 
 
 
 | 22 | } | 
 
 
 
 
 | 23 |  | 
 
 
 
 
 | 24 | public ImporterFile ImporterFile => file; | 
 
 
 
 
 | 25 |  | 
 
 
 
 
 | 26 | public virtual void Import(string filePath, string outputDirPath) | 
 
 
 
 
 | 27 | { | 
 
 
 
 
 | 28 | } | 
 
 
 
 
 | 29 |  | 
 
 
 
 
 | 30 | public virtual void BeginImport() | 
 
 
 
 
 | 31 | { | 
 
 
 
 
 | 32 | file.BeginImport(); | 
 
 
 
 
 | 33 |  | 
 
 
 
 
 | 34 | dependencies = new Dictionary<string, ImporterTask>(); | 
 
 
 
 
 | 35 | } | 
 
 
 
 
 | 36 |  | 
 
 
 
 
 | 37 | public BinaryWriter RawWriter => file.RawWriter; | 
 
 
 
 
 | 38 |  | 
 
 
 
 
 | 39 | public void AddDependency(string filePath, TemplateTag type) | 
 
 
 
 
 | 40 | { | 
 
 
 
 
 | 41 | if (!dependencies.ContainsKey(filePath)) | 
 
 
 
 
 | 42 | dependencies[filePath] = new ImporterTask(filePath, type); | 
 
 
 
 
 | 43 | } | 
 
 
 
 
 | 44 |  | 
 
 
 
 
 | 45 | public ICollection<ImporterTask> Dependencies | 
 
 
 
 
 | 46 | { | 
 
 
 
 
 | 47 | get | 
 
 
 
 
 | 48 | { | 
 
 
 
 
 | 49 | if (dependencies == null) | 
 
 
 
 
 | 50 | return new ImporterTask[0]; | 
 
 
 
 
 | 51 |  | 
 
 
 
 
 | 52 | return dependencies.Values; | 
 
 
 
 
 | 53 | } | 
 
 
 
 
 | 54 | } | 
 
 
 
 
 | 55 |  | 
 
 
 
 
 | 56 | public ImporterDescriptor CreateInstance(TemplateTag tag, string name = null) => file.CreateInstance(tag, name); | 
 
 
 
 
 | 57 |  | 
 
 
 
 
 | 58 | public int WriteRawPart(byte[] data) => file.WriteRawPart(data); | 
 
 
 
 
 | 59 |  | 
 
 
 
 
 | 60 | public int WriteRawPart(string text) => file.WriteRawPart(text); | 
 
 
 
 
 | 61 |  | 
 
 
 
 
 | 62 | public void Write(string outputDirPath) => file.Write(outputDirPath); | 
 
 
 
 
 | 63 |  | 
 
 
 
 
 | 64 | protected static string MakeInstanceName(TemplateTag tag, string name) | 
 
 
 
 
 | 65 | { | 
 
 
 
 
 | 66 | string tagName = tag.ToString(); | 
 
 
 
 
 | 67 |  | 
 
 
 
 
 | 68 | if (!name.StartsWith(tagName, StringComparison.Ordinal)) | 
 
 
 
 
 | 69 | name = tagName + name; | 
 
 
 
 
 | 70 |  | 
 
 
 
 
 | 71 | return name; | 
 
 
 
 
 | 72 | } | 
 
 
 
 
 | 73 |  | 
 
 
 
 
 | 74 | public static string EncodeFileName(string name, Dictionary<string, string> fileNames = null) | 
 
 
 
 
 | 75 | { | 
 
 
 
 
 | 76 | foreach (char c in Path.GetInvalidFileNameChars()) | 
 
 
 
 
 | 77 | name = name.Replace(c.ToString(), string.Format(CultureInfo.InvariantCulture, "%{0:X2}", (int)c)); | 
 
 
 
 
 | 78 |  | 
 
 
 
 
 | 79 | if (fileNames != null) | 
 
 
 
 
 | 80 | { | 
 
 
 
 
 | 81 | string existingName; | 
 
 
 
 
 | 82 |  | 
 
 
 
 
 | 83 | while (fileNames.TryGetValue(name, out existingName)) | 
 
 
 
 
 | 84 | { | 
 
 
 
 
 | 85 | int i = 0; | 
 
 
 
 
 | 86 |  | 
 
 
 
 
 | 87 | if (name.Length > 4) | 
 
 
 
 
 | 88 | i = 4; | 
 
 
 
 
 | 89 |  | 
 
 
 
 
 | 90 | while (i < name.Length && char.ToLowerInvariant(name[i]) != char.ToLowerInvariant(existingName[i])) | 
 
 
 
 
 | 91 | i++; | 
 
 
 
 
 | 92 |  | 
 
 
 
 
 | 93 | name = name.Substring(0, i) + string.Format(CultureInfo.InvariantCulture, "%{0:X2}", (int)name[i]) + name.Substring(i + 1); | 
 
 
 
 
 | 94 | } | 
 
 
 
 
 | 95 |  | 
 
 
 
 
 | 96 | fileNames[name] = name; | 
 
 
 
 
 | 97 | } | 
 
 
 
 
 | 98 |  | 
 
 
 
 
 | 99 | return name; | 
 
 
 
 
 | 100 | } | 
 
 
 
 
 | 101 |  | 
 
 
 
 
 | 102 | public static string DecodeFileName(string fileName) | 
 
 
 
 
 | 103 | { | 
 
 
 
 
 | 104 | fileName = Path.GetFileNameWithoutExtension(fileName); | 
 
 
 
 
 | 105 |  | 
 
 
 
 
 | 106 | var buffer = new StringBuilder(); | 
 
 
 
 
 | 107 |  | 
 
 
 
 
 | 108 | for (int i, startIndex = 0; startIndex != -1; startIndex = i) | 
 
 
 
 
 | 109 | { | 
 
 
 
 
 | 110 | i = fileName.IndexOf('%', startIndex); | 
 
 
 
 
 | 111 |  | 
 
 
 
 
 | 112 | if (i == -1) | 
 
 
 
 
 | 113 | { | 
 
 
 
 
 | 114 | buffer.Append(fileName, startIndex, fileName.Length - startIndex); | 
 
 
 
 
 | 115 | } | 
 
 
 
 
 | 116 | else | 
 
 
 
 
 | 117 | { | 
 
 
 
 
 | 118 | buffer.Append(fileName, startIndex, i - startIndex); | 
 
 
 
 
 | 119 | buffer.Append((char)Int32.Parse(fileName.Substring(i + 1, 2), NumberStyles.HexNumber)); | 
 
 
 
 
 | 120 | i += 3; | 
 
 
 
 
 | 121 | } | 
 
 
 
 
 | 122 | } | 
 
 
 
 
 | 123 |  | 
 
 
 
 
 | 124 | return buffer.ToString(); | 
 
 
 
 
 | 125 | } | 
 
 
 
 
 | 126 | } | 
 
 
 
 
 | 127 | } |