diff --git a/SabreTools.DatFiles/DatFile.MetadataConverter.cs b/SabreTools.DatFiles/DatFile.MetadataConverter.cs index b785c6a9..dd71361d 100644 --- a/SabreTools.DatFiles/DatFile.MetadataConverter.cs +++ b/SabreTools.DatFiles/DatFile.MetadataConverter.cs @@ -207,7 +207,7 @@ namespace SabreTools.DatFiles { Header.SetFieldValue("DATVERSIONURL", newDat.DatVersionUrl); //Header.SetFieldValue("DATURL", newDat.DatUrl); // TODO: Add to internal model - Header.SetFieldValue("IMURL", newDat.DatVersionUrl); + Header.SetFieldValue("IMURL", newDat.ImUrl); } } if (item.ContainsKey(Models.Metadata.Header.SearchKey)) @@ -1411,10 +1411,251 @@ namespace SabreTools.DatFiles } #endregion - + #region To Metadata + /// + /// Convert metadata information + /// + public Models.Metadata.MetadataFile? ConvertMetadata() + { + // If we don't have items, we can't do anything + if (this.Items == null || !this.Items.Any()) + return null; + // Create an object to hold the data + var metadataFile = new Models.Metadata.MetadataFile(); + + // Convert and assign the header + var header = ConvertHeader(); + if (header != null) + metadataFile[Models.Metadata.MetadataFile.HeaderKey] = header; + + // TODO: Implement machine creation + + return metadataFile; + } + + /// + /// Convert header information + /// + private Models.Metadata.Header? ConvertHeader() + { + // If the header is invalid, we can't do anything + if (Header == null) + return null; + + // Create an internal header + var header = new Models.Metadata.Header(); + + if (Header.GetFieldValue(Models.Metadata.Header.AuthorKey) == null) + header[Models.Metadata.Header.AuthorKey] = Header.GetFieldValue(Models.Metadata.Header.AuthorKey); + if (Header.GetFieldValue(Models.Metadata.Header.BiosModeKey) == MergingFlag.None) + header[Models.Metadata.Header.BiosModeKey] = Header.GetFieldValue(Models.Metadata.Header.BiosModeKey); + if (Header.GetFieldValue(Models.Metadata.Header.BuildKey) == null) + header[Models.Metadata.Header.BuildKey] = Header.GetFieldValue(Models.Metadata.Header.BuildKey); + if (Header.GetFieldValue(Models.Metadata.Header.CategoryKey) == null) + header[Models.Metadata.Header.CategoryKey] = Header.GetFieldValue(Models.Metadata.Header.CategoryKey); + if (Header.GetFieldValue(Models.Metadata.Header.CommentKey) == null) + header[Models.Metadata.Header.CommentKey] = Header.GetFieldValue(Models.Metadata.Header.CommentKey); + if (Header.GetFieldValue(Models.Metadata.Header.DateKey) == null) + header[Models.Metadata.Header.DateKey] = Header.GetFieldValue(Models.Metadata.Header.DateKey); + if (Header.GetFieldValue(Models.Metadata.Header.DatVersionKey) == null) + header[Models.Metadata.Header.DatVersionKey] = Header.GetFieldValue(Models.Metadata.Header.DatVersionKey); + if (Header.GetFieldValue(Models.Metadata.Header.DebugKey) == null) + header[Models.Metadata.Header.DebugKey] = Header.GetFieldValue(Models.Metadata.Header.DebugKey); + if (Header.GetFieldValue(Models.Metadata.Header.DescriptionKey) == null) + header[Models.Metadata.Header.DescriptionKey] = Header.GetFieldValue(Models.Metadata.Header.DescriptionKey); + if (Header.GetFieldValue(Models.Metadata.Header.EmailKey) == null) + header[Models.Metadata.Header.EmailKey] = Header.GetFieldValue(Models.Metadata.Header.EmailKey); + if (Header.GetFieldValue(Models.Metadata.Header.EmulatorVersionKey) == null) + header[Models.Metadata.Header.EmulatorVersionKey] = Header.GetFieldValue(Models.Metadata.Header.EmulatorVersionKey); + if (Header.GetFieldValue(Models.Metadata.Header.ForceMergingKey) == MergingFlag.None) + header[Models.Metadata.Header.ForceMergingKey] = Header.GetFieldValue(Models.Metadata.Header.ForceMergingKey); + if (Header.GetFieldValue(Models.Metadata.Header.ForceNodumpKey) == NodumpFlag.None) + header[Models.Metadata.Header.ForceNodumpKey] = Header.GetFieldValue(Models.Metadata.Header.ForceNodumpKey); + if (Header.GetFieldValue(Models.Metadata.Header.ForcePackingKey) == PackingFlag.None) + header[Models.Metadata.Header.ForcePackingKey] = Header.GetFieldValue(Models.Metadata.Header.ForcePackingKey); + if (Header.GetFieldValue(Models.Metadata.Header.HeaderKey) == null) + header[Models.Metadata.Header.HeaderKey] = Header.GetFieldValue(Models.Metadata.Header.HeaderKey); + if (Header.GetFieldValue(Models.Metadata.Header.HomepageKey) == null) + header[Models.Metadata.Header.HomepageKey] = Header.GetFieldValue(Models.Metadata.Header.HomepageKey); + if (Header.GetFieldValue(Models.Metadata.Header.IdKey) == null) + header[Models.Metadata.Header.IdKey] = Header.GetFieldValue(Models.Metadata.Header.IdKey); + if (Header.GetFieldValue(Models.Metadata.Header.ImFolderKey) == null) + header[Models.Metadata.Header.ImFolderKey] = Header.GetFieldValue(Models.Metadata.Header.ImFolderKey); + if (Header.GetFieldValue(Models.Metadata.Header.LockBiosModeKey) == null) + header[Models.Metadata.Header.LockBiosModeKey] = Header.GetFieldValue(Models.Metadata.Header.LockBiosModeKey); + if (Header.GetFieldValue(Models.Metadata.Header.LockRomModeKey) == null) + header[Models.Metadata.Header.LockRomModeKey] = Header.GetFieldValue(Models.Metadata.Header.LockRomModeKey); + if (Header.GetFieldValue(Models.Metadata.Header.LockSampleModeKey) == null) + header[Models.Metadata.Header.LockSampleModeKey] = Header.GetFieldValue(Models.Metadata.Header.LockSampleModeKey); + if (Header.GetFieldValue(Models.Metadata.Header.MameConfigKey) == null) + header[Models.Metadata.Header.MameConfigKey] = Header.GetFieldValue(Models.Metadata.Header.NameKey); + if (Header.GetFieldValue(Models.Metadata.Header.NameKey) == null) + header[Models.Metadata.Header.NameKey] = Header.GetFieldValue(Models.Metadata.Header.MameConfigKey); + if (Header.GetFieldValue(Models.Metadata.Header.PluginKey) == null) + header[Models.Metadata.Header.PluginKey] = Header.GetFieldValue(Models.Metadata.Header.PluginKey); + if (Header.GetFieldValue(Models.Metadata.Header.RefNameKey) == null) + header[Models.Metadata.Header.RefNameKey] = Header.GetFieldValue(Models.Metadata.Header.RefNameKey); + if (Header.GetFieldValue(Models.Metadata.Header.RomModeKey) == MergingFlag.None) + header[Models.Metadata.Header.RomModeKey] = Header.GetFieldValue(Models.Metadata.Header.RomModeKey); + if (Header.GetFieldValue(Models.Metadata.Header.RomTitleKey) == null) + header[Models.Metadata.Header.RomTitleKey] = Header.GetFieldValue(Models.Metadata.Header.RomTitleKey); + if (Header.GetFieldValue(Models.Metadata.Header.RootDirKey) == null) + header[Models.Metadata.Header.RootDirKey] = Header.GetFieldValue(Models.Metadata.Header.RootDirKey); + if (Header.GetFieldValue(Models.Metadata.Header.SampleModeKey) == MergingFlag.None) + header[Models.Metadata.Header.SampleModeKey] = Header.GetFieldValue(Models.Metadata.Header.SampleModeKey); + if (Header.GetFieldValue(Models.Metadata.Header.ScreenshotsHeightKey) == null) + header[Models.Metadata.Header.ScreenshotsHeightKey] = Header.GetFieldValue(Models.Metadata.Header.ScreenshotsHeightKey); + if (Header.GetFieldValue(Models.Metadata.Header.ScreenshotsWidthKey) == null) + header[Models.Metadata.Header.ScreenshotsWidthKey] = Header.GetFieldValue(Models.Metadata.Header.ScreenshotsWidthKey); + if (Header.GetFieldValue(Models.Metadata.Header.SystemKey) == null) + header[Models.Metadata.Header.SystemKey] = Header.GetFieldValue(Models.Metadata.Header.SystemKey); + if (Header.GetFieldValue(Models.Metadata.Header.TypeKey) == null) + header[Models.Metadata.Header.TypeKey] = Header.GetFieldValue(Models.Metadata.Header.TypeKey); + if (Header.GetFieldValue(Models.Metadata.Header.UrlKey) == null) + header[Models.Metadata.Header.UrlKey] = Header.GetFieldValue(Models.Metadata.Header.UrlKey); + if (Header.GetFieldValue(Models.Metadata.Header.VersionKey) == null) + header[Models.Metadata.Header.VersionKey] = Header.GetFieldValue(Models.Metadata.Header.VersionKey); + + // Convert subheader values + if (Header.CanOpenSpecified) + header[Models.Metadata.Header.CanOpenKey] = Header.GetFieldValue(Models.Metadata.Header.CanOpenKey); + // if (Header.ImagesSpecified) + // // TODO: Add to internal model + if (Header.InfosSpecified) + { + var infoItem = new Models.OfflineList.Infos(); + var infos = Header.GetFieldValue(Models.Metadata.Header.InfosKey)!; + foreach (var info in infos) + { + switch (info.Name) + { + case "title": + infoItem.Title = new Models.OfflineList.Title + { + Visible = info.Visible.FromYesNo(), + InNamingOption = info.InNamingOption.FromYesNo(), + Default = info.Default.FromYesNo(), + }; + break; + case "location": + infoItem.Location = new Models.OfflineList.Location + { + Visible = info.Visible.FromYesNo(), + InNamingOption = info.InNamingOption.FromYesNo(), + Default = info.Default.FromYesNo(), + }; + break; + case "publisher": + infoItem.Publisher = new Models.OfflineList.Publisher + { + Visible = info.Visible.FromYesNo(), + InNamingOption = info.InNamingOption.FromYesNo(), + Default = info.Default.FromYesNo(), + }; + break; + case "sourceRom": + infoItem.SourceRom = new Models.OfflineList.SourceRom + { + Visible = info.Visible.FromYesNo(), + InNamingOption = info.InNamingOption.FromYesNo(), + Default = info.Default.FromYesNo(), + }; + break; + case "saveType": + infoItem.SaveType = new Models.OfflineList.SaveType + { + Visible = info.Visible.FromYesNo(), + InNamingOption = info.InNamingOption.FromYesNo(), + Default = info.Default.FromYesNo(), + }; + break; + case "romSize": + infoItem.RomSize = new Models.OfflineList.RomSize + { + Visible = info.Visible.FromYesNo(), + InNamingOption = info.InNamingOption.FromYesNo(), + Default = info.Default.FromYesNo(), + }; + break; + case "releaseNumber": + infoItem.ReleaseNumber = new Models.OfflineList.ReleaseNumber + { + Visible = info.Visible.FromYesNo(), + InNamingOption = info.InNamingOption.FromYesNo(), + Default = info.Default.FromYesNo(), + }; + break; + case "languageNumber": + infoItem.LanguageNumber = new Models.OfflineList.LanguageNumber + { + Visible = info.Visible.FromYesNo(), + InNamingOption = info.InNamingOption.FromYesNo(), + Default = info.Default.FromYesNo(), + }; + break; + case "comment": + infoItem.Comment = new Models.OfflineList.Comment + { + Visible = info.Visible.FromYesNo(), + InNamingOption = info.InNamingOption.FromYesNo(), + Default = info.Default.FromYesNo(), + }; + break; + case "romCRC": + infoItem.RomCRC = new Models.OfflineList.RomCRC + { + Visible = info.Visible.FromYesNo(), + InNamingOption = info.InNamingOption.FromYesNo(), + Default = info.Default.FromYesNo(), + }; + break; + case "im1CRC": + infoItem.Im1CRC = new Models.OfflineList.Im1CRC + { + Visible = info.Visible.FromYesNo(), + InNamingOption = info.InNamingOption.FromYesNo(), + Default = info.Default.FromYesNo(), + }; + break; + case "im2CRC": + infoItem.Im2CRC = new Models.OfflineList.Im2CRC + { + Visible = info.Visible.FromYesNo(), + InNamingOption = info.InNamingOption.FromYesNo(), + Default = info.Default.FromYesNo(), + }; + break; + case "languages": + infoItem.Languages = new Models.OfflineList.Languages + { + Visible = info.Visible.FromYesNo(), + InNamingOption = info.InNamingOption.FromYesNo(), + Default = info.Default.FromYesNo(), + }; + break; + } + } + + header[Models.Metadata.Header.InfosKey] = infoItem; + } + if (Header.NewDatSpecified) + { + var newDat = new Models.OfflineList.NewDat + { + DatVersionUrl = Header.GetFieldValue("DATVERSIONURL"), + //DatUrl = Header.GetFieldValue("DATURL"), // TODO: Add to internal model + ImUrl = Header.GetFieldValue("IMURL"), + }; + header[Models.Metadata.Header.NewDatKey] = newDat; + } + // if (Header.SearchSpecified) + // // TODO: Add to internal model + + return header; + } #endregion } diff --git a/SabreTools.DatFiles/DatHeader.cs b/SabreTools.DatFiles/DatHeader.cs index f5f3fc12..fed8e764 100644 --- a/SabreTools.DatFiles/DatHeader.cs +++ b/SabreTools.DatFiles/DatHeader.cs @@ -97,11 +97,22 @@ namespace SabreTools.DatFiles { get { - var canOpen = GetFieldValue(Models.Metadata.Header.CanOpenKey); + var canOpen = GetFieldValue(Models.Metadata.Header.CanOpenKey); return canOpen != null && canOpen.Length > 0; } } + [JsonIgnore] + public bool NewDatSpecified + { + get + { + return GetFieldValue("DATVERSIONURL") != null + //&& GetFieldValue("DATURL") != null // TODO: Add to internal model + && GetFieldValue("IMURL") != null; + } + } + /// /// Internal Header model ///