using System.Collections.Generic; using System.Linq; using SabreTools.Models.Internal; namespace SabreTools.Serialization { /// /// Serializer for SoftwareList models to internal structure /// public partial class Internal { #region Serialize /// /// Convert from to /// public static MetadataFile ConvertFromSoftwareList(Models.SoftwareList.SoftwareList item) { var metadataFile = new MetadataFile { [MetadataFile.HeaderKey] = ConvertHeaderFromSoftwareList(item), }; if (item?.Software != null && item.Software.Any()) metadataFile[MetadataFile.MachineKey] = item.Software.Select(ConvertMachineFromSoftwareList).ToArray(); return metadataFile; } /// /// Convert from to /// private static Header ConvertHeaderFromSoftwareList(Models.SoftwareList.SoftwareList item) { var header = new Header { [Header.NameKey] = item.Name, [Header.DescriptionKey] = item.Description, [Header.NotesKey] = item.Notes, }; return header; } /// /// Convert from to /// private static Machine ConvertMachineFromSoftwareList(Models.SoftwareList.Software item) { var machine = new Machine { [Machine.NameKey] = item.Name, [Machine.CloneOfKey] = item.CloneOf, [Machine.SupportedKey] = item.Supported, [Machine.DescriptionKey] = item.Description, [Machine.YearKey] = item.Year, [Machine.PublisherKey] = item.Publisher, [Machine.NotesKey] = item.Notes, }; if (item.Info != null && item.Info.Any()) { var infos = new List(); foreach (var info in item.Info) { infos.Add(ConvertFromSoftwareList(info)); } machine[Machine.InfoKey] = infos.ToArray(); } if (item.SharedFeat != null && item.SharedFeat.Any()) { var sharedFeats = new List(); foreach (var sharedFeat in item.SharedFeat) { sharedFeats.Add(ConvertFromSoftwareList(sharedFeat)); } machine[Machine.SharedFeatKey] = sharedFeats.ToArray(); } if (item.Part != null && item.Part.Any()) { var parts = new List(); foreach (var part in item.Part) { parts.Add(ConvertFromSoftwareList(part)); } machine[Machine.PartKey] = parts.ToArray(); } return machine; } /// /// Convert from to /// private static DataArea ConvertFromSoftwareList(Models.SoftwareList.DataArea item) { var dataArea = new DataArea { [DataArea.NameKey] = item.Name, [DataArea.SizeKey] = item.Size, [DataArea.WidthKey] = item.Width, [DataArea.EndiannessKey] = item.Endianness, }; if (item.Rom != null && item.Rom.Any()) { var roms = new List(); foreach (var rom in item.Rom) { roms.Add(ConvertFromSoftwareList(rom)); } dataArea[DataArea.RomKey] = roms.ToArray(); } return dataArea; } /// /// Convert from to /// private static DipSwitch ConvertFromSoftwareList(Models.SoftwareList.DipSwitch item) { var dipSwitch = new DipSwitch { [DipSwitch.NameKey] = item.Name, [DipSwitch.TagKey] = item.Tag, [DipSwitch.MaskKey] = item.Mask, }; if (item.DipValue != null && item.DipValue.Any()) { var dipValues = new List(); foreach (var dipValue in item.DipValue) { dipValues.Add(ConvertFromSoftwareList(dipValue)); } dipSwitch[DipSwitch.DipValueKey] = dipValues.ToArray(); } return dipSwitch; } /// /// Convert from to /// private static DipValue ConvertFromSoftwareList(Models.SoftwareList.DipValue item) { var dipValue = new DipValue { [DipValue.NameKey] = item.Name, [DipValue.ValueKey] = item.Value, [DipValue.DefaultKey] = item.Default, }; return dipValue; } /// /// Convert from to /// private static Disk ConvertFromSoftwareList(Models.SoftwareList.Disk item) { var disk = new Disk { [Disk.NameKey] = item.Name, [Disk.MD5Key] = item.MD5, [Disk.SHA1Key] = item.SHA1, [Disk.StatusKey] = item.Status, [Disk.WritableKey] = item.Writeable, }; return disk; } /// /// Convert from to /// private static DiskArea ConvertFromSoftwareList(Models.SoftwareList.DiskArea item) { var diskArea = new DiskArea { [DiskArea.NameKey] = item.Name, }; if (item.Disk != null && item.Disk.Any()) { var roms = new List(); foreach (var disk in item.Disk) { roms.Add(ConvertFromSoftwareList(disk)); } diskArea[DiskArea.DiskKey] = roms.ToArray(); } return diskArea; } /// /// Convert from to /// private static Feature ConvertFromSoftwareList(Models.SoftwareList.Feature item) { var feature = new Feature { [Feature.NameKey] = item.Name, [Feature.ValueKey] = item.Value, }; return feature; } /// /// Convert from to /// private static Info ConvertFromSoftwareList(Models.SoftwareList.Info item) { var info = new Info { [Info.NameKey] = item.Name, [Info.ValueKey] = item.Value, }; return info; } /// /// Convert from to /// private static Part ConvertFromSoftwareList(Models.SoftwareList.Part item) { var part = new Part { [Part.NameKey] = item.Name, [Part.InterfaceKey] = item.Interface, }; if (item.Feature != null && item.Feature.Any()) { var features = new List(); foreach (var feature in item.Feature) { features.Add(ConvertFromSoftwareList(feature)); } part[Part.FeatureKey] = features.ToArray(); } if (item.DataArea != null && item.DataArea.Any()) { var dataAreas = new List(); foreach (var dataArea in item.DataArea) { dataAreas.Add(ConvertFromSoftwareList(dataArea)); } part[Part.DataAreaKey] = dataAreas.ToArray(); } if (item.DiskArea != null && item.DiskArea.Any()) { var diskAreas = new List(); foreach (var diskArea in item.DiskArea) { diskAreas.Add(ConvertFromSoftwareList(diskArea)); } part[Part.DiskAreaKey] = diskAreas.ToArray(); } if (item.DipSwitch != null && item.DipSwitch.Any()) { var dipSwitches = new List(); foreach (var rom in item.DipSwitch) { dipSwitches.Add(ConvertFromSoftwareList(rom)); } part[Part.DipSwitchKey] = dipSwitches.ToArray(); } return part; } /// /// Convert from to /// private static Rom ConvertFromSoftwareList(Models.SoftwareList.Rom item) { var rom = new Rom { [Rom.NameKey] = item.Name, [Rom.SizeKey] = item.Size, [Rom.LengthKey] = item.Length, [Rom.CRCKey] = item.CRC, [Rom.SHA1Key] = item.SHA1, [Rom.OffsetKey] = item.Offset, [Rom.ValueKey] = item.Value, [Rom.StatusKey] = item.Status, [Rom.LoadFlagKey] = item.LoadFlag, }; return rom; } /// /// Convert from to /// private static SharedFeat ConvertFromSoftwareList(Models.SoftwareList.SharedFeat item) { var sharedFeat = new SharedFeat { [SharedFeat.NameKey] = item.Name, [SharedFeat.ValueKey] = item.Value, }; return sharedFeat; } #endregion #region Deserialize /// /// Convert from to /// public static Models.SoftwareList.SoftwareList? ConvertHeaderToSoftwareList(Header? item) { if (item == null) return null; var softwareList = new Models.SoftwareList.SoftwareList { Name = item.ReadString(Header.NameKey), Description = item.ReadString(Header.DescriptionKey), Notes = item.ReadString(Header.NotesKey), }; return softwareList; } /// /// Convert from to /// public static Models.SoftwareList.Software? ConvertMachineToSoftwareList(Machine? item) { if (item == null) return null; var software = new Models.SoftwareList.Software { Name = item.ReadString(Machine.NameKey), CloneOf = item.ReadString(Machine.CloneOfKey), Supported = item.ReadString(Machine.SupportedKey), Description = item.ReadString(Machine.DescriptionKey), Year = item.ReadString(Machine.YearKey), Publisher = item.ReadString(Machine.PublisherKey), Notes = item.ReadString(Machine.NotesKey), }; var infos = item.Read(Machine.InfoKey); software.Info = infos?.Select(ConvertToSoftwareList)?.ToArray(); var sharedFeats = item.Read(Machine.SharedFeatKey); software.SharedFeat = sharedFeats?.Select(ConvertToSoftwareList)?.ToArray(); var parts = item.Read(Machine.PartKey); software.Part = parts?.Select(ConvertToSoftwareList)?.ToArray(); return software; } /// /// Convert from to /// private static Models.SoftwareList.DataArea? ConvertToSoftwareList(DataArea? item) { if (item == null) return null; var dataArea = new Models.SoftwareList.DataArea { Name = item.ReadString(DataArea.NameKey), Size = item.ReadString(DataArea.SizeKey), Width = item.ReadString(DataArea.WidthKey), Endianness = item.ReadString(DataArea.EndiannessKey), }; var roms = item.Read(DataArea.RomKey); dataArea.Rom = roms?.Select(ConvertToSoftwareList)?.ToArray(); return dataArea; } /// /// Convert from to /// private static Models.SoftwareList.DipSwitch? ConvertToSoftwareList(DipSwitch? item) { if (item == null) return null; var dipSwitch = new Models.SoftwareList.DipSwitch { Name = item.ReadString(DipSwitch.NameKey), Tag = item.ReadString(DipSwitch.TagKey), Mask = item.ReadString(DipSwitch.MaskKey), }; var dipValues = item.Read(DipSwitch.DipValueKey); dipSwitch.DipValue = dipValues?.Select(ConvertToSoftwareList)?.ToArray(); return dipSwitch; } /// /// Convert from to /// private static Models.SoftwareList.DipValue? ConvertToSoftwareList(DipValue? item) { if (item == null) return null; var dipValue = new Models.SoftwareList.DipValue { Name = item.ReadString(DipValue.NameKey), Value = item.ReadString(DipValue.ValueKey), Default = item.ReadString(DipValue.DefaultKey), }; return dipValue; } /// /// Convert from to /// private static Models.SoftwareList.Disk? ConvertToSoftwareList(Disk? item) { if (item == null) return null; var disk = new Models.SoftwareList.Disk { Name = item.ReadString(Disk.NameKey), MD5 = item.ReadString(Disk.MD5Key), SHA1 = item.ReadString(Disk.SHA1Key), Status = item.ReadString(Disk.StatusKey), Writeable = item.ReadString(Disk.WritableKey), }; return disk; } /// /// Convert from to /// private static Models.SoftwareList.DiskArea? ConvertToSoftwareList(DiskArea? item) { if (item == null) return null; var diskArea = new Models.SoftwareList.DiskArea { Name = item.ReadString(DiskArea.NameKey), }; var disks = item.Read(DiskArea.DiskKey); diskArea.Disk = disks?.Select(ConvertToSoftwareList)?.ToArray(); return diskArea; } /// /// Convert from to /// private static Models.SoftwareList.Feature? ConvertToSoftwareList(Feature? item) { if (item == null) return null; var feature = new Models.SoftwareList.Feature { Name = item.ReadString(Feature.NameKey), Value = item.ReadString(Feature.ValueKey), }; return feature; } /// /// Convert from to /// private static Models.SoftwareList.Info? ConvertToSoftwareList(Info? item) { if (item == null) return null; var info = new Models.SoftwareList.Info { Name = item.ReadString(Info.NameKey), Value = item.ReadString(Info.ValueKey), }; return info; } /// /// Convert from to /// private static Models.SoftwareList.Part? ConvertToSoftwareList(Part? item) { if (item == null) return null; var part = new Models.SoftwareList.Part { Name = item.ReadString(Part.NameKey), Interface = item.ReadString(Part.InterfaceKey), }; var features = item.Read(Part.FeatureKey); part.Feature = features?.Select(ConvertToSoftwareList)?.ToArray(); var dataAreas = item.Read(Part.DataAreaKey); part.DataArea = dataAreas?.Select(ConvertToSoftwareList)?.ToArray(); var diskAreas = item.Read(Part.DiskAreaKey); part.DiskArea = diskAreas?.Select(ConvertToSoftwareList)?.ToArray(); var dipSwitches = item.Read(Part.DipSwitchKey); part.DipSwitch = dipSwitches?.Select(ConvertToSoftwareList)?.ToArray(); return part; } /// /// Convert from to /// private static Models.SoftwareList.Rom? ConvertToSoftwareList(Rom? item) { if (item == null) return null; var rom = new Models.SoftwareList.Rom { Name = item.ReadString(Rom.NameKey), Size = item.ReadString(Rom.SizeKey), Length = item.ReadString(Rom.LengthKey), CRC = item.ReadString(Rom.CRCKey), SHA1 = item.ReadString(Rom.SHA1Key), Offset = item.ReadString(Rom.OffsetKey), Value = item.ReadString(Rom.ValueKey), Status = item.ReadString(Rom.StatusKey), LoadFlag = item.ReadString(Rom.LoadFlagKey), }; return rom; } /// /// Convert from to /// private static Models.SoftwareList.SharedFeat? ConvertToSoftwareList(SharedFeat? item) { if (item == null) return null; var sharedFeat = new Models.SoftwareList.SharedFeat { Name = item.ReadString(SharedFeat.NameKey), Value = item.ReadString(SharedFeat.ValueKey), }; return sharedFeat; } #endregion } }