public XMLActorDefinitionReader(string defdir) { Definitions = new List<Definition>(); string path = Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), defdir); if (Directory.Exists(path) == false) return; ProgramVersion = new Version(); List<string> XmlFiles = Directory.EnumerateFiles(path, "*.xml").ToList(); foreach (string fn in XmlFiles) { Definition ndef = null; Definition.Item nitem = null; Definition.Item.Option nopt = null; OpenGLHelpers.DisplayList displaydl = null; OpenGLHelpers.DisplayList pickdl = null; XmlTextReader xml = new XmlTextReader(fn); while (xml.Read()) { if (xml.NodeType == XmlNodeType.Element) { if (xml.Name == "ActorDatabase") { while (xml.MoveToNextAttribute()) { if (xml.Name == "ProgramVersion") { ProgramVersion = Version.Parse(xml.Value); if (ProgramVersion != Version.Parse(Application.ProductVersion)) ThrowVersionError(); } } } else if (xml.Name == "Definition") { if (ProgramVersion == new Version()) ThrowVersionError(); ndef = new Definition(); ndef.Items = new List<Definition.Item>(); while (xml.MoveToNextAttribute()) { switch (xml.Name) { case "Number": if (xml.Value.StartsWith("0x") == true) ndef.Number = ushort.Parse(xml.Value.Substring(2), System.Globalization.NumberStyles.HexNumber); else ndef.Number = ushort.Parse(xml.Value); break; case "IsDefault": ndef.IsDefault = (Definition.DefaultTypes)Enum.Parse(typeof(Definition.DefaultTypes), xml.Value); break; case "DisplayModel": displaydl = OpenGLHelpers.StockObjects.GetDisplayList(xml.Value); if (displaydl != null) ndef.DisplayModel = displaydl; break; case "PickModel": pickdl = OpenGLHelpers.StockObjects.GetDisplayList(xml.Value); if (pickdl != null) ndef.PickModel = pickdl; break; case "FrontOffset": ndef.FrontOffset = double.Parse(xml.Value, System.Globalization.CultureInfo.InvariantCulture); break; } } } else if (xml.Name == "Item") { nitem = new Definition.Item(); while (xml.MoveToNextAttribute()) { switch (xml.Name) { case "Index": nitem.Index = int.Parse(xml.Value); break; case "ValueType": nitem.ValueType = FindTypeInCurrentAssemblies(xml.Value); break; case "DisplayStyle": nitem.DisplayStyle = (Definition.Item.DisplayStyles)Enum.Parse(typeof(Definition.Item.DisplayStyles), xml.Value); break; case "Usage": nitem.Usage = (Definition.Item.Usages)Enum.Parse(typeof(Definition.Item.Usages), xml.Value); break; case "Description": nitem.Description = xml.Value; break; case "Mask": if (xml.Value.StartsWith("0x") == true) nitem.Mask = UInt64.Parse(xml.Value.Substring(2), System.Globalization.NumberStyles.HexNumber); else nitem.Mask = UInt64.Parse(xml.Value); break; case "ControlType": nitem.ControlType = FindTypeInCurrentAssemblies(xml.Value); break; } } ndef.Items.Add(nitem); } else if (xml.Name == "Option") { nopt = new Definition.Item.Option(); while (xml.MoveToNextAttribute()) { switch (xml.Name) { case "Value": if (xml.Value.StartsWith("0x") == true) nopt.Value = UInt64.Parse(xml.Value.Substring(2), System.Globalization.NumberStyles.HexNumber); else nopt.Value = UInt64.Parse(xml.Value); break; case "Description": nopt.Description = xml.Value; break; } } nitem.Options.Add(nopt); } } else if (xml.NodeType == XmlNodeType.EndElement) { if (xml.Name == "Definition") { if (displaydl != null && pickdl == null) ndef.PickModel = displaydl; Definitions.Add(ndef); } } } } }
public XMLActorDefinitionReader(string defdir) { Definitions = new List <Definition>(); string path = Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), defdir); if (Directory.Exists(path) == false) { return; } ProgramVersion = new Version(); List <string> XmlFiles = Directory.EnumerateFiles(path, "*.xml").ToList(); foreach (string fn in XmlFiles) { Definition ndef = null; Definition.Item nitem = null; Definition.Item.Option nopt = null; OpenGLHelpers.DisplayList displaydl = null; OpenGLHelpers.DisplayList pickdl = null; XmlTextReader xml = new XmlTextReader(fn); while (xml.Read()) { if (xml.NodeType == XmlNodeType.Element) { if (xml.Name == "ActorDatabase") { while (xml.MoveToNextAttribute()) { if (xml.Name == "ProgramVersion") { ProgramVersion = Version.Parse(xml.Value); if (ProgramVersion != Version.Parse(Application.ProductVersion)) { ThrowVersionError(); } } } } else if (xml.Name == "Definition") { if (ProgramVersion == new Version()) { ThrowVersionError(); } ndef = new Definition(); ndef.Items = new List <Definition.Item>(); while (xml.MoveToNextAttribute()) { switch (xml.Name) { case "Number": if (xml.Value.StartsWith("0x") == true) { ndef.Number = ushort.Parse(xml.Value.Substring(2), System.Globalization.NumberStyles.HexNumber); } else { ndef.Number = ushort.Parse(xml.Value); } break; case "IsDefault": ndef.IsDefault = (Definition.DefaultTypes)Enum.Parse(typeof(Definition.DefaultTypes), xml.Value); break; case "DisplayModel": displaydl = OpenGLHelpers.StockObjects.GetDisplayList(xml.Value); if (displaydl != null) { ndef.DisplayModel = displaydl; } break; case "PickModel": pickdl = OpenGLHelpers.StockObjects.GetDisplayList(xml.Value); if (pickdl != null) { ndef.PickModel = pickdl; } break; case "FrontOffset": ndef.FrontOffset = double.Parse(xml.Value, System.Globalization.CultureInfo.InvariantCulture); break; } } } else if (xml.Name == "Item") { nitem = new Definition.Item(); while (xml.MoveToNextAttribute()) { switch (xml.Name) { case "Index": nitem.Index = int.Parse(xml.Value); break; case "ValueType": nitem.ValueType = FindTypeInCurrentAssemblies(xml.Value); break; case "DisplayStyle": nitem.DisplayStyle = (Definition.Item.DisplayStyles)Enum.Parse(typeof(Definition.Item.DisplayStyles), xml.Value); break; case "Usage": nitem.Usage = (Definition.Item.Usages)Enum.Parse(typeof(Definition.Item.Usages), xml.Value); break; case "Description": nitem.Description = xml.Value; break; case "Mask": if (xml.Value.StartsWith("0x") == true) { nitem.Mask = UInt64.Parse(xml.Value.Substring(2), System.Globalization.NumberStyles.HexNumber); } else { nitem.Mask = UInt64.Parse(xml.Value); } break; case "ControlType": nitem.ControlType = FindTypeInCurrentAssemblies(xml.Value); break; } } ndef.Items.Add(nitem); } else if (xml.Name == "Option") { nopt = new Definition.Item.Option(); while (xml.MoveToNextAttribute()) { switch (xml.Name) { case "Value": if (xml.Value.StartsWith("0x") == true) { nopt.Value = UInt64.Parse(xml.Value.Substring(2), System.Globalization.NumberStyles.HexNumber); } else { nopt.Value = UInt64.Parse(xml.Value); } break; case "Description": nopt.Description = xml.Value; break; } } nitem.Options.Add(nopt); } } else if (xml.NodeType == XmlNodeType.EndElement) { if (xml.Name == "Definition") { if (displaydl != null && pickdl == null) { ndef.PickModel = displaydl; } Definitions.Add(ndef); } } } } }