diff --git a/OfflineMerge/OfflineMerge.cs b/OfflineMerge/OfflineMerge.cs index f1e24cec..75c16943 100644 --- a/OfflineMerge/OfflineMerge.cs +++ b/OfflineMerge/OfflineMerge.cs @@ -144,16 +144,19 @@ namespace SabreTools { // First get the combination Dictionary of currentAllMerged and currentNewMerged _logger.User("Adding Current and New Merged DATs to the dictionary"); - Dictionary> completeDats = new Dictionary>(); + DatData completeDats = new DatData + { + Roms = new Dictionary>(), + }; completeDats = RomManipulation.ParseDict(_currentAllMerged, 0, 0, completeDats, _logger); completeDats = RomManipulation.ParseDict(_currentNewMerged, 0, 0, completeDats, _logger); // Now get Net New output dictionary [(currentNewMerged)-(currentAllMerged)] _logger.User("Creating and populating Net New dictionary"); Dictionary> netNew = new Dictionary>(); - foreach (string key in completeDats.Keys) + foreach (string key in completeDats.Roms.Keys) { - List templist = RomManipulation.Merge(completeDats[key]); + List templist = RomManipulation.Merge(completeDats.Roms[key]); foreach (RomData rom in templist) { if (rom.Dupe == DupeType.None && rom.System == _currentNewMerged) @@ -175,9 +178,9 @@ namespace SabreTools // Now create the Unneeded dictionary [(currentAllMerged)-(currentNewMerged)] _logger.User("Creating and populating Uneeded dictionary"); Dictionary> unneeded = new Dictionary>(); - foreach (string key in completeDats.Keys) + foreach (string key in completeDats.Roms.Keys) { - List templist = RomManipulation.Merge(completeDats[key]); + List templist = RomManipulation.Merge(completeDats.Roms[key]); foreach (RomData rom in templist) { if (rom.Dupe == DupeType.None && rom.System == _currentAllMerged) @@ -198,23 +201,26 @@ namespace SabreTools // Now create the New Missing dictionary [(Net New)+(currentMissingMerged-(Unneeded))] _logger.User("Creating and populating New Missing dictionary"); - Dictionary> midMissing = new Dictionary>(); + DatData midMissing = new DatData + { + Roms = new Dictionary>(), + }; midMissing = RomManipulation.ParseDict(_currentMissingMerged, 0, 0, midMissing, _logger); foreach (string key in unneeded.Keys) { - if (midMissing.ContainsKey(key)) + if (midMissing.Roms.ContainsKey(key)) { - midMissing[key].AddRange(unneeded[key]); + midMissing.Roms[key].AddRange(unneeded[key]); } else { - midMissing.Add(key, unneeded[key]); + midMissing.Roms.Add(key, unneeded[key]); } } Dictionary> newMissing = new Dictionary>(); - foreach (string key in midMissing.Keys) + foreach (string key in midMissing.Roms.Keys) { - List templist = RomManipulation.Merge(midMissing[key]); + List templist = RomManipulation.Merge(midMissing.Roms[key]); foreach (RomData rom in templist) { if (rom.Dupe == DupeType.None && rom.System == _currentMissingMerged) @@ -258,11 +264,11 @@ namespace SabreTools midHave.Add(key, newMissing[key]); } } - foreach (string key in completeDats.Keys) + foreach (string key in completeDats.Roms.Keys) { if (midHave.ContainsKey(key)) { - foreach (RomData rom in completeDats[key]) + foreach (RomData rom in completeDats.Roms[key]) { if (rom.System == _currentNewMerged) { @@ -273,7 +279,7 @@ namespace SabreTools else { List roms = new List(); - foreach (RomData rom in completeDats[key]) + foreach (RomData rom in completeDats.Roms[key]) { if (rom.System == _currentNewMerged) { @@ -448,13 +454,16 @@ namespace SabreTools { // Now create the Have dictionary [(currentAllMerged)-(currentMissingMerged)] _logger.User("Creating and populating Have dictionary"); - Dictionary> midHave = new Dictionary>(); + DatData midHave = new DatData + { + Roms = new Dictionary>(), + }; midHave = RomManipulation.ParseDict(_currentMissingMerged, 0, 0, midHave, _logger); midHave = RomManipulation.ParseDict(_currentAllMerged, 0, 0, midHave, _logger); Dictionary> have = new Dictionary>(); - foreach (string key in midHave.Keys) + foreach (string key in midHave.Roms.Keys) { - List templist = RomManipulation.Merge(midHave[key]); + List templist = RomManipulation.Merge(midHave.Roms[key]); foreach (RomData rom in templist) { if (rom.Dupe == DupeType.None && rom.System == _currentAllMerged) @@ -518,13 +527,16 @@ namespace SabreTools { // Now create the Have dictionary [(currentNewMerged)-(currentMissingMerged)] _logger.User("Creating and populating Have dictionary"); - Dictionary> midHave = new Dictionary>(); + DatData midHave = new DatData + { + Roms = new Dictionary>(), + }; midHave = RomManipulation.ParseDict(_currentMissingMerged, 0, 0, midHave, _logger); midHave = RomManipulation.ParseDict(_currentNewMerged, 0, 0, midHave, _logger); Dictionary> have = new Dictionary>(); - foreach (string key in midHave.Keys) + foreach (string key in midHave.Roms.Keys) { - List templist = RomManipulation.Merge(midHave[key]); + List templist = RomManipulation.Merge(midHave.Roms[key]); foreach (RomData rom in templist) { if (rom.Dupe == DupeType.None && rom.System == _currentNewMerged) diff --git a/SabreHelper/RomManipulation.cs b/SabreHelper/RomManipulation.cs index f3334a35..45760ea2 100644 --- a/SabreHelper/RomManipulation.cs +++ b/SabreHelper/RomManipulation.cs @@ -375,22 +375,6 @@ namespace SabreTools.Helper /// Logger object for console and/or file output /// DatData object representing the read-in data public static DatData ParseDict(string filename, int sysid, int srcid, DatData datdata, Logger logger) - { - Dictionary> roms = ParseDict(filename, sysid, srcid, datdata.Roms, logger); - datdata.Roms = roms; - return datdata; - } - - /// - /// Parse a DAT and return all found games and roms within - /// - /// Name of the file to be parsed - /// System ID for the DAT - /// Source ID for the DAT - /// The dictionary to add found roms to - /// Logger object for console and/or file output - /// Dictionary with "size-crc" key and List of RomData objects value representing the found data - public static Dictionary> ParseDict(string filename, int sysid, int srcid, Dictionary> dict, Logger logger) { XmlTextReader xtr = GetXmlTextReader(filename, logger); bool superdat = false, shouldbreak = false; @@ -415,14 +399,104 @@ namespace SabreTools.Helper xtr.Read(); break; case "header": - xtr.ReadToDescendant("name"); - string content = xtr.ReadElementContentAsString(); - superdat = (content != null ? content.Contains(" - SuperDAT") : false); - while (xtr.Name != "header") + // We want to process the entire subtree of the header + XmlReader headreader = xtr.ReadSubtree(); + + if (headreader != null) { - xtr.Read(); + while (headreader.Read()) + { + // We only want elements + if (headreader.NodeType != XmlNodeType.Element) + { + continue; + } + + // Get all header items (ONLY OVERWRITE IF THERE'S NO DATA) + switch (xtr.Name) + { + case "name": + string readname = headreader.ReadElementContentAsString(); + datdata.Name = (datdata.Name == "" ? readname : ""); + superdat = superdat || readname.Contains(" - SuperDAT"); + break; + case "description": + datdata.Description = (datdata.Description == "" ? headreader.ReadElementContentAsString() : datdata.Description); + break; + case "category": + datdata.Category = (datdata.Category == "" ? headreader.ReadElementContentAsString() : datdata.Category); + break; + case "version": + datdata.Version = (datdata.Version == "" ? headreader.ReadElementContentAsString() : datdata.Version); + break; + case "date": + datdata.Date = (datdata.Date == "" ? headreader.ReadElementContentAsString() : datdata.Date); + break; + case "author": + datdata.Author = (datdata.Author == "" ? headreader.ReadElementContentAsString() : datdata.Author); + break; + case "email": + datdata.Email = (datdata.Email == "" ? headreader.ReadElementContentAsString() : datdata.Email); + break; + case "homepage": + datdata.Homepage = (datdata.Homepage == "" ? headreader.ReadElementContentAsString() : datdata.Homepage); + break; + case "url": + datdata.Url = (datdata.Url == "" ? headreader.ReadElementContentAsString() : datdata.Url); + break; + case "comment": + datdata.Comment = (datdata.Comment == "" ? headreader.ReadElementContentAsString() : datdata.Comment); + break; + case "clrmamepro": + if (headreader.GetAttribute("forcemerging") != null) + { + switch (headreader.GetAttribute("forcemerging")) + { + case "split": + datdata.ForceMerging = ForceMerging.Split; + break; + case "none": + datdata.ForceMerging = ForceMerging.None; + break; + case "full": + datdata.ForceMerging = ForceMerging.Full; + break; + } + } + if (headreader.GetAttribute("forcenodump") != null) + { + switch (headreader.GetAttribute("forcenodump")) + { + case "obsolete": + datdata.ForceNodump = ForceNodump.Obsolete; + break; + case "required": + datdata.ForceNodump = ForceNodump.Required; + break; + case "ignore": + datdata.ForceNodump = ForceNodump.Ignore; + break; + } + } + if (headreader.GetAttribute("forcepacking") != null) + { + switch (headreader.GetAttribute("forcepacking")) + { + case "zip": + datdata.ForcePacking = ForcePacking.Zip; + break; + case "unzip": + datdata.ForcePacking = ForcePacking.Unzip; + break; + } + } + break; + } + } } - xtr.Read(); + + // Skip the header node now that we've processed it + xtr.Skip(); break; case "machine": case "game": @@ -491,11 +565,11 @@ namespace SabreTools.Helper // If the rom is continue or ignore, add the size to the previous rom if (xtr.GetAttribute("loadflag") == "continue" || xtr.GetAttribute("loadflag") == "ignore") { - int index = dict[key].Count() - 1; - RomData lastrom = dict[key][index]; + int index = datdata.Roms[key].Count() - 1; + RomData lastrom = datdata.Roms[key][index]; lastrom.Size += size; - dict[key].RemoveAt(index); - dict[key].Add(lastrom); + datdata.Roms[key].RemoveAt(index); + datdata.Roms[key].Add(lastrom); continue; } @@ -548,15 +622,15 @@ namespace SabreTools.Helper System = filename, }; - if (dict.ContainsKey(key)) + if (datdata.Roms.ContainsKey(key)) { - dict[key].Add(value); + datdata.Roms[key].Add(value); } else { List newvalue = new List(); newvalue.Add(value); - dict.Add(key, newvalue); + datdata.Roms.Add(key, newvalue); } } break; @@ -583,7 +657,7 @@ namespace SabreTools.Helper } } - return dict; + return datdata; } /// diff --git a/UncompressedSize/UncompressedSize.cs b/UncompressedSize/UncompressedSize.cs index cfdc2a87..a988e908 100644 --- a/UncompressedSize/UncompressedSize.cs +++ b/UncompressedSize/UncompressedSize.cs @@ -34,9 +34,12 @@ namespace SabreTools long size = 0; foreach (string filename in inputs) { - Dictionary> roms = new Dictionary>(); - roms = RomManipulation.ParseDict(filename, 0, 0, roms, logger); - foreach (List romlist in roms.Values) + DatData datdata = new DatData + { + Roms = new Dictionary>(), + }; + datdata = RomManipulation.ParseDict(filename, 0, 0, datdata, logger); + foreach (List romlist in datdata.Roms.Values) { foreach (RomData rom in romlist) {