mirror of
https://github.com/SabreTools/SabreTools.Serialization.git
synced 2026-09-23 07:14:57 +00:00
Add and convert OfflineList
This commit is contained in:
137
CrossModel/OfflineList.Deserializer.cs
Normal file
137
CrossModel/OfflineList.Deserializer.cs
Normal file
@@ -0,0 +1,137 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.OfflineList;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class OfflineList : IModelSerializer<Dat, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
#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.Header>(Models.Metadata.MetadataFile.HeaderKey);
|
||||
var dat = header != null ? ConvertHeaderFromInternalModel(header) : new Dat();
|
||||
|
||||
var machines = obj.Read<Models.Metadata.Machine[]>(Models.Metadata.MetadataFile.MachineKey);
|
||||
if (machines != null && machines.Any())
|
||||
{
|
||||
dat.Games = new Games
|
||||
{
|
||||
Game = machines
|
||||
.Where(m => m != null)
|
||||
.Select(ConvertMachineFromInternalModel)
|
||||
.ToArray()
|
||||
};
|
||||
}
|
||||
|
||||
return dat;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Header"/> to <cref="Models.OfflineList.Dat"/>
|
||||
/// </summary>
|
||||
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<Infos>(Models.Metadata.Header.InfosKey),
|
||||
CanOpen = item.Read<CanOpen>(Models.Metadata.Header.CanOpenKey),
|
||||
NewDat = item.Read<NewDat>(Models.Metadata.Header.NewDatKey),
|
||||
Search = item.Read<Search>(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<Images>(Models.Metadata.Header.ImagesKey),
|
||||
};
|
||||
}
|
||||
|
||||
return dat;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Machine"/> to <cref="Models.OfflineList.Game"/>
|
||||
/// </summary>
|
||||
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.Rom[]>(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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.Metadata.Rom"/> to <cref="Models.OfflineList.FileRomCRC"/>
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
117
CrossModel/OfflineList.Serializer.cs
Normal file
117
CrossModel/OfflineList.Serializer.cs
Normal file
@@ -0,0 +1,117 @@
|
||||
using System.Linq;
|
||||
using SabreTools.Models.OfflineList;
|
||||
|
||||
namespace SabreTools.Serialization.CrossModel
|
||||
{
|
||||
public partial class OfflineList : IModelSerializer<Dat, Models.Metadata.MetadataFile>
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
#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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.OfflineList.Dat"/> to <cref="Models.Metadata.Header"/>
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.OfflineList.Game"/> to <cref="Models.Metadata.Machine"/>
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert from <cref="Models.OfflineList.FileRomCRC"/> to <cref="Models.Metadata.Rom"/>
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
7
Files/OfflineList.Deserializer.cs
Normal file
7
Files/OfflineList.Deserializer.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class OfflineList : XmlFile<Models.OfflineList.Dat>
|
||||
{
|
||||
// All serialization logic is in the base class
|
||||
}
|
||||
}
|
||||
7
Files/OfflineList.Serializer.cs
Normal file
7
Files/OfflineList.Serializer.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace SabreTools.Serialization.Files
|
||||
{
|
||||
public partial class OfflineList : XmlFile<Models.OfflineList.Dat>
|
||||
{
|
||||
// All serialization logic is in the base class
|
||||
}
|
||||
}
|
||||
7
Streams/OfflineList.Deserializer.cs
Normal file
7
Streams/OfflineList.Deserializer.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace SabreTools.Serialization.Streams
|
||||
{
|
||||
public partial class OfflineList : XmlFile<Models.OfflineList.Dat>
|
||||
{
|
||||
// All serialization logic is in the base class
|
||||
}
|
||||
}
|
||||
7
Streams/OfflineList.Serializer.cs
Normal file
7
Streams/OfflineList.Serializer.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace SabreTools.Serialization.Streams
|
||||
{
|
||||
public partial class OfflineList : XmlFile<Models.OfflineList.Dat>
|
||||
{
|
||||
// All serialization logic is in the base class
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user