diff --git a/SabreTools.Serialization/Internal.OfflineList.cs b/SabreTools.Serialization/Internal.OfflineList.cs deleted file mode 100644 index 559b14ae..00000000 --- a/SabreTools.Serialization/Internal.OfflineList.cs +++ /dev/null @@ -1,220 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using SabreTools.Models.Internal; - -namespace SabreTools.Serialization -{ - /// - /// Serializer for OfflineList models to internal structure - /// - public partial class Internal - { - #region Serialize - - /// - /// Convert from to - /// - public static MetadataFile ConvertToInternalModel(Models.OfflineList.Dat item) - { - var metadataFile = new MetadataFile - { - [MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), - }; - - if (item?.Games?.Game != null && item.Games.Game.Any()) - metadataFile[MetadataFile.MachineKey] = item.Games.Game.Select(ConvertMachineToInternalModel).ToArray(); - - return metadataFile; - } - - /// - /// Convert from to - /// - private static Header ConvertHeaderToInternalModel(Models.OfflineList.Dat item) - { - var header = new Header - { - [Header.SchemaLocationKey] = item.NoNamespaceSchemaLocation, - }; - - if (item.Configuration != null) - { - header[Header.NameKey] = item.Configuration.DatName; - header[Header.ImFolderKey] = item.Configuration.ImFolder; - header[Header.DatVersionKey] = item.Configuration.DatVersion; - header[Header.SystemKey] = item.Configuration.System; - header[Header.ScreenshotsWidthKey] = item.Configuration.ScreenshotsWidth; - header[Header.ScreenshotsHeightKey] = item.Configuration.ScreenshotsHeight; - header[Header.InfosKey] = item.Configuration.Infos; - header[Header.CanOpenKey] = item.Configuration.CanOpen; - header[Header.NewDatKey] = item.Configuration.NewDat; - header[Header.SearchKey] = item.Configuration.Search; - header[Header.RomTitleKey] = item.Configuration.RomTitle; - } - - if (item.GUI != null) - { - header[Header.ImagesKey] = item.GUI.Images; - } - - return header; - } - - /// - /// Convert from to - /// - private static Machine ConvertMachineToInternalModel(Models.OfflineList.Game item) - { - var machine = new Machine - { - [Machine.ImageNumberKey] = item.ImageNumber, - [Machine.ReleaseNumberKey] = item.ReleaseNumber, - [Machine.NameKey] = item.Title, - [Machine.SaveTypeKey] = item.SaveType, - [Machine.PublisherKey] = item.Publisher, - [Machine.LocationKey] = item.Location, - [Machine.SourceRomKey] = item.SourceRom, - [Machine.LanguageKey] = item.Language, - [Machine.Im1CRCKey] = item.Im1CRC, - [Machine.Im2CRCKey] = item.Im2CRC, - [Machine.CommentKey] = item.Comment, - [Machine.DuplicateIDKey] = item.DuplicateID, - }; - - if (item.Files?.RomCRC != null && item.Files.RomCRC.Any()) - { - var roms = new List(); - foreach (var file in item.Files.RomCRC) - { - var rom = ConvertToInternalModel(file); - rom[Rom.SizeKey] = item.RomSize; - roms.Add(rom); - } - machine[Machine.RomKey] = roms.ToArray(); - } - - return machine; - } - - /// - /// Convert from to - /// - private static Rom ConvertToInternalModel(Models.OfflineList.FileRomCRC item) - { - var rom = new Rom - { - [Rom.ExtensionKey] = item.Extension, - [Rom.CRCKey] = item.Content, - }; - return rom; - } - - #endregion - - #region Deserialize - - /// - /// Convert from to - /// - public static Models.OfflineList.Dat? ConvertHeaderToOfflineList(Header? item) - { - if (item == null) - return null; - - var dat = new Models.OfflineList.Dat - { - NoNamespaceSchemaLocation = item.ReadString(Header.SchemaLocationKey), - }; - - if (item.ContainsKey(Header.NameKey) - || item.ContainsKey(Header.ImFolderKey) - || item.ContainsKey(Header.DatVersionKey) - || item.ContainsKey(Header.SystemKey) - || item.ContainsKey(Header.ScreenshotsWidthKey) - || item.ContainsKey(Header.ScreenshotsHeightKey) - || item.ContainsKey(Header.InfosKey) - || item.ContainsKey(Header.CanOpenKey) - || item.ContainsKey(Header.NewDatKey) - || item.ContainsKey(Header.SearchKey) - || item.ContainsKey(Header.RomTitleKey)) - { - dat.Configuration = new Models.OfflineList.Configuration - { - DatName = item.ReadString(Header.NameKey), - ImFolder = item.ReadString(Header.ImFolderKey), - DatVersion = item.ReadString(Header.DatVersionKey), - System = item.ReadString(Header.SystemKey), - ScreenshotsWidth = item.ReadString(Header.ScreenshotsWidthKey), - ScreenshotsHeight = item.ReadString(Header.ScreenshotsHeightKey), - Infos = item.Read(Header.InfosKey), - CanOpen = item.Read(Header.CanOpenKey), - NewDat = item.Read(Header.NewDatKey), - Search = item.Read(Header.SearchKey), - RomTitle = item.ReadString(Header.RomTitleKey), - }; - } - - if (item.ContainsKey(Header.ImagesKey)) - { - dat.GUI = new Models.OfflineList.GUI - { - Images = item.Read(Header.ImagesKey), - }; - } - - return dat; - } - - /// - /// Convert from to - /// - public static Models.OfflineList.Game? ConvertMachineToOfflineList(Machine? item) - { - if (item == null) - return null; - - var game = new Models.OfflineList.Game - { - ImageNumber = item.ReadString(Machine.ImageNumberKey), - ReleaseNumber = item.ReadString(Machine.ReleaseNumberKey), - Title = item.ReadString(Machine.NameKey), - SaveType = item.ReadString(Machine.SaveTypeKey), - Publisher = item.ReadString(Machine.PublisherKey), - Location = item.ReadString(Machine.LocationKey), - SourceRom = item.ReadString(Machine.SourceRomKey), - Language = item.ReadString(Machine.LanguageKey), - Im1CRC = item.ReadString(Machine.Im1CRCKey), - Im2CRC = item.ReadString(Machine.Im2CRCKey), - Comment = item.ReadString(Machine.CommentKey), - DuplicateID = item.ReadString(Machine.DuplicateIDKey), - }; - - var roms = item.Read(Machine.RomKey); - game.RomSize = roms? - .Select(rom => rom.ReadString(Rom.SizeKey))? - .FirstOrDefault(s => s != null); - var romCRCs = roms?.Select(ConvertToOfflineList).ToArray(); - game.Files = new Models.OfflineList.Files { RomCRC = romCRCs }; - - return game; - } - - /// - /// Convert from to - /// - private static Models.OfflineList.FileRomCRC? ConvertToOfflineList(Rom? item) - { - if (item == null) - return null; - - var fileRomCRC = new Models.OfflineList.FileRomCRC - { - Extension = item.ReadString(Rom.ExtensionKey), - Content = item.ReadString(Rom.CRCKey), - }; - return fileRomCRC; - } - - #endregion - } -} \ No newline at end of file diff --git a/SabreTools.Serialization/OfflineList.Deserializer.cs b/SabreTools.Serialization/OfflineList.Deserializer.cs new file mode 100644 index 00000000..3e29c4ef --- /dev/null +++ b/SabreTools.Serialization/OfflineList.Deserializer.cs @@ -0,0 +1,118 @@ +using System.Linq; +using SabreTools.Models.OfflineList; + +namespace SabreTools.Serialization +{ + /// + /// XML deserializer for OfflineList metadata files + /// + public partial class OfflineList : XmlSerializer + { + // TODO: Add deserialization of entire Dat + #region Internal + + /// + /// Convert from to + /// + public static Dat? ConvertHeaderFromInternalModel(Models.Internal.Header? item) + { + if (item == null) + return null; + + var dat = new Dat + { + NoNamespaceSchemaLocation = item.ReadString(Models.Internal.Header.SchemaLocationKey), + }; + + if (item.ContainsKey(Models.Internal.Header.NameKey) + || item.ContainsKey(Models.Internal.Header.ImFolderKey) + || item.ContainsKey(Models.Internal.Header.DatVersionKey) + || item.ContainsKey(Models.Internal.Header.SystemKey) + || item.ContainsKey(Models.Internal.Header.ScreenshotsWidthKey) + || item.ContainsKey(Models.Internal.Header.ScreenshotsHeightKey) + || item.ContainsKey(Models.Internal.Header.InfosKey) + || item.ContainsKey(Models.Internal.Header.CanOpenKey) + || item.ContainsKey(Models.Internal.Header.NewDatKey) + || item.ContainsKey(Models.Internal.Header.SearchKey) + || item.ContainsKey(Models.Internal.Header.RomTitleKey)) + { + dat.Configuration = new Configuration + { + DatName = item.ReadString(Models.Internal.Header.NameKey), + ImFolder = item.ReadString(Models.Internal.Header.ImFolderKey), + DatVersion = item.ReadString(Models.Internal.Header.DatVersionKey), + System = item.ReadString(Models.Internal.Header.SystemKey), + ScreenshotsWidth = item.ReadString(Models.Internal.Header.ScreenshotsWidthKey), + ScreenshotsHeight = item.ReadString(Models.Internal.Header.ScreenshotsHeightKey), + Infos = item.Read(Models.Internal.Header.InfosKey), + CanOpen = item.Read(Models.Internal.Header.CanOpenKey), + NewDat = item.Read(Models.Internal.Header.NewDatKey), + Search = item.Read(Models.Internal.Header.SearchKey), + RomTitle = item.ReadString(Models.Internal.Header.RomTitleKey), + }; + } + + if (item.ContainsKey(Models.Internal.Header.ImagesKey)) + { + dat.GUI = new GUI + { + Images = item.Read(Models.Internal.Header.ImagesKey), + }; + } + + return dat; + } + + /// + /// Convert from to + /// + public static Game? ConvertMachineFromInternalModel(Models.Internal.Machine? item) + { + if (item == null) + return null; + + var game = new Game + { + ImageNumber = item.ReadString(Models.Internal.Machine.ImageNumberKey), + ReleaseNumber = item.ReadString(Models.Internal.Machine.ReleaseNumberKey), + Title = item.ReadString(Models.Internal.Machine.NameKey), + SaveType = item.ReadString(Models.Internal.Machine.SaveTypeKey), + Publisher = item.ReadString(Models.Internal.Machine.PublisherKey), + Location = item.ReadString(Models.Internal.Machine.LocationKey), + SourceRom = item.ReadString(Models.Internal.Machine.SourceRomKey), + Language = item.ReadString(Models.Internal.Machine.LanguageKey), + Im1CRC = item.ReadString(Models.Internal.Machine.Im1CRCKey), + Im2CRC = item.ReadString(Models.Internal.Machine.Im2CRCKey), + Comment = item.ReadString(Models.Internal.Machine.CommentKey), + DuplicateID = item.ReadString(Models.Internal.Machine.DuplicateIDKey), + }; + + var roms = item.Read(Models.Internal.Machine.RomKey); + game.RomSize = roms? + .Select(rom => rom.ReadString(Models.Internal.Rom.SizeKey))? + .FirstOrDefault(s => s != null); + var romCRCs = roms?.Select(ConvertFromInternalModel).ToArray(); + game.Files = new Files { RomCRC = romCRCs }; + + return game; + } + + /// + /// Convert from to + /// + private static FileRomCRC? ConvertFromInternalModel(Models.Internal.Rom? item) + { + if (item == null) + return null; + + var fileRomCRC = new FileRomCRC + { + Extension = item.ReadString(Models.Internal.Rom.ExtensionKey), + Content = item.ReadString(Models.Internal.Rom.CRCKey), + }; + return fileRomCRC; + } + + #endregion + } +} \ No newline at end of file diff --git a/SabreTools.Serialization/OfflineList.Serializer.cs b/SabreTools.Serialization/OfflineList.Serializer.cs new file mode 100644 index 00000000..563b2851 --- /dev/null +++ b/SabreTools.Serialization/OfflineList.Serializer.cs @@ -0,0 +1,111 @@ +using System.Linq; +using SabreTools.Models.OfflineList; + +namespace SabreTools.Serialization +{ + /// + /// XML serializer for OfflineList metadata files + /// + public partial class OfflineList : XmlSerializer + { + #region Internal + + /// + /// Convert from to + /// + public static Models.Internal.MetadataFile ConvertToInternalModel(Dat item) + { + var metadataFile = new Models.Internal.MetadataFile + { + [Models.Internal.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), + }; + + if (item?.Games?.Game != null && item.Games.Game.Any()) + metadataFile[Models.Internal.MetadataFile.MachineKey] = item.Games.Game.Select(ConvertMachineToInternalModel).ToArray(); + + return metadataFile; + } + + /// + /// Convert from to + /// + private static Models.Internal.Header ConvertHeaderToInternalModel(Dat item) + { + var header = new Models.Internal.Header + { + [Models.Internal.Header.SchemaLocationKey] = item.NoNamespaceSchemaLocation, + }; + + if (item.Configuration != null) + { + header[Models.Internal.Header.NameKey] = item.Configuration.DatName; + header[Models.Internal.Header.ImFolderKey] = item.Configuration.ImFolder; + header[Models.Internal.Header.DatVersionKey] = item.Configuration.DatVersion; + header[Models.Internal.Header.SystemKey] = item.Configuration.System; + header[Models.Internal.Header.ScreenshotsWidthKey] = item.Configuration.ScreenshotsWidth; + header[Models.Internal.Header.ScreenshotsHeightKey] = item.Configuration.ScreenshotsHeight; + header[Models.Internal.Header.InfosKey] = item.Configuration.Infos; + header[Models.Internal.Header.CanOpenKey] = item.Configuration.CanOpen; + header[Models.Internal.Header.NewDatKey] = item.Configuration.NewDat; + header[Models.Internal.Header.SearchKey] = item.Configuration.Search; + header[Models.Internal.Header.RomTitleKey] = item.Configuration.RomTitle; + } + + if (item.GUI != null) + { + header[Models.Internal.Header.ImagesKey] = item.GUI.Images; + } + + return header; + } + + /// + /// Convert from to + /// + private static Models.Internal.Machine ConvertMachineToInternalModel(Game item) + { + var machine = new Models.Internal.Machine + { + [Models.Internal.Machine.ImageNumberKey] = item.ImageNumber, + [Models.Internal.Machine.ReleaseNumberKey] = item.ReleaseNumber, + [Models.Internal.Machine.NameKey] = item.Title, + [Models.Internal.Machine.SaveTypeKey] = item.SaveType, + [Models.Internal.Machine.PublisherKey] = item.Publisher, + [Models.Internal.Machine.LocationKey] = item.Location, + [Models.Internal.Machine.SourceRomKey] = item.SourceRom, + [Models.Internal.Machine.LanguageKey] = item.Language, + [Models.Internal.Machine.Im1CRCKey] = item.Im1CRC, + [Models.Internal.Machine.Im2CRCKey] = item.Im2CRC, + [Models.Internal.Machine.CommentKey] = item.Comment, + [Models.Internal.Machine.DuplicateIDKey] = item.DuplicateID, + }; + + if (item.Files?.RomCRC != null && item.Files.RomCRC.Any()) + { + machine[Models.Internal.Machine.RomKey] = item.Files.RomCRC.Select(romCRC => + { + var rom = ConvertToInternalModel(romCRC); + rom[Models.Internal.Rom.SizeKey] = item.RomSize; + return rom; + }).ToArray(); + } + + return machine; + } + + /// + /// Convert from to + /// + private static Models.Internal.Rom ConvertToInternalModel(FileRomCRC item) + { + var rom = new Models.Internal.Rom + { + [Models.Internal.Rom.ExtensionKey] = item.Extension, + [Models.Internal.Rom.CRCKey] = item.Content, + }; + return rom; + } + + #endregion + } +} \ No newline at end of file diff --git a/SabreTools.Serialization/OfflineList.cs b/SabreTools.Serialization/OfflineList.cs deleted file mode 100644 index 9a43e961..00000000 --- a/SabreTools.Serialization/OfflineList.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace SabreTools.Serialization -{ - /// - /// XML deserializer for OfflineList metadata files - /// - public class OfflineList : XmlSerializer { } -} \ No newline at end of file