From 90f55078d513e624f40308f0f70dbc2511c052d8 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sat, 22 Aug 2020 23:40:00 -0700 Subject: [PATCH] More ListXML objects and cleanup --- SabreTools.Library/DatFiles/Json.cs | 18 +- SabreTools.Library/DatFiles/Listxml.cs | 173 ++++++++++++------ SabreTools.Library/DatFiles/OpenMSX.cs | 8 +- SabreTools.Library/DatFiles/SeparatedValue.cs | 12 +- SabreTools.Library/DatFiles/SoftwareList.cs | 18 +- SabreTools.Library/DatItems/Auxiliary.cs | 108 ++++++++--- SabreTools.Library/DatItems/DatItem.cs | 8 +- 7 files changed, 243 insertions(+), 102 deletions(-) diff --git a/SabreTools.Library/DatFiles/Json.cs b/SabreTools.Library/DatFiles/Json.cs index f2307c93..55b8a0ea 100644 --- a/SabreTools.Library/DatFiles/Json.cs +++ b/SabreTools.Library/DatFiles/Json.cs @@ -678,7 +678,10 @@ namespace SabreTools.Library.DatFiles jtr.Read(); // Mask Key string mask = jtr.ReadAsString(); - var dip = new ListXMLDipSwitch(name, tag, mask); + var dipSwitch = new ListXMLDipSwitch(); + dipSwitch.Name = name; + dipSwitch.Tag = tag; + dipSwitch.Mask = mask; jtr.Read(); // Start dipvalues object while (!sr.EndOfStream) @@ -695,12 +698,17 @@ namespace SabreTools.Library.DatFiles bool? def = jtr.ReadAsString().AsYesNo(); jtr.Read(); // End object - dip.Values.Add(new ListXMLDipValue(valname, value, def)); + var dipValue = new ListXMLDipValue(); + dipValue.Name = valname; + dipValue.Value = value; + dipValue.Default = def; + + dipSwitch.Values.Add(dipValue); } jtr.Read(); // End object - machine.DipSwitches.Add(dip); + machine.DipSwitches.Add(dipSwitch); } break; @@ -840,7 +848,7 @@ namespace SabreTools.Library.DatFiles datItem.AltName = altName; datItem.AltTitle = altTitle; - datItem.Original = new OpenMSXOriginal(original, null); + datItem.Original = new OpenMSXOriginal() { Name = original }; datItem.OpenMSXSubType = subType; datItem.OpenMSXType = msxType; datItem.Remark = remark; @@ -2216,7 +2224,7 @@ namespace SabreTools.Library.DatFiles if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.Original, Header.ExcludeFields))) { jtw.WritePropertyName("original"); - jtw.WriteValue(datItem.Original.Original); + jtw.WriteValue(datItem.Original.Name); } if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.OpenMSXSubType, Header.ExcludeFields))) { diff --git a/SabreTools.Library/DatFiles/Listxml.cs b/SabreTools.Library/DatFiles/Listxml.cs index c0e2d790..6f08948c 100644 --- a/SabreTools.Library/DatFiles/Listxml.cs +++ b/SabreTools.Library/DatFiles/Listxml.cs @@ -314,80 +314,79 @@ namespace SabreTools.Library.DatFiles // TODO: Should any be additional Machine fields? case "chip": - // TODO: Make a new object for this - // string chip_name = reader.GetAttribute("name"); - // string chip_tag = reader.GetAttribute("tag"); - // string chip_type = reader.GetAttribute("type"); // (cpu|audio) - // string chip_clock = reader.GetAttribute("clock"); + // TODO: Use these chips + var chip = new ListXMLChip(); + chip.Name = reader.GetAttribute("name"); + chip.Tag = reader.GetAttribute("tag"); + chip.Type = reader.GetAttribute("type"); + chip.Clock = reader.GetAttribute("clock"); reader.Read(); break; case "display": - // TODO: Make a new object for this - // string display_tag = reader.GetAttribute("tag"); - // string display_type = reader.GetAttribute("type"); // (raster|vector|lcd|svg|unknown) - // string display_rotate = reader.GetAttribute("rotate"); // (0|90|180|270) - // bool? display_flipx = Utilities.GetYesNo(reader.GetAttribute("flipx")); - // string display_width = reader.GetAttribute("width"); - // string display_height = reader.GetAttribute("height"); - // string display_refresh = reader.GetAttribute("refresh"); - // string display_pixclock = reader.GetAttribute("pixclock"); - // string display_htotal = reader.GetAttribute("htotal"); - // string display_hbend = reader.GetAttribute("hbend"); - // string display_hbstart = reader.GetAttribute("hbstart"); - // string display_vtotal = reader.GetAttribute("vtotal"); - // string display_vbend = reader.GetAttribute("vbend"); - // string display_vbstart = reader.GetAttribute("vbstart"); + // TODO: Use these displays + var display = new ListXMLDisplay(); + display.Tag = reader.GetAttribute("tag"); + display.Type = reader.GetAttribute("type"); + display.Rotate = reader.GetAttribute("rotate"); + display.FlipX = reader.GetAttribute("flipx").AsYesNo(); + display.Width = reader.GetAttribute("width"); + display.Height = reader.GetAttribute("height"); + display.Refresh = reader.GetAttribute("refresh"); + display.PixClock = reader.GetAttribute("pixclock"); + display.HTotal = reader.GetAttribute("htotal"); + display.HBend = reader.GetAttribute("hbend"); + display.HStart = reader.GetAttribute("hstart"); + display.VTotal = reader.GetAttribute("vtotal"); + display.VBend = reader.GetAttribute("vbend"); + display.VStart = reader.GetAttribute("vstart"); reader.Read(); break; case "sound": - // TODO: Make a new object for this - // string sound_channels = reader.GetAttribute("channels"); + // TODO: Use these sounds + var sound = new ListXMLSound(); + sound.Channels = reader.GetAttribute("channels"); reader.Read(); break; case "condition": - // TODO: Make a new object for this - // string condition_tag = reader.GetAttribute("tag"); - // string condition_mask = reader.GetAttribute("mask"); - // string condition_relation = reader.GetAttribute("relation"); // (eq|ne|gt|le|lt|ge) - // string condition_value = reader.GetAttribute("value"); + // TODO: Use these conditions + var condition = new ListXMLCondition(); + condition.Tag = reader.GetAttribute("tag"); + condition.Mask = reader.GetAttribute("mask"); + condition.Relation = reader.GetAttribute("relation"); + condition.Value = reader.GetAttribute("value"); reader.Read(); break; case "input": - // TODO: Make a new object for this - // bool? input_service = Utilities.GetYesNo(reader.GetAttribute("service")); - // bool? input_tilt = Utilities.GetYesNo(reader.GetAttribute("tilt")); - // string input_players = reader.GetAttribute("players"); - // string input_coins = reader.GetAttribute("coins"); + // TODO: Use these inputs + var input = new ListXMLInput(); + input.Service = reader.GetAttribute("service").AsYesNo(); + input.Tilt = reader.GetAttribute("tilt").AsYesNo(); + input.Players = reader.GetAttribute("players"); + input.Coins = reader.GetAttribute("coins"); - // // While the subtree contains elements... - // TODO: Make a new object for this - // string control_type = reader.GetAttribute("type"); - // string control_player = reader.GetAttribute("player"); - // string control_buttons = reader.GetAttribute("buttons"); - // string control_regbuttons = reader.GetAttribute("regbuttons"); - // string control_minimum = reader.GetAttribute("minimum"); - // string control_maximum = reader.GetAttribute("maximum"); - // string control_sensitivity = reader.GetAttribute("sensitivity"); - // string control_keydelta = reader.GetAttribute("keydelta"); - // bool? control_reverse = Utilities.GetYesNo(reader.GetAttribute("reverse")); - // string control_ways = reader.GetAttribute("ways"); - // string control_ways2 = reader.GetAttribute("ways2"); - // string control_ways3 = reader.GetAttribute("ways3"); + // Now read the internal tags + ReadInput(reader.ReadSubtree(), input); + // Skip the input now that we've processed it reader.Skip(); break; case "dipswitch": // TODO: Use these dipswitches - var dipSwitch = new ListXMLDipSwitch(reader.GetAttribute("name"), reader.GetAttribute("tag"), reader.GetAttribute("mask")); + var dipSwitch = new ListXMLDipSwitch(); + dipSwitch.Name = reader.GetAttribute("name"); + dipSwitch.Tag = reader.GetAttribute("tag"); + dipSwitch.Mask = reader.GetAttribute("mask"); + + // Now read the internal tags ReadDipSwitch(reader.ReadSubtree(), dipSwitch); // Skip the dipswitch now that we've processed it @@ -573,7 +572,63 @@ namespace SabreTools.Library.DatFiles } /// - /// Read DipSwitch DipValues information + /// Read Input information + /// + /// XmlReader representing a diskarea block + /// ListXMLInput to populate + private void ReadInput(XmlReader reader, ListXMLInput input) + { + // If we have an empty trurip, skip it + if (reader == null) + return; + + // Get list ready + input.Controls = new List(); + + // Otherwise, add what is possible + reader.MoveToContent(); + + while (!reader.EOF) + { + // We only want elements + if (reader.NodeType != XmlNodeType.Element) + { + reader.Read(); + continue; + } + + // Get the information from the dipswitch + switch (reader.Name) + { + case "control": + var control = new ListXMLControl(); + control.Type = reader.GetAttribute("type"); + control.Player = reader.GetAttribute("player"); + control.Buttons = reader.GetAttribute("buttons"); + control.RegButtons = reader.GetAttribute("regbuttons"); + control.Minimum = reader.GetAttribute("minimum"); + control.Maximum = reader.GetAttribute("maximum"); + control.Sensitivity = reader.GetAttribute("sensitivity"); + control.KeyDelta = reader.GetAttribute("keydelta"); + control.Reverse = reader.GetAttribute("reverse").AsYesNo(); + control.Ways = reader.GetAttribute("ways"); + control.Ways2 = reader.GetAttribute("ways2"); + control.Ways3 = reader.GetAttribute("ways3"); + + input.Controls.Add(control); + + reader.Read(); + break; + + default: + reader.Read(); + break; + } + } + } + + /// + /// Read DipSwitch information /// /// XmlReader representing a diskarea block /// ListXMLDipSwitch to populate @@ -603,18 +658,24 @@ namespace SabreTools.Library.DatFiles switch (reader.Name) { case "diplocation": - dipSwitch.Locations.Add(new ListXMLDipLocation( - reader.GetAttribute("name"), - reader.GetAttribute("number"), - reader.GetAttribute("inverted").AsYesNo())); + var dipLocation = new ListXMLDipLocation(); + dipLocation.Name = reader.GetAttribute("name"); + dipLocation.Number = reader.GetAttribute("number"); + dipLocation.Inverted = reader.GetAttribute("inverted").AsYesNo(); + + dipSwitch.Locations.Add(dipLocation); + reader.Read(); break; case "dipvalue": - dipSwitch.Values.Add(new ListXMLDipValue( - reader.GetAttribute("name"), - reader.GetAttribute("value"), - reader.GetAttribute("default").AsYesNo())); + var dipValue = new ListXMLDipValue(); + dipValue.Name = reader.GetAttribute("name"); + dipValue.Value = reader.GetAttribute("value"); + dipValue.Default = reader.GetAttribute("default").AsYesNo(); + + dipSwitch.Values.Add(dipValue); + reader.Read(); break; diff --git a/SabreTools.Library/DatFiles/OpenMSX.cs b/SabreTools.Library/DatFiles/OpenMSX.cs index 28be49a6..a84d75a2 100644 --- a/SabreTools.Library/DatFiles/OpenMSX.cs +++ b/SabreTools.Library/DatFiles/OpenMSX.cs @@ -248,9 +248,9 @@ namespace SabreTools.Library.DatFiles break; case "original": - bool? value = reader.GetAttribute("value").AsYesNo(); - string orig = reader.ReadElementContentAsString(); - original = new OpenMSXOriginal(orig, value); + original = new OpenMSXOriginal(); + original.Value = reader.GetAttribute("value").AsYesNo(); + original.Name = reader.ReadElementContentAsString(); break; default: @@ -730,7 +730,7 @@ namespace SabreTools.Library.DatFiles { xtw.WriteStartElement("original"); xtw.WriteAttributeString("value", rom.Original.Value == true ? "true" : "false"); - xtw.WriteString(rom.Original.Original); + xtw.WriteString(rom.Original.Name); xtw.WriteEndElement(); } diff --git a/SabreTools.Library/DatFiles/SeparatedValue.cs b/SabreTools.Library/DatFiles/SeparatedValue.cs index 561ea027..216137c9 100644 --- a/SabreTools.Library/DatFiles/SeparatedValue.cs +++ b/SabreTools.Library/DatFiles/SeparatedValue.cs @@ -715,7 +715,7 @@ namespace SabreTools.Library.DatFiles AltName = altName, AltTitle = altTitle, - Original = new OpenMSXOriginal(original, null), + Original = new OpenMSXOriginal() { Name = original }, OpenMSXSubType = subType, OpenMSXType = msxType, Remark = remark, @@ -750,7 +750,7 @@ namespace SabreTools.Library.DatFiles AltName = altName, AltTitle = altTitle, - Original = new OpenMSXOriginal(original, null), + Original = new OpenMSXOriginal() { Name = original }, OpenMSXSubType = subType, OpenMSXType = msxType, Remark = remark, @@ -788,7 +788,7 @@ namespace SabreTools.Library.DatFiles AltName = altName, AltTitle = altTitle, - Original = new OpenMSXOriginal(original, null), + Original = new OpenMSXOriginal() { Name = original }, OpenMSXSubType = subType, OpenMSXType = msxType, Remark = remark, @@ -838,7 +838,7 @@ namespace SabreTools.Library.DatFiles AltName = altName, AltTitle = altTitle, - Original = new OpenMSXOriginal(original, null), + Original = new OpenMSXOriginal() { Name = original }, OpenMSXSubType = subType, OpenMSXType = msxType, Remark = remark, @@ -878,7 +878,7 @@ namespace SabreTools.Library.DatFiles AltName = altName, AltTitle = altTitle, - Original = new OpenMSXOriginal(original, null), + Original = new OpenMSXOriginal() { Name = original }, OpenMSXSubType = subType, OpenMSXType = msxType, Remark = remark, @@ -932,7 +932,7 @@ namespace SabreTools.Library.DatFiles AltName = altName, AltTitle = altTitle, - Original = new OpenMSXOriginal(original, null), + Original = new OpenMSXOriginal() { Name = original }, OpenMSXSubType = subType, OpenMSXType = msxType, Remark = remark, diff --git a/SabreTools.Library/DatFiles/SoftwareList.cs b/SabreTools.Library/DatFiles/SoftwareList.cs index 18e36a34..5d7f4e1c 100644 --- a/SabreTools.Library/DatFiles/SoftwareList.cs +++ b/SabreTools.Library/DatFiles/SoftwareList.cs @@ -334,7 +334,12 @@ namespace SabreTools.Library.DatFiles case "dipswitch": // TODO: Use these dipswitches - var dipSwitch = new ListXMLDipSwitch(reader.GetAttribute("name"), reader.GetAttribute("tag"), reader.GetAttribute("mask")); + var dipSwitch = new ListXMLDipSwitch(); + dipSwitch.Name = reader.GetAttribute("name"); + dipSwitch.Tag = reader.GetAttribute("tag"); + dipSwitch.Mask = reader.GetAttribute("mask"); + + // Now read the internal tags ReadDipSwitch(reader.ReadSubtree(), dipSwitch); // Skip the dipswitch now that we've processed it @@ -590,10 +595,13 @@ namespace SabreTools.Library.DatFiles switch (reader.Name) { case "dipvalue": - dipSwitch.Values.Add(new ListXMLDipValue( - reader.GetAttribute("name"), - reader.GetAttribute("value"), - reader.GetAttribute("default").AsYesNo())); + var dipValue = new ListXMLDipValue(); + dipValue.Name = reader.GetAttribute("name"); + dipValue.Value = reader.GetAttribute("value"); + dipValue.Default = reader.GetAttribute("default").AsYesNo(); + + dipSwitch.Values.Add(dipValue); + reader.Read(); break; diff --git a/SabreTools.Library/DatItems/Auxiliary.cs b/SabreTools.Library/DatItems/Auxiliary.cs index 2677a9b1..ada554cb 100644 --- a/SabreTools.Library/DatItems/Auxiliary.cs +++ b/SabreTools.Library/DatItems/Auxiliary.cs @@ -33,20 +33,76 @@ namespace SabreTools.Library.DatItems /// public class OpenMSXOriginal { - public string Original { get; set; } + public string Name { get; set; } public bool? Value { get; set; } - - public OpenMSXOriginal(string original, bool? value) - { - Original = original; - Value = value; - } } #endregion #region ListXML + /// + /// Represents one ListXML chip + /// + public class ListXMLChip + { + public string Name { get; set; } + public string Tag { get; set; } + public string Type { get; set; } // TODO: (cpu|audio) + public string Clock { get; set; } + } + + /// + /// Represents one ListXML condition + /// + public class ListXMLCondition + { + public string Tag { get; set; } + public string Mask { get; set; } + public string Relation { get; set; } // TODO: (eq|ne|gt|le|lt|ge) + public string Value { get; set; } + } + + /// + /// Represents one ListXML control + /// + public class ListXMLControl + { + public string Type { get; set; } + public string Player { get; set; } // TODO: Int32? + public string Buttons { get; set; } // TODO: Int32? + public string RegButtons { get; set; } // TODO: Int32? + public string Minimum { get; set; } // TODO: Int32? Float? + public string Maximum { get; set; } // TODO: Int32? Float? + public string Sensitivity { get; set; } // TODO: Int32? Float? + public string KeyDelta { get; set; } // TODO: Int32? Float? + public bool? Reverse { get; set; } + public string Ways { get; set; } // TODO: Int32? Float? + public string Ways2 { get; set; } // TODO: Int32? Float? + public string Ways3 { get; set; } // TODO: Int32? Float? + } + + /// + /// Represents one ListXML display + /// + public class ListXMLDisplay + { + public string Tag { get; set; } + public string Type { get; set; } // TODO: (raster|vector|lcd|svg|unknown) + public string Rotate { get; set; } // TODO: (0|90|180|270) Int32? + public bool? FlipX { get; set; } + public string Width { get; set; } // TODO: Int32? + public string Height { get; set; } // TODO: Int32? + public string Refresh { get; set; } // TODO: Int32? Float? + public string PixClock { get; set; } // TODO: Int32? Float? + public string HTotal { get; set; } // TODO: Int32? Float? + public string HBend { get; set; } // TODO: Int32? Float? + public string HStart { get; set; } // TODO: Int32? Float? + public string VTotal { get; set; } // TODO: Int32? Float? + public string VBend { get; set; } // TODO: Int32? Float? + public string VStart { get; set; } // TODO: Int32? Float? + } + /// /// Represents one ListXML dipswitch /// @@ -59,11 +115,8 @@ namespace SabreTools.Library.DatItems public List Locations { get; set; } public List Values { get; set; } - public ListXMLDipSwitch(string name, string tag, string mask) + public ListXMLDipSwitch() { - Name = name; - Tag = tag; - Mask = mask; Locations = new List(); Values = new List(); } @@ -77,13 +130,6 @@ namespace SabreTools.Library.DatItems public string Name { get; set; } public string Number { get; set; } public bool? Inverted { get; set; } - - public ListXMLDipLocation(string name, string number, bool? inverted) - { - Name = name; - Number = number; - Inverted = inverted; - } } /// @@ -95,15 +141,33 @@ namespace SabreTools.Library.DatItems public string Name { get; set; } public string Value { get; set; } public bool? Default { get; set; } + } - public ListXMLDipValue(string name, string value, bool? def) + /// + /// Represents one ListXML input + /// + public class ListXMLInput + { + public bool? Service { get; set; } + public bool? Tilt { get; set; } + public string Players { get; set; } // TODO: Int32? + public string Coins { get; set; } // TODO: Int32? + public List Controls { get; set; } + + public ListXMLInput() { - Name = name; - Value = value; - Default = def; + Controls = new List(); } } + /// + /// Represents one ListXML sound + /// + public class ListXMLSound + { + public string Channels { get; set; } // TODO: Int32? + } + #endregion #region SoftwareList diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs index ed19a0ff..18e34e2d 100644 --- a/SabreTools.Library/DatItems/DatItem.cs +++ b/SabreTools.Library/DatItems/DatItem.cs @@ -352,7 +352,7 @@ namespace SabreTools.Library.DatItems #region OpenMSX case Field.Original: - fieldValue = Original.Original; + fieldValue = Original.Name; break; case Field.OpenMSXSubType: fieldValue = OpenMSXSubType.ToString(); @@ -442,7 +442,7 @@ namespace SabreTools.Library.DatItems #region OpenMSX if (mappings.Keys.Contains(Field.Original)) - Original = new OpenMSXOriginal(mappings[Field.Original], null); + Original = new OpenMSXOriginal() { Name = mappings[Field.Original] }; if (mappings.Keys.Contains(Field.OpenMSXSubType)) OpenMSXSubType = mappings[Field.OpenMSXSubType].AsOpenMSXSubType(); @@ -725,9 +725,9 @@ namespace SabreTools.Library.DatItems #region OpenMSX // Filter on original - if (filter.Original.MatchesPositiveSet(Original.Original) == false) + if (filter.Original.MatchesPositiveSet(Original.Name) == false) return false; - if (filter.Original.MatchesNegativeSet(Original.Original) == true) + if (filter.Original.MatchesNegativeSet(Original.Name) == true) return false; // Filter on OpenMSX subtype