mirror of
https://github.com/claunia/SabreTools.git
synced 2025-12-16 19:14:27 +00:00
This made sense at one point, but none of the operations that once used the concurrency in the type still process concurrently. As such, this class has been made redundant. All places that it was used previously have reverted to standard `List<T>`.
203 lines
8.2 KiB
C#
203 lines
8.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Text;
|
|
using SabreTools.DatItems;
|
|
|
|
namespace SabreTools.DatFiles.Formats
|
|
{
|
|
/// <summary>
|
|
/// Represents a Missfile
|
|
/// </summary>
|
|
internal sealed class Missfile : DatFile
|
|
{
|
|
/// <summary>
|
|
/// Constructor designed for casting a base DatFile
|
|
/// </summary>
|
|
/// <param name="datFile">Parent DatFile to copy from</param>
|
|
public Missfile(DatFile? datFile) : base(datFile)
|
|
{
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
/// <remarks>There is no consistent way to parse a missfile</remarks>
|
|
public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
protected override List<string>? GetMissingRequiredFields(DatItem datItem)
|
|
{
|
|
// TODO: Check required fields
|
|
return null;
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
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)
|
|
{
|
|
List<DatItem> 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.GetBoolFieldValue(DatHeader.UseRomNameKey) == true || !ShouldIgnore(datItem, ignoreblanks))
|
|
WriteDatItem(sw, datItem, lastgame);
|
|
|
|
// Set the new data to compare against
|
|
lastgame = datItem.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey);
|
|
}
|
|
}
|
|
|
|
logger.User($"'{outfile}' written!{Environment.NewLine}");
|
|
sw.Dispose();
|
|
fs.Dispose();
|
|
}
|
|
catch (Exception ex) when (!throwOnError)
|
|
{
|
|
logger.Error(ex);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public override bool WriteToFileDB(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 ItemsDB.SortedKeys)
|
|
{
|
|
// If this machine doesn't contain any writable items, skip
|
|
var items = ItemsDB.GetItemsForBucket(key, filter: true);
|
|
if (items == null || !ContainsWritable(items))
|
|
continue;
|
|
|
|
// Resolve the names in the block
|
|
items = [.. DatItem.ResolveNamesDB([.. items])];
|
|
|
|
for (int index = 0; index < items.Length; index++)
|
|
{
|
|
// Check for a "null" item
|
|
var datItem = items[index];
|
|
datItem = ProcessNullifiedItem(datItem);
|
|
|
|
// Get the machine for the item
|
|
var machine = ItemsDB.GetMachineForItem(datItem.Item1);
|
|
|
|
// Write out the item if we're using machine names or we're not ignoring
|
|
if (!Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true || !ShouldIgnore(datItem, ignoreblanks))
|
|
WriteDatItemDB(sw, datItem, lastgame);
|
|
|
|
// Set the new data to compare against
|
|
lastgame = machine.Item2!.GetStringFieldValue(Models.Metadata.Machine.NameKey);
|
|
}
|
|
}
|
|
|
|
logger.User($"'{outfile}' written!{Environment.NewLine}");
|
|
sw.Dispose();
|
|
fs.Dispose();
|
|
}
|
|
catch (Exception ex) when (!throwOnError)
|
|
{
|
|
logger.Error(ex);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Write out DatItem using the supplied StreamWriter
|
|
/// </summary>
|
|
/// <param name="sw">StreamWriter to output to</param>
|
|
/// <param name="datItem">DatItem object to be output</param>
|
|
/// <param name="lastgame">The name of the last game to be output</param>
|
|
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.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)?.IsActive == true || Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true)
|
|
sw.Write($"{datItem.GetName() ?? string.Empty}\n");
|
|
else if (!Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true && datItem.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) != lastgame)
|
|
sw.Write($"{datItem.GetFieldValue<Machine>(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey) ?? string.Empty}\n");
|
|
|
|
sw.Flush();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Write out DatItem using the supplied StreamWriter
|
|
/// </summary>
|
|
/// <param name="sw">StreamWriter to output to</param>
|
|
/// <param name="datItem">DatItem object to be output</param>
|
|
/// <param name="lastgame">The name of the last game to be output</param>
|
|
private void WriteDatItemDB(StreamWriter sw, (long, DatItem) datItem, string? lastgame)
|
|
{
|
|
// Get the machine for the item
|
|
var machine = ItemsDB.GetMachineForItem(datItem.Item1);
|
|
|
|
// Process the item name
|
|
ProcessItemNameDB(datItem, false, forceRomName: false);
|
|
|
|
// Romba mode automatically uses item name
|
|
if (Header.GetFieldValue<DepotInformation?>(DatHeader.OutputDepotKey)?.IsActive == true || Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true)
|
|
sw.Write($"{datItem.Item2.GetName() ?? string.Empty}\n");
|
|
else if (!Header.GetBoolFieldValue(DatHeader.UseRomNameKey) == true && machine.Item2!.GetStringFieldValue(Models.Metadata.Machine.NameKey) != lastgame)
|
|
sw.Write($"{machine.Item2!.GetStringFieldValue(Models.Metadata.Machine.NameKey) ?? string.Empty}\n");
|
|
|
|
sw.Flush();
|
|
}
|
|
}
|
|
}
|