diff --git a/SabreTools.Library/DatFiles/Json.cs b/SabreTools.Library/DatFiles/Json.cs index 90528b5f..c7161b06 100644 --- a/SabreTools.Library/DatFiles/Json.cs +++ b/SabreTools.Library/DatFiles/Json.cs @@ -629,6 +629,25 @@ namespace SabreTools.Library.DatFiles machine.Supported = jtr.ReadAsString().AsYesNo(); break; + case "sharedfeat": + machine.SharedFeatures = new List>(); + jtr.Read(); // Start Array + while (!sr.EndOfStream) + { + jtr.Read(); // Start object (or end array) + if (jtr.TokenType == JsonToken.EndArray) + break; + + jtr.Read(); // Key + string key = jtr.Value as string; + string value = jtr.ReadAsString(); + jtr.Read(); // End object + + machine.SharedFeatures.Add(new KeyValuePair(key, value)); + } + + break; + #endregion default: @@ -1687,6 +1706,20 @@ namespace SabreTools.Library.DatFiles jtw.WriteValue("no"); } } + if (!string.IsNullOrWhiteSpace(datItem.GetField(Field.SharedFeatures, Header.ExcludeFields))) + { + jtw.WritePropertyName("sharedfeat"); + jtw.WriteStartArray(); + foreach (var feature in datItem.Machine.SharedFeatures) + { + jtw.WriteStartObject(); + jtw.WritePropertyName(feature.Key); + jtw.WriteValue(feature.Value); + jtw.WriteEndObject(); + } + + jtw.WriteEndArray(); + } #endregion diff --git a/SabreTools.Library/DatFiles/SeparatedValue.cs b/SabreTools.Library/DatFiles/SeparatedValue.cs index e33baa2e..d3779a33 100644 --- a/SabreTools.Library/DatFiles/SeparatedValue.cs +++ b/SabreTools.Library/DatFiles/SeparatedValue.cs @@ -461,6 +461,17 @@ namespace SabreTools.Library.DatFiles machine.Supported = value.AsYesNo(); break; + case "Machine.SharedFeatures": + machine.SharedFeatures = new List>(); + var sharedFeatures = value.Split(';'); + foreach (var sharedFeature in sharedFeatures) + { + var featurePair = sharedFeature.Split('='); + machine.SharedFeatures.Add(new KeyValuePair(featurePair[0], featurePair[1])); + } + + break; + #endregion #endregion // Machine @@ -1171,6 +1182,17 @@ namespace SabreTools.Library.DatFiles case "supported": return "Machine.Supported"; + case "sharedfeat": + case "shared feat": + case "shared-feat": + case "sharedfeature": + case "shared feature": + case "shared-feature": + case "sharedfeatures": + case "shared features": + case "shared-features": + return "Machine.SharedFeatures"; + #endregion #endregion // Machine diff --git a/SabreTools.Library/DatFiles/SoftwareList.cs b/SabreTools.Library/DatFiles/SoftwareList.cs index cfeedf3b..e0ab5845 100644 --- a/SabreTools.Library/DatFiles/SoftwareList.cs +++ b/SabreTools.Library/DatFiles/SoftwareList.cs @@ -146,6 +146,7 @@ namespace SabreTools.Library.DatFiles CloneOf = reader.GetAttribute("cloneof") ?? string.Empty, Infos = new List>(), + SharedFeatures = new List>(), MachineType = (machineType == MachineType.NULL ? MachineType.None : machineType), }; @@ -184,8 +185,7 @@ namespace SabreTools.Library.DatFiles break; case "sharedfeat": - // string sharedfeat_name = reader.GetAttribute("name"); - // string sharedfeat_value = reader.GetAttribute("value"); + machine.SharedFeatures.Add(new KeyValuePair(reader.GetAttribute("name"), reader.GetAttribute("value"))); reader.Read(); break; @@ -742,6 +742,17 @@ namespace SabreTools.Library.DatFiles } } + if (!Header.ExcludeFields.Contains(Field.SharedFeatures) && datItem.Machine.SharedFeatures != null && datItem.Machine.SharedFeatures.Count > 0) + { + foreach (KeyValuePair kvp in datItem.Machine.SharedFeatures) + { + xtw.WriteStartElement("sharedfeat"); + xtw.WriteAttributeString("name", kvp.Key); + xtw.WriteAttributeString("value", kvp.Value); + xtw.WriteEndElement(); + } + } + xtw.Flush(); } catch (Exception ex) diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs index 21ed6ff1..038d7dc9 100644 --- a/SabreTools.Library/DatItems/DatItem.cs +++ b/SabreTools.Library/DatItems/DatItem.cs @@ -222,6 +222,7 @@ namespace SabreTools.Library.DatItems // SoftwareList Field.Supported, + Field.SharedFeatures, }; #endregion diff --git a/SabreTools.Library/DatItems/Enums.cs b/SabreTools.Library/DatItems/Enums.cs index 98fd0f45..e61139da 100644 --- a/SabreTools.Library/DatItems/Enums.cs +++ b/SabreTools.Library/DatItems/Enums.cs @@ -90,6 +90,7 @@ namespace SabreTools.Library.DatItems #region SoftwareList Supported, + SharedFeatures, #endregion diff --git a/SabreTools.Library/DatItems/Machine.cs b/SabreTools.Library/DatItems/Machine.cs index 0cdf0359..a704e8fd 100644 --- a/SabreTools.Library/DatItems/Machine.cs +++ b/SabreTools.Library/DatItems/Machine.cs @@ -165,6 +165,7 @@ namespace SabreTools.Library.DatItems /// /// List of info items /// + /// Also in SoftwareList [JsonProperty("infos")] public List> Infos { get; set; } = null; @@ -253,6 +254,13 @@ namespace SabreTools.Library.DatItems [JsonProperty("supported")] public bool? Supported { get; set; } = true; + /// + /// List of shared feature items + /// + /// Also in SoftwareList + [JsonProperty("sharedfeat")] + public List> SharedFeatures { get; set; } = null; + #endregion #endregion @@ -403,6 +411,9 @@ namespace SabreTools.Library.DatItems case Field.Supported: fieldValue = Supported?.ToString(); break; + case Field.SharedFeatures: + fieldValue = string.Join(";", (SharedFeatures ?? new List>()).Select(i => $"{i.Key}={i.Value}")); + break; #endregion @@ -572,6 +583,19 @@ namespace SabreTools.Library.DatItems if (mappings.Keys.Contains(Field.Supported)) Supported = mappings[Field.Supported].AsYesNo(); + if (mappings.Keys.Contains(Field.SharedFeatures)) + { + if (SharedFeatures == null) + SharedFeatures = new List>(); + + string[] pairs = mappings[Field.SharedFeatures].Split(';'); + foreach (string pair in pairs) + { + string[] split = pair.Split('='); + SharedFeatures.Add(new KeyValuePair(split[0], split[1])); + } + } + #endregion } @@ -671,6 +695,7 @@ namespace SabreTools.Library.DatItems #region SoftwareList Supported = this.Supported, + SharedFeatures = this.SharedFeatures, #endregion }; @@ -1076,6 +1101,9 @@ namespace SabreTools.Library.DatItems if (fields.Contains(Field.Supported)) Supported = null; + if (fields.Contains(Field.SharedFeatures)) + SharedFeatures = null; + #endregion } @@ -1221,6 +1249,9 @@ namespace SabreTools.Library.DatItems if (fields.Contains(Field.Supported)) Supported = machine.Supported; + if (fields.Contains(Field.SharedFeatures)) + SharedFeatures = machine.SharedFeatures; + #endregion } diff --git a/SabreTools.Library/Filtering/Filter.cs b/SabreTools.Library/Filtering/Filter.cs index ec5fa7db..0c26759d 100644 --- a/SabreTools.Library/Filtering/Filter.cs +++ b/SabreTools.Library/Filtering/Filter.cs @@ -212,6 +212,8 @@ namespace SabreTools.Library.Filtering /// public FilterItem Supported { get; private set; } = new FilterItem() { Neutral = null }; + // TODO: Machine.SharedFeatures - List> + #endregion #endregion // Machine Filters diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs index b9006a71..a64d1b61 100644 --- a/SabreTools.Library/Tools/Converters.cs +++ b/SabreTools.Library/Tools/Converters.cs @@ -297,6 +297,16 @@ namespace SabreTools.Library.Tools case "supported": return Field.Supported; + case "sharedfeat": + case "shared feat": + case "shared-feat": + case "sharedfeature": + case "shared feature": + case "shared-feature": + case "sharedfeatures": + case "shared features": + case "shared-features": + return Field.SharedFeatures; #endregion