diff --git a/SabreTools.Library/DatFiles/ClrMamePro.cs b/SabreTools.Library/DatFiles/ClrMamePro.cs
index ffba3774..b8610b94 100644
--- a/SabreTools.Library/DatFiles/ClrMamePro.cs
+++ b/SabreTools.Library/DatFiles/ClrMamePro.cs
@@ -681,91 +681,68 @@ namespace SabreTools.Library.DatFiles
{
case ItemType.Archive:
cmpw.WriteStartElement("archive");
- cmpw.WriteAttributeString("name", datItem.Name);
+ cmpw.WriteRequiredAttributeString("name", datItem.Name);
cmpw.WriteEndElement();
break;
case ItemType.BiosSet:
var biosSet = datItem as BiosSet;
cmpw.WriteStartElement("biosset");
- cmpw.WriteAttributeString("name", biosSet.Name);
- if (!string.IsNullOrWhiteSpace(biosSet.Description))
- cmpw.WriteAttributeString("description", biosSet.Description);
- if (biosSet.Default != null)
- cmpw.WriteAttributeString("default", biosSet.Default.ToString().ToLowerInvariant());
+ cmpw.WriteRequiredAttributeString("name", biosSet.Name);
+ cmpw.WriteOptionalAttributeString("description", biosSet.Description);
+ cmpw.WriteOptionalAttributeString("default", biosSet.Default?.ToString().ToLowerInvariant());
cmpw.WriteEndElement();
break;
case ItemType.Disk:
var disk = datItem as Disk;
cmpw.WriteStartElement("disk");
- cmpw.WriteAttributeString("name", disk.Name);
- if (!string.IsNullOrWhiteSpace(disk.MD5))
- cmpw.WriteAttributeString("md5", disk.MD5?.ToLowerInvariant());
+ cmpw.WriteRequiredAttributeString("name", disk.Name);
+ cmpw.WriteOptionalAttributeString("md5", disk.MD5?.ToLowerInvariant());
#if NET_FRAMEWORK
- if (!string.IsNullOrWhiteSpace(disk.RIPEMD160))
- cmpw.WriteAttributeString("ripemd160", disk.RIPEMD160?.ToLowerInvariant());
+ cmpw.WriteOptionalAttributeString("ripemd160", disk.RIPEMD160?.ToLowerInvariant());
#endif
- if (!string.IsNullOrWhiteSpace(disk.SHA1))
- cmpw.WriteAttributeString("sha1", disk.SHA1?.ToLowerInvariant());
- if (!string.IsNullOrWhiteSpace(disk.SHA256))
- cmpw.WriteAttributeString("sha256", disk.SHA256?.ToLowerInvariant());
- if (!string.IsNullOrWhiteSpace(disk.SHA384))
- cmpw.WriteAttributeString("sha384", disk.SHA384?.ToLowerInvariant());
- if (!string.IsNullOrWhiteSpace(disk.SHA512))
- cmpw.WriteAttributeString("sha512", disk.SHA512?.ToLowerInvariant());
- if (disk.ItemStatus != ItemStatus.None)
- cmpw.WriteAttributeString("flags", disk.ItemStatus.ToString().ToLowerInvariant());
+ cmpw.WriteOptionalAttributeString("sha1", disk.SHA1?.ToLowerInvariant());
+ cmpw.WriteOptionalAttributeString("sha256", disk.SHA256?.ToLowerInvariant());
+ cmpw.WriteOptionalAttributeString("sha384", disk.SHA384?.ToLowerInvariant());
+ cmpw.WriteOptionalAttributeString("sha512", disk.SHA512?.ToLowerInvariant());
+ cmpw.WriteOptionalAttributeString("flags", disk.ItemStatus.FromItemStatus(false));
cmpw.WriteEndElement();
break;
case ItemType.Release:
var release = datItem as Release;
cmpw.WriteStartElement("release");
- cmpw.WriteAttributeString("name", release.Name);
- if (!string.IsNullOrWhiteSpace(release.Region))
- cmpw.WriteAttributeString("region", release.Region);
- if (!string.IsNullOrWhiteSpace(release.Language))
- cmpw.WriteAttributeString("language", release.Language);
- if (!string.IsNullOrWhiteSpace(release.Date))
- cmpw.WriteAttributeString("date", release.Date);
- if (release.Default != null)
- cmpw.WriteAttributeString("default", release.Default.ToString().ToLowerInvariant());
+ cmpw.WriteRequiredAttributeString("name", release.Name);
+ cmpw.WriteOptionalAttributeString("region", release.Region);
+ cmpw.WriteOptionalAttributeString("language", release.Language);
+ cmpw.WriteOptionalAttributeString("date", release.Date);
+ cmpw.WriteOptionalAttributeString("default", release.Default?.ToString().ToLowerInvariant());
cmpw.WriteEndElement();
break;
case ItemType.Rom:
var rom = datItem as Rom;
cmpw.WriteStartElement("rom");
- cmpw.WriteAttributeString("name", rom.Name);
- if (rom.Size != -1)
- cmpw.WriteAttributeString("size", rom.Size.ToString());
- if (!string.IsNullOrWhiteSpace(rom.CRC))
- cmpw.WriteAttributeString("crc", rom.CRC?.ToLowerInvariant());
- if (!string.IsNullOrWhiteSpace(rom.MD5))
- cmpw.WriteAttributeString("md5", rom.MD5?.ToLowerInvariant());
+ cmpw.WriteRequiredAttributeString("name", rom.Name);
+ if (rom.Size != -1) cmpw.WriteAttributeString("size", rom.Size.ToString());
+ cmpw.WriteOptionalAttributeString("crc", rom.CRC?.ToLowerInvariant());
+ cmpw.WriteOptionalAttributeString("md5", rom.MD5?.ToLowerInvariant());
#if NET_FRAMEWORK
- if (!string.IsNullOrWhiteSpace(rom.RIPEMD160))
- cmpw.WriteAttributeString("ripemd160", rom.RIPEMD160?.ToLowerInvariant());
+ cmpw.WriteOptionalAttributeString("ripemd160", rom.RIPEMD160?.ToLowerInvariant());
#endif
- if (!string.IsNullOrWhiteSpace(rom.SHA1))
- cmpw.WriteAttributeString("sha1", rom.SHA1?.ToLowerInvariant());
- if (!string.IsNullOrWhiteSpace(rom.SHA256))
- cmpw.WriteAttributeString("sha256", rom.SHA256?.ToLowerInvariant());
- if (!string.IsNullOrWhiteSpace(rom.SHA384))
- cmpw.WriteAttributeString("sha384", rom.SHA384?.ToLowerInvariant());
- if (!string.IsNullOrWhiteSpace(rom.SHA512))
- cmpw.WriteAttributeString("sha512", rom.SHA512?.ToLowerInvariant());
- if (!string.IsNullOrWhiteSpace(rom.Date))
- cmpw.WriteAttributeString("date", rom.Date);
- if (rom.ItemStatus != ItemStatus.None)
- cmpw.WriteAttributeString("flags", rom.ItemStatus.ToString().ToLowerInvariant());
+ cmpw.WriteOptionalAttributeString("sha1", rom.SHA1?.ToLowerInvariant());
+ cmpw.WriteOptionalAttributeString("sha256", rom.SHA256?.ToLowerInvariant());
+ cmpw.WriteOptionalAttributeString("sha384", rom.SHA384?.ToLowerInvariant());
+ cmpw.WriteOptionalAttributeString("sha512", rom.SHA512?.ToLowerInvariant());
+ cmpw.WriteOptionalAttributeString("date", rom.Date);
+ cmpw.WriteOptionalAttributeString("flags", rom.ItemStatus.FromItemStatus(false));
cmpw.WriteEndElement();
break;
case ItemType.Sample:
cmpw.WriteStartElement("sample");
- cmpw.WriteAttributeString("name", datItem.Name);
+ cmpw.WriteRequiredAttributeString("name", datItem.Name);
cmpw.WriteEndElement();
break;
}
diff --git a/SabreTools.Library/DatFiles/DosCenter.cs b/SabreTools.Library/DatFiles/DosCenter.cs
index 738db200..0736bf66 100644
--- a/SabreTools.Library/DatFiles/DosCenter.cs
+++ b/SabreTools.Library/DatFiles/DosCenter.cs
@@ -471,13 +471,10 @@ namespace SabreTools.Library.DatFiles
case ItemType.Rom:
var rom = datItem as Rom;
cmpw.WriteStartElement("file");
- cmpw.WriteAttributeString("name", datItem.Name);
- if (rom.Size != -1)
- cmpw.WriteAttributeString("size", rom.Size.ToString());
- if (!string.IsNullOrWhiteSpace(rom.Date))
- cmpw.WriteAttributeString("date", rom.Date);
- if (!string.IsNullOrWhiteSpace(rom.CRC))
- cmpw.WriteAttributeString("crc", rom.CRC?.ToLowerInvariant());
+ cmpw.WriteRequiredAttributeString("name", datItem.Name);
+ if (rom.Size != -1) cmpw.WriteAttributeString("size", rom.Size.ToString());
+ cmpw.WriteOptionalAttributeString("date", rom.Date);
+ cmpw.WriteOptionalAttributeString("crc", rom.CRC?.ToLowerInvariant());
cmpw.WriteEndElement();
break;
}
diff --git a/SabreTools.Library/IO/ClrMameProWriter.cs b/SabreTools.Library/IO/ClrMameProWriter.cs
index 2a35af32..6efc9416 100644
--- a/SabreTools.Library/IO/ClrMameProWriter.cs
+++ b/SabreTools.Library/IO/ClrMameProWriter.cs
@@ -176,6 +176,23 @@ namespace SabreTools.Library.IO
WriteEndElement();
}
+ ///
+ /// Ensure writing writing null values as empty strings
+ ///
+ public void WriteRequiredElementString(string name, string value)
+ {
+ WriteElementString(name, value ?? string.Empty);
+ }
+
+ ///
+ /// Write an element, if the value is not null or empty
+ ///
+ public void WriteOptionalElementString(string name, string value)
+ {
+ if (!string.IsNullOrEmpty(value))
+ WriteElementString(name, value);
+ }
+
///
/// Write the start of an attribute node
///
@@ -222,6 +239,23 @@ namespace SabreTools.Library.IO
WriteEndAttribute();
}
+ ///
+ /// Ensure writing writing null values as empty strings
+ ///
+ public void WriteRequiredAttributeString(string name, string value)
+ {
+ WriteAttributeString(name, value ?? string.Empty);
+ }
+
+ ///
+ /// Write an attribute, if the value is not null or empty
+ ///
+ public void WriteOptionalAttributeString(string name, string value)
+ {
+ if (!string.IsNullOrEmpty(value))
+ WriteAttributeString(name, value);
+ }
+
///
/// Write a standalone attribute
///