diff --git a/CrossModel/OfflineList.Deserializer.cs b/CrossModel/OfflineList.Deserializer.cs new file mode 100644 index 00000000..4e91a9b6 --- /dev/null +++ b/CrossModel/OfflineList.Deserializer.cs @@ -0,0 +1,137 @@ +using System.Linq; +using SabreTools.Models.OfflineList; + +namespace SabreTools.Serialization.CrossModel +{ + public partial class OfflineList : IModelSerializer + { + /// +#if NET48 + public Dat Deserialize(Models.Metadata.MetadataFile obj) +#else + public Dat? Deserialize(Models.Metadata.MetadataFile? obj) +#endif + { + if (obj == null) + return null; + + var header = obj.Read(Models.Metadata.MetadataFile.HeaderKey); + var dat = header != null ? ConvertHeaderFromInternalModel(header) : new Dat(); + + var machines = obj.Read(Models.Metadata.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + { + dat.Games = new Games + { + Game = machines + .Where(m => m != null) + .Select(ConvertMachineFromInternalModel) + .ToArray() + }; + } + + return dat; + } + + /// + /// Convert from to + /// + private static Dat ConvertHeaderFromInternalModel(Models.Metadata.Header item) + { + var dat = new Dat + { + NoNamespaceSchemaLocation = item.ReadString(Models.Metadata.Header.SchemaLocationKey), + }; + + if (item.ContainsKey(Models.Metadata.Header.NameKey) + || item.ContainsKey(Models.Metadata.Header.ImFolderKey) + || item.ContainsKey(Models.Metadata.Header.DatVersionKey) + || item.ContainsKey(Models.Metadata.Header.SystemKey) + || item.ContainsKey(Models.Metadata.Header.ScreenshotsWidthKey) + || item.ContainsKey(Models.Metadata.Header.ScreenshotsHeightKey) + || item.ContainsKey(Models.Metadata.Header.InfosKey) + || item.ContainsKey(Models.Metadata.Header.CanOpenKey) + || item.ContainsKey(Models.Metadata.Header.NewDatKey) + || item.ContainsKey(Models.Metadata.Header.SearchKey) + || item.ContainsKey(Models.Metadata.Header.RomTitleKey)) + { + dat.Configuration = new Configuration + { + DatName = item.ReadString(Models.Metadata.Header.NameKey), + ImFolder = item.ReadString(Models.Metadata.Header.ImFolderKey), + DatVersion = item.ReadString(Models.Metadata.Header.DatVersionKey), + System = item.ReadString(Models.Metadata.Header.SystemKey), + ScreenshotsWidth = item.ReadString(Models.Metadata.Header.ScreenshotsWidthKey), + ScreenshotsHeight = item.ReadString(Models.Metadata.Header.ScreenshotsHeightKey), + Infos = item.Read(Models.Metadata.Header.InfosKey), + CanOpen = item.Read(Models.Metadata.Header.CanOpenKey), + NewDat = item.Read(Models.Metadata.Header.NewDatKey), + Search = item.Read(Models.Metadata.Header.SearchKey), + RomTitle = item.ReadString(Models.Metadata.Header.RomTitleKey), + }; + } + + if (item.ContainsKey(Models.Metadata.Header.ImagesKey)) + { + dat.GUI = new GUI + { + Images = item.Read(Models.Metadata.Header.ImagesKey), + }; + } + + return dat; + } + + /// + /// Convert from to + /// + private static Game ConvertMachineFromInternalModel(Models.Metadata.Machine item) + { + var game = new Game + { + ImageNumber = item.ReadString(Models.Metadata.Machine.ImageNumberKey), + ReleaseNumber = item.ReadString(Models.Metadata.Machine.ReleaseNumberKey), + Title = item.ReadString(Models.Metadata.Machine.NameKey), + SaveType = item.ReadString(Models.Metadata.Machine.SaveTypeKey), + Publisher = item.ReadString(Models.Metadata.Machine.PublisherKey), + Location = item.ReadString(Models.Metadata.Machine.LocationKey), + SourceRom = item.ReadString(Models.Metadata.Machine.SourceRomKey), + Language = item.ReadString(Models.Metadata.Machine.LanguageKey), + Im1CRC = item.ReadString(Models.Metadata.Machine.Im1CRCKey), + Im2CRC = item.ReadString(Models.Metadata.Machine.Im2CRCKey), + Comment = item.ReadString(Models.Metadata.Machine.CommentKey), + DuplicateID = item.ReadString(Models.Metadata.Machine.DuplicateIDKey), + }; + + var roms = item.Read(Models.Metadata.Machine.RomKey); + if (roms != null && roms.Any()) + { + game.RomSize = roms + .Select(rom => rom.ReadString(Models.Metadata.Rom.SizeKey)) + .FirstOrDefault(s => s != null); + + var romCRCs = roms + .Where(r => r != null) + .Select(ConvertFromInternalModel) + .ToArray(); + + game.Files = new Models.OfflineList.Files { RomCRC = romCRCs }; + } + + return game; + } + + /// + /// Convert from to + /// + private static FileRomCRC ConvertFromInternalModel(Models.Metadata.Rom item) + { + var fileRomCRC = new FileRomCRC + { + Extension = item.ReadString(Models.Metadata.Rom.ExtensionKey), + Content = item.ReadString(Models.Metadata.Rom.CRCKey), + }; + return fileRomCRC; + } + } +} \ No newline at end of file diff --git a/CrossModel/OfflineList.Serializer.cs b/CrossModel/OfflineList.Serializer.cs new file mode 100644 index 00000000..393d4ad3 --- /dev/null +++ b/CrossModel/OfflineList.Serializer.cs @@ -0,0 +1,117 @@ +using System.Linq; +using SabreTools.Models.OfflineList; + +namespace SabreTools.Serialization.CrossModel +{ + public partial class OfflineList : IModelSerializer + { + /// +#if NET48 + public Models.Metadata.MetadataFile Serialize(Dat item) +#else + public Models.Metadata.MetadataFile? Serialize(Dat? item) +#endif + { + if (item == null) + return null; + + var metadataFile = new Models.Metadata.MetadataFile + { + [Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), + }; + + if (item?.Games?.Game != null && item.Games.Game.Any()) + { + metadataFile[Models.Metadata.MetadataFile.MachineKey] = item.Games.Game + .Where(g => g != null) + .Select(ConvertMachineToInternalModel) + .ToArray(); + } + + return metadataFile; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Header ConvertHeaderToInternalModel(Dat item) + { + var header = new Models.Metadata.Header + { + [Models.Metadata.Header.SchemaLocationKey] = item.NoNamespaceSchemaLocation, + }; + + if (item.Configuration != null) + { + header[Models.Metadata.Header.NameKey] = item.Configuration.DatName; + header[Models.Metadata.Header.ImFolderKey] = item.Configuration.ImFolder; + header[Models.Metadata.Header.DatVersionKey] = item.Configuration.DatVersion; + header[Models.Metadata.Header.SystemKey] = item.Configuration.System; + header[Models.Metadata.Header.ScreenshotsWidthKey] = item.Configuration.ScreenshotsWidth; + header[Models.Metadata.Header.ScreenshotsHeightKey] = item.Configuration.ScreenshotsHeight; + header[Models.Metadata.Header.InfosKey] = item.Configuration.Infos; + header[Models.Metadata.Header.CanOpenKey] = item.Configuration.CanOpen; + header[Models.Metadata.Header.NewDatKey] = item.Configuration.NewDat; + header[Models.Metadata.Header.SearchKey] = item.Configuration.Search; + header[Models.Metadata.Header.RomTitleKey] = item.Configuration.RomTitle; + } + + if (item.GUI != null) + { + header[Models.Metadata.Header.ImagesKey] = item.GUI.Images; + } + + return header; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Machine ConvertMachineToInternalModel(Game item) + { + var machine = new Models.Metadata.Machine + { + [Models.Metadata.Machine.ImageNumberKey] = item.ImageNumber, + [Models.Metadata.Machine.ReleaseNumberKey] = item.ReleaseNumber, + [Models.Metadata.Machine.NameKey] = item.Title, + [Models.Metadata.Machine.SaveTypeKey] = item.SaveType, + [Models.Metadata.Machine.PublisherKey] = item.Publisher, + [Models.Metadata.Machine.LocationKey] = item.Location, + [Models.Metadata.Machine.SourceRomKey] = item.SourceRom, + [Models.Metadata.Machine.LanguageKey] = item.Language, + [Models.Metadata.Machine.Im1CRCKey] = item.Im1CRC, + [Models.Metadata.Machine.Im2CRCKey] = item.Im2CRC, + [Models.Metadata.Machine.CommentKey] = item.Comment, + [Models.Metadata.Machine.DuplicateIDKey] = item.DuplicateID, + }; + + if (item.Files?.RomCRC != null && item.Files.RomCRC.Any()) + { + machine[Models.Metadata.Machine.RomKey] = item.Files.RomCRC + .Where(r => r != null) + .Select(romCRC => + { + var rom = ConvertToInternalModel(romCRC); + rom[Models.Metadata.Rom.SizeKey] = item.RomSize; + return rom; + }) + .ToArray(); + } + + return machine; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Rom ConvertToInternalModel(FileRomCRC item) + { + var rom = new Models.Metadata.Rom + { + [Models.Metadata.Rom.ExtensionKey] = item.Extension, + [Models.Metadata.Rom.CRCKey] = item.Content, + }; + return rom; + } + } +} \ No newline at end of file diff --git a/Files/OfflineList.Deserializer.cs b/Files/OfflineList.Deserializer.cs new file mode 100644 index 00000000..03c639c3 --- /dev/null +++ b/Files/OfflineList.Deserializer.cs @@ -0,0 +1,7 @@ +namespace SabreTools.Serialization.Files +{ + public partial class OfflineList : XmlFile + { + // All serialization logic is in the base class + } +} \ No newline at end of file diff --git a/Files/OfflineList.Serializer.cs b/Files/OfflineList.Serializer.cs new file mode 100644 index 00000000..03c639c3 --- /dev/null +++ b/Files/OfflineList.Serializer.cs @@ -0,0 +1,7 @@ +namespace SabreTools.Serialization.Files +{ + public partial class OfflineList : XmlFile + { + // All serialization logic is in the base class + } +} \ No newline at end of file diff --git a/Streams/OfflineList.Deserializer.cs b/Streams/OfflineList.Deserializer.cs new file mode 100644 index 00000000..efe18027 --- /dev/null +++ b/Streams/OfflineList.Deserializer.cs @@ -0,0 +1,7 @@ +namespace SabreTools.Serialization.Streams +{ + public partial class OfflineList : XmlFile + { + // All serialization logic is in the base class + } +} \ No newline at end of file diff --git a/Streams/OfflineList.Serializer.cs b/Streams/OfflineList.Serializer.cs new file mode 100644 index 00000000..efe18027 --- /dev/null +++ b/Streams/OfflineList.Serializer.cs @@ -0,0 +1,7 @@ +namespace SabreTools.Serialization.Streams +{ + public partial class OfflineList : XmlFile + { + // All serialization logic is in the base class + } +} \ No newline at end of file