| 1 | using System; | 
 
 
 
 
 | 2 | using System.Collections.Generic; | 
 
 
 
 
 | 3 | using System.IO; | 
 
 
 
 
 | 4 |  | 
 
 
 
 
 | 5 | namespace Oni.Objects | 
 
 
 
 
 | 6 | { | 
 
 
 
 
 | 7 | internal class ObjectLoadContext | 
 
 
 
 
 | 8 | { | 
 
 
 
 
 | 9 | private readonly Func<TemplateTag, string, ObjectLoadContext, InstanceDescriptor> getDescriptor; | 
 
 
 
 
 | 10 | private readonly TextWriter info; | 
 
 
 
 
 | 11 | private readonly Dictionary<string, ObjectClass> classCache; | 
 
 
 
 
 | 12 | private string basePath; | 
 
 
 
 
 | 13 | private string filePath; | 
 
 
 
 
 | 14 |  | 
 
 
 
 
 | 15 | public ObjectLoadContext(Func<TemplateTag, string, ObjectLoadContext, InstanceDescriptor> getDescriptor, TextWriter info) | 
 
 
 
 
 | 16 | { | 
 
 
 
 
 | 17 | this.getDescriptor = getDescriptor; | 
 
 
 
 
 | 18 | this.info = info; | 
 
 
 
 
 | 19 | this.classCache = new Dictionary<string, ObjectClass>(StringComparer.Ordinal); | 
 
 
 
 
 | 20 | } | 
 
 
 
 
 | 21 |  | 
 
 
 
 
 | 22 | public T GetClass<T>(TemplateTag tag, string name, Func<InstanceDescriptor, T> reader) | 
 
 
 
 
 | 23 | where T : ObjectClass, new() | 
 
 
 
 
 | 24 | { | 
 
 
 
 
 | 25 | ObjectClass klass; | 
 
 
 
 
 | 26 |  | 
 
 
 
 
 | 27 | string fullName = tag.ToString() + name; | 
 
 
 
 
 | 28 |  | 
 
 
 
 
 | 29 | if (!classCache.TryGetValue(fullName, out klass)) | 
 
 
 
 
 | 30 | { | 
 
 
 
 
 | 31 | var descriptor = getDescriptor(tag, name, this); | 
 
 
 
 
 | 32 |  | 
 
 
 
 
 | 33 | if (descriptor != null) | 
 
 
 
 
 | 34 | { | 
 
 
 
 
 | 35 | info.WriteLine("Using {0} object class '{1}' from '{2}'", tag, descriptor.Name, descriptor.FilePath); | 
 
 
 
 
 | 36 |  | 
 
 
 
 
 | 37 | klass = reader(descriptor); | 
 
 
 
 
 | 38 | klass.Name = descriptor.Name; | 
 
 
 
 
 | 39 | } | 
 
 
 
 
 | 40 |  | 
 
 
 
 
 | 41 | classCache.Add(fullName, klass); | 
 
 
 
 
 | 42 | } | 
 
 
 
 
 | 43 |  | 
 
 
 
 
 | 44 | return (T)klass; | 
 
 
 
 
 | 45 | } | 
 
 
 
 
 | 46 |  | 
 
 
 
 
 | 47 | public string BasePath | 
 
 
 
 
 | 48 | { | 
 
 
 
 
 | 49 | get { return basePath; } | 
 
 
 
 
 | 50 | set { basePath = value; } | 
 
 
 
 
 | 51 | } | 
 
 
 
 
 | 52 |  | 
 
 
 
 
 | 53 | public string FilePath | 
 
 
 
 
 | 54 | { | 
 
 
 
 
 | 55 | get { return filePath; } | 
 
 
 
 
 | 56 | set { filePath = value; } | 
 
 
 
 
 | 57 | } | 
 
 
 
 
 | 58 | } | 
 
 
 
 
 | 59 | } |