Files
SabreTools/SabreTools.DatFiles/Formats/Hashfile.Writer.cs

177 lines
7.5 KiB
C#
Raw Normal View History

2023-07-28 21:34:34 -04:00
using System;
using System.Collections.Generic;
using SabreTools.Core;
using SabreTools.DatItems;
using SabreTools.DatItems.Formats;
namespace SabreTools.DatFiles.Formats
{
/// <summary>
/// Represents writing a hashfile such as an SFV, MD5, or SHA-1 file
/// </summary>
internal partial class Hashfile : DatFile
{
/// <inheritdoc/>
protected override ItemType[] GetSupportedTypes()
{
2024-02-28 19:19:50 -05:00
return
[
2023-07-28 21:34:34 -04:00
ItemType.Disk,
ItemType.Media,
ItemType.Rom
2024-02-28 19:19:50 -05:00
];
2023-07-28 21:34:34 -04:00
}
/// <inheritdoc/>
2024-03-05 23:41:00 -05:00
protected override List<string>? GetMissingRequiredFields(DatItem datItem)
2023-07-28 21:34:34 -04:00
{
2024-03-05 23:41:00 -05:00
var missingFields = new List<string>();
2023-07-28 21:34:34 -04:00
// Check item name
2024-02-28 22:54:56 -05:00
if (string.IsNullOrEmpty(datItem.GetName()))
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Rom.NameKey);
2023-07-28 21:34:34 -04:00
// Check hash linked to specific Hashfile type
switch (_hash)
{
2023-09-11 10:27:17 -04:00
case Serialization.Hash.CRC:
2024-03-10 16:49:07 -04:00
switch (datItem)
2023-07-28 21:34:34 -04:00
{
2024-03-10 16:49:07 -04:00
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.CRCKey)))
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Rom.CRCKey);
2023-07-28 21:34:34 -04:00
break;
default:
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Rom.CRCKey);
2023-07-28 21:34:34 -04:00
break;
}
break;
2023-09-11 10:27:17 -04:00
case Serialization.Hash.MD5:
2024-03-10 16:49:07 -04:00
switch (datItem)
2023-07-28 21:34:34 -04:00
{
2024-03-10 16:49:07 -04:00
case Disk disk:
if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.MD5Key)))
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Disk.MD5Key);
2023-07-28 21:34:34 -04:00
break;
2024-03-10 16:49:07 -04:00
case Media medium:
if (string.IsNullOrEmpty(medium.GetStringFieldValue(Models.Metadata.Media.MD5Key)))
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Media.MD5Key);
2023-07-28 21:34:34 -04:00
break;
2024-03-10 16:49:07 -04:00
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.MD5Key)))
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Rom.MD5Key);
2023-07-28 21:34:34 -04:00
break;
default:
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Rom.MD5Key);
2023-07-28 21:34:34 -04:00
break;
}
break;
2023-09-11 10:27:17 -04:00
case Serialization.Hash.SHA1:
2024-03-10 16:49:07 -04:00
switch (datItem)
2023-07-28 21:34:34 -04:00
{
2024-03-10 16:49:07 -04:00
case Disk disk:
if (string.IsNullOrEmpty(disk.GetStringFieldValue(Models.Metadata.Disk.SHA1Key)))
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Disk.SHA1Key);
2023-07-28 21:34:34 -04:00
break;
2024-03-10 16:49:07 -04:00
case Media medium:
if (string.IsNullOrEmpty(medium.GetStringFieldValue(Models.Metadata.Media.SHA1Key)))
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Media.SHA1Key);
2023-07-28 21:34:34 -04:00
break;
2024-03-10 16:49:07 -04:00
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA1Key)))
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Rom.SHA1Key);
2023-07-28 21:34:34 -04:00
break;
default:
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Rom.SHA1Key);
2023-07-28 21:34:34 -04:00
break;
}
break;
2023-09-11 10:27:17 -04:00
case Serialization.Hash.SHA256:
2024-03-10 16:49:07 -04:00
switch (datItem)
2023-07-28 21:34:34 -04:00
{
2024-03-10 16:49:07 -04:00
case Media medium:
if (string.IsNullOrEmpty(medium.GetStringFieldValue(Models.Metadata.Media.SHA256Key)))
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Media.SHA256Key);
2023-07-28 21:34:34 -04:00
break;
2024-03-10 16:49:07 -04:00
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA256Key)))
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Rom.SHA256Key);
2023-07-28 21:34:34 -04:00
break;
default:
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Rom.SHA256Key);
2023-07-28 21:34:34 -04:00
break;
}
break;
2023-09-11 10:27:17 -04:00
case Serialization.Hash.SHA384:
2024-03-10 16:49:07 -04:00
switch (datItem)
2023-07-28 21:34:34 -04:00
{
2024-03-10 16:49:07 -04:00
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA384Key)))
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Rom.SHA384Key);
2023-07-28 21:34:34 -04:00
break;
default:
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Rom.SHA384Key);
2023-07-28 21:34:34 -04:00
break;
}
break;
2023-09-11 10:27:17 -04:00
case Serialization.Hash.SHA512:
2024-03-10 16:49:07 -04:00
switch (datItem)
2023-07-28 21:34:34 -04:00
{
2024-03-10 16:49:07 -04:00
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SHA512Key)))
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Rom.SHA512Key);
2023-07-28 21:34:34 -04:00
break;
default:
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Rom.SHA512Key);
2023-07-28 21:34:34 -04:00
break;
}
break;
2023-09-11 10:27:17 -04:00
case Serialization.Hash.SpamSum:
2024-03-10 16:49:07 -04:00
switch (datItem)
2023-07-28 21:34:34 -04:00
{
2024-03-10 16:49:07 -04:00
case Media medium:
if (string.IsNullOrEmpty(medium.GetStringFieldValue(Models.Metadata.Media.SpamSumKey)))
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Media.SpamSumKey);
2023-07-28 21:34:34 -04:00
break;
2024-03-10 16:49:07 -04:00
case Rom rom:
if (string.IsNullOrEmpty(rom.GetStringFieldValue(Models.Metadata.Rom.SpamSumKey)))
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Rom.SpamSumKey);
2023-07-28 21:34:34 -04:00
break;
default:
2024-03-05 23:41:00 -05:00
missingFields.Add(Models.Metadata.Rom.SpamSumKey);
2023-07-28 21:34:34 -04:00
break;
}
break;
}
return missingFields;
}
/// <inheritdoc/>
public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false)
{
try
{
logger.User($"Writing to '{outfile}'...");
// Serialize the input file
var metadata = ConvertMetadata(ignoreblanks);
var hashfile = new Serialization.CrossModel.Hashfile().Deserialize(metadata, _hash);
2023-09-11 01:20:21 -04:00
if (!(new Serialization.Files.Hashfile().Serialize(hashfile, outfile, _hash)))
2023-07-28 21:34:34 -04:00
{
logger.Warning($"File '{outfile}' could not be written! See the log for more details.");
return false;
}
}
catch (Exception ex) when (!throwOnError)
{
logger.Error(ex);
return false;
}
2023-07-31 11:33:03 -04:00
logger.User($"'{outfile}' written!{Environment.NewLine}");
2023-07-28 21:34:34 -04:00
return true;
}
}
}