using System; using SabreTools.Core; using SabreTools.Core.Tools; namespace SabreTools.DatFiles.Formats { /// /// Represents parsing a Logiqx-derived DAT /// internal partial class Logiqx : DatFile { /// public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false) { try { // Deserialize the input file var metadataFile = new Serialization.Files.Logiqx().Deserialize(filename); var metadata = new Serialization.CrossModel.Logiqx().Serialize(metadataFile); // Convert the header to the internal format ConvertHeader(metadataFile, keep); // Convert to the internal format ConvertMetadata(metadata, filename, indexId, statsOnly); } catch (Exception ex) when (!throwOnError) { string message = $"'{filename}' - An error occurred during parsing"; logger.Error(ex, message); } } #region Converters /// /// Convert header information /// /// Deserialized model to convert /// True if full pathnames are to be kept, false otherwise (default) private void ConvertHeader(Models.Logiqx.Datafile? datafile, bool keep) { // If the datafile is missing, we can't do anything if (datafile == null) return; if (Header.GetFieldValue(Models.Metadata.Header.BuildKey) == null) Header.SetFieldValue(Models.Metadata.Header.BuildKey, datafile.Build); if (Header.GetFieldValue(Models.Metadata.Header.DebugKey) == null) Header.SetFieldValue(Models.Metadata.Header.DebugKey, datafile.Debug.AsYesNo()); // SchemaLocation is specifically skipped ConvertHeader(datafile.Header, keep); } /// /// Convert header information /// /// Deserialized model to convert /// True if full pathnames are to be kept, false otherwise (default) private void ConvertHeader(Models.Logiqx.Header? header, bool keep) { // If the header is missing, we can't do anything if (header == null) return; if (Header.GetFieldValue(Models.Metadata.Header.IdKey) == null) Header.SetFieldValue(Models.Metadata.Header.IdKey, header.Id); if (Header.GetFieldValue(Models.Metadata.Header.NameKey) == null) Header.SetFieldValue(Models.Metadata.Header.NameKey, header.Name); if (Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) == null) Header.SetFieldValue(Models.Metadata.Header.DescriptionKey, header.Description); if (Header.GetFieldValue(Models.Metadata.Header.RootDirKey) == null) Header.SetFieldValue(Models.Metadata.Header.RootDirKey, header.RootDir); if (Header.GetFieldValue(Models.Metadata.Header.CategoryKey) == null) Header.SetFieldValue(Models.Metadata.Header.CategoryKey, header.Category); if (Header.GetFieldValue(Models.Metadata.Header.VersionKey) == null) Header.SetFieldValue(Models.Metadata.Header.VersionKey, header.Version); if (Header.GetFieldValue(Models.Metadata.Header.DateKey) == null) Header.SetFieldValue(Models.Metadata.Header.DateKey, header.Date); if (Header.GetFieldValue(Models.Metadata.Header.AuthorKey) == null) Header.SetFieldValue(Models.Metadata.Header.AuthorKey, header.Author); if (Header.GetFieldValue(Models.Metadata.Header.EmailKey) == null) Header.SetFieldValue(Models.Metadata.Header.EmailKey, header.Email); if (Header.GetFieldValue(Models.Metadata.Header.HomepageKey) == null) Header.SetFieldValue(Models.Metadata.Header.HomepageKey, header.Homepage); if (Header.GetFieldValue(Models.Metadata.Header.UrlKey) == null) Header.SetFieldValue(Models.Metadata.Header.UrlKey, header.Url); if (Header.GetFieldValue(Models.Metadata.Header.CommentKey) == null) Header.SetFieldValue(Models.Metadata.Header.CommentKey, header.Comment); if (Header.GetFieldValue(Models.Metadata.Header.TypeKey) == null) Header.SetFieldValue(Models.Metadata.Header.TypeKey, header.Type); ConvertSubheader(header.ClrMamePro); ConvertSubheader(header.RomCenter); // Handle implied SuperDAT if (header.Name?.Contains(" - SuperDAT") == true && keep) { if (Header.GetFieldValue(Models.Metadata.Header.TypeKey) == null) Header.SetFieldValue(Models.Metadata.Header.TypeKey, "SuperDAT"); } } /// /// Convert subheader information /// /// Deserialized model to convert private void ConvertSubheader(Models.Logiqx.ClrMamePro? clrMamePro) { // If the subheader is missing, we can't do anything if (clrMamePro == null) return; if (Header.GetFieldValue(Models.Metadata.Header.ForceMergingKey) == MergingFlag.None) Header.SetFieldValue(Models.Metadata.Header.ForceMergingKey, clrMamePro.ForceMerging.AsEnumValue()); if (Header.GetFieldValue(Models.Metadata.Header.ForceNodumpKey) == NodumpFlag.None) Header.SetFieldValue(Models.Metadata.Header.ForceNodumpKey, clrMamePro.ForceNodump.AsEnumValue()); if (Header.GetFieldValue(Models.Metadata.Header.ForcePackingKey) == PackingFlag.None) Header.SetFieldValue(Models.Metadata.Header.ForcePackingKey, clrMamePro.ForcePacking.AsEnumValue()); if (Header.GetFieldValue(Models.Metadata.Header.HeaderKey) == null) Header.SetFieldValue(Models.Metadata.Header.HeaderKey, clrMamePro.Header); } /// /// Convert subheader information /// /// Deserialized model to convert private void ConvertSubheader(Models.Logiqx.RomCenter? romCenter) { // If the subheader is missing, we can't do anything if (romCenter == null) return; if (Header.GetFieldValue(Models.Metadata.Header.BiosModeKey) == MergingFlag.None) Header.SetFieldValue(Models.Metadata.Header.BiosModeKey, romCenter.BiosMode.AsEnumValue()); if (Header.GetFieldValue(Models.Metadata.Header.LockBiosModeKey) == null) Header.SetFieldValue(Models.Metadata.Header.LockBiosModeKey, romCenter.LockBiosMode.AsYesNo()); if (Header.GetFieldValue(Models.Metadata.Header.LockRomModeKey) == null) Header.SetFieldValue(Models.Metadata.Header.LockRomModeKey, romCenter.LockRomMode.AsYesNo()); if (Header.GetFieldValue(Models.Metadata.Header.LockSampleModeKey) == null) Header.SetFieldValue(Models.Metadata.Header.LockSampleModeKey, romCenter.LockSampleMode.AsYesNo()); if (Header.GetFieldValue(Models.Metadata.Header.PluginKey) == null) Header.SetFieldValue(Models.Metadata.Header.PluginKey, romCenter.Plugin); if (Header.GetFieldValue(Models.Metadata.Header.RomModeKey) == MergingFlag.None) Header.SetFieldValue(Models.Metadata.Header.RomModeKey, romCenter.RomMode.AsEnumValue()); if (Header.GetFieldValue(Models.Metadata.Header.SampleModeKey) == MergingFlag.None) Header.SetFieldValue(Models.Metadata.Header.SampleModeKey, romCenter.SampleMode.AsEnumValue()); } #endregion } }