diff --git a/SabreTools.DatFiles/Formats/Missfile.Reader.cs b/SabreTools.DatFiles/Formats/Missfile.Reader.cs new file mode 100644 index 00000000..fa12a0bf --- /dev/null +++ b/SabreTools.DatFiles/Formats/Missfile.Reader.cs @@ -0,0 +1,17 @@ +using System; + +namespace SabreTools.DatFiles.Formats +{ + /// + /// Represents parsing a Missfile + /// + internal partial class Missfile : DatFile + { + /// + /// There is no consistent way to parse a missfile + public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false) + { + throw new NotImplementedException(); + } + } +} diff --git a/SabreTools.DatFiles/Formats/Missfile.Writer.cs b/SabreTools.DatFiles/Formats/Missfile.Writer.cs new file mode 100644 index 00000000..da2cde2a --- /dev/null +++ b/SabreTools.DatFiles/Formats/Missfile.Writer.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using SabreTools.Core; +using SabreTools.DatItems; + +namespace SabreTools.DatFiles.Formats +{ + /// + /// Represents writing a Missfile + /// + internal partial class Missfile : DatFile + { + /// + protected override List GetMissingRequiredFields(DatItem datItem) + { + // TODO: Check required fields + return null; + } + + /// + public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false) + { + try + { + logger.User($"Writing to '{outfile}'..."); + FileStream fs = File.Create(outfile); + + // If we get back null for some reason, just log and return + if (fs == null) + { + logger.Warning($"File '{outfile}' could not be created for writing! Please check to see if the file is writable"); + return false; + } + + StreamWriter sw = new(fs, new UTF8Encoding(false)); + + // Write out each of the machines and roms + string lastgame = null; + + // Use a sorted list of games to output + foreach (string key in Items.SortedKeys) + { + ConcurrentList datItems = Items.FilteredItems(key); + + // If this machine doesn't contain any writable items, skip + if (!ContainsWritable(datItems)) + continue; + + // Resolve the names in the block + datItems = DatItem.ResolveNames(datItems); + + for (int index = 0; index < datItems.Count; index++) + { + DatItem datItem = datItems[index]; + + // Check for a "null" item + datItem = ProcessNullifiedItem(datItem); + + // Write out the item if we're using machine names or we're not ignoring + if (!Header.UseRomName || !ShouldIgnore(datItem, ignoreblanks)) + WriteDatItem(sw, datItem, lastgame); + + // Set the new data to compare against + lastgame = datItem.Machine.Name; + } + } + + logger.User($"'{outfile}' written!{Environment.NewLine}"); + sw.Dispose(); + fs.Dispose(); + } + catch (Exception ex) when (!throwOnError) + { + logger.Error(ex); + return false; + } + + return true; + } + + /// + /// Write out DatItem using the supplied StreamWriter + /// + /// StreamWriter to output to + /// DatItem object to be output + /// The name of the last game to be output + private void WriteDatItem(StreamWriter sw, DatItem datItem, string lastgame) + { + // Process the item name + ProcessItemName(datItem, false, forceRomName: false); + + // Romba mode automatically uses item name + if (Header.OutputDepot?.IsActive == true || Header.UseRomName) + sw.Write($"{datItem.GetName() ?? string.Empty}\n"); + else if (!Header.UseRomName && datItem.Machine.Name != lastgame) + sw.Write($"{datItem.Machine.Name}\n"); + + sw.Flush(); + } + } +} diff --git a/SabreTools.DatFiles/Formats/Missfile.cs b/SabreTools.DatFiles/Formats/Missfile.cs index c33a4acb..1c38332c 100644 --- a/SabreTools.DatFiles/Formats/Missfile.cs +++ b/SabreTools.DatFiles/Formats/Missfile.cs @@ -1,16 +1,9 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using SabreTools.Core; -using SabreTools.DatItems; - -namespace SabreTools.DatFiles.Formats +namespace SabreTools.DatFiles.Formats { /// - /// Represents parsing and writing of a Missfile + /// Represents a Missfile /// - internal class Missfile : DatFile + internal partial class Missfile : DatFile { /// /// Constructor designed for casting a base DatFile @@ -20,100 +13,5 @@ namespace SabreTools.DatFiles.Formats : base(datFile) { } - - /// - public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false) - { - // There is no consistent way to parse a missfile... - throw new NotImplementedException(); - } - - /// - protected override List GetMissingRequiredFields(DatItem datItem) - { - // TODO: Check required fields - return null; - } - - /// - public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false) - { - try - { - logger.User($"Writing to '{outfile}'..."); - FileStream fs = File.Create(outfile); - - // If we get back null for some reason, just log and return - if (fs == null) - { - logger.Warning($"File '{outfile}' could not be created for writing! Please check to see if the file is writable"); - return false; - } - - StreamWriter sw = new(fs, new UTF8Encoding(false)); - - // Write out each of the machines and roms - string lastgame = null; - - // Use a sorted list of games to output - foreach (string key in Items.SortedKeys) - { - ConcurrentList datItems = Items.FilteredItems(key); - - // If this machine doesn't contain any writable items, skip - if (!ContainsWritable(datItems)) - continue; - - // Resolve the names in the block - datItems = DatItem.ResolveNames(datItems); - - for (int index = 0; index < datItems.Count; index++) - { - DatItem datItem = datItems[index]; - - // Check for a "null" item - datItem = ProcessNullifiedItem(datItem); - - // Write out the item if we're using machine names or we're not ignoring - if (!Header.UseRomName || !ShouldIgnore(datItem, ignoreblanks)) - WriteDatItem(sw, datItem, lastgame); - - // Set the new data to compare against - lastgame = datItem.Machine.Name; - } - } - - logger.User($"'{outfile}' written!{Environment.NewLine}"); - sw.Dispose(); - fs.Dispose(); - } - catch (Exception ex) when (!throwOnError) - { - logger.Error(ex); - return false; - } - - return true; - } - - /// - /// Write out DatItem using the supplied StreamWriter - /// - /// StreamWriter to output to - /// DatItem object to be output - /// The name of the last game to be output - private void WriteDatItem(StreamWriter sw, DatItem datItem, string lastgame) - { - // Process the item name - ProcessItemName(datItem, false, forceRomName: false); - - // Romba mode automatically uses item name - if (Header.OutputDepot?.IsActive == true || Header.UseRomName) - sw.Write($"{datItem.GetName() ?? string.Empty}\n"); - else if (!Header.UseRomName && datItem.Machine.Name != lastgame) - sw.Write($"{datItem.Machine.Name}\n"); - - sw.Flush(); - } } }