From bee6c0ba1114e9519f79c3a2c5b15f7e27ba5d85 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 3 Apr 2024 23:25:54 -0400 Subject: [PATCH] Add byte deserializers for remaining stream deserializers --- .../Deserializers/AttractMode.cs | 28 +++++++++++++++ .../Deserializers/Catalog.cs | 15 ++++++++ .../Deserializers/ClrMamePro.cs | 32 +++++++++++++++++ .../Deserializers/CueSheet.cs | 28 +++++++++++++++ .../Deserializers/DosCenter.cs | 28 +++++++++++++++ .../Deserializers/EverdriveSMDB.cs | 28 +++++++++++++++ .../Deserializers/Hashfile.cs | 33 +++++++++++++++++- .../Deserializers/JsonFile.cs | 34 ++++++++++++++++++- .../Deserializers/Listrom.cs | 28 +++++++++++++++ .../Deserializers/RomCenter.cs | 28 +++++++++++++++ .../Deserializers/SeparatedValue.cs | 32 +++++++++++++++++ 11 files changed, 312 insertions(+), 2 deletions(-) diff --git a/SabreTools.Serialization/Deserializers/AttractMode.cs b/SabreTools.Serialization/Deserializers/AttractMode.cs index 85ff63bc..4b852b0a 100644 --- a/SabreTools.Serialization/Deserializers/AttractMode.cs +++ b/SabreTools.Serialization/Deserializers/AttractMode.cs @@ -9,6 +9,7 @@ using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Deserializers { public class AttractMode : + IByteDeserializer, IFileDeserializer, IStreamDeserializer { @@ -20,6 +21,33 @@ namespace SabreTools.Serialization.Deserializers #endregion + #region IByteDeserializer + + /// + public static MetadataFile? DeserializeBytes(byte[]? data, int offset) + { + var deserializer = new AttractMode(); + return deserializer.Deserialize(data, offset); + } + + /// + public MetadataFile? Deserialize(byte[]? data, int offset) + { + // If the data is invalid + if (data == null) + return null; + + // If the offset is out of bounds + if (offset < 0 || offset >= data.Length) + return null; + + // Create a memory stream and parse that + var dataStream = new MemoryStream(data, offset, data.Length - offset); + return DeserializeStream(dataStream); + } + + #endregion + #region IFileDeserializer /// diff --git a/SabreTools.Serialization/Deserializers/Catalog.cs b/SabreTools.Serialization/Deserializers/Catalog.cs index 54de815d..481c9d92 100644 --- a/SabreTools.Serialization/Deserializers/Catalog.cs +++ b/SabreTools.Serialization/Deserializers/Catalog.cs @@ -6,6 +6,21 @@ namespace SabreTools.Serialization.Deserializers public class Catalog : JsonFile { + #region IByteDeserializer + + /// + public static Models.Xbox.Catalog? DeserializeBytes(byte[]? data, int offset) + { + var deserializer = new Catalog(); + return deserializer.Deserialize(data, offset); + } + + /// Catalog.js file is encoded as UTF-16 LE + public override Models.Xbox.Catalog? Deserialize(byte[]? data, int offset) + => Deserialize(data, offset, new UnicodeEncoding()); + + #endregion + #region IFileDeserializer /// diff --git a/SabreTools.Serialization/Deserializers/ClrMamePro.cs b/SabreTools.Serialization/Deserializers/ClrMamePro.cs index db64c365..2de58a4c 100644 --- a/SabreTools.Serialization/Deserializers/ClrMamePro.cs +++ b/SabreTools.Serialization/Deserializers/ClrMamePro.cs @@ -9,9 +9,41 @@ using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Deserializers { public class ClrMamePro : + IByteDeserializer, IFileDeserializer, IStreamDeserializer { + #region IByteDeserializer + + /// + public static MetadataFile? DeserializeBytes(byte[]? data, int offset, bool quotes = true) + { + var deserializer = new ClrMamePro(); + return deserializer.Deserialize(data, offset, quotes); + } + + /// + public MetadataFile? Deserialize(byte[]? data, int offset) + => Deserialize(data, offset, true); + + /// + public MetadataFile? Deserialize(byte[]? data, int offset, bool quotes) + { + // If the data is invalid + if (data == null) + return null; + + // If the offset is out of bounds + if (offset < 0 || offset >= data.Length) + return null; + + // Create a memory stream and parse that + var dataStream = new MemoryStream(data, offset, data.Length - offset); + return DeserializeStream(dataStream, quotes); + } + + #endregion + #region IFileDeserializer /// diff --git a/SabreTools.Serialization/Deserializers/CueSheet.cs b/SabreTools.Serialization/Deserializers/CueSheet.cs index e64a5089..d77c7f5a 100644 --- a/SabreTools.Serialization/Deserializers/CueSheet.cs +++ b/SabreTools.Serialization/Deserializers/CueSheet.cs @@ -10,9 +10,37 @@ using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Deserializers { public class CueSheet : + IByteDeserializer, IFileDeserializer, IStreamDeserializer { + #region IByteDeserializer + + /// + public static Models.CueSheets.CueSheet? DeserializeBytes(byte[]? data, int offset) + { + var deserializer = new CueSheet(); + return deserializer.Deserialize(data, offset); + } + + /// + public Models.CueSheets.CueSheet? Deserialize(byte[]? data, int offset) + { + // If the data is invalid + if (data == null) + return null; + + // If the offset is out of bounds + if (offset < 0 || offset >= data.Length) + return null; + + // Create a memory stream and parse that + var dataStream = new MemoryStream(data, offset, data.Length - offset); + return DeserializeStream(dataStream); + } + + #endregion + #region IFileDeserializer /// diff --git a/SabreTools.Serialization/Deserializers/DosCenter.cs b/SabreTools.Serialization/Deserializers/DosCenter.cs index a73c4344..b6a10eb7 100644 --- a/SabreTools.Serialization/Deserializers/DosCenter.cs +++ b/SabreTools.Serialization/Deserializers/DosCenter.cs @@ -8,9 +8,37 @@ using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Deserializers { public class DosCenter : + IByteDeserializer, IFileDeserializer, IStreamDeserializer { + #region IByteDeserializer + + /// + public static MetadataFile? DeserializeBytes(byte[]? data, int offset) + { + var deserializer = new DosCenter(); + return deserializer.Deserialize(data, offset); + } + + /// + public MetadataFile? Deserialize(byte[]? data, int offset) + { + // If the data is invalid + if (data == null) + return null; + + // If the offset is out of bounds + if (offset < 0 || offset >= data.Length) + return null; + + // Create a memory stream and parse that + var dataStream = new MemoryStream(data, offset, data.Length - offset); + return DeserializeStream(dataStream); + } + + #endregion + #region IFileDeserializer /// diff --git a/SabreTools.Serialization/Deserializers/EverdriveSMDB.cs b/SabreTools.Serialization/Deserializers/EverdriveSMDB.cs index f3559496..52c3e4af 100644 --- a/SabreTools.Serialization/Deserializers/EverdriveSMDB.cs +++ b/SabreTools.Serialization/Deserializers/EverdriveSMDB.cs @@ -9,9 +9,37 @@ using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Deserializers { public class EverdriveSMDB : + IByteDeserializer, IFileDeserializer, IStreamDeserializer { + #region IByteDeserializer + + /// + public static MetadataFile? DeserializeBytes(byte[]? data, int offset) + { + var deserializer = new EverdriveSMDB(); + return deserializer.Deserialize(data, offset); + } + + /// + public MetadataFile? Deserialize(byte[]? data, int offset) + { + // If the data is invalid + if (data == null) + return null; + + // If the offset is out of bounds + if (offset < 0 || offset >= data.Length) + return null; + + // Create a memory stream and parse that + var dataStream = new MemoryStream(data, offset, data.Length - offset); + return DeserializeStream(dataStream); + } + + #endregion + #region IFileDeserializer /// diff --git a/SabreTools.Serialization/Deserializers/Hashfile.cs b/SabreTools.Serialization/Deserializers/Hashfile.cs index 8e5f0481..503fc038 100644 --- a/SabreTools.Serialization/Deserializers/Hashfile.cs +++ b/SabreTools.Serialization/Deserializers/Hashfile.cs @@ -6,13 +6,44 @@ using SabreTools.Hashing; using SabreTools.Models.Hashfile; using SabreTools.Serialization.Interfaces; -// TODO: Replace use of Serialization.Hash with Hashing.HashType namespace SabreTools.Serialization.Deserializers { public class Hashfile : + IByteDeserializer, IFileDeserializer, IStreamDeserializer { + #region IByteDeserializer + + /// + public static Models.Hashfile.Hashfile? DeserializeBytes(byte[]? data, int offset, HashType hash = HashType.CRC32) + { + var deserializer = new Hashfile(); + return deserializer.Deserialize(data, offset, hash); + } + + /// + public Models.Hashfile.Hashfile? Deserialize(byte[]? data, int offset) + => Deserialize(data, offset, HashType.CRC32); + + /// + public Models.Hashfile.Hashfile? Deserialize(byte[]? data, int offset, HashType hash) + { + // If the data is invalid + if (data == null) + return null; + + // If the offset is out of bounds + if (offset < 0 || offset >= data.Length) + return null; + + // Create a memory stream and parse that + var dataStream = new MemoryStream(data, offset, data.Length - offset); + return DeserializeStream(dataStream, hash); + } + + #endregion + #region IFileDeserializer /// diff --git a/SabreTools.Serialization/Deserializers/JsonFile.cs b/SabreTools.Serialization/Deserializers/JsonFile.cs index 5f5f2b0a..5683d6b6 100644 --- a/SabreTools.Serialization/Deserializers/JsonFile.cs +++ b/SabreTools.Serialization/Deserializers/JsonFile.cs @@ -10,9 +10,41 @@ namespace SabreTools.Serialization.Deserializers /// /// public class JsonFile : + IByteDeserializer, IFileDeserializer, IStreamDeserializer { + #region IByteDeserializer + + /// + public virtual T? Deserialize(byte[]? data, int offset) + => Deserialize(data, offset, new UTF8Encoding(false)); + + /// + /// Deserialize a byte array into + /// + /// Type of object to deserialize to + /// Byte array to parse + /// Offset into the byte array + /// Encoding to parse text as + /// Filled object on success, null on error + public T? Deserialize(byte[]? data, int offset, Encoding encoding) + { + // If the data is invalid + if (data == null) + return default; + + // If the offset is out of bounds + if (offset < 0 || offset >= data.Length) + return default; + + // Create a memory stream and parse that + var dataStream = new MemoryStream(data, offset, data.Length - offset); + return Deserialize(dataStream, encoding); + } + + #endregion + #region IFileDeserializer /// @@ -33,7 +65,7 @@ namespace SabreTools.Serialization.Deserializers } #endregion - + #region IStreamDeserializer /// diff --git a/SabreTools.Serialization/Deserializers/Listrom.cs b/SabreTools.Serialization/Deserializers/Listrom.cs index 9e040ed4..6bc87733 100644 --- a/SabreTools.Serialization/Deserializers/Listrom.cs +++ b/SabreTools.Serialization/Deserializers/Listrom.cs @@ -8,9 +8,37 @@ using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Deserializers { public class Listrom : + IByteDeserializer, IFileDeserializer, IStreamDeserializer { + #region IByteDeserializer + + /// + public static MetadataFile? DeserializeBytes(byte[]? data, int offset) + { + var deserializer = new Listrom(); + return deserializer.Deserialize(data, offset); + } + + /// + public MetadataFile? Deserialize(byte[]? data, int offset) + { + // If the data is invalid + if (data == null) + return null; + + // If the offset is out of bounds + if (offset < 0 || offset >= data.Length) + return null; + + // Create a memory stream and parse that + var dataStream = new MemoryStream(data, offset, data.Length - offset); + return DeserializeStream(dataStream); + } + + #endregion + #region IFileDeserializer /// diff --git a/SabreTools.Serialization/Deserializers/RomCenter.cs b/SabreTools.Serialization/Deserializers/RomCenter.cs index 1a1877d4..caa5b884 100644 --- a/SabreTools.Serialization/Deserializers/RomCenter.cs +++ b/SabreTools.Serialization/Deserializers/RomCenter.cs @@ -9,9 +9,37 @@ using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Deserializers { public class RomCenter : + IByteDeserializer, IFileDeserializer, IStreamDeserializer { + #region IByteDeserializer + + /// + public static MetadataFile? DeserializeBytes(byte[]? data, int offset) + { + var deserializer = new RomCenter(); + return deserializer.Deserialize(data, offset); + } + + /// + public MetadataFile? Deserialize(byte[]? data, int offset) + { + // If the data is invalid + if (data == null) + return null; + + // If the offset is out of bounds + if (offset < 0 || offset >= data.Length) + return null; + + // Create a memory stream and parse that + var dataStream = new MemoryStream(data, offset, data.Length - offset); + return DeserializeStream(dataStream); + } + + #endregion + #region IFileDeserializer /// diff --git a/SabreTools.Serialization/Deserializers/SeparatedValue.cs b/SabreTools.Serialization/Deserializers/SeparatedValue.cs index 62fd20d8..21d98f03 100644 --- a/SabreTools.Serialization/Deserializers/SeparatedValue.cs +++ b/SabreTools.Serialization/Deserializers/SeparatedValue.cs @@ -9,6 +9,7 @@ using SabreTools.Serialization.Interfaces; namespace SabreTools.Serialization.Deserializers { public class SeparatedValue : + IByteDeserializer, IFileDeserializer, IStreamDeserializer { @@ -20,6 +21,37 @@ namespace SabreTools.Serialization.Deserializers #endregion + #region IByteDeserializer + + /// + public static MetadataFile? DeserializeBytes(byte[]? data, int offset, char delim) + { + var deserializer = new SeparatedValue(); + return deserializer.Deserialize(data, offset, delim); + } + + /// + public MetadataFile? Deserialize(byte[]? data, int offset) + => Deserialize(data, offset, ','); + + /// + public MetadataFile? Deserialize(byte[]? data, int offset, char delim) + { + // If the data is invalid + if (data == null) + return null; + + // If the offset is out of bounds + if (offset < 0 || offset >= data.Length) + return null; + + // Create a memory stream and parse that + var dataStream = new MemoryStream(data, offset, data.Length - offset); + return DeserializeStream(dataStream, delim); + } + + #endregion + #region IFileDeserializer ///