2026-01-27 12:03:01 -05:00
|
|
|
#pragma warning disable IDE0017 // Simplify object initialization
|
2025-09-26 14:57:20 -04:00
|
|
|
namespace SabreTools.Serialization.Readers
|
2023-09-13 15:30:32 -04:00
|
|
|
{
|
2025-09-26 15:02:43 -04:00
|
|
|
public partial class XeMID : IStringReader<Data.Models.Xbox.XeMID>
|
2023-09-13 15:30:32 -04:00
|
|
|
{
|
2026-01-25 20:07:59 -05:00
|
|
|
/// <inheritdoc/>
|
|
|
|
|
public bool Debug { get; set; } = false;
|
|
|
|
|
|
2025-09-26 15:02:43 -04:00
|
|
|
/// <inheritdoc cref="IStringReader.Deserialize(string?)"/>
|
2025-09-26 13:06:18 -04:00
|
|
|
public static Data.Models.Xbox.XeMID? DeserializeString(string? str)
|
2024-04-03 21:42:08 -04:00
|
|
|
{
|
|
|
|
|
var deserializer = new XeMID();
|
|
|
|
|
return deserializer.Deserialize(str);
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-13 15:30:32 -04:00
|
|
|
/// <inheritdoc/>
|
2025-09-26 13:06:18 -04:00
|
|
|
public Data.Models.Xbox.XeMID? Deserialize(string? str)
|
2023-09-13 15:30:32 -04:00
|
|
|
{
|
2023-11-21 20:59:20 -05:00
|
|
|
if (string.IsNullOrEmpty(str))
|
2023-09-13 15:30:32 -04:00
|
|
|
return null;
|
|
|
|
|
|
2023-11-07 23:30:26 -05:00
|
|
|
string xemid = str!.TrimEnd('\0');
|
2023-11-21 20:59:20 -05:00
|
|
|
if (string.IsNullOrEmpty(xemid))
|
2023-09-13 15:30:32 -04:00
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
return ParseXeMID(xemid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Parse an XGD2/3 XeMID string
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="xemidString">XeMID string to attempt to parse</param>
|
|
|
|
|
/// <returns>Filled XeMID on success, null on error</returns>
|
2025-09-26 13:06:18 -04:00
|
|
|
private static Data.Models.Xbox.XeMID? ParseXeMID(string? xemidString)
|
2023-09-13 15:30:32 -04:00
|
|
|
{
|
2026-01-25 14:30:18 -05:00
|
|
|
if (xemidString is null)
|
2023-10-24 16:56:41 -04:00
|
|
|
return null;
|
|
|
|
|
if (!(xemidString.Length == 13 || xemidString.Length == 14 || xemidString.Length == 21 || xemidString.Length == 22))
|
2023-09-13 15:30:32 -04:00
|
|
|
return null;
|
|
|
|
|
|
2025-09-26 13:06:18 -04:00
|
|
|
var xemid = new Data.Models.Xbox.XeMID();
|
2023-09-13 15:30:32 -04:00
|
|
|
|
2025-11-14 09:06:59 -05:00
|
|
|
#if NETCOREAPP || NETSTANDARD2_1_OR_GREATER
|
|
|
|
|
xemid.PublisherIdentifier = xemidString[..2];
|
|
|
|
|
#else
|
2023-09-13 15:30:32 -04:00
|
|
|
xemid.PublisherIdentifier = xemidString.Substring(0, 2);
|
2025-11-14 09:06:59 -05:00
|
|
|
#endif
|
2023-09-13 15:30:32 -04:00
|
|
|
xemid.PlatformIdentifier = xemidString[2];
|
|
|
|
|
if (xemid.PlatformIdentifier != '2')
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
xemid.GameID = xemidString.Substring(3, 3);
|
|
|
|
|
xemid.SKU = xemidString.Substring(6, 2);
|
|
|
|
|
xemid.RegionIdentifier = xemidString[8];
|
|
|
|
|
|
|
|
|
|
if (xemidString.Length == 13 || xemidString.Length == 21)
|
|
|
|
|
{
|
|
|
|
|
xemid.BaseVersion = xemidString.Substring(9, 1);
|
|
|
|
|
xemid.MediaSubtypeIdentifier = xemidString[10];
|
|
|
|
|
xemid.DiscNumberIdentifier = xemidString.Substring(11, 2);
|
|
|
|
|
}
|
|
|
|
|
else if (xemidString.Length == 14 || xemidString.Length == 22)
|
|
|
|
|
{
|
|
|
|
|
xemid.BaseVersion = xemidString.Substring(9, 2);
|
|
|
|
|
xemid.MediaSubtypeIdentifier = xemidString[11];
|
|
|
|
|
xemid.DiscNumberIdentifier = xemidString.Substring(12, 2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (xemidString.Length == 21)
|
2025-11-14 09:06:59 -05:00
|
|
|
#if NETCOREAPP || NETSTANDARD2_1_OR_GREATER
|
|
|
|
|
xemid.CertificationSubmissionIdentifier = xemidString[13..];
|
|
|
|
|
#else
|
2023-09-13 15:30:32 -04:00
|
|
|
xemid.CertificationSubmissionIdentifier = xemidString.Substring(13);
|
2025-11-14 09:06:59 -05:00
|
|
|
#endif
|
2023-09-13 15:30:32 -04:00
|
|
|
else if (xemidString.Length == 22)
|
2025-11-14 09:06:59 -05:00
|
|
|
#if NETCOREAPP || NETSTANDARD2_1_OR_GREATER
|
|
|
|
|
xemid.CertificationSubmissionIdentifier = xemidString[14..];
|
|
|
|
|
#else
|
2023-09-13 15:30:32 -04:00
|
|
|
xemid.CertificationSubmissionIdentifier = xemidString.Substring(14);
|
2025-11-14 09:06:59 -05:00
|
|
|
#endif
|
2023-09-13 15:30:32 -04:00
|
|
|
|
|
|
|
|
return xemid;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-07-24 09:31:28 -04:00
|
|
|
}
|