Fix JSON read/write, XML write

This commit is contained in:
Matt Nadareski
2020-08-24 11:56:49 -07:00
parent a424f53407
commit d8fdce88c0
26 changed files with 348 additions and 2064 deletions

View File

@@ -721,19 +721,19 @@ namespace SabreTools.Library.DatFiles
cmpw.WriteStartElement("disk");
cmpw.WriteAttributeString("name", disk.Name);
if (!string.IsNullOrWhiteSpace(disk.MD5))
cmpw.WriteAttributeString("md5", disk.MD5.ToLowerInvariant());
cmpw.WriteAttributeString("md5", disk.MD5?.ToLowerInvariant());
#if NET_FRAMEWORK
if (!string.IsNullOrWhiteSpace(disk.RIPEMD160))
cmpw.WriteAttributeString("ripemd160", disk.RIPEMD160.ToLowerInvariant());
cmpw.WriteAttributeString("ripemd160", disk.RIPEMD160?.ToLowerInvariant());
#endif
if (!string.IsNullOrWhiteSpace(disk.SHA1))
cmpw.WriteAttributeString("sha1", disk.SHA1.ToLowerInvariant());
cmpw.WriteAttributeString("sha1", disk.SHA1?.ToLowerInvariant());
if (!string.IsNullOrWhiteSpace(disk.SHA256))
cmpw.WriteAttributeString("sha256", disk.SHA256.ToLowerInvariant());
cmpw.WriteAttributeString("sha256", disk.SHA256?.ToLowerInvariant());
if (!string.IsNullOrWhiteSpace(disk.SHA384))
cmpw.WriteAttributeString("sha384", disk.SHA384.ToLowerInvariant());
cmpw.WriteAttributeString("sha384", disk.SHA384?.ToLowerInvariant());
if (!string.IsNullOrWhiteSpace(disk.SHA512))
cmpw.WriteAttributeString("sha512", disk.SHA512.ToLowerInvariant());
cmpw.WriteAttributeString("sha512", disk.SHA512?.ToLowerInvariant());
if (disk.ItemStatus != ItemStatus.None)
cmpw.WriteAttributeString("flags", disk.ItemStatus.ToString().ToLowerInvariant());
cmpw.WriteEndElement();
@@ -761,21 +761,21 @@ namespace SabreTools.Library.DatFiles
if (rom.Size != -1)
cmpw.WriteAttributeString("size", rom.Size.ToString());
if (!string.IsNullOrWhiteSpace(rom.CRC))
cmpw.WriteAttributeString("crc", rom.CRC.ToLowerInvariant());
cmpw.WriteAttributeString("crc", rom.CRC?.ToLowerInvariant());
if (!string.IsNullOrWhiteSpace(rom.MD5))
cmpw.WriteAttributeString("md5", rom.MD5.ToLowerInvariant());
cmpw.WriteAttributeString("md5", rom.MD5?.ToLowerInvariant());
#if NET_FRAMEWORK
if (!string.IsNullOrWhiteSpace(rom.RIPEMD160))
cmpw.WriteAttributeString("ripemd160", rom.RIPEMD160.ToLowerInvariant());
cmpw.WriteAttributeString("ripemd160", rom.RIPEMD160?.ToLowerInvariant());
#endif
if (!string.IsNullOrWhiteSpace(rom.SHA1))
cmpw.WriteAttributeString("sha1", rom.SHA1.ToLowerInvariant());
cmpw.WriteAttributeString("sha1", rom.SHA1?.ToLowerInvariant());
if (!string.IsNullOrWhiteSpace(rom.SHA256))
cmpw.WriteAttributeString("sha256", rom.SHA256.ToLowerInvariant());
cmpw.WriteAttributeString("sha256", rom.SHA256?.ToLowerInvariant());
if (!string.IsNullOrWhiteSpace(rom.SHA384))
cmpw.WriteAttributeString("sha384", rom.SHA384.ToLowerInvariant());
cmpw.WriteAttributeString("sha384", rom.SHA384?.ToLowerInvariant());
if (!string.IsNullOrWhiteSpace(rom.SHA512))
cmpw.WriteAttributeString("sha512", rom.SHA512.ToLowerInvariant());
cmpw.WriteAttributeString("sha512", rom.SHA512?.ToLowerInvariant());
if (!string.IsNullOrWhiteSpace(rom.Date))
cmpw.WriteAttributeString("date", rom.Date);
if (rom.ItemStatus != ItemStatus.None)

View File

@@ -2166,7 +2166,7 @@ namespace SabreTools.Library.DatFiles
});
// Now find all folders that are empty, if we are supposed to
if (!Header.OutputDepot.IsActive && addBlanks)
if (!(Header.OutputDepot?.IsActive ?? false) && addBlanks)
{
List<string> empties = DirectoryExtensions.ListEmpty(basePath);
Parallel.ForEach(empties, Globals.ParallelOptions, dir =>
@@ -2245,7 +2245,7 @@ namespace SabreTools.Library.DatFiles
bool copyFiles)
{
// Special case for if we are in Depot mode (all names are supposed to be SHA-1 hashes)
if (Header.OutputDepot.IsActive)
if (Header.OutputDepot?.IsActive ?? false)
{
GZipArchive gzarc = new GZipArchive(item);
BaseFile baseFile = gzarc.GetTorrentGZFileInfo();
@@ -3841,7 +3841,7 @@ namespace SabreTools.Library.DatFiles
string post = CreatePrefixPostfix(item, false);
// If we're in Depot mode, take care of that instead
if (Header.OutputDepot.IsActive)
if (Header.OutputDepot?.IsActive ?? false)
{
if (item.ItemType == ItemType.Rom)
{
@@ -3928,27 +3928,27 @@ namespace SabreTools.Library.DatFiles
// Ensure we have the proper values for replacement
if (item.ItemType == ItemType.Rom)
{
crc = ((Rom)item).CRC;
md5 = ((Rom)item).MD5;
crc = ((Rom)item).CRC ?? string.Empty;
md5 = ((Rom)item).MD5 ?? string.Empty;
#if NET_FRAMEWORK
ripemd160 = ((Rom)item).RIPEMD160;
ripemd160 = ((Rom)item).RIPEMD160 ?? string.Empty;
#endif
sha1 = ((Rom)item).SHA1;
sha256 = ((Rom)item).SHA256;
sha384 = ((Rom)item).SHA384;
sha512 = ((Rom)item).SHA512;
sha1 = ((Rom)item).SHA1 ?? string.Empty;
sha256 = ((Rom)item).SHA256 ?? string.Empty;
sha384 = ((Rom)item).SHA384 ?? string.Empty;
sha512 = ((Rom)item).SHA512 ?? string.Empty;
size = ((Rom)item).Size.ToString();
}
else if (item.ItemType == ItemType.Disk)
{
md5 = ((Disk)item).MD5;
md5 = ((Disk)item).MD5 ?? string.Empty;
#if NET_FRAMEWORK
ripemd160 = ((Disk)item).RIPEMD160;
ripemd160 = ((Disk)item).RIPEMD160 ?? string.Empty;
#endif
sha1 = ((Disk)item).SHA1;
sha256 = ((Disk)item).SHA256;
sha384 = ((Disk)item).SHA384;
sha512 = ((Disk)item).SHA512;
sha1 = ((Disk)item).SHA1 ?? string.Empty;
sha256 = ((Disk)item).SHA256 ?? string.Empty;
sha384 = ((Disk)item).SHA384 ?? string.Empty;
sha512 = ((Disk)item).SHA512 ?? string.Empty;
}
// Now do bulk replacement where possible
@@ -3956,9 +3956,9 @@ namespace SabreTools.Library.DatFiles
.Replace("%game%", game)
.Replace("%machine%", game)
.Replace("%name%", name)
.Replace("%manufacturer%", item.Machine.Manufacturer)
.Replace("%publisher%", item.Machine.Publisher)
.Replace("%category%", item.Machine.Category)
.Replace("%manufacturer%", item.Machine.Manufacturer ?? string.Empty)
.Replace("%publisher%", item.Machine.Publisher ?? string.Empty)
.Replace("%category%", item.Machine.Category ?? string.Empty)
.Replace("%crc%", crc)
.Replace("%md5%", md5)
.Replace("%ripemd160%", ripemd160)

View File

@@ -21,106 +21,103 @@ namespace SabreTools.Library.DatFiles
/// <summary>
/// External name of the DAT
/// </summary>
[JsonProperty("filename")]
[JsonProperty("filename", DefaultValueHandling = DefaultValueHandling.Include)]
public string FileName { get; set; }
/// <summary>
/// Internal name of the DAT
/// </summary>
[JsonProperty("name")]
[JsonProperty("name", DefaultValueHandling = DefaultValueHandling.Include)]
public string Name { get; set; }
/// <summary>
/// DAT description
/// </summary>
[JsonProperty("description")]
[JsonProperty("description", DefaultValueHandling = DefaultValueHandling.Include)]
public string Description { get; set; }
/// <summary>
/// Root directory for the files; currently TruRip/EmuARC-exclusive
/// </summary>
[JsonProperty("rootdir")]
[JsonProperty("rootdir", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string RootDir { get; set; }
/// <summary>
/// General category of items found in the DAT
/// </summary>
[JsonProperty("category")]
[JsonProperty("category", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Category { get; set; }
/// <summary>
/// Version of the DAT
/// </summary>
[JsonProperty("version")]
[JsonProperty("version", DefaultValueHandling = DefaultValueHandling.Include)]
public string Version { get; set; }
/// <summary>
/// Creation or modification date
/// </summary>
[JsonProperty("date")]
[JsonProperty("date", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Date { get; set; }
/// <summary>
/// List of authors who contributed to the DAT
/// </summary>
[JsonProperty("author")]
[JsonProperty("author", DefaultValueHandling = DefaultValueHandling.Include)]
public string Author { get; set; }
/// <summary>
/// Email address for DAT author(s)
/// </summary>
[JsonProperty("email")]
[JsonProperty("email", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Email { get; set; }
/// <summary>
/// Author or distribution homepage name
/// </summary>
[JsonProperty("homepage")]
[JsonProperty("homepage", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Homepage { get; set; }
/// <summary>
/// Author or distribution URL
/// </summary>
[JsonProperty("url")]
[JsonProperty("url", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Url { get; set; }
/// <summary>
/// Any comment that does not already fit an existing field
/// </summary>
[JsonProperty("comment")]
[JsonProperty("comment", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Comment { get; set; }
/// <summary>
/// Header skipper to be used when loading the DAT
/// </summary>
[JsonProperty("header")]
[JsonProperty("header", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string HeaderSkipper { get; set; }
/// <summary>
/// Classification of the DAT. Generally only used for SuperDAT
/// </summary>
[JsonProperty("type")]
[JsonProperty("type", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Type { get; set; }
/// <summary>
/// Force a merging style when loaded
/// </summary>
/// TODO: Make nullable
[JsonProperty("forcemerging")]
[JsonProperty("forcemerging", DefaultValueHandling = DefaultValueHandling.Ignore)]
public MergingFlag ForceMerging { get; set; }
/// <summary>
/// Force nodump handling when loaded
/// </summary>
/// TODO: Make nullable
[JsonProperty("forcenodump")]
[JsonProperty("forcenodump", DefaultValueHandling = DefaultValueHandling.Ignore)]
public NodumpFlag ForceNodump { get; set; }
/// <summary>
/// Force output packing when loaded
/// </summary>
/// TODO: Make nullable
[JsonProperty("forcepacking")]
[JsonProperty("forcepacking", DefaultValueHandling = DefaultValueHandling.Ignore)]
public PackingFlag ForcePacking { get; set; }
/// <summary>
@@ -185,13 +182,13 @@ namespace SabreTools.Library.DatFiles
/// Debug build flag
/// </summary>
/// <remarks>Also in Logiqx</remarks>
[JsonProperty("debug")]
public bool? Debug { get; set; } = false;
[JsonProperty("debug", DefaultValueHandling = DefaultValueHandling.Ignore)]
public bool? Debug { get; set; } = null;
/// <summary>
/// MAME configuration name
/// </summary>
[JsonProperty("mameconfig")]
[JsonProperty("mameconfig", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string MameConfig { get; set; }
#endregion
@@ -201,46 +198,46 @@ namespace SabreTools.Library.DatFiles
/// <summary>
/// Build version
/// </summary>
[JsonProperty("build")]
[JsonProperty("build", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Build { get; set; }
/// <summary>
/// RomCenter rom mode
/// </summary>
/// <remarks>(merged|split|unmerged) "split"</remarks>
[JsonProperty("rommode")]
[JsonProperty("rommode", DefaultValueHandling = DefaultValueHandling.Ignore)]
public MergingFlag RomMode { get; set; }
/// <summary>
/// RomCenter bios mode
/// </summary>
/// <remarks>(merged|split|unmerged) "split"</remarks>
[JsonProperty("biosmode")]
[JsonProperty("biosmode", DefaultValueHandling = DefaultValueHandling.Ignore)]
public MergingFlag BiosMode { get; set; }
/// <summary>
/// RomCenter sample mode
/// </summary>
/// <remarks>(merged|unmerged) "merged"</remarks>
[JsonProperty("samplemode")]
[JsonProperty("samplemode", DefaultValueHandling = DefaultValueHandling.Ignore)]
public MergingFlag SampleMode { get; set; }
/// <summary>
/// RomCenter lock rom mode
/// </summary>
[JsonProperty("lockrommode")]
[JsonProperty("lockrommode", DefaultValueHandling = DefaultValueHandling.Ignore)]
public bool? LockRomMode { get; set; }
/// <summary>
/// RomCenter lock bios mode
/// </summary>
[JsonProperty("lockbiosmode")]
[JsonProperty("lockbiosmode", DefaultValueHandling = DefaultValueHandling.Ignore)]
public bool? LockBiosMode { get; set; }
/// <summary>
/// RomCenter lock sample mode
/// </summary>
[JsonProperty("locksamplemode")]
[JsonProperty("locksamplemode", DefaultValueHandling = DefaultValueHandling.Ignore)]
public bool? LockSampleMode { get; set; }
#endregion
@@ -261,31 +258,31 @@ namespace SabreTools.Library.DatFiles
/// System
/// </summary>
/// <remarks>Known as "plugin" in Logiqx and RomCenter</remarks>
[JsonProperty("system")]
[JsonProperty("system", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string System { get; set; }
/// <summary>
/// Screenshots width
/// </summary>
[JsonProperty("screenshotswidth")]
[JsonProperty("screenshotswidth", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string ScreenshotsWidth { get; set; }
/// <summary>
/// Screenshots height
/// </summary>
[JsonProperty("screenshotsheight")]
[JsonProperty("screenshotsheight", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string ScreenshotsHeight { get; set; }
/// <summary>
/// OfflineList info list
/// </summary>
[JsonProperty("infos")]
[JsonProperty("infos", DefaultValueHandling = DefaultValueHandling.Ignore)]
public List<OfflineListInfo> Infos { get; set; }
/// <summary>
/// OfflineList can-open extensions
/// </summary>
[JsonProperty("canopen")]
[JsonProperty("canopen", DefaultValueHandling = DefaultValueHandling.Ignore)]
public List<string> CanOpen { get; set; }
// TODO: Implement the following header values:
@@ -299,7 +296,7 @@ namespace SabreTools.Library.DatFiles
/// <summary>
/// Rom title
/// </summary>
[JsonProperty("romtitle")]
[JsonProperty("romtitle", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string RomTitle { get; set; }
#endregion
@@ -309,7 +306,7 @@ namespace SabreTools.Library.DatFiles
/// <summary>
/// RomCenter DAT format version
/// </summary>
[JsonProperty("rcversion")]
[JsonProperty("rcversion", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string RomCenterVersion { get; set; }
#endregion
@@ -575,8 +572,8 @@ namespace SabreTools.Library.DatFiles
ReplaceExtension = datHeader.ReplaceExtension;
RemoveExtension = datHeader.RemoveExtension;
InputDepot = datHeader.InputDepot.Clone() as DepotInformation;
OutputDepot = datHeader.OutputDepot.Clone() as DepotInformation;
InputDepot = datHeader.InputDepot?.Clone() as DepotInformation;
OutputDepot = datHeader.OutputDepot?.Clone() as DepotInformation;
GameName = datHeader.GameName;
Quotes = datHeader.Quotes;
UseRomName = datHeader.UseRomName;

View File

@@ -477,7 +477,7 @@ namespace SabreTools.Library.DatFiles
if (!string.IsNullOrWhiteSpace(rom.Date))
cmpw.WriteAttributeString("date", rom.Date);
if (!string.IsNullOrWhiteSpace(rom.CRC))
cmpw.WriteAttributeString("crc", rom.CRC.ToLowerInvariant());
cmpw.WriteAttributeString("crc", rom.CRC?.ToLowerInvariant());
cmpw.WriteEndElement();
break;
}

View File

@@ -190,12 +190,12 @@ namespace SabreTools.Library.DatFiles
string[] fields = new string[]
{
rom.SHA256,
$"{rom.Machine.Name}/",
rom.Name,
rom.SHA1,
rom.MD5,
rom.CRC,
rom.SHA256 ?? string.Empty,
$"{rom.Machine.Name ?? string.Empty}/",
rom.Name ?? string.Empty,
rom.SHA1 ?? string.Empty,
rom.MD5 ?? string.Empty,
rom.CRC ?? string.Empty,
};
svw.WriteValues(fields);

File diff suppressed because it is too large Load Diff

View File

@@ -445,7 +445,7 @@ namespace SabreTools.Library.DatFiles
// Otherwise, write out the SHA-1 hash
else if (!string.IsNullOrWhiteSpace(disk.SHA1))
sw.Write($" SHA1({disk.SHA1})");
sw.Write($" SHA1({disk.SHA1 ?? string.Empty})");
// If we have a baddump, put the second indicator
if (disk.ItemStatus == ItemStatus.BadDump)
@@ -480,9 +480,9 @@ namespace SabreTools.Library.DatFiles
else
{
if (!string.IsNullOrWhiteSpace(rom.CRC))
sw.Write($" CRC({rom.CRC})");
sw.Write($" CRC({rom.CRC ?? string.Empty})");
if (!string.IsNullOrWhiteSpace(rom.SHA1))
sw.Write($" SHA1({rom.SHA1})");
sw.Write($" SHA1({rom.SHA1 ?? string.Empty})");
}
// If we have a baddump, put the second indicator

View File

@@ -1138,14 +1138,14 @@ namespace SabreTools.Library.DatFiles
var disk = datItem as Disk;
xtw.WriteStartElement("disk");
xtw.WriteRequiredAttributeString("name", disk.Name);
xtw.WriteOptionalAttributeString("md5", disk.MD5.ToLowerInvariant());
xtw.WriteOptionalAttributeString("md5", disk.MD5?.ToLowerInvariant());
#if NET_FRAMEWORK
xtw.WriteOptionalAttributeString("ripemd160", disk.RIPEMD160.ToLowerInvariant());
xtw.WriteOptionalAttributeString("ripemd160", disk.RIPEMD160?.ToLowerInvariant());
#endif
xtw.WriteOptionalAttributeString("sha1", disk.SHA1.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha256", disk.SHA256.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha384", disk.SHA384.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha512", disk.SHA512.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha1", disk.SHA1?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha256", disk.SHA256?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha384", disk.SHA384?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha512", disk.SHA512?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("merge", disk.MergeTag);
xtw.WriteOptionalAttributeString("region", disk.Region);
xtw.WriteOptionalAttributeString("index", disk.Index);
@@ -1160,15 +1160,15 @@ namespace SabreTools.Library.DatFiles
xtw.WriteStartElement("rom");
xtw.WriteRequiredAttributeString("name", rom.Name);
if (rom.Size != -1) xtw.WriteAttributeString("size", rom.Size.ToString());
xtw.WriteOptionalAttributeString("crc", rom.CRC.ToLowerInvariant());
xtw.WriteOptionalAttributeString("md5", rom.MD5.ToLowerInvariant());
xtw.WriteOptionalAttributeString("crc", rom.CRC?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("md5", rom.MD5?.ToLowerInvariant());
#if NET_FRAMEWORK
xtw.WriteOptionalAttributeString("ripemd160", rom.RIPEMD160.ToLowerInvariant());
xtw.WriteOptionalAttributeString("ripemd160", rom?.RIPEMD160.ToLowerInvariant());
#endif
xtw.WriteOptionalAttributeString("sha1", rom.SHA1.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha256", rom.SHA256.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha384", rom.SHA384.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha512", rom.SHA512.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha1", rom.SHA1?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha256", rom.SHA256?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha384", rom.SHA384?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha512", rom.SHA512?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("bios", rom.Bios);
xtw.WriteOptionalAttributeString("merge", rom.MergeTag);
xtw.WriteOptionalAttributeString("region", rom.Region);

View File

@@ -1057,14 +1057,14 @@ namespace SabreTools.Library.DatFiles
var disk = datItem as Disk;
xtw.WriteStartElement("disk");
xtw.WriteRequiredAttributeString("name", disk.Name);
xtw.WriteOptionalAttributeString("md5", disk.MD5.ToLowerInvariant());
xtw.WriteOptionalAttributeString("md5", disk.MD5?.ToLowerInvariant());
#if NET_FRAMEWORK
xtw.WriteOptionalAttributeString("ripemd160", disk.RIPEMD160.ToLowerInvariant());
xtw.WriteOptionalAttributeString("ripemd160", disk.RIPEMD160?.ToLowerInvariant());
#endif
xtw.WriteOptionalAttributeString("sha1", disk.SHA1.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha256", disk.SHA256.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha384", disk.SHA384.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha512", disk.SHA512.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha1", disk.SHA1?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha256", disk.SHA256?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha384", disk.SHA384?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha512", disk.SHA512?.ToLowerInvariant());
if (disk.ItemStatus != ItemStatus.None) xtw.WriteAttributeString("status", disk.ItemStatus.ToString().ToLowerInvariant());
xtw.WriteEndElement();
break;
@@ -1085,15 +1085,15 @@ namespace SabreTools.Library.DatFiles
xtw.WriteStartElement("rom");
xtw.WriteRequiredAttributeString("name", rom.Name);
if (rom.Size != -1) xtw.WriteAttributeString("size", rom.Size.ToString());
xtw.WriteOptionalAttributeString("crc", rom.CRC.ToLowerInvariant());
xtw.WriteOptionalAttributeString("md5", rom.MD5.ToLowerInvariant());
xtw.WriteOptionalAttributeString("crc", rom.CRC?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("md5", rom.MD5?.ToLowerInvariant());
#if NET_FRAMEWORK
xtw.WriteOptionalAttributeString("ripemd160", rom.RIPEMD160.ToLowerInvariant());
xtw.WriteOptionalAttributeString("ripemd160", rom.RIPEMD160?.ToLowerInvariant());
#endif
xtw.WriteOptionalAttributeString("sha1", rom.SHA1.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha256", rom.SHA256.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha384", rom.SHA384.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha512", rom.SHA512.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha1", rom.SHA1?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha256", rom.SHA256?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha384", rom.SHA384?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha512", rom.SHA512?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("date", rom.Date);
if (rom.ItemStatus != ItemStatus.None) xtw.WriteAttributeString("status", rom.ItemStatus.ToString().ToLowerInvariant());
xtw.WriteOptionalAttributeString("inverted", rom.Inverted.FromYesNo());

View File

@@ -136,7 +136,7 @@ namespace SabreTools.Library.DatFiles
ProcessItemName(datItem, false, forceRomName: false);
// Romba mode automatically uses item name
if (Header.OutputDepot.IsActive || Header.UseRomName)
if ((Header.OutputDepot?.IsActive ?? false) || Header.UseRomName)
{
sw.Write($"{datItem.Name}\n");
}

View File

@@ -925,14 +925,14 @@ namespace SabreTools.Library.DatFiles
{
xtw.WriteStartElement("romMD5");
xtw.WriteAttributeString("extension", ".chd");
xtw.WriteString(disk.MD5.ToUpperInvariant());
xtw.WriteString(disk.MD5?.ToUpperInvariant());
xtw.WriteEndElement();
}
else if (!string.IsNullOrWhiteSpace(disk.SHA1))
{
xtw.WriteStartElement("romSHA1");
xtw.WriteAttributeString("extension", ".chd");
xtw.WriteString(disk.SHA1.ToUpperInvariant());
xtw.WriteString(disk.SHA1?.ToUpperInvariant());
xtw.WriteEndElement();
}
@@ -949,21 +949,21 @@ namespace SabreTools.Library.DatFiles
{
xtw.WriteStartElement("romCRC");
xtw.WriteRequiredAttributeString("extension", tempext);
xtw.WriteString(rom.CRC.ToUpperInvariant());
xtw.WriteString(rom.CRC?.ToUpperInvariant());
xtw.WriteEndElement();
}
else if (!string.IsNullOrWhiteSpace(rom.MD5))
{
xtw.WriteStartElement("romMD5");
xtw.WriteRequiredAttributeString("extension", tempext);
xtw.WriteString(rom.MD5.ToUpperInvariant());
xtw.WriteString(rom.MD5?.ToUpperInvariant());
xtw.WriteEndElement();
}
else if (!string.IsNullOrWhiteSpace(rom.SHA1))
{
xtw.WriteStartElement("romSHA1");
xtw.WriteRequiredAttributeString("extension", tempext);
xtw.WriteString(rom.SHA1.ToUpperInvariant());
xtw.WriteString(rom.SHA1?.ToUpperInvariant());
xtw.WriteEndElement();
}

View File

@@ -740,7 +740,7 @@ namespace SabreTools.Library.DatFiles
case OpenMSXSubType.Rom:
case OpenMSXSubType.NULL:
xtw.WriteStartElement("rom");
xtw.WriteRequiredElementString("hash", rom.SHA1.ToLowerInvariant());
xtw.WriteRequiredElementString("hash", rom.SHA1?.ToLowerInvariant());
xtw.WriteOptionalElementString("start", rom.Offset);
xtw.WriteOptionalElementString("type", rom.OpenMSXType);
xtw.WriteOptionalElementString("remark", rom.Remark);
@@ -749,7 +749,7 @@ namespace SabreTools.Library.DatFiles
case OpenMSXSubType.MegaRom:
xtw.WriteStartElement("megarom");
xtw.WriteRequiredElementString("hash", rom.SHA1.ToLowerInvariant());
xtw.WriteRequiredElementString("hash", rom.SHA1?.ToLowerInvariant());
xtw.WriteOptionalElementString("start", rom.Offset);
xtw.WriteOptionalElementString("type", rom.OpenMSXType);
xtw.WriteOptionalElementString("remark", rom.Remark);
@@ -759,7 +759,7 @@ namespace SabreTools.Library.DatFiles
case OpenMSXSubType.SCCPlusCart:
xtw.WriteStartElement("sccpluscart");
xtw.WriteOptionalElementString("boot", rom.Boot);
xtw.WriteRequiredElementString("hash", rom.SHA1.ToLowerInvariant());
xtw.WriteRequiredElementString("hash", rom.SHA1?.ToLowerInvariant());
xtw.WriteOptionalElementString("remark", rom.Remark);
xtw.WriteEndElement();
break;

View File

@@ -532,18 +532,18 @@ namespace SabreTools.Library.DatFiles
case ItemType.Rom:
var rom = datItem as Rom;
iw.WriteString($"¬{rom.Machine.CloneOf}");
iw.WriteString($"¬{rom.Machine.CloneOf}");
iw.WriteString($"¬{rom.Machine.Name}");
if (string.IsNullOrWhiteSpace(rom.Machine.Description))
iw.WriteString($"¬{rom.Machine.Name}");
iw.WriteString($"¬{rom.Machine.CloneOf ?? string.Empty}");
iw.WriteString($"¬{rom.Machine.CloneOf ?? string.Empty}");
iw.WriteString($"¬{rom.Machine.Name ?? string.Empty}");
if (string.IsNullOrWhiteSpace(rom.Machine.Description ?? string.Empty))
iw.WriteString($"¬{rom.Machine.Name ?? string.Empty}");
else
iw.WriteString($"¬{rom.Machine.Description}");
iw.WriteString($"¬{rom.Name}");
iw.WriteString($"¬{rom.CRC}");
iw.WriteString($"¬{rom.Machine.Description ?? string.Empty}");
iw.WriteString($"¬{rom.Name ?? string.Empty}");
iw.WriteString($"¬{rom.CRC ?? string.Empty}");
iw.WriteString($"¬{rom.Size}");
iw.WriteString($"¬{rom.Machine.RomOf}");
iw.WriteString($"¬{rom.MergeTag}");
iw.WriteString($"¬{rom.Machine.RomOf ?? string.Empty}");
iw.WriteString($"¬{rom.MergeTag ?? string.Empty}");
iw.WriteString("¬");
iw.WriteLine();

View File

@@ -902,14 +902,14 @@ namespace SabreTools.Library.DatFiles
xtw.WriteStartElement("file");
xtw.WriteAttributeString("type", "disk");
xtw.WriteRequiredAttributeString("name", disk.Name);
xtw.WriteOptionalAttributeString("md5", disk.MD5.ToLowerInvariant());
xtw.WriteOptionalAttributeString("md5", disk.MD5?.ToLowerInvariant());
#if NET_FRAMEWORK
xtw.WriteOptionalAttributeString("ripemd160", disk.RIPEMD160.ToLowerInvariant());
xtw.WriteOptionalAttributeString("ripemd160", disk.RIPEMD160?.ToLowerInvariant());
#endif
xtw.WriteOptionalAttributeString("sha1", disk.SHA1.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha256", disk.SHA256.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha384", disk.SHA384.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha512", disk.SHA512.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha1", disk.SHA1?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha256", disk.SHA256?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha384", disk.SHA384?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha512", disk.SHA512?.ToLowerInvariant());
if (disk.ItemStatus != ItemStatus.None)
{
xtw.WriteStartElement("flags");
@@ -943,15 +943,15 @@ namespace SabreTools.Library.DatFiles
xtw.WriteAttributeString("type", "rom");
xtw.WriteRequiredAttributeString("name", rom.Name);
if (rom.Size != -1) xtw.WriteAttributeString("size", rom.Size.ToString());
xtw.WriteOptionalAttributeString("crc", rom.CRC.ToLowerInvariant());
xtw.WriteOptionalAttributeString("md5", rom.MD5.ToLowerInvariant());
xtw.WriteOptionalAttributeString("crc", rom.CRC?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("md5", rom.MD5?.ToLowerInvariant());
#if NET_FRAMEWORK
xtw.WriteOptionalAttributeString("ripemd160", rom.RIPEMD160.ToLowerInvariant());
xtw.WriteOptionalAttributeString("ripemd160", rom.RIPEMD160?.ToLowerInvariant());
#endif
xtw.WriteOptionalAttributeString("sha1", rom.SHA1.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha256", rom.SHA256.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha384", rom.SHA384.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha512", rom.SHA512.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha1", rom.SHA1?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha256", rom.SHA256?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha384", rom.SHA384?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha512", rom.SHA512?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("date", rom.Date);
if (rom.ItemStatus != ItemStatus.None)
{

View File

@@ -1723,11 +1723,11 @@ namespace SabreTools.Library.DatFiles
fields[8] = string.Empty;
fields[9] = string.Empty;
fields[10] = disk.MD5.ToLowerInvariant();
//fields[11] = disk.GetField(Field.RIPEMD160, DatHeader.ExcludeFields).ToLowerInvariant();
//fields[11] = disk.RIPEMD160?.ToLowerInvariant();
fields[11] = disk.SHA1.ToLowerInvariant();
fields[12] = disk.SHA256.ToLowerInvariant();
//fields[13] = disk.GetField(Field.SHA384, DatHeader.ExcludeFields).ToLowerInvariant();
//fields[14] = disk.GetField(Field.SHA512, DatHeader.ExcludeFields).ToLowerInvariant();
//fields[13] = disk.SHA384?.ToLowerInvariant();
//fields[14] = disk.SHA512?.ToLowerInvariant();
fields[13] = disk.ItemStatus.ToString();
break;
@@ -1737,13 +1737,13 @@ namespace SabreTools.Library.DatFiles
fields[6] = rom.Name;
fields[7] = string.Empty;
fields[8] = rom.Size.ToString();
fields[9] = rom.CRC.ToLowerInvariant();
fields[10] = rom.MD5.ToLowerInvariant();
//fields[11] = rom.GetField(Field.RIPEMD160, DatHeader.ExcludeFields).ToLowerInvariant();
fields[11] = rom.SHA1.ToLowerInvariant();
fields[12] = rom.SHA256.ToLowerInvariant();
//fields[13] = rom.GetField(Field.SHA384, DatHeader.ExcludeFields).ToLowerInvariant();
//fields[14] = rom.GetField(Field.SHA512, DatHeader.ExcludeFields).ToLowerInvariant();
fields[9] = rom.CRC?.ToLowerInvariant();
fields[10] = rom.MD5?.ToLowerInvariant();
//fields[11] = rom.RIPEMD160?.ToLowerInvariant();
fields[11] = rom.SHA1?.ToLowerInvariant();
fields[12] = rom.SHA256?.ToLowerInvariant();
//fields[13] = rom.SHA384?.ToLowerInvariant();
//fields[14] = rom.SHA512?.ToLowerInvariant();
fields[13] = rom.ItemStatus.ToString();
break;
}

View File

@@ -952,14 +952,14 @@ namespace SabreTools.Library.DatFiles
xtw.WriteStartElement("disk");
xtw.WriteRequiredAttributeString("name", disk.Name);
xtw.WriteOptionalAttributeString("md5", disk.MD5.ToLowerInvariant());
xtw.WriteOptionalAttributeString("md5", disk.MD5?.ToLowerInvariant());
#if NET_FRAMEWORK
xtw.WriteOptionalAttributeString("ripemd160", disk.RIPEMD160.ToLowerInvariant());
xtw.WriteOptionalAttributeString("ripemd160", disk.RIPEMD160?.ToLowerInvariant());
#endif
xtw.WriteOptionalAttributeString("sha1", disk.SHA1.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha256", disk.SHA256.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha384", disk.SHA384.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha512", disk.SHA512.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha1", disk.SHA1?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha256", disk.SHA256?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha384", disk.SHA384?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha512", disk.SHA512?.ToLowerInvariant());
if (disk.ItemStatus != ItemStatus.None) xtw.WriteAttributeString("status", disk.ItemStatus.ToString().ToLowerInvariant());
xtw.WriteOptionalAttributeString("writable", disk.Writable.FromYesNo());
xtw.WriteEndElement();
@@ -982,15 +982,15 @@ namespace SabreTools.Library.DatFiles
xtw.WriteStartElement("rom");
xtw.WriteRequiredAttributeString("name", rom.Name);
if (rom.Size != -1) xtw.WriteAttributeString("size", rom.Size.ToString());
xtw.WriteOptionalAttributeString("crc", rom.CRC.ToLowerInvariant());
xtw.WriteOptionalAttributeString("md5", rom.MD5.ToLowerInvariant());
xtw.WriteOptionalAttributeString("crc", rom.CRC?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("md5", rom.MD5?.ToLowerInvariant());
#if NET_FRAMEWORK
xtw.WriteOptionalAttributeString("ripemd160", rom.RIPEMD160.ToLowerInvariant());
xtw.WriteOptionalAttributeString("ripemd160", rom.RIPEMD160?.ToLowerInvariant());
#endif
xtw.WriteOptionalAttributeString("sha1", rom.SHA1.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha256", rom.SHA256.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha384", rom.SHA384.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha512", rom.SHA512.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha1", rom.SHA1?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha256", rom.SHA256?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha384", rom.SHA384?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("sha512", rom.SHA512?.ToLowerInvariant());
xtw.WriteOptionalAttributeString("offset", rom.Offset);
xtw.WriteOptionalAttributeString("value", rom.Value);
if (rom.ItemStatus != ItemStatus.None) xtw.WriteAttributeString("status", rom.ItemStatus.ToString().ToLowerInvariant());