Files
BinaryObjectScanner/BinaryObjectScanner.Wrappers/CIA.cs

649 lines
20 KiB
C#
Raw Normal View History

2023-01-09 10:53:15 -08:00
using System.IO;
2023-01-13 14:04:21 -08:00
using System.Text;
2023-01-09 10:53:15 -08:00
2023-03-07 16:59:14 -05:00
namespace BinaryObjectScanner.Wrappers
2023-01-09 10:53:15 -08:00
{
2023-09-11 23:25:09 -04:00
public class CIA : WrapperBase<SabreTools.Models.N3DS.CIA>
2023-01-09 10:53:15 -08:00
{
2023-01-18 11:18:53 -08:00
#region Descriptive Properties
/// <inheritdoc/>
2023-09-11 23:25:09 -04:00
public override string DescriptionString => "CTR Importable Archive (CIA)";
2023-01-18 11:18:53 -08:00
#endregion
2023-01-09 10:53:15 -08:00
#region Pass-Through Properties
#region Header
/// <inheritdoc cref="Models.N3DS.CIAHeader.HeaderSize"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public uint HeaderSize => _model.Header.HeaderSize;
2023-09-13 00:08:11 -04:00
#else
public uint? HeaderSize => _model.Header?.HeaderSize;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.CIAHeader.Type"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public ushort Type => _model.Header.Type;
2023-09-13 00:08:11 -04:00
#else
public ushort? Type => _model.Header?.Type;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.CIAHeader.Version"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public ushort Version => _model.Header.Version;
2023-09-13 00:08:11 -04:00
#else
public ushort? Version => _model.Header?.Version;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.CIAHeader.CertificateChainSize"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public uint CertificateChainSize => _model.Header.CertificateChainSize;
2023-09-13 00:08:11 -04:00
#else
public uint? CertificateChainSize => _model.Header?.CertificateChainSize;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.CIAHeader.TicketSize"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public uint TicketSize => _model.Header.TicketSize;
2023-09-13 00:08:11 -04:00
#else
public uint? TicketSize => _model.Header?.TicketSize;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.CIAHeader.TMDFileSize"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public uint TMDFileSize => _model.Header.TMDFileSize;
2023-09-13 00:08:11 -04:00
#else
public uint? TMDFileSize => _model.Header?.TMDFileSize;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.CIAHeader.MetaSize"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public uint MetaSize => _model.Header.MetaSize;
2023-09-13 00:08:11 -04:00
#else
public uint? MetaSize => _model.Header?.MetaSize;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.CIAHeader.ContentSize"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public ulong ContentSize => _model.Header.ContentSize;
2023-09-13 00:08:11 -04:00
#else
public ulong? ContentSize => _model.Header?.ContentSize;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.CIAHeader.ContentIndex"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] ContentIndex => _model.Header.ContentIndex;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public byte[]? ContentIndex => _model.Header?.ContentIndex;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
#endregion
#region Certificate Chain
/// <inheritdoc cref="Models.N3DS.CIA.CertificateChain"/>
#if NET48
2023-09-11 23:25:09 -04:00
public SabreTools.Models.N3DS.Certificate[] CertificateChain => _model.CertificateChain;
#else
public SabreTools.Models.N3DS.Certificate?[]? CertificateChain => _model.CertificateChain;
#endif
2023-01-09 10:53:15 -08:00
#endregion
#region Ticket
/// <inheritdoc cref="Models.N3DS.Ticket.SignatureType"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public SabreTools.Models.N3DS.SignatureType T_SignatureType => _model.Ticket.SignatureType;
2023-09-13 00:08:11 -04:00
#else
public SabreTools.Models.N3DS.SignatureType? T_SignatureType => _model.Ticket?.SignatureType;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.SignatureSize"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public ushort T_SignatureSize => _model.Ticket.SignatureSize;
2023-09-13 00:08:11 -04:00
#else
public ushort? T_SignatureSize => _model.Ticket?.SignatureSize;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.PaddingSize"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte T_PaddingSize => _model.Ticket.PaddingSize;
2023-09-13 00:08:11 -04:00
#else
public byte? T_PaddingSize => _model.Ticket?.PaddingSize;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.Signature"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] T_Signature => _model.Ticket.Signature;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public byte[]? T_Signature => _model.Ticket?.Signature;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.Padding"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] T_Padding => _model.Ticket.Padding;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public byte[]? T_Padding => _model.Ticket?.Padding;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.Issuer"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public string T_Issuer => _model.Ticket.Issuer;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public string? T_Issuer => _model.Ticket?.Issuer;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.ECCPublicKey"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] T_ECCPublicKey => _model.Ticket.ECCPublicKey;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public byte[]? T_ECCPublicKey => _model.Ticket?.ECCPublicKey;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.Version"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte T_Version => _model.Ticket.Version;
2023-09-13 00:08:11 -04:00
#else
public byte? T_Version => _model.Ticket?.Version;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.CaCrlVersion"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte T_CaCrlVersion => _model.Ticket.CaCrlVersion;
2023-09-13 00:08:11 -04:00
#else
public byte? T_CaCrlVersion => _model.Ticket?.CaCrlVersion;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.SignerCrlVersion"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte T_SignerCrlVersion => _model.Ticket.SignerCrlVersion;
2023-09-13 00:08:11 -04:00
#else
public byte? T_SignerCrlVersion => _model.Ticket?.SignerCrlVersion;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.TitleKey"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] T_TitleKey => _model.Ticket.TitleKey;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public byte[]? T_TitleKey => _model.Ticket?.TitleKey;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved1"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte T_Reserved1 => _model.Ticket.Reserved1;
2023-09-13 00:08:11 -04:00
#else
public byte? T_Reserved1 => _model.Ticket?.Reserved1;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.TicketID"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public ulong T_TicketID => _model.Ticket.TicketID;
2023-09-13 00:08:11 -04:00
#else
public ulong? T_TicketID => _model.Ticket?.TicketID;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.ConsoleID"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public uint T_ConsoleID => _model.Ticket.ConsoleID;
2023-09-13 00:08:11 -04:00
#else
public uint? T_ConsoleID => _model.Ticket?.ConsoleID;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.TitleID"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public ulong T_TitleID => _model.Ticket.TitleID;
2023-09-13 00:08:11 -04:00
#else
public ulong? T_TitleID => _model.Ticket?.TitleID;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved2"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] T_Reserved2 => _model.Ticket.Reserved2;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public byte[]? T_Reserved2 => _model.Ticket?.Reserved2;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.TicketTitleVersion"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public ushort T_TicketTitleVersion => _model.Ticket.TicketTitleVersion;
2023-09-13 00:08:11 -04:00
#else
public ushort? T_TicketTitleVersion => _model.Ticket?.TicketTitleVersion;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved3"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] T_Reserved3 => _model.Ticket.Reserved3;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public byte[]? T_Reserved3 => _model.Ticket?.Reserved3;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.LicenseType"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte T_LicenseType => _model.Ticket.LicenseType;
2023-09-13 00:08:11 -04:00
#else
public byte? T_LicenseType => _model.Ticket?.LicenseType;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.CommonKeyYIndex"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte T_CommonKeyYIndex => _model.Ticket.CommonKeyYIndex;
2023-09-13 00:08:11 -04:00
#else
public byte? T_CommonKeyYIndex => _model.Ticket?.CommonKeyYIndex;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved4"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] T_Reserved4 => _model.Ticket.Reserved4;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public byte[]? T_Reserved4 => _model.Ticket?.Reserved4;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.eShopAccountID"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public uint T_eShopAccountID => _model.Ticket.eShopAccountID;
2023-09-13 00:08:11 -04:00
#else
public uint? T_eShopAccountID => _model.Ticket?.eShopAccountID;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved5"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte T_Reserved5 => _model.Ticket.Reserved5;
2023-09-13 00:08:11 -04:00
#else
public byte? T_Reserved5 => _model.Ticket?.Reserved5;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.Audit"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte T_Audit => _model.Ticket.Audit;
2023-09-13 00:08:11 -04:00
#else
public byte? T_Audit => _model.Ticket?.Audit;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.Reserved6"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] T_Reserved6 => _model.Ticket.Reserved6;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public byte[]? T_Reserved6 => _model.Ticket?.Reserved6;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.Limits"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public uint[] T_Limits => _model.Ticket.Limits;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public uint[]? T_Limits => _model.Ticket?.Limits;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.ContentIndexSize"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public uint T_ContentIndexSize => _model.Ticket.ContentIndexSize;
2023-09-13 00:08:11 -04:00
#else
public uint? T_ContentIndexSize => _model.Ticket?.ContentIndexSize;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.ContentIndex"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] T_ContentIndex => _model.Ticket.ContentIndex;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public byte[]? T_ContentIndex => _model.Ticket?.ContentIndex;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.Ticket.CertificateChain"/>
#if NET48
2023-09-11 23:25:09 -04:00
public SabreTools.Models.N3DS.Certificate[] T_CertificateChain => _model.Ticket.CertificateChain;
#else
2023-09-13 00:08:11 -04:00
public SabreTools.Models.N3DS.Certificate?[]? T_CertificateChain => _model.Ticket?.CertificateChain;
#endif
2023-01-09 10:53:15 -08:00
#endregion
#region Title Metadata
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SignatureType"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public SabreTools.Models.N3DS.SignatureType TMD_SignatureType => _model.TMDFileData.SignatureType;
2023-09-13 00:08:11 -04:00
#else
public SabreTools.Models.N3DS.SignatureType? TMD_SignatureType => _model.TMDFileData?.SignatureType;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SignatureSize"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public ushort TMD_SignatureSize => _model.TMDFileData.SignatureSize;
2023-09-13 00:08:11 -04:00
#else
public ushort? TMD_SignatureSize => _model.TMDFileData?.SignatureSize;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.PaddingSize"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte TMD_PaddingSize => _model.TMDFileData.PaddingSize;
2023-09-13 00:08:11 -04:00
#else
public byte? TMD_PaddingSize => _model.TMDFileData?.PaddingSize;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Signature"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] TMD_Signature => _model.TMDFileData.Signature;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public byte[]? TMD_Signature => _model.TMDFileData?.Signature;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Padding1"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] TMD_Padding1 => _model.TMDFileData.Padding1;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public byte[]? TMD_Padding1 => _model.TMDFileData?.Padding1;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Issuer"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public string TMD_Issuer => _model.TMDFileData.Issuer;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public string? TMD_Issuer => _model.TMDFileData?.Issuer;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Version"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte TMD_Version => _model.TMDFileData.Version;
2023-09-13 00:08:11 -04:00
#else
public byte? TMD_Version => _model.TMDFileData?.Version;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.CaCrlVersion"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte TMD_CaCrlVersion => _model.TMDFileData.CaCrlVersion;
2023-09-13 00:08:11 -04:00
#else
public byte? TMD_CaCrlVersion => _model.TMDFileData?.CaCrlVersion;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SignerCrlVersion"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte TMD_SignerCrlVersion => _model.TMDFileData.SignerCrlVersion;
2023-09-13 00:08:11 -04:00
#else
public byte? TMD_SignerCrlVersion => _model.TMDFileData?.SignerCrlVersion;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Reserved1"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte TMD_Reserved1 => _model.TMDFileData.Reserved1;
2023-09-13 00:08:11 -04:00
#else
public byte? TMD_Reserved1 => _model.TMDFileData?.Reserved1;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SystemVersion"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public ulong TMD_SystemVersion => _model.TMDFileData.SystemVersion;
2023-09-13 00:08:11 -04:00
#else
public ulong? TMD_SystemVersion => _model.TMDFileData?.SystemVersion;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.TitleID"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public ulong TMD_TitleID => _model.TMDFileData.TitleID;
2023-09-13 00:08:11 -04:00
#else
public ulong? TMD_TitleID => _model.TMDFileData?.TitleID;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.TitleType"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public uint TMD_TitleType => _model.TMDFileData.TitleType;
2023-09-13 00:08:11 -04:00
#else
public uint? TMD_TitleType => _model.TMDFileData?.TitleType;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.GroupID"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public ushort TMD_GroupID => _model.TMDFileData.GroupID;
2023-09-13 00:08:11 -04:00
#else
public ushort? TMD_GroupID => _model.TMDFileData?.GroupID;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SaveDataSize"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public uint TMD_SaveDataSize => _model.TMDFileData.SaveDataSize;
2023-09-13 00:08:11 -04:00
#else
public uint? TMD_SaveDataSize => _model.TMDFileData?.SaveDataSize;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SRLPrivateSaveDataSize"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public uint TMD_SRLPrivateSaveDataSize => _model.TMDFileData.SRLPrivateSaveDataSize;
2023-09-13 00:08:11 -04:00
#else
public uint? TMD_SRLPrivateSaveDataSize => _model.TMDFileData?.SRLPrivateSaveDataSize;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Reserved2"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] TMD_Reserved2 => _model.TMDFileData.Reserved2;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public byte[]? TMD_Reserved2 => _model.TMDFileData?.Reserved2;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SRLFlag"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte TMD_SRLFlag => _model.TMDFileData.SRLFlag;
2023-09-13 00:08:11 -04:00
#else
public byte? TMD_SRLFlag => _model.TMDFileData?.SRLFlag;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Reserved3"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] TMD_Reserved3 => _model.TMDFileData.Reserved3;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public byte[]? TMD_Reserved3 => _model.TMDFileData?.Reserved3;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.AccessRights"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public uint TMD_AccessRights => _model.TMDFileData.AccessRights;
2023-09-13 00:08:11 -04:00
#else
public uint? TMD_AccessRights => _model.TMDFileData?.AccessRights;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.TitleVersion"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public ushort TMD_TitleVersion => _model.TMDFileData.TitleVersion;
2023-09-13 00:08:11 -04:00
#else
public ushort? TMD_TitleVersion => _model.TMDFileData?.TitleVersion;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.ContentCount"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public ushort TMD_ContentCount => _model.TMDFileData.ContentCount;
2023-09-13 00:08:11 -04:00
#else
public ushort? TMD_ContentCount => _model.TMDFileData?.ContentCount;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.BootContent"/>
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public ushort TMD_BootContent => _model.TMDFileData.BootContent;
2023-09-13 00:08:11 -04:00
#else
public ushort? TMD_BootContent => _model.TMDFileData?.BootContent;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.Padding2"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] TMD_Padding2 => _model.TMDFileData.Padding2;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public byte[]? TMD_Padding2 => _model.TMDFileData?.Padding2;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.SHA256HashContentInfoRecords"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] TMD_SHA256HashContentInfoRecords => _model.TMDFileData.SHA256HashContentInfoRecords;
2023-09-12 17:12:23 -04:00
#else
2023-09-13 00:08:11 -04:00
public byte[]? TMD_SHA256HashContentInfoRecords => _model.TMDFileData?.SHA256HashContentInfoRecords;
2023-09-12 17:12:23 -04:00
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.ContentInfoRecords"/>
#if NET48
2023-09-11 23:25:09 -04:00
public SabreTools.Models.N3DS.ContentInfoRecord[] TMD_ContentInfoRecords => _model.TMDFileData.ContentInfoRecords;
#else
2023-09-13 00:08:11 -04:00
public SabreTools.Models.N3DS.ContentInfoRecord?[]? TMD_ContentInfoRecords => _model.TMDFileData?.ContentInfoRecords;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.ContentChunkRecords"/>
#if NET48
2023-09-11 23:25:09 -04:00
public SabreTools.Models.N3DS.ContentChunkRecord[] TMD_ContentChunkRecords => _model.TMDFileData.ContentChunkRecords;
#else
2023-09-13 00:08:11 -04:00
public SabreTools.Models.N3DS.ContentChunkRecord?[]? TMD_ContentChunkRecords => _model.TMDFileData?.ContentChunkRecords;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.TitleMetadata.CertificateChain"/>
#if NET48
2023-09-11 23:25:09 -04:00
public SabreTools.Models.N3DS.Certificate[] TMD_CertificateChain => _model.TMDFileData.CertificateChain;
#else
2023-09-13 00:08:11 -04:00
public SabreTools.Models.N3DS.Certificate?[]? TMD_CertificateChain => _model.TMDFileData?.CertificateChain;
#endif
2023-01-09 10:53:15 -08:00
#endregion
#region Partitions
/// <inheritdoc cref="Models.N3DS.CIA.Partitions"/>
#if NET48
2023-09-11 23:25:09 -04:00
public SabreTools.Models.N3DS.NCCHHeader[] Partitions => _model.Partitions;
#else
public SabreTools.Models.N3DS.NCCHHeader?[]? Partitions => _model.Partitions;
#endif
#endregion
2023-01-09 10:53:15 -08:00
#region Meta Data
/// <inheritdoc cref="Models.N3DS.MetaData.TitleIDDependencyList"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] MD_TitleIDDependencyList => _model.MetaData?.TitleIDDependencyList;
2023-09-12 17:12:23 -04:00
#else
public byte[]? MD_TitleIDDependencyList => _model.MetaData?.TitleIDDependencyList;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.MetaData.Reserved1"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] MD_Reserved1 => _model.MetaData?.Reserved1;
2023-09-12 17:12:23 -04:00
#else
public byte[]? MD_Reserved1 => _model.MetaData?.Reserved1;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.MetaData.CoreVersion"/>
2023-09-11 23:25:09 -04:00
public uint? MD_CoreVersion => _model.MetaData?.CoreVersion;
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.MetaData.Reserved2"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] MD_Reserved2 => _model.MetaData?.Reserved2;
2023-09-12 17:12:23 -04:00
#else
public byte[]? MD_Reserved2 => _model.MetaData?.Reserved2;
#endif
2023-01-09 10:53:15 -08:00
/// <inheritdoc cref="Models.N3DS.MetaData.IconData"/>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public byte[] MD_IconData => _model.MetaData?.IconData;
2023-09-12 17:12:23 -04:00
#else
public byte[]? MD_IconData => _model.MetaData?.IconData;
#endif
2023-01-09 10:53:15 -08:00
#endregion
#endregion
#region Constructors
2023-09-11 23:25:09 -04:00
/// <inheritdoc/>
#if NET48
public CIA(SabreTools.Models.N3DS.CIA model, byte[] data, int offset)
#else
public CIA(SabreTools.Models.N3DS.CIA? model, byte[]? data, int offset)
#endif
: base(model, data, offset)
{
// All logic is handled by the base class
}
/// <inheritdoc/>
#if NET48
public CIA(SabreTools.Models.N3DS.CIA model, Stream data)
#else
public CIA(SabreTools.Models.N3DS.CIA? model, Stream? data)
#endif
: base(model, data)
{
// All logic is handled by the base class
}
2023-01-09 10:53:15 -08:00
/// <summary>
/// Create a CIA archive from a byte array and offset
/// </summary>
/// <param name="data">Byte array representing the archive</param>
/// <param name="offset">Offset within the array to parse</param>
/// <returns>A CIA archive wrapper on success, null on failure</returns>
2023-09-12 17:12:23 -04:00
#if NET48
2023-01-09 10:53:15 -08:00
public static CIA Create(byte[] data, int offset)
2023-09-12 17:12:23 -04:00
#else
public static CIA? Create(byte[]? data, int offset)
#endif
2023-01-09 10:53:15 -08:00
{
// 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 use that
MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset);
return Create(dataStream);
}
/// <summary>
/// Create a CIA archive from a Stream
/// </summary>
/// <param name="data">Stream representing the archive</param>
/// <returns>A CIA archive wrapper on success, null on failure</returns>
2023-09-12 17:12:23 -04:00
#if NET48
2023-01-09 10:53:15 -08:00
public static CIA Create(Stream data)
2023-09-12 17:12:23 -04:00
#else
public static CIA? Create(Stream? data)
#endif
2023-01-09 10:53:15 -08:00
{
// If the data is invalid
if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead)
return null;
2023-09-10 23:51:38 -04:00
var archive = new SabreTools.Serialization.Streams.CIA().Deserialize(data);
2023-01-09 10:53:15 -08:00
if (archive == null)
return null;
2023-09-11 23:25:09 -04:00
try
{
return new CIA(archive, data);
}
catch
2023-01-09 10:53:15 -08:00
{
2023-09-11 23:25:09 -04:00
return null;
}
2023-01-09 10:53:15 -08:00
}
#endregion
#region Printing
/// <inheritdoc/>
2023-01-13 14:04:21 -08:00
public override StringBuilder PrettyPrint()
2023-01-09 10:53:15 -08:00
{
2023-01-13 14:04:21 -08:00
StringBuilder builder = new StringBuilder();
2023-09-13 13:12:31 -04:00
Printing.CIA.Print(builder, _model);
2023-01-13 14:04:21 -08:00
return builder;
2023-01-09 10:53:15 -08:00
}
#if NET6_0_OR_GREATER
/// <inheritdoc/>
2023-09-11 23:25:09 -04:00
public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions);
#endif
2023-01-09 10:53:15 -08:00
#endregion
}
}