using System; using System.Collections.Generic; using System.IO; using System.Text; using SabreTools.Data.Extensions; using SabreTools.Data.Models.ClrMamePro; using SabreTools.Text.ClrMamePro; using SabreTools.Text.Extensions; #pragma warning disable CA1822 // Mark members as static namespace SabreTools.Serialization.Readers { public class ClrMamePro : BaseBinaryReader { #region IByteReader /// public override 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 is null || data.Length == 0) 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, quotes); } #endregion #region IFileReader /// public override MetadataFile? Deserialize(string? path) => Deserialize(path, true); /// public MetadataFile? Deserialize(string? path, bool quotes) { try { // If we don't have a file if (string.IsNullOrEmpty(path) || !File.Exists(path)) return default; // Open the file for deserialization using var stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); return Deserialize(stream, quotes); } catch { // TODO: Handle logging the exception return default; } } #endregion #region IStreamReader /// public override MetadataFile? Deserialize(Stream? data) => Deserialize(data, true); /// public MetadataFile? Deserialize(Stream? data, bool quotes) { // If the data is invalid if (data is null || !data.CanRead) return null; try { // Setup the reader and output var reader = new Reader(data, Encoding.UTF8) { Quotes = quotes }; var dat = new MetadataFile(); // Loop through and parse out the values string? lastTopLevel = reader.TopLevel; GameBase? game = null; var games = new List(); var releases = new List(); var biosSets = new List(); var roms = new List(); var disks = new List(); var medias = new List(); var samples = new List(); var archives = new List(); var chips = new List(); var videos = new List