diff --git a/SabreTools.Serialization/ArchiveDotOrg.Deserializer.cs b/SabreTools.Serialization/ArchiveDotOrg.Deserializer.cs index f34ebbff..3a518f93 100644 --- a/SabreTools.Serialization/ArchiveDotOrg.Deserializer.cs +++ b/SabreTools.Serialization/ArchiveDotOrg.Deserializer.cs @@ -8,13 +8,29 @@ namespace SabreTools.Serialization /// public partial class ArchiveDotOrg : XmlSerializer { - // TODO: Add deserialization of entire Files #region Internal + /// + /// Convert from to an array of + /// + public static Files? ConvertFromInternalModel(Models.Internal.MetadataFile? item) + { + if (item == null) + return null; + + var files = new Files(); + + var machines = item.Read(Models.Internal.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + files.File = machines.SelectMany(ConvertFromInternalModel).ToArray(); + + return files; + } + /// /// Convert from to an array of /// - public static File[]? ConvertFromInternalModel(Models.Internal.Machine? item) + private static File[]? ConvertFromInternalModel(Models.Internal.Machine? item) { if (item == null) return null; diff --git a/SabreTools.Serialization/AttractMode.Deserializer.cs b/SabreTools.Serialization/AttractMode.Deserializer.cs index ac5b5ab4..2deff0b3 100644 --- a/SabreTools.Serialization/AttractMode.Deserializer.cs +++ b/SabreTools.Serialization/AttractMode.Deserializer.cs @@ -121,13 +121,30 @@ namespace SabreTools.Serialization return dat; } - // TODO: Add deserialization of entire MetadataFile #region Internal + /// + /// Convert from to + /// + public static MetadataFile? ConvertFromInternalModel(Models.Internal.MetadataFile? item) + { + if (item == null) + return null; + + var header = item.Read(Models.Internal.MetadataFile.HeaderKey); + var metadataFile = header != null ? ConvertHeaderFromInternalModel(header) : new MetadataFile(); + + var machines = item.Read(Models.Internal.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + metadataFile.Row = machines.SelectMany(ConvertMachineFromInternalModel).ToArray(); + + return metadataFile; + } + /// /// Convert from to /// - public static MetadataFile? ConvertHeaderToInternalModel(Models.Internal.Header? item) + private static MetadataFile? ConvertHeaderFromInternalModel(Models.Internal.Header? item) { if (item == null) return null; @@ -142,7 +159,7 @@ namespace SabreTools.Serialization /// /// Convert from to an array of /// - public static Row?[]? ConvertMachineToInternalModel(Models.Internal.Machine? item) + private static Row?[]? ConvertMachineFromInternalModel(Models.Internal.Machine? item) { if (item == null) return null; @@ -153,7 +170,7 @@ namespace SabreTools.Serialization if (rom == null) return null; - var rowItem = ConvertToInternalModel(rom); + var rowItem = ConvertFromInternalModel(rom); rowItem.Name = item.ReadString(Models.Internal.Machine.NameKey); rowItem.Emulator = item.ReadString(Models.Internal.Machine.EmulatorKey); @@ -181,7 +198,7 @@ namespace SabreTools.Serialization /// /// Convert from to /// - private static Row? ConvertToInternalModel(Models.Internal.Rom? item) + private static Row? ConvertFromInternalModel(Models.Internal.Rom? item) { if (item == null) return null; diff --git a/SabreTools.Serialization/ClrMamePro.Deserializer.cs b/SabreTools.Serialization/ClrMamePro.Deserializer.cs index f19ddb79..b05bd905 100644 --- a/SabreTools.Serialization/ClrMamePro.Deserializer.cs +++ b/SabreTools.Serialization/ClrMamePro.Deserializer.cs @@ -830,13 +830,33 @@ namespace SabreTools.Serialization return driver; } - // TODO: Add deserialization of entire MetadataFile #region Internal + /// + /// Convert from to + /// + public static MetadataFile? ConvertFromInternalModel(Models.Internal.MetadataFile? item, bool game = false) + { + if (item == null) + return null; + + var metadataFile = new MetadataFile(); + + var header = item.Read(Models.Internal.MetadataFile.HeaderKey); + if (header != null) + metadataFile.ClrMamePro = ConvertHeaderFromInternalModel(header); + + var machines = item.Read(Models.Internal.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + metadataFile.Game = machines.Select(machine => ConvertMachineFromInternalModel(machine, game)).ToArray(); + + return metadataFile; + } + /// /// Convert from to /// - public static Models.ClrMamePro.ClrMamePro? ConvertHeaderFromInternalModel(Models.Internal.Header? item) + private static Models.ClrMamePro.ClrMamePro? ConvertHeaderFromInternalModel(Models.Internal.Header? item) { if (item == null) return null; @@ -865,7 +885,7 @@ namespace SabreTools.Serialization /// /// Convert from to /// - public static GameBase? ConvertMachineFromInternalModel(Models.Internal.Machine? item, bool game = false) + private static GameBase? ConvertMachineFromInternalModel(Models.Internal.Machine? item, bool game = false) { if (item == null) return null; diff --git a/SabreTools.Serialization/DosCenter.Deserializer.cs b/SabreTools.Serialization/DosCenter.Deserializer.cs index cc707cf9..3b4f2f4a 100644 --- a/SabreTools.Serialization/DosCenter.Deserializer.cs +++ b/SabreTools.Serialization/DosCenter.Deserializer.cs @@ -19,16 +19,8 @@ namespace SabreTools.Serialization /// Deserialized data on success, null on failure public static MetadataFile? Deserialize(string path) { - try - { - using var stream = PathProcessor.OpenStream(path); - return Deserialize(stream); - } - catch - { - // TODO: Handle logging the exception - return default; - } + using var stream = PathProcessor.OpenStream(path); + return Deserialize(stream); } /// @@ -38,163 +30,155 @@ namespace SabreTools.Serialization /// Deserialized data on success, null on failure public static MetadataFile? Deserialize(Stream? stream) { - try + // If the stream is null + if (stream == null) + return default; + + // Setup the reader and output + var reader = new ClrMameProReader(stream, Encoding.UTF8) { DosCenter = true }; + var dat = new MetadataFile(); + + // Loop through and parse out the values + string lastTopLevel = reader.TopLevel; + + Game? game = null; + var games = new List(); + var files = new List(); + + var additional = new List(); + var headerAdditional = new List(); + var gameAdditional = new List(); + var fileAdditional = new List(); + while (!reader.EndOfStream) { - // If the stream is null - if (stream == null) - return default; + // If we have no next line + if (!reader.ReadNextLine()) + break; - // Setup the reader and output - var reader = new ClrMameProReader(stream, Encoding.UTF8) { DosCenter = true }; - var dat = new MetadataFile(); - - // Loop through and parse out the values - string lastTopLevel = reader.TopLevel; - - Game? game = null; - var games = new List(); - var files = new List(); - - var additional = new List(); - var headerAdditional = new List(); - var gameAdditional = new List(); - var fileAdditional = new List(); - while (!reader.EndOfStream) + // Ignore certain row types + switch (reader.RowType) { - // If we have no next line - if (!reader.ReadNextLine()) - break; - - // Ignore certain row types - switch (reader.RowType) - { - case CmpRowType.None: - case CmpRowType.Comment: - continue; - case CmpRowType.EndTopLevel: - switch (lastTopLevel) - { - case "doscenter": - dat.DosCenter.ADDITIONAL_ELEMENTS = headerAdditional.ToArray(); - headerAdditional.Clear(); - break; - case "game": - game.File = files.ToArray(); - game.ADDITIONAL_ELEMENTS = gameAdditional.ToArray(); - games.Add(game); - - game = null; - files.Clear(); - gameAdditional.Clear(); - break; - default: - // No-op - break; - } - continue; - } - - // If we're at the root - if (reader.RowType == CmpRowType.TopLevel) - { - lastTopLevel = reader.TopLevel; - switch (reader.TopLevel) + case CmpRowType.None: + case CmpRowType.Comment: + continue; + case CmpRowType.EndTopLevel: + switch (lastTopLevel) { case "doscenter": - dat.DosCenter = new Models.DosCenter.DosCenter(); + dat.DosCenter.ADDITIONAL_ELEMENTS = headerAdditional.ToArray(); + headerAdditional.Clear(); break; case "game": - game = new Game(); + game.File = files.ToArray(); + game.ADDITIONAL_ELEMENTS = gameAdditional.ToArray(); + games.Add(game); + + game = null; + files.Clear(); + gameAdditional.Clear(); break; default: - additional.Add(reader.CurrentLine); + // No-op break; } - } + continue; + } - // If we're in the doscenter block - else if (reader.TopLevel == "doscenter" && reader.RowType == CmpRowType.Standalone) + // If we're at the root + if (reader.RowType == CmpRowType.TopLevel) + { + lastTopLevel = reader.TopLevel; + switch (reader.TopLevel) { - // Create the block if we haven't already - dat.DosCenter ??= new Models.DosCenter.DosCenter(); - - switch (reader.Standalone?.Key?.ToLowerInvariant()) - { - case "name:": - dat.DosCenter.Name = reader.Standalone?.Value; - break; - case "description:": - dat.DosCenter.Description = reader.Standalone?.Value; - break; - case "version:": - dat.DosCenter.Version = reader.Standalone?.Value; - break; - case "date:": - dat.DosCenter.Date = reader.Standalone?.Value; - break; - case "author:": - dat.DosCenter.Author = reader.Standalone?.Value; - break; - case "homepage:": - dat.DosCenter.Homepage = reader.Standalone?.Value; - break; - case "comment:": - dat.DosCenter.Comment = reader.Standalone?.Value; - break; - default: - headerAdditional.Add(item: reader.CurrentLine); - break; - } - } - - // If we're in a game block - else if (reader.TopLevel == "game" && reader.RowType == CmpRowType.Standalone) - { - // Create the block if we haven't already - game ??= new Game(); - - switch (reader.Standalone?.Key?.ToLowerInvariant()) - { - case "name": - game.Name = reader.Standalone?.Value; - break; - default: - gameAdditional.Add(item: reader.CurrentLine); - break; - } - } - - // If we're in a file block - else if (reader.TopLevel == "game" && reader.RowType == CmpRowType.Internal) - { - // If we have an unknown type, log it - if (reader.InternalName != "file") - { - gameAdditional.Add(reader.CurrentLine); - continue; - } - - // Create the file and add to the list - var file = CreateFile(reader); - files.Add(file); - } - - else - { - additional.Add(item: reader.CurrentLine); + case "doscenter": + dat.DosCenter = new Models.DosCenter.DosCenter(); + break; + case "game": + game = new Game(); + break; + default: + additional.Add(reader.CurrentLine); + break; } } - // Add extra pieces and return - dat.Game = games.ToArray(); - dat.ADDITIONAL_ELEMENTS = additional.ToArray(); - return dat; - } - catch - { - // TODO: Handle logging the exception - return default; + // If we're in the doscenter block + else if (reader.TopLevel == "doscenter" && reader.RowType == CmpRowType.Standalone) + { + // Create the block if we haven't already + dat.DosCenter ??= new Models.DosCenter.DosCenter(); + + switch (reader.Standalone?.Key?.ToLowerInvariant()) + { + case "name:": + dat.DosCenter.Name = reader.Standalone?.Value; + break; + case "description:": + dat.DosCenter.Description = reader.Standalone?.Value; + break; + case "version:": + dat.DosCenter.Version = reader.Standalone?.Value; + break; + case "date:": + dat.DosCenter.Date = reader.Standalone?.Value; + break; + case "author:": + dat.DosCenter.Author = reader.Standalone?.Value; + break; + case "homepage:": + dat.DosCenter.Homepage = reader.Standalone?.Value; + break; + case "comment:": + dat.DosCenter.Comment = reader.Standalone?.Value; + break; + default: + headerAdditional.Add(item: reader.CurrentLine); + break; + } + } + + // If we're in a game block + else if (reader.TopLevel == "game" && reader.RowType == CmpRowType.Standalone) + { + // Create the block if we haven't already + game ??= new Game(); + + switch (reader.Standalone?.Key?.ToLowerInvariant()) + { + case "name": + game.Name = reader.Standalone?.Value; + break; + default: + gameAdditional.Add(item: reader.CurrentLine); + break; + } + } + + // If we're in a file block + else if (reader.TopLevel == "game" && reader.RowType == CmpRowType.Internal) + { + // If we have an unknown type, log it + if (reader.InternalName != "file") + { + gameAdditional.Add(reader.CurrentLine); + continue; + } + + // Create the file and add to the list + var file = CreateFile(reader); + files.Add(file); + } + + else + { + additional.Add(item: reader.CurrentLine); + } } + + // Add extra pieces and return + dat.Game = games.ToArray(); + dat.ADDITIONAL_ELEMENTS = additional.ToArray(); + return dat; } /// @@ -231,14 +215,34 @@ namespace SabreTools.Serialization file.ADDITIONAL_ELEMENTS = itemAdditional.ToArray(); return file; } - - // TODO: Add deserialization of entire MetadataFile + #region Internal + /// + /// Convert from to + /// + public static MetadataFile? ConvertFromInternalModel(Models.Internal.MetadataFile? item) + { + if (item == null) + return null; + + var metadataFile = new MetadataFile(); + + var header = item.Read(Models.Internal.MetadataFile.HeaderKey); + if (header != null) + metadataFile.DosCenter = ConvertHeaderFromInternalModel(header); + + var machines = item.Read(Models.Internal.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + metadataFile.Game = machines.Select(ConvertMachineFromInternalModel).ToArray(); + + return metadataFile; + } + /// /// Convert from to /// - public static Models.DosCenter.DosCenter? ConvertHeaderFromInternalModel(Models.Internal.Header? item) + private static Models.DosCenter.DosCenter? ConvertHeaderFromInternalModel(Models.Internal.Header? item) { if (item == null) return null; @@ -259,7 +263,7 @@ namespace SabreTools.Serialization /// /// Convert from to /// - public static Game? ConvertMachineFromInternalModel(Models.Internal.Machine? item) + private static Game? ConvertMachineFromInternalModel(Models.Internal.Machine? item) { if (item == null) return null; diff --git a/SabreTools.Serialization/EverdriveSMDB.Deserializer.cs b/SabreTools.Serialization/EverdriveSMDB.Deserializer.cs index b907181e..ed231520 100644 --- a/SabreTools.Serialization/EverdriveSMDB.Deserializer.cs +++ b/SabreTools.Serialization/EverdriveSMDB.Deserializer.cs @@ -77,25 +77,41 @@ namespace SabreTools.Serialization return dat; } - // TODO: Add deserialization of entire MetadataFile #region Internal + /// + /// Convert from to + /// + public static MetadataFile? ConvertFromInternalModel(Models.Internal.MetadataFile? item) + { + if (item == null) + return null; + + var metadataFile = new MetadataFile(); + + var machines = item.Read(Models.Internal.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + metadataFile.Row = machines.SelectMany(ConvertMachineFromInternalModel).ToArray(); + + return metadataFile; + } + /// /// Convert from to an array of /// - public static Row[]? ConvertMachineToEverdriveSMDB(Models.Internal.Machine item) + private static Row[]? ConvertMachineFromInternalModel(Models.Internal.Machine item) { if (item == null) return null; var roms = item.Read(Models.Internal.Machine.RomKey); - return roms?.Select(ConvertToEverdriveSMDB)?.ToArray(); + return roms?.Select(ConvertFromInternalModel)?.ToArray(); } /// /// Convert from to /// - private static Row? ConvertToEverdriveSMDB(Models.Internal.Rom? item) + private static Row? ConvertFromInternalModel(Models.Internal.Rom? item) { if (item == null) return null; diff --git a/SabreTools.Serialization/Hashfile.Deserializer.cs b/SabreTools.Serialization/Hashfile.Deserializer.cs index f434857e..8a6592c1 100644 --- a/SabreTools.Serialization/Hashfile.Deserializer.cs +++ b/SabreTools.Serialization/Hashfile.Deserializer.cs @@ -142,13 +142,27 @@ namespace SabreTools.Serialization return dat; } - // TODO: Add deserialization of entire Hashfile #region Internal + /// + /// Convert from to an array of + /// + public static Models.Hashfile.Hashfile[]? ConvertFromInternalModel(Models.Internal.MetadataFile? item, Hash hash) + { + if (item == null) + return null; + + var machines = item.Read(Models.Internal.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + return machines.Select(machine => ConvertMachineFromInternalModel(machine, hash)).ToArray(); + + return null; + } + /// /// Convert from to /// - public static Models.Hashfile.Hashfile? ConvertMachineToInternalModel(Models.Internal.Machine? item, Hash hash) + private static Models.Hashfile.Hashfile? ConvertMachineFromInternalModel(Models.Internal.Machine? item, Hash hash) { if (item == null) return null; diff --git a/SabreTools.Serialization/Listrom.Deserializer.cs b/SabreTools.Serialization/Listrom.Deserializer.cs index 571559fc..43e5cb85 100644 --- a/SabreTools.Serialization/Listrom.Deserializer.cs +++ b/SabreTools.Serialization/Listrom.Deserializer.cs @@ -188,13 +188,29 @@ namespace SabreTools.Serialization return dat; } - // TODO: Add deserialization of entire MetadataFile #region Internal + /// + /// Convert from to + /// + public static MetadataFile? ConvertFromInternalModel(Models.Internal.MetadataFile? item) + { + if (item == null) + return null; + + var metadataFile = new MetadataFile(); + + var machines = item.Read(Models.Internal.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + metadataFile.Set = machines.Select(ConvertMachineFromInternalModel).ToArray(); + + return metadataFile; + } + /// /// Convert from to /// - public static Set? ConvertMachineToListrom(Models.Internal.Machine? item) + private static Set? ConvertMachineFromInternalModel(Models.Internal.Machine? item) { if (item == null) return null; @@ -209,11 +225,11 @@ namespace SabreTools.Serialization var roms = item.Read(Models.Internal.Machine.RomKey); if (roms != null) - rowItems.AddRange(roms.Select(ConvertToListrom)); + rowItems.AddRange(roms.Select(ConvertFromInternalModel)); var disks = item.Read(Models.Internal.Machine.DiskKey); if (disks != null) - rowItems.AddRange(disks.Select(ConvertToListrom)); + rowItems.AddRange(disks.Select(ConvertFromInternalModel)); set.Row = rowItems.ToArray(); return set; @@ -222,7 +238,7 @@ namespace SabreTools.Serialization /// /// Convert from to /// - private static Row? ConvertToListrom(Models.Internal.Disk? item) + private static Row? ConvertFromInternalModel(Models.Internal.Disk? item) { if (item == null) return null; @@ -245,7 +261,7 @@ namespace SabreTools.Serialization /// /// Convert from to /// - private static Row? ConvertToListrom(Models.Internal.Rom? item) + private static Row? ConvertFromInternalModel(Models.Internal.Rom? item) { if (item == null) return null; diff --git a/SabreTools.Serialization/Listxml.Deserializer.cs b/SabreTools.Serialization/Listxml.Deserializer.cs index 596572e6..06773a6c 100644 --- a/SabreTools.Serialization/Listxml.Deserializer.cs +++ b/SabreTools.Serialization/Listxml.Deserializer.cs @@ -10,10 +10,46 @@ namespace SabreTools.Serialization { #region Internal + /// + /// Convert from to + /// + public static M1? ConvertM1FromInternalModel(Models.Internal.MetadataFile? item) + { + if (item == null) + return null; + + var header = item.Read(Models.Internal.MetadataFile.HeaderKey); + var m1 = header != null ? ConvertM1FromInternalModel(header) : new M1(); + + var machines = item.Read(Models.Internal.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + m1.Game = machines.Select(ConvertMachineFromInternalModel).ToArray(); + + return m1; + } + + /// + /// Convert from to + /// + public static Mame? ConvertMameFromInternalModel(Models.Internal.MetadataFile? item) + { + if (item == null) + return null; + + var header = item.Read(Models.Internal.MetadataFile.HeaderKey); + var mame = header != null ? ConvertMameFromInternalModel(header) : new Mame(); + + var machines = item.Read(Models.Internal.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + mame.Game = machines.Select(ConvertMachineFromInternalModel).ToArray(); + + return mame; + } + /// /// Convert from to /// - public static M1? ConvertM1FromInternalModel(Models.Internal.Header? item) + private static M1? ConvertM1FromInternalModel(Models.Internal.Header? item) { if (item == null) return null; @@ -28,7 +64,7 @@ namespace SabreTools.Serialization /// /// Convert from to /// - public static Mame? ConvertMameFromInternalModel(Models.Internal.Header? item) + private static Mame? ConvertMameFromInternalModel(Models.Internal.Header? item) { if (item == null) return null; @@ -39,13 +75,14 @@ namespace SabreTools.Serialization Debug = item.ReadString(Models.Internal.Header.DebugKey), MameConfig = item.ReadString(Models.Internal.Header.MameConfigKey), }; + return mame; } /// /// Convert from to /// - public static GameBase? ConvertMachineFromInternalModel(Models.Internal.Machine? item) + private static GameBase? ConvertMachineFromInternalModel(Models.Internal.Machine? item) { if (item == null) return null; diff --git a/SabreTools.Serialization/Logiqx.Deserializer.cs b/SabreTools.Serialization/Logiqx.Deserializer.cs index 67f4822f..23444b9a 100644 --- a/SabreTools.Serialization/Logiqx.Deserializer.cs +++ b/SabreTools.Serialization/Logiqx.Deserializer.cs @@ -8,13 +8,39 @@ namespace SabreTools.Serialization /// public partial class Logiqx : XmlSerializer { - // TODO: Add deserialization of entire Datafile #region Internal + /// + /// Convert from to + /// + public static Datafile? ConvertFromInternalModel(Models.Internal.MetadataFile? item, bool game = false) + { + if (item == null) + return null; + + var datafile = new Datafile + { + Build = item.ReadString(Models.Internal.Header.BuildKey), + Debug = item.ReadString(Models.Internal.Header.DebugKey), + SchemaLocation = item.ReadString(Models.Internal.Header.SchemaLocationKey), + }; + + var header = item.Read(Models.Internal.MetadataFile.HeaderKey); + if (header != null) + datafile.Header = ConvertHeaderFromInternalModel(header); + + // TODO: Handle Dir items + var machines = item.Read(Models.Internal.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + datafile.Game = machines.Select(machine => ConvertMachineFromInternalModel(machine, game)).ToArray(); + + return datafile; + } + /// /// Convert from to /// - public static Header? ConvertHeaderFromInternalModel(Models.Internal.Header? item) + private static Header ConvertHeaderFromInternalModel(Models.Internal.Header item) { if (item == null) return null; @@ -76,7 +102,7 @@ namespace SabreTools.Serialization /// /// Convert from to /// - public static GameBase? ConvertMachineFromInternalModel(Models.Internal.Machine? item, bool game = false) + private static GameBase? ConvertMachineFromInternalModel(Models.Internal.Machine? item, bool game = false) { if (item == null) return null; diff --git a/SabreTools.Serialization/OfflineList.Deserializer.cs b/SabreTools.Serialization/OfflineList.Deserializer.cs index 3e29c4ef..e66749f1 100644 --- a/SabreTools.Serialization/OfflineList.Deserializer.cs +++ b/SabreTools.Serialization/OfflineList.Deserializer.cs @@ -8,13 +8,30 @@ namespace SabreTools.Serialization /// public partial class OfflineList : XmlSerializer { - // TODO: Add deserialization of entire Dat #region Internal + /// + /// Convert from to + /// + public static Dat? ConvertFromInternalModel(Models.Internal.MetadataFile? item) + { + if (item == null) + return null; + + var header = item.Read(Models.Internal.MetadataFile.HeaderKey); + var dat = header != null ? ConvertHeaderFromInternalModel(header) : new Dat(); + + var machines = item.Read(Models.Internal.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + dat.Games = new Games { Game = machines.Select(ConvertMachineFromInternalModel).ToArray() }; + + return dat; + } + /// /// Convert from to /// - public static Dat? ConvertHeaderFromInternalModel(Models.Internal.Header? item) + private static Dat? ConvertHeaderFromInternalModel(Models.Internal.Header? item) { if (item == null) return null; @@ -66,7 +83,7 @@ namespace SabreTools.Serialization /// /// Convert from to /// - public static Game? ConvertMachineFromInternalModel(Models.Internal.Machine? item) + private static Game? ConvertMachineFromInternalModel(Models.Internal.Machine? item) { if (item == null) return null; diff --git a/SabreTools.Serialization/OpenMSX.Deserializer.cs b/SabreTools.Serialization/OpenMSX.Deserializer.cs index a8c6ae08..fe4493cf 100644 --- a/SabreTools.Serialization/OpenMSX.Deserializer.cs +++ b/SabreTools.Serialization/OpenMSX.Deserializer.cs @@ -8,13 +8,30 @@ namespace SabreTools.Serialization /// public partial class OpenMSX : XmlSerializer { - // TODO: Add deserialization of entire SoftwareDb #region Internal + /// + /// Convert from to + /// + public static SoftwareDb? ConvertFromInternalModel(Models.Internal.MetadataFile? item) + { + if (item == null) + return null; + + var header = item.Read(Models.Internal.MetadataFile.HeaderKey); + var softwareDb = header != null ? ConvertHeaderFromInternalModel(header) : new SoftwareDb(); + + var machines = item.Read(Models.Internal.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + softwareDb.Software = machines.Select(ConvertMachineFromInternalModel).ToArray(); + + return softwareDb; + } + /// /// Convert from to /// - public static SoftwareDb? ConvertHeaderFromInternalModel(Models.Internal.Header? item) + private static SoftwareDb? ConvertHeaderFromInternalModel(Models.Internal.Header? item) { if (item == null) return null; @@ -29,7 +46,7 @@ namespace SabreTools.Serialization /// /// Convert from to /// - public static Software? ConvertMachineFromInternalModel(Models.Internal.Machine? item) + private static Software? ConvertMachineFromInternalModel(Models.Internal.Machine? item) { if (item == null) return null; diff --git a/SabreTools.Serialization/RomCenter.Deserializer.cs b/SabreTools.Serialization/RomCenter.Deserializer.cs index ed95cf8a..02650bdb 100644 --- a/SabreTools.Serialization/RomCenter.Deserializer.cs +++ b/SabreTools.Serialization/RomCenter.Deserializer.cs @@ -221,13 +221,30 @@ namespace SabreTools.Serialization return dat; } - // TODO: Add deserialization of entire MetadataFile #region Internal + /// + /// Convert from to + /// + public static MetadataFile? ConvertFromInternalModel(Models.Internal.MetadataFile? item) + { + if (item == null) + return null; + + var header = item.Read(Models.Internal.MetadataFile.HeaderKey); + var metadataFile = header != null ? ConvertHeaderFromInternalModel(header) : new MetadataFile(); + + var machines = item.Read(Models.Internal.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + metadataFile.Games = new Games { Rom = machines.SelectMany(ConvertMachineFromInternalModel).ToArray() }; + + return metadataFile; + } + /// /// Convert from to /// - public static MetadataFile? ConvertHeaderFromInternalModel(Models.Internal.Header? item) + private static MetadataFile? ConvertHeaderFromInternalModel(Models.Internal.Header? item) { if (item == null) return null; @@ -283,7 +300,7 @@ namespace SabreTools.Serialization /// /// Convert from to an array of /// - public static Rom?[]? ConvertMachineFromInternalModel(Models.Internal.Machine? item) + private static Rom?[]? ConvertMachineFromInternalModel(Models.Internal.Machine? item) { if (item == null) return null; diff --git a/SabreTools.Serialization/SeparatedValue.Deserializer.cs b/SabreTools.Serialization/SeparatedValue.Deserializer.cs index 2acf46de..e525e77d 100644 --- a/SabreTools.Serialization/SeparatedValue.Deserializer.cs +++ b/SabreTools.Serialization/SeparatedValue.Deserializer.cs @@ -120,13 +120,30 @@ namespace SabreTools.Serialization return dat; } - // TODO: Add deserialization of entire MetadataFile #region Internal + /// + /// Convert from to + /// + public static MetadataFile? ConvertFromInternalModel(Models.Internal.MetadataFile? item) + { + if (item == null) + return null; + + var header = item.Read(Models.Internal.MetadataFile.HeaderKey); + var metadataFile = header != null ? ConvertHeaderFromInternalModel(header) : new MetadataFile(); + + var machines = item.Read(Models.Internal.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + metadataFile.Row = machines.SelectMany(ConvertMachineFromInternalModel).ToArray(); + + return metadataFile; + } + /// /// Convert from to /// - public static MetadataFile? ConvertHeaderFromInternalModel(Models.Internal.Header? item) + private static MetadataFile? ConvertHeaderFromInternalModel(Models.Internal.Header? item) { if (item == null) return null; @@ -141,7 +158,7 @@ namespace SabreTools.Serialization /// /// Convert from to an array of /// - public static Row[]? ConvertMachineFromInternalModel(Models.Internal.Machine? item) + private static Row[]? ConvertMachineFromInternalModel(Models.Internal.Machine? item) { if (item == null) return null; diff --git a/SabreTools.Serialization/SoftwareList.Deserializer.cs b/SabreTools.Serialization/SoftwareList.Deserializer.cs index 3b30a496..44742707 100644 --- a/SabreTools.Serialization/SoftwareList.Deserializer.cs +++ b/SabreTools.Serialization/SoftwareList.Deserializer.cs @@ -8,13 +8,30 @@ namespace SabreTools.Serialization /// public partial class SoftawreList : XmlSerializer { - // TODO: Add deserialization of entire SoftwareList - #region Deserialize + #region Internal + + /// + /// Convert from to + /// + public static SoftwareList? ConvertFromInternalModel(Models.Internal.MetadataFile? item) + { + if (item == null) + return null; + + var header = item.Read(Models.Internal.MetadataFile.HeaderKey); + var metadataFile = header != null ? ConvertHeaderFromInternalModel(header) : new SoftwareList(); + + var machines = item.Read(Models.Internal.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + metadataFile.Software = machines.Select(ConvertMachineFromInternalModel).ToArray(); + + return metadataFile; + } /// /// Convert from to /// - public static SoftwareList? ConvertHeaderFromInternalModel(Models.Internal.Header? item) + private static SoftwareList? ConvertHeaderFromInternalModel(Models.Internal.Header? item) { if (item == null) return null; @@ -31,7 +48,7 @@ namespace SabreTools.Serialization /// /// Convert from to /// - public static Software? ConvertMachineFromInternalModel(Models.Internal.Machine? item) + private static Software? ConvertMachineFromInternalModel(Models.Internal.Machine? item) { if (item == null) return null;