diff --git a/CrossModel/EverdriveSMDB.Deserializer.cs b/CrossModel/EverdriveSMDB.Deserializer.cs new file mode 100644 index 00000000..fd491a36 --- /dev/null +++ b/CrossModel/EverdriveSMDB.Deserializer.cs @@ -0,0 +1,65 @@ +using System; +using System.Linq; +using SabreTools.Models.EverdriveSMDB; + +namespace SabreTools.Serialization.CrossModel +{ + public partial class EverdriveSMDB : IModelSerializer + { + /// +#if NET48 + public MetadataFile Deserialize(Models.Metadata.MetadataFile obj) +#else + public MetadataFile? Deserialize(Models.Metadata.MetadataFile? obj) +#endif + { + if (obj == null) + return null; + + var metadataFile = new MetadataFile(); + + var machines = obj.Read(Models.Metadata.MetadataFile.MachineKey); + if (machines != null && machines.Any()) + { + metadataFile.Row = machines + .Where(m => m != null) + .SelectMany(ConvertMachineFromInternalModel) + .ToArray(); + } + + return metadataFile; + } + + /// + /// Convert from to an array of + /// + private static Row[] ConvertMachineFromInternalModel(Models.Metadata.Machine item) + { + var roms = item.Read(Models.Metadata.Machine.RomKey); + if (roms == null || !roms.Any()) + return Array.Empty(); + + return roms + .Where(r => r != null) + .Select(ConvertFromInternalModel) + .ToArray(); + } + + /// + /// Convert from to + /// + private static Row ConvertFromInternalModel(Models.Metadata.Rom item) + { + var row = new Row + { + SHA256 = item.ReadString(Models.Metadata.Rom.SHA256Key), + Name = item.ReadString(Models.Metadata.Rom.NameKey), + SHA1 = item.ReadString(Models.Metadata.Rom.SHA1Key), + MD5 = item.ReadString(Models.Metadata.Rom.MD5Key), + CRC32 = item.ReadString(Models.Metadata.Rom.CRCKey), + Size = item.ReadString(Models.Metadata.Rom.SizeKey), + }; + return row; + } + } +} \ No newline at end of file diff --git a/CrossModel/EverdriveSMDB.Serializer.cs b/CrossModel/EverdriveSMDB.Serializer.cs new file mode 100644 index 00000000..d7e91390 --- /dev/null +++ b/CrossModel/EverdriveSMDB.Serializer.cs @@ -0,0 +1,75 @@ +using System.Linq; +using SabreTools.Models.EverdriveSMDB; + +namespace SabreTools.Serialization.CrossModel +{ + public partial class EverdriveSMDB : IModelSerializer + { + /// +#if NET48 + public Models.Metadata.MetadataFile Serialize(MetadataFile obj) +#else + public Models.Metadata.MetadataFile? Serialize(MetadataFile? obj) +#endif + { + if (obj == null) + return null; + + var metadataFile = new Models.Metadata.MetadataFile + { + [Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(), + }; + + if (obj?.Row != null && obj.Row.Any()) + { + metadataFile[Models.Metadata.MetadataFile.MachineKey] = obj.Row + .Where(r => r != null) + .Select(ConvertMachineToInternalModel) + .ToArray(); + } + + return metadataFile; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Header ConvertHeaderToInternalModel() + { + var header = new Models.Metadata.Header + { + [Models.Metadata.Header.NameKey] = "Everdrive SMDB", + }; + return header; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Machine ConvertMachineToInternalModel(Row item) + { + var machine = new Models.Metadata.Machine + { + [Models.Metadata.Machine.RomKey] = ConvertToInternalModel(item), + }; + return machine; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Rom ConvertToInternalModel(Row item) + { + var rom = new Models.Metadata.Rom + { + [Models.Metadata.Rom.SHA256Key] = item.SHA256, + [Models.Metadata.Rom.NameKey] = item.Name, + [Models.Metadata.Rom.SHA1Key] = item.SHA1, + [Models.Metadata.Rom.MD5Key] = item.MD5, + [Models.Metadata.Rom.CRCKey] = item.CRC32, + [Models.Metadata.Rom.SizeKey] = item.Size, + }; + return rom; + } + } +} \ No newline at end of file diff --git a/Files/EverdriveSMDB.Deserializer.cs b/Files/EverdriveSMDB.Deserializer.cs new file mode 100644 index 00000000..1d7a44bd --- /dev/null +++ b/Files/EverdriveSMDB.Deserializer.cs @@ -0,0 +1,20 @@ +using SabreTools.Models.EverdriveSMDB; + +namespace SabreTools.Serialization.Files +{ + public partial class EverdriveSMDB : IFileSerializer + { + /// +#if NET48 + public MetadataFile Deserialize(string path) +#else + public MetadataFile? Deserialize(string? path) +#endif + { + using (var stream = PathProcessor.OpenStream(path)) + { + return new Streams.EverdriveSMDB().Deserialize(stream); + } + } + } +} \ No newline at end of file diff --git a/Files/EverdriveSMDB.Serializer.cs b/Files/EverdriveSMDB.Serializer.cs new file mode 100644 index 00000000..82e4088d --- /dev/null +++ b/Files/EverdriveSMDB.Serializer.cs @@ -0,0 +1,27 @@ +using SabreTools.Models.EverdriveSMDB; + +namespace SabreTools.Serialization.Files +{ + public partial class EverdriveSMDB : IFileSerializer + { + /// +#if NET48 + public bool Serialize(MetadataFile obj, string path) +#else + public bool Serialize(MetadataFile? obj, string? path) +#endif + { + using (var stream = new Streams.EverdriveSMDB().Serialize(obj)) + { + if (stream == null) + return false; + + using (var fs = System.IO.File.OpenWrite(path)) + { + stream.CopyTo(fs); + return true; + } + } + } + } +} \ No newline at end of file diff --git a/Streams/EverdriveSMDB.Deserializer.cs b/Streams/EverdriveSMDB.Deserializer.cs new file mode 100644 index 00000000..683214c7 --- /dev/null +++ b/Streams/EverdriveSMDB.Deserializer.cs @@ -0,0 +1,66 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using SabreTools.IO.Readers; +using SabreTools.Models.EverdriveSMDB; + +namespace SabreTools.Serialization.Streams +{ + public partial class EverdriveSMDB : IStreamSerializer + { + /// +#if NET48 + public MetadataFile Deserialize(Stream data) +#else + public MetadataFile? Deserialize(Stream? data) +#endif + { + // If the stream is null + if (data == null) + return default; + + // Setup the reader and output + var reader = new SeparatedValueReader(data, Encoding.UTF8) + { + Header = false, + Separator = '\t', + VerifyFieldCount = false, + }; + var dat = new MetadataFile(); + + // Loop through the rows and parse out values + var rows = new List(); + while (!reader.EndOfStream) + { + // If we have no next line + if (!reader.ReadNextLine() || reader.Line == null) + break; + + // Parse the line into a row + var row = new Row + { + SHA256 = reader.Line[0], + Name = reader.Line[1], + SHA1 = reader.Line[2], + MD5 = reader.Line[3], + CRC32 = reader.Line[4], + }; + + // If we have the size field + if (reader.Line.Count > 5) + row.Size = reader.Line[5]; + + // If we have additional fields + if (reader.Line.Count > 6) + row.ADDITIONAL_ELEMENTS = reader.Line.Skip(5).ToArray(); + + rows.Add(row); + } + + // Assign the rows to the Dat and return + dat.Row = rows.ToArray(); + return dat; + } + } +} \ No newline at end of file diff --git a/Streams/EverdriveSMDB.Serializer.cs b/Streams/EverdriveSMDB.Serializer.cs new file mode 100644 index 00000000..ce37a4e4 --- /dev/null +++ b/Streams/EverdriveSMDB.Serializer.cs @@ -0,0 +1,77 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using SabreTools.IO.Writers; +using SabreTools.Models.EverdriveSMDB; + +namespace SabreTools.Serialization.Streams +{ + public partial class EverdriveSMDB : IStreamSerializer + { + /// +#if NET48 + public Stream Serialize(MetadataFile obj) +#else + public Stream? Serialize(MetadataFile? obj) +#endif + { + // If the metadata file is null + if (obj == null) + return null; + + // Setup the writer and output + var stream = new MemoryStream(); + var writer = new SeparatedValueWriter(stream, Encoding.UTF8) { Separator = '\t', Quotes = false }; + + // Write out the rows, if they exist + WriteRows(obj.Row, writer); + + // Return the stream + stream.Seek(0, SeekOrigin.Begin); + return stream; + } + + /// + /// Write rows information to the current writer + /// + /// Array of Row objects representing the rows information + /// SeparatedValueWriter representing the output +#if NET48 + private static void WriteRows(Row[] rows, SeparatedValueWriter writer) +#else + private static void WriteRows(Row[]? rows, SeparatedValueWriter writer) +#endif + { + // If the games information is missing, we can't do anything + if (rows == null || !rows.Any()) + return; + + // Loop through and write out the rows + foreach (var row in rows) + { + if (row == null) + continue; + +#if NET48 + var rowArray = new List +#else + var rowArray = new List +#endif + { + row.SHA256, + row.Name, + row.SHA1, + row.MD5, + row.CRC32, + }; + + if (row.Size != null) + rowArray.Add(row.Size); + + writer.WriteValues(rowArray.ToArray()); + writer.Flush(); + } + } + } +} \ No newline at end of file