83 Commits
1.1.4 ... 1.4.7

Author SHA1 Message Date
Matt Nadareski
149a45d871 Bump version 2024-05-15 14:00:54 -04:00
Matt Nadareski
e18d8d7543 Fix menu header parsing/serialization 2024-05-15 14:00:30 -04:00
Matt Nadareski
38f0d4aef5 Bump version 2024-05-13 13:18:47 -04:00
Matt Nadareski
3959993255 Fix XMID/XeMID comments 2024-05-09 21:40:43 -04:00
Matt Nadareski
00df5bdd6e UTF-8 treated like ASCII for old .NET 2024-05-07 05:28:46 -04:00
Matt Nadareski
00c087d8e0 Add third-party expansion fields for PKZIP 2024-04-28 02:30:46 -04:00
Matt Nadareski
6bc948784a Add PKZIP appendix A and B 2024-04-28 02:02:58 -04:00
Matt Nadareski
c4f14854c2 Add extensible data field definitions 2024-04-28 01:11:27 -04:00
Matt Nadareski
adaac68898 Bump version 2024-04-24 10:04:06 -04:00
Matt Nadareski
a9bc4a2bfe Fix getopts 2024-04-24 01:35:59 -04:00
Matt Nadareski
262b91de65 32 unicode characters, 64 bytes 2024-04-24 01:25:30 -04:00
Matt Nadareski
62bd6a4bde Add a couple of constants from UnshieldSharp 2024-04-24 00:36:41 -04:00
Matt Nadareski
7f14f0c5b0 Fix encoding for DirectoryEntry 2024-04-23 21:43:17 -04:00
Matt Nadareski
33d63fddae Bump version 2024-04-23 21:01:52 -04:00
Matt Nadareski
209be57bf4 Add layouts for some BD+ models 2024-04-23 20:59:47 -04:00
Matt Nadareski
a1581e9d9b Add layouts for some BFPK models 2024-04-23 20:58:51 -04:00
Matt Nadareski
521664d5a8 Add layouts for some BSP models 2024-04-23 20:57:24 -04:00
Matt Nadareski
73a8d91a83 Add layouts for some CFB models 2024-04-23 20:55:10 -04:00
Matt Nadareski
438e87f833 Add layouts for some CHD models 2024-04-23 20:50:09 -04:00
Matt Nadareski
2cdedbb456 Add layouts for some DVD models 2024-04-23 20:47:33 -04:00
Matt Nadareski
b57a545598 Add layouts for some GCF models 2024-04-23 20:38:11 -04:00
Matt Nadareski
8dc6eb2eee Add layouts for some IS-CAB models 2024-04-23 20:26:18 -04:00
Matt Nadareski
b58436d71a Add layouts for some MoPaQ models 2024-04-23 20:18:26 -04:00
Matt Nadareski
925c20021f Add layouts for some MSDOS models 2024-04-23 20:13:07 -04:00
Matt Nadareski
9bebf95599 Add layouts for some N3DS models 2024-04-23 20:09:39 -04:00
Matt Nadareski
089e13ca03 Add layouts for some NCF models 2024-04-23 19:34:56 -04:00
Matt Nadareski
de07b3b0dd Make some types non-nullable 2024-04-23 19:13:47 -04:00
Matt Nadareski
22cb5360e6 Add notes about prefixed strings 2024-04-23 17:20:05 -04:00
Matt Nadareski
a422ec7e6d Add layouts for some Nitro models 2024-04-23 17:15:15 -04:00
Matt Nadareski
f60afd6368 Add layouts for some PE models 2024-04-23 16:42:29 -04:00
Matt Nadareski
b8f67a8ab0 Add layouts for some VBSP models 2024-04-23 16:06:09 -04:00
Matt Nadareski
d844a8b582 Add layouts for some VPK models 2024-04-23 16:03:20 -04:00
Matt Nadareski
8583baa862 Add layouts for some WAD models 2024-04-23 15:56:43 -04:00
Matt Nadareski
8f3be17850 Add layouts for some XZP models 2024-04-23 15:49:41 -04:00
Matt Nadareski
5856967794 Fill and fix some ISAv3 information 2024-04-23 15:43:33 -04:00
Matt Nadareski
8f78c73c6f Fix publish scripts 2024-04-23 14:12:10 -04:00
Matt Nadareski
af4ff3d383 Bump version 2024-04-23 14:10:58 -04:00
Matt Nadareski
3e638a5c57 Make Linux publish script executable 2024-04-23 14:10:27 -04:00
Matt Nadareski
638d0226c1 Add publish scripts 2024-04-23 14:10:03 -04:00
Matt Nadareski
07c6d5b43a Obsolete is not an error... for now 2024-04-23 13:38:37 -04:00
Matt Nadareski
108e63a099 Add some null-terminated type flags 2024-04-23 13:36:24 -04:00
Matt Nadareski
c636d3252b Migrate many models to StructLayout 2024-04-23 13:30:43 -04:00
Matt Nadareski
b19dbf2254 Update APPNOTE link, add more Header IDs 2024-04-17 16:43:02 -04:00
Matt Nadareski
111b84170c Add relevant information to PKZIP archive 2024-04-17 16:09:30 -04:00
Matt Nadareski
2d7df0d4fb Add PKZIP archive model 2024-04-17 15:59:56 -04:00
Matt Nadareski
aba02663e5 Start adding PKZIP models 2024-04-17 15:47:41 -04:00
Matt Nadareski
594fec923a Bump version 2024-04-03 22:44:18 -04:00
Deterous
b5cf4e870d Add fields for v1.0 catalog.js files (#6) 2024-04-03 19:43:17 -07:00
Matt Nadareski
e6976796c2 Initial attempt at Delphi models 2024-04-02 10:58:20 -04:00
Deterous
295d8c7612 XboxOne/XboxSX catalog.js Model (#5)
* XboxOne catalog.js model

* Split Catalog object, bump version

* Minor fixes

* Custom JsonConverter for launchPackage

* Make launchPackage an abstract object

* Don't ignore packages

* Fix field types for Catalog/Package
2024-04-02 07:54:57 -07:00
Matt Nadareski
4dd184583c Revert XML tag for OfflineList duplicate ID 2024-03-19 15:30:45 -04:00
Matt Nadareski
081c9c9245 Bump version 2024-03-12 16:21:06 -04:00
Matt Nadareski
b974380ccf Fix SoftwareList.Disk field name 2024-03-12 15:28:58 -04:00
Matt Nadareski
41ed2cbc9a Fix XML element name for duplicateId 2024-03-12 00:07:47 -04:00
Matt Nadareski
2cfcb49e35 Fix missing OfflineList field 2024-03-11 23:35:22 -04:00
Matt Nadareski
b3f3f12b3e Use "main" instead of "master" 2024-02-27 19:06:26 -05:00
Matt Nadareski
b41700ff92 Update copyright date 2024-02-27 17:18:02 -05:00
Matt Nadareski
e8a357546b Add nuget package and PR workflows 2024-02-27 17:17:50 -05:00
Matt Nadareski
68f0201c11 Add SafeDisc encrypted file entry model 2023-11-30 19:11:52 -05:00
Matt Nadareski
25b6493249 Bump version 2023-11-21 11:15:24 -05:00
Matt Nadareski
a551363c0b Support .NET Framework 2.0 2023-11-20 23:44:05 -05:00
Matt Nadareski
2fd92aea8f Support .NET Framework 3.5 2023-11-20 21:10:43 -05:00
Matt Nadareski
a61b3d0ed9 Add IS Archive V3 models 2023-11-15 14:30:25 -05:00
Matt Nadareski
a40a6871df Bump version 2023-11-14 12:30:15 -05:00
Matt Nadareski
5792ec64c0 Cut off at .NET Framework 4.0 2023-11-08 10:45:12 -05:00
Matt Nadareski
3b13c7cc96 Cut off at .NET Framework 4.0 2023-11-08 10:44:47 -05:00
Matt Nadareski
894d7b62e2 Enable warnings as errors 2023-11-07 21:52:01 -05:00
Matt Nadareski
38e37b1a63 Support ancient .NET 2023-11-07 21:18:17 -05:00
Matt Nadareski
1f340bd244 Remove framework gating 2023-11-07 20:57:05 -05:00
Matt Nadareski
e582ce8726 Enable latest language version 2023-11-07 20:48:49 -05:00
Matt Nadareski
dad71add36 Expand supported RIDs 2023-11-07 20:47:31 -05:00
Matt Nadareski
cb2a28016e Enable broader support 2023-11-07 20:46:11 -05:00
Matt Nadareski
46a814ac73 Add PS3 SFB and SFO models 2023-11-03 15:18:26 -04:00
Matt Nadareski
8fabe9c02d Rename IRD to File internally 2023-10-29 21:53:12 -04:00
Matt Nadareski
21e22a1476 Bump version 2023-10-25 12:36:33 -04:00
Matt Nadareski
016057a837 Add mapping dictionaries for Xbox 2023-10-24 22:48:41 -04:00
Matt Nadareski
69ca889ac7 Add version guards around LZX.Chunk 2023-10-24 21:45:32 -04:00
Matt Nadareski
cd67a7282b Add version guards to IRD model 2023-10-23 11:33:50 -04:00
Matt Nadareski
948edbad58 Merge pull request #4 from Deterous/Deterous-patch-1
Improve IRD Model
2023-10-23 10:54:21 -04:00
Deterous
d445f02ba6 Specify the reserved attributes 2023-10-23 12:23:55 +13:00
Deterous
835fce7876 Comment on UID 2023-10-23 12:00:05 +13:00
Deterous
97513840e0 ID and UID are the same Property 2023-10-23 11:53:34 +13:00
Matt Nadareski
6112dcb391 Add IRD model 2023-10-22 01:03:34 -04:00
527 changed files with 6846 additions and 8443 deletions

43
.github/workflows/build_nupkg.yml vendored Normal file
View File

@@ -0,0 +1,43 @@
name: Nuget Pack
on:
push:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Pack
run: dotnet pack
- name: Upload build
uses: actions/upload-artifact@v4
with:
name: 'Nuget Package'
path: 'bin/Release/*.nupkg'
- name: Upload to rolling
uses: ncipollo/release-action@v1.14.0
with:
allowUpdates: True
artifacts: 'bin/Release/*.nupkg'
body: 'Last built commit: ${{ github.sha }}'
name: 'Rolling Release'
prerelease: True
replacesArtifacts: True
tag: "rolling"
updateOnlyUnreleased: True

17
.github/workflows/check_pr.yml vendored Normal file
View File

@@ -0,0 +1,17 @@
name: Build PR
on: [pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Build
run: dotnet build

View File

@@ -1,17 +1,17 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.AACS
{
/// <summary>
/// This record type is undocumented but found in real media key blocks
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public sealed class CopyrightRecord : Record
{
/// <summary>
/// Null-terminated ASCII string representing the copyright
/// </summary>
#if NET48
public string Copyright { get; set; }
#else
public string? Copyright { get; set; }
#endif
[MarshalAs(UnmanagedType.LPStr)]
public string? Copyright;
}
}

View File

@@ -1,6 +1,9 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.AACS
{
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class DriveRevocationListEntry
{
/// <summary>
@@ -9,17 +12,14 @@ namespace SabreTools.Models.AACS
/// field indicates that only one ID is being revoked, a value of one
/// in the Range field indicates two IDs are being revoked, and so on.
/// </summary>
public ushort Range { get; set; }
public ushort Range;
/// <summary>
/// A 6-byte Drive ID value identifying the Licensed Drive being revoked
/// (or the first in a range of Licensed Drives being revoked, in the
/// case of a non-zero Range value).
/// </summary>
#if NET48
public byte[] DriveID { get; set; }
#else
public byte[]? DriveID { get; set; }
#endif
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[]? DriveID;
}
}

View File

@@ -21,10 +21,6 @@ namespace SabreTools.Models.AACS
/// <summary>
/// Revocation list entries
/// </summary>
#if NET48
public DriveRevocationSignatureBlock[] SignatureBlocks { get; set; }
#else
public DriveRevocationSignatureBlock?[]? SignatureBlocks { get; set; }
#endif
}
}

View File

@@ -12,10 +12,6 @@ namespace SabreTools.Models.AACS
/// A list of 8-byte Host Drive List Entry fields, the length of this
/// list being equal to the number in the signature block.
/// </summary>
#if NET48
public DriveRevocationListEntry[] EntryFields { get; set; }
#else
public DriveRevocationListEntry?[]? EntryFields { get; set; }
#endif
}
}

View File

@@ -18,10 +18,6 @@ namespace SabreTools.Models.AACS
/// determines that the signature does not verify or is omitted, it
/// must refuse to use the Media Key.
/// </summary>
#if NET48
public byte[] SignatureData { get; set; }
#else
public byte[]? SignatureData { get; set; }
#endif
}
}

View File

@@ -6,10 +6,6 @@ namespace SabreTools.Models.AACS
/// <summary>
/// In this record, each subset-difference is encoded with 5 bytes.
/// </summary>
#if NET48
public SubsetDifference[] SubsetDifferences { get; set; }
#else
public SubsetDifference?[]? SubsetDifferences { get; set; }
#endif
}
}

View File

@@ -1,6 +1,9 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.AACS
{
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class HostRevocationListEntry
{
/// <summary>
@@ -9,17 +12,14 @@ namespace SabreTools.Models.AACS
/// field indicates that only one ID is being revoked, a value of one
/// in the Range field indicates two IDs are being revoked, and so on.
/// </summary>
public ushort Range { get; set; }
public ushort Range;
/// <summary>
/// A 6-byte Host ID value identifying the host being revoked (or the
/// first in a range of hosts being revoked, in the case of a non-zero
/// Range value).
/// </summary>
#if NET48
public byte[] HostID { get; set; }
#else
public byte[]? HostID { get; set; }
#endif
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[]? HostID;
}
}

View File

@@ -24,10 +24,6 @@ namespace SabreTools.Models.AACS
/// <summary>
/// Revocation list entries
/// </summary>
#if NET48
public HostRevocationSignatureBlock[] SignatureBlocks { get; set; }
#else
public HostRevocationSignatureBlock?[]? SignatureBlocks { get; set; }
#endif
}
}

View File

@@ -12,10 +12,6 @@ namespace SabreTools.Models.AACS
/// A list of 8-byte Host Revocation List Entry fields, the length of this
/// list being equal to the number in the signature block.
/// </summary>
#if NET48
public HostRevocationListEntry[] EntryFields { get; set; }
#else
public HostRevocationListEntry?[]? EntryFields { get; set; }
#endif
}
}

View File

@@ -9,10 +9,6 @@ namespace SabreTools.Models.AACS
/// <summary>
/// Records
/// </summary>
#if NET48
public Record[] Records { get; set; }
#else
public Record?[]? Records { get; set; }
#endif
}
}

View File

@@ -13,10 +13,6 @@ namespace SabreTools.Models.AACS
/// record. This 16 bytes is the ciphertext value C in the media
/// key calculation.
/// </summary>
#if NET48
public byte[][] MediaKeyData { get; set; }
#else
public byte[][]? MediaKeyData { get; set; }
#endif
}
}

View File

@@ -1,6 +1,9 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.AACS
{
/// <see href="https://aacsla.com/wp-content/uploads/2019/02/AACS_Spec_Common_Final_0953.pdf"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class SubsetDifference
{
/// <summary>
@@ -9,12 +12,12 @@ namespace SabreTools.Models.AACS
/// the mask. For example, the value 0x01 denotes a mask of
/// 0xFFFFFFFE; value 0x0A denotes a mask of 0xFFFFFC00.
/// </summary>
public byte Mask { get; set; }
public byte Mask;
/// <summary>
/// The last 4 bytes are the uv number, most significant
/// byte first.
/// </summary>
public uint Number { get; set; }
public uint Number;
}
}

View File

@@ -21,10 +21,6 @@ namespace SabreTools.Models.AACS
/// Subset-Difference record, with 0 being the start of the record.
/// </summary>
// <remarks>UInt24 not UInt32</remarks>
#if NET48
public uint[] Offsets { get; set; }
#else
public uint[]? Offsets { get; set; }
#endif
}
}

View File

@@ -19,10 +19,6 @@ namespace SabreTools.Models.AACS
/// where 0xXXXXXXXXXXXXXXXX is an arbitrary 8-byte value, and Km is
/// the correct final Media Key value.
/// </summary>
#if NET48
public byte[] CiphertextValue { get; set; }
#else
public byte[]? CiphertextValue { get; set; }
#endif
}
}

View File

@@ -7,438 +7,198 @@ namespace SabreTools.Models.ArchiveDotOrg
public class File
{
[XmlAttribute("name")]
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
/// <remarks>Is this a set of defined values?</remarks>
[XmlAttribute("source")]
#if NET48
public string Source { get; set; }
#else
public string? Source { get; set; }
#endif
[XmlElement("btih")]
#if NET48
public string BitTorrentMagnetHash { get; set; }
#else
public string? BitTorrentMagnetHash { get; set; }
#endif
[XmlElement("mtime")]
#if NET48
public string LastModifiedTime { get; set; }
#else
public string? LastModifiedTime { get; set; }
#endif
[XmlElement("size")]
#if NET48
public string Size { get; set; }
#else
public string? Size { get; set; }
#endif
[XmlElement("md5")]
#if NET48
public string MD5 { get; set; }
#else
public string? MD5 { get; set; }
#endif
[XmlElement("crc32")]
#if NET48
public string CRC32 { get; set; }
#else
public string? CRC32 { get; set; }
#endif
[XmlElement("sha1")]
#if NET48
public string SHA1 { get; set; }
#else
public string? SHA1 { get; set; }
#endif
[XmlElement("filecount")]
#if NET48
public string FileCount { get; set; }
#else
public string? FileCount { get; set; }
#endif
/// <remarks>Is this a set of defined values?</remarks>
[XmlElement("format")]
#if NET48
public string Format { get; set; }
#else
public string? Format { get; set; }
#endif
[XmlElement("original")]
#if NET48
public string Original { get; set; }
#else
public string? Original { get; set; }
#endif
/// <remarks>Is this a set of defined values?</remarks>
[XmlElement("summation")]
#if NET48
public string Summation { get; set; }
#else
public string? Summation { get; set; }
#endif
[XmlElement("matrix_number")]
#if NET48
public string MatrixNumber { get; set; }
#else
public string? MatrixNumber { get; set; }
#endif
[XmlElement("collection-catalog-number")]
#if NET48
public string CollectionCatalogNumber { get; set; }
#else
public string? CollectionCatalogNumber { get; set; }
#endif
[XmlElement("publisher")]
#if NET48
public string Publisher { get; set; }
#else
public string? Publisher { get; set; }
#endif
[XmlElement("comment")]
#if NET48
public string Comment { get; set; }
#else
public string? Comment { get; set; }
#endif
#region ASR-Related
[XmlElement("asr_detected_lang")]
#if NET48
public string ASRDetectedLang { get; set; }
#else
public string? ASRDetectedLang { get; set; }
#endif
[XmlElement("asr_detected_lang_conf")]
#if NET48
public string ASRDetectedLangConf { get; set; }
#else
public string? ASRDetectedLangConf { get; set; }
#endif
[XmlElement("asr_transcribed_lang")]
#if NET48
public string ASRTranscribedLang { get; set; }
#else
public string? ASRTranscribedLang { get; set; }
#endif
[XmlElement("whisper_asr_module_version")]
#if NET48
public string WhisperASRModuleVersion { get; set; }
#else
public string? WhisperASRModuleVersion { get; set; }
#endif
[XmlElement("whisper_model_hash")]
#if NET48
public string WhisperModelHash { get; set; }
#else
public string? WhisperModelHash { get; set; }
#endif
[XmlElement("whisper_model_name")]
#if NET48
public string WhisperModelName { get; set; }
#else
public string? WhisperModelName { get; set; }
#endif
[XmlElement("whisper_version")]
#if NET48
public string WhisperVersion { get; set; }
#else
public string? WhisperVersion { get; set; }
#endif
#endregion
#region OCR-Related
[XmlElement("cloth_cover_detection_module_version")]
#if NET48
public string ClothCoverDetectionModuleVersion { get; set; }
#else
public string? ClothCoverDetectionModuleVersion { get; set; }
#endif
[XmlElement("hocr_char_to_word_hocr_version")]
#if NET48
public string hOCRCharToWordhOCRVersion { get; set; }
#else
public string? hOCRCharToWordhOCRVersion { get; set; }
#endif
[XmlElement("hocr_char_to_word_module_version")]
#if NET48
public string hOCRCharToWordModuleVersion { get; set; }
#else
public string? hOCRCharToWordModuleVersion { get; set; }
#endif
[XmlElement("hocr_fts_text_hocr_version")]
#if NET48
public string hOCRFtsTexthOCRVersion { get; set; }
#else
public string? hOCRFtsTexthOCRVersion { get; set; }
#endif
[XmlElement("hocr_fts_text_module_version")]
#if NET48
public string hOCRFtsTextModuleVersion { get; set; }
#else
public string? hOCRFtsTextModuleVersion { get; set; }
#endif
[XmlElement("hocr_pageindex_hocr_version")]
#if NET48
public string hOCRPageIndexhOCRVersion { get; set; }
#else
public string? hOCRPageIndexhOCRVersion { get; set; }
#endif
[XmlElement("hocr_pageindex_module_version")]
#if NET48
public string hOCRPageIndexModuleVersion { get; set; }
#else
public string? hOCRPageIndexModuleVersion { get; set; }
#endif
[XmlElement("ocr")]
#if NET48
public string TesseractOCR { get; set; }
#else
public string? TesseractOCR { get; set; }
#endif
[XmlElement("ocr_converted")]
#if NET48
public string TesseractOCRConverted { get; set; }
#else
public string? TesseractOCRConverted { get; set; }
#endif
[XmlElement("ocr_detected_lang")]
#if NET48
public string TesseractOCRDetectedLang { get; set; }
#else
public string? TesseractOCRDetectedLang { get; set; }
#endif
[XmlElement("ocr_detected_lang_conf")]
#if NET48
public string TesseractOCRDetectedLangConf { get; set; }
#else
public string? TesseractOCRDetectedLangConf { get; set; }
#endif
[XmlElement("ocr_detected_script")]
#if NET48
public string TesseractOCRDetectedScript { get; set; }
#else
public string? TesseractOCRDetectedScript { get; set; }
#endif
[XmlElement("ocr_detected_script_conf")]
#if NET48
public string TesseractOCRDetectedScriptConf { get; set; }
#else
public string? TesseractOCRDetectedScriptConf { get; set; }
#endif
[XmlElement("ocr_module_version")]
#if NET48
public string TesseractOCRModuleVersion { get; set; }
#else
public string? TesseractOCRModuleVersion { get; set; }
#endif
[XmlElement("ocr_parameters")]
#if NET48
public string TesseractOCRParameters { get; set; }
#else
public string? TesseractOCRParameters { get; set; }
#endif
[XmlElement("pdf_module_version")]
#if NET48
public string PDFModuleVersion { get; set; }
#else
public string? PDFModuleVersion { get; set; }
#endif
[XmlElement("word_conf_0_10")]
#if NET48
public string WordConfidenceInterval0To10 { get; set; }
#else
public string? WordConfidenceInterval0To10 { get; set; }
#endif
[XmlElement("word_conf_11_20")]
#if NET48
public string WordConfidenceInterval11To20 { get; set; }
#else
public string? WordConfidenceInterval11To20 { get; set; }
#endif
[XmlElement("word_conf_21_30")]
#if NET48
public string WordConfidenceInterval21To30 { get; set; }
#else
public string? WordConfidenceInterval21To30 { get; set; }
#endif
[XmlElement("word_conf_31_40")]
#if NET48
public string WordConfidenceInterval31To40 { get; set; }
#else
public string? WordConfidenceInterval31To40 { get; set; }
#endif
[XmlElement("word_conf_41_50")]
#if NET48
public string WordConfidenceInterval41To50 { get; set; }
#else
public string? WordConfidenceInterval41To50 { get; set; }
#endif
[XmlElement("word_conf_51_60")]
#if NET48
public string WordConfidenceInterval51To60 { get; set; }
#else
public string? WordConfidenceInterval51To60 { get; set; }
#endif
[XmlElement("word_conf_61_70")]
#if NET48
public string WordConfidenceInterval61To70 { get; set; }
#else
public string? WordConfidenceInterval61To70 { get; set; }
#endif
[XmlElement("word_conf_71_80")]
#if NET48
public string WordConfidenceInterval71To80 { get; set; }
#else
public string? WordConfidenceInterval71To80 { get; set; }
#endif
[XmlElement("word_conf_81_90")]
#if NET48
public string WordConfidenceInterval81To90 { get; set; }
#else
public string? WordConfidenceInterval81To90 { get; set; }
#endif
[XmlElement("word_conf_91_100")]
#if NET48
public string WordConfidenceInterval91To100 { get; set; }
#else
public string? WordConfidenceInterval91To100 { get; set; }
#endif
#endregion
#region Media-Related
[XmlElement("album")]
#if NET48
public string Album { get; set; }
#else
public string? Album { get; set; }
#endif
[XmlElement("artist")]
#if NET48
public string Artist { get; set; }
#else
public string? Artist { get; set; }
#endif
[XmlElement("bitrate")]
#if NET48
public string Bitrate { get; set; }
#else
public string? Bitrate { get; set; }
#endif
[XmlElement("creator")]
#if NET48
public string Creator { get; set; }
#else
public string? Creator { get; set; }
#endif
[XmlElement("height")]
#if NET48
public string Height { get; set; }
#else
public string? Height { get; set; }
#endif
[XmlElement("length")]
#if NET48
public string Length { get; set; }
#else
public string? Length { get; set; }
#endif
[XmlElement("preview-image")]
#if NET48
public string PreviewImage { get; set; }
#else
public string? PreviewImage { get; set; }
#endif
/// <remarks>Is this a set of defined values?</remarks>
[XmlElement("rotation")]
#if NET48
public string Rotation { get; set; }
#else
public string? Rotation { get; set; }
#endif
[XmlElement("title")]
#if NET48
public string Title { get; set; }
#else
public string? Title { get; set; }
#endif
[XmlElement("track")]
#if NET48
public string Track { get; set; }
#else
public string? Track { get; set; }
#endif
[XmlElement("width")]
#if NET48
public string Width { get; set; }
#else
public string? Width { get; set; }
#endif
#endregion
@@ -446,19 +206,11 @@ namespace SabreTools.Models.ArchiveDotOrg
/// <remarks>Should be empty</remarks>
[XmlAnyAttribute]
#if NET48
public XmlAttribute[] ADDITIONAL_ATTRIBUTES { get; set; }
#else
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
#endif
/// <remarks>Should be empty</remarks>
[XmlAnyElement]
#if NET48
public object[] ADDITIONAL_ELEMENTS { get; set; }
#else
public object[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -7,29 +7,17 @@ namespace SabreTools.Models.ArchiveDotOrg
public class Files
{
[XmlElement("file")]
#if NET48
public File[] File { get; set; }
#else
public File?[]? File { get; set; }
#endif
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
[XmlAnyAttribute]
#if NET48
public XmlAttribute[] ADDITIONAL_ATTRIBUTES { get; set; }
#else
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
#endif
/// <remarks>Should be empty</remarks>
[XmlAnyElement]
#if NET48
public object[] ADDITIONAL_ELEMENTS { get; set; }
#else
public object[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -6,16 +6,8 @@ namespace SabreTools.Models.AttractMode
public class MetadataFile
{
[Required]
#if NET48
public string[] Header { get; set; }
#else
public string[]? Header { get; set; }
#endif
#if NET48
public Row[] Row { get; set; }
#else
public Row?[]? Row { get; set; }
#endif
}
}

View File

@@ -4,146 +4,54 @@ namespace SabreTools.Models.AttractMode
{
/// <remarks>Also called Romname</remarks>
[Required]
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
#if NET48
public string Title { get; set; }
#else
public string? Title { get; set; }
#endif
#if NET48
public string Emulator { get; set; }
#else
public string? Emulator { get; set; }
#endif
#if NET48
public string CloneOf { get; set; }
#else
public string? CloneOf { get; set; }
#endif
#if NET48
public string Year { get; set; }
#else
public string? Year { get; set; }
#endif
#if NET48
public string Manufacturer { get; set; }
#else
public string? Manufacturer { get; set; }
#endif
#if NET48
public string Category { get; set; }
#else
public string? Category { get; set; }
#endif
#if NET48
public string Players { get; set; }
#else
public string? Players { get; set; }
#endif
#if NET48
public string Rotation { get; set; }
#else
public string? Rotation { get; set; }
#endif
#if NET48
public string Control { get; set; }
#else
public string? Control { get; set; }
#endif
#if NET48
public string Status { get; set; }
#else
public string? Status { get; set; }
#endif
#if NET48
public string DisplayCount { get; set; }
#else
public string? DisplayCount { get; set; }
#endif
#if NET48
public string DisplayType { get; set; }
#else
public string? DisplayType { get; set; }
#endif
#if NET48
public string AltRomname { get; set; }
#else
public string? AltRomname { get; set; }
#endif
#if NET48
public string AltTitle { get; set; }
#else
public string? AltTitle { get; set; }
#endif
#if NET48
public string Extra { get; set; }
#else
public string? Extra { get; set; }
#endif
#if NET48
public string Buttons { get; set; }
#else
public string? Buttons { get; set; }
#endif
#if NET48
public string Favorite { get; set; }
#else
public string? Favorite { get; set; }
#endif
#if NET48
public string Tags { get; set; }
#else
public string? Tags { get; set; }
#endif
#if NET48
public string PlayedCount { get; set; }
#else
public string? PlayedCount { get; set; }
#endif
#if NET48
public string PlayedTime { get; set; }
#else
public string? PlayedTime { get; set; }
#endif
#if NET48
public string FileIsAvailable { get; set; }
#else
public string? FileIsAvailable { get; set; }
#endif
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public string[] ADDITIONAL_ELEMENTS { get; set; }
#else
public string[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -6,20 +6,14 @@ namespace SabreTools.Models.BDPlus
/// <summary>
/// "BDSVM_CC"
/// </summary>
#if NET48
public string Signature { get; set; }
#else
/// <remarks>8 bytes</remarks>
public string? Signature { get; set; }
#endif
/// <summary>
/// 5 bytes of unknown data
/// Unknown data
/// </summary>
#if NET48
public byte[] Unknown1 { get; set; }
#else
/// <remarks>5 bytes</remarks>
public byte[]? Unknown1 { get; set; }
#endif
/// <summary>
/// Version year
@@ -37,13 +31,10 @@ namespace SabreTools.Models.BDPlus
public byte Day { get; set; }
/// <summary>
/// 4 bytes of unknown data
/// Unknown data
/// </summary>
#if NET48
public byte[] Unknown2 { get; set; }
#else
/// <remarks>4 bytes</remarks>
public byte[]? Unknown2 { get; set; }
#endif
/// <summary>
/// Length
@@ -53,10 +44,6 @@ namespace SabreTools.Models.BDPlus
/// <summary>
/// Length bytes of data
/// </summary>
#if NET48
public byte[] Data { get; set; }
#else
public byte[]? Data { get; set; }
#endif
}
}

View File

@@ -9,19 +9,11 @@
/// <summary>
/// Header
/// </summary>
#if NET48
public Header Header { get; set; }
#else
public Header? Header { get; set; }
#endif
/// <summary>
/// Files
/// </summary>
#if NET48
public FileEntry[] Files { get; set; }
#else
public FileEntry?[]? Files { get; set; }
#endif
public FileEntry[]? Files { get; set; }
}
}

View File

@@ -14,11 +14,7 @@
/// <summary>
/// Name
/// </summary>
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
/// <summary>
/// Uncompressed size

View File

@@ -1,28 +1,28 @@
namespace SabreTools.Models.BFPK
using System.Runtime.InteropServices;
namespace SabreTools.Models.BFPK
{
/// <summary>
/// Header
/// </summary>
/// <see cref="https://forum.xentax.com/viewtopic.php?t=5102"/>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public sealed class Header
{
/// <summary>
/// "BFPK"
/// </summary>
#if NET48
public string Magic { get; set; }
#else
public string? Magic { get; set; }
#endif
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public string? Magic;
/// <summary>
/// Version
/// </summary>
public int Version { get; set; }
public int Version;
/// <summary>
/// Files
/// </summary>
public int Files { get; set; }
public int Files;
}
}

View File

@@ -1,3 +1,5 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.BMP
{
/// <summary>
@@ -5,31 +7,32 @@ namespace SabreTools.Models.BMP
/// and layout of a file that contains a DIB.
/// </summary>
/// <see href="https://learn.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-bitmapfileheader"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class BITMAPFILEHEADER
{
/// <summary>
/// The file type; must be BM.
/// </summary>
public ushort Type { get; set; }
public ushort Type;
/// <summary>
/// The size, in bytes, of the bitmap file.
/// </summary>
public uint Size { get; set; }
public uint Size;
/// <summary>
/// Reserved; must be zero.
/// </summary>
public ushort Reserved1 { get; set; }
public ushort Reserved1;
/// <summary>
/// Reserved; must be zero.
/// </summary>
public ushort Reserved2 { get; set; }
public ushort Reserved2;
/// <summary>
/// The offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits.
/// </summary>
public uint OffBits { get; set; }
public uint OffBits;
}
}

View File

@@ -1,9 +1,12 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.BMP
{
/// <summary>
/// The BITMAPINFOHEADER structure contains information about the dimensions and
/// color format of a device-independent bitmap (DIB).
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public sealed class BITMAPINFOHEADER
{
/// <summary>
@@ -11,12 +14,12 @@ namespace SabreTools.Models.BMP
/// not include the size of the color table or the size of the color masks,
/// if they are appended to the end of structure.
/// </summary>
public uint Size { get; set; }
public uint Size;
/// <summary>
/// Specifies the width of the bitmap, in pixels.
/// </summary>
public int Width { get; set; }
public int Width;
/// <summary>
/// Specifies the height of the bitmap, in pixels.
@@ -30,19 +33,19 @@ namespace SabreTools.Models.BMP
/// or negative biHeight.
/// - For compressed formats, biHeight must be positive, regardless of image orientation.
/// </summary>
public int Height { get; set; }
public int Height;
/// <summary>
/// Specifies the number of planes for the target device. This value must be set to 1.
/// </summary>
public ushort Planes { get; set; }
public ushort Planes;
/// <summary>
/// Specifies the number of bits per pixel (bpp). For uncompressed formats, this value
/// is the average number of bits per pixel. For compressed formats, this value is the
/// implied bit depth of the uncompressed image, after the image has been decoded.
/// </summary>
public ushort BitCount { get; set; }
public ushort BitCount;
/// <summary>
/// For compressed video and YUV formats, this member is a FOURCC code, specified as a
@@ -59,36 +62,36 @@ namespace SabreTools.Models.BMP
/// If biCompression equals BI_BITFIELDS, the format is either RGB 555 or RGB 565. Use
/// the subtype GUID in the AM_MEDIA_TYPE structure to determine the specific RGB type.
/// </summary>
public uint Compression { get; set; }
public uint Compression;
/// <summary>
/// Specifies the size, in bytes, of the image. This can be set to 0 for uncompressed
/// RGB bitmaps.
/// </summary>
public uint SizeImage { get; set; }
public uint SizeImage;
/// <summary>
/// Specifies the horizontal resolution, in pixels per meter, of the target device for
/// the bitmap.
/// </summary>
public int XPelsPerMeter { get; set; }
public int XPelsPerMeter;
/// <summary>
/// Specifies the vertical resolution, in pixels per meter, of the target device for
/// the bitmap.
/// </summary>
public int YPelsPerMeter { get; set; }
public int YPelsPerMeter;
/// <summary>
/// Specifies the number of color indices in the color table that are actually used by
/// the bitmap.
/// </summary>
public uint ClrUsed { get; set; }
public uint ClrUsed;
/// <summary>
/// Specifies the number of color indices that are considered important for displaying
/// the bitmap. If this value is zero, all colors are important.
/// </summary>
public uint ClrImportant { get; set; }
public uint ClrImportant;
}
}

View File

@@ -9,37 +9,21 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Header data
/// </summary>
#if NET48
public Header Header { get; set; }
#else
public Header? Header { get; set; }
#endif
/// <summary>
/// Lumps
/// </summary>
#if NET48
public Lump[] Lumps { get; set; }
#else
public Lump?[]? Lumps { get; set; }
#endif
/// <summary>
/// Texture header data
/// </summary>
#if NET48
public TextureHeader TextureHeader { get; set; }
#else
public TextureHeader? TextureHeader { get; set; }
#endif
/// <summary>
/// Textures
/// </summary>
#if NET48
public Texture[] Textures { get; set; }
#else
public Texture?[]? Textures { get; set; }
#endif
}
}

View File

@@ -1,11 +1,14 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.BSP
{
/// <see href="https://github.com/RavuAlHemio/hllib/blob/master/HLLib/BSPFile.h"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class Header
{
/// <summary>
/// Version
/// </summary>
public uint Version { get; set; }
public uint Version;
}
}

View File

@@ -1,16 +1,19 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.BSP
{
/// <see href="https://github.com/RavuAlHemio/hllib/blob/master/HLLib/BSPFile.h"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class Lump
{
/// <summary>
/// Offset
/// </summary>
public uint Offset { get; set; }
public uint Offset;
/// <summary>
/// Length
/// </summary>
public uint Length { get; set; }
public uint Length;
}
}

View File

@@ -6,11 +6,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Name
/// </summary>
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
/// <summary>
/// Width
@@ -25,20 +21,12 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Offsets
/// </summary>
#if NET48
public uint[] Offsets { get; set; }
#else
public uint[]? Offsets { get; set; }
#endif
/// <summary>
/// Texture data
/// </summary>
#if NET48
public byte[] TextureData { get; set; }
#else
public byte[]? TextureData { get; set; }
#endif
/// <summary>
/// Palette size
@@ -48,10 +36,6 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Palette data
/// </summary>
#if NET48
public byte[] PaletteData { get; set; }
#else
public byte[]? PaletteData { get; set; }
#endif
}
}

View File

@@ -11,10 +11,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Offsets
/// </summary>
#if NET48
public uint[] Offsets { get; set; }
#else
/// <remarks>TextureCount entries</remarks>
public uint[]? Offsets { get; set; }
#endif
}
}

View File

@@ -12,11 +12,7 @@ namespace SabreTools.Models.CFB
/// <summary>
/// Compound file header
/// </summary>
#if NET48
public FileHeader Header { get; set; }
#else
public FileHeader? Header { get; set; }
#endif
/// <summary>
/// The FAT is the main allocator for space within a compound file.
@@ -29,11 +25,7 @@ namespace SabreTools.Models.CFB
///
/// If Header Major Version is 4, there MUST be 1,024 fields specified to fill a 4,096-byte sector
/// </remarks>
#if NET48
public SectorNumber[] FATSectorNumbers { get; set; }
#else
public SectorNumber?[]? FATSectorNumbers { get; set; }
#endif
public SectorNumber[]? FATSectorNumbers { get; set; }
/// <summary>
/// The mini FAT is used to allocate space in the mini stream.
@@ -46,11 +38,7 @@ namespace SabreTools.Models.CFB
///
/// If Header Major Version is 4, there MUST be 1,024 fields specified to fill a 4,096-byte sector
/// </remarks>
#if NET48
public SectorNumber[] MiniFATSectorNumbers { get; set; }
#else
public SectorNumber?[]? MiniFATSectorNumbers { get; set; }
#endif
public SectorNumber[]? MiniFATSectorNumbers { get; set; }
/// <summary>
/// The DIFAT array is used to represent storage of the FAT sectors.
@@ -67,11 +55,7 @@ namespace SabreTools.Models.CFB
/// If Header Major Version is 4, there MUST be 1,023 fields specified
/// to fill a 4,096-byte sector minus the "Next DIFAT Sector Location" field.
/// </remarks>
#if NET48
public SectorNumber[] DIFATSectorNumbers { get; set; }
#else
public SectorNumber?[]? DIFATSectorNumbers { get; set; }
#endif
public SectorNumber[]? DIFATSectorNumbers { get; set; }
/// <summary>
/// The directory entry array is an array of directory entries that
@@ -103,10 +87,6 @@ namespace SabreTools.Models.CFB
/// all zeroes. The Modified Time field in the root storage directory
/// entry MAY be all zeroes.
/// <remarks>
#if NET48
public DirectoryEntry[] DirectoryEntries { get; set; }
#else
public DirectoryEntry?[]? DirectoryEntries { get; set; }
#endif
public DirectoryEntry[]? DirectoryEntries { get; set; }
}
}

View File

@@ -1,8 +1,10 @@
using System;
using System.Runtime.InteropServices;
namespace SabreTools.Models.CFB
{
/// <see href="https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-CFB/%5bMS-CFB%5d.pdf"/>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public sealed class DirectoryEntry
{
/// <summary>
@@ -16,17 +18,15 @@ namespace SabreTools.Models.CFB
/// The following characters are illegal and MUST NOT be part of the
/// name: '/', '\', ':', '!'.
/// </summary>
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
/// <remarks>64 bytes</remarks>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string? Name;
/// <summary>
/// This field MUST be 0x00, 0x01, 0x02, or 0x05, depending on the
/// actual type of object. All other values are not valid.
/// </summary>
public ushort NameLength { get; set; }
public ushort NameLength;
/// <summary>
/// This field MUST match the length of the Directory Entry Name Unicode
@@ -34,31 +34,36 @@ namespace SabreTools.Models.CFB
/// terminating null character in the count. This length MUST NOT exceed 64,
/// the maximum size of the Directory Entry Name field.
/// </summary>
public ObjectType ObjectType { get; set; }
[MarshalAs(UnmanagedType.U1)]
public ObjectType ObjectType;
/// <summary>
/// This field MUST be 0x00 (red) or 0x01 (black). All other values are not valid.
/// </summary>
public ColorFlag ColorFlag { get; set; }
[MarshalAs(UnmanagedType.U1)]
public ColorFlag ColorFlag;
/// <summary>
/// This field contains the stream ID of the left sibling. If there
/// is no left sibling, the field MUST be set to NOSTREAM (0xFFFFFFFF).
/// </summary>
public StreamID LeftSiblingID { get; set; }
[MarshalAs(UnmanagedType.U4)]
public StreamID LeftSiblingID;
/// <summary>
/// This field contains the stream ID of the right sibling. If there
/// is no right sibling, the field MUST be set to NOSTREAM (0xFFFFFFFF).
/// </summary>
public StreamID RightSiblingID { get; set; }
[MarshalAs(UnmanagedType.U4)]
public StreamID RightSiblingID;
/// <summary>
/// This field contains the stream ID of a child object. If there is no
/// child object, including all entries for stream objects, the field
/// MUST be set to NOSTREAM (0xFFFFFFFF).
/// </summary>
public StreamID ChildID { get; set; }
[MarshalAs(UnmanagedType.U4)]
public StreamID ChildID;
/// <summary>
/// This field contains an object class GUID, if this entry is for a
@@ -71,7 +76,7 @@ namespace SabreTools.Models.CFB
/// this value is not all zeroes, the object class GUID can be used as a
/// parameter to start applications.
/// </summary>
public Guid CLSID { get; set; }
public Guid CLSID;
/// <summary>
/// This field contains the user-defined flags if this entry is for a storage
@@ -82,7 +87,7 @@ namespace SabreTools.Models.CFB
/// objects without explicitly setting state bits, it MUST write all zeroes
/// by default.
/// </summary>
public uint StateBits { get; set; }
public uint StateBits;
/// <summary>
/// This field contains the creation time for a storage object, or all zeroes
@@ -92,7 +97,7 @@ namespace SabreTools.Models.CFB
/// object, this field MUST be all zeroes, and the creation time is retrieved
/// or set on the compound file itself.
/// </summary>
public ulong CreationTime { get; set; }
public ulong CreationTime;
/// <summary>
/// This field contains the modification time for a storage object, or all
@@ -102,7 +107,7 @@ namespace SabreTools.Models.CFB
/// storage object, this field MAY<2> be set to all zeroes, and the modified
/// time is retrieved or set on the compound file itself.
/// </summary>
public ulong ModifiedTime { get; set; }
public ulong ModifiedTime;
/// <summary>
/// This field contains the first sector location if this is a stream object.
@@ -110,7 +115,7 @@ namespace SabreTools.Models.CFB
/// mini stream, if the mini stream exists. For a storage object, this field MUST
/// be set to all zeroes.
/// </summary>
public uint StartingSectorLocation { get; set; }
public uint StartingSectorLocation;
/// <summary>
/// This 64-bit integer field contains the size of the user-defined data if this
@@ -132,6 +137,6 @@ namespace SabreTools.Models.CFB
/// unless there is a specific reason to do otherwise (for example, a parser whose
/// purpose is to verify the correctness of a compound file).
/// </remarks>
public ulong StreamSize { get; set; }
public ulong StreamSize;
}
}

View File

@@ -1,38 +1,40 @@
using System;
using System.Runtime.InteropServices;
namespace SabreTools.Models.CFB
{
/// <see href="https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-CFB/%5bMS-CFB%5d.pdf"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class FileHeader
{
/// <summary>
/// Iddentification signature for the compound file structure, and MUST be
/// set to the value 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1.
/// </summary>
public ulong Signature { get; set; }
public ulong Signature;
/// <summary>
/// Reserved and unused class ID that MUST be set to all zeroes (CLSID_NULL)
/// </summary>
public Guid CLSID { get; set; }
public Guid CLSID;
/// <summary>
/// Version number for nonbreaking changes. This field SHOULD be set to
/// 0x003E if the major version field is either 0x0003 or 0x0004.
/// </summary>
public ushort MinorVersion { get; set; }
public ushort MinorVersion;
/// <summary>
/// Version number for breaking changes. This field MUST be set to either
/// 0x0003 (version 3) or 0x0004 (version 4).
/// </summary>
public ushort MajorVersion { get; set; }
public ushort MajorVersion;
/// <summary>
/// This field MUST be set to 0xFFFE. This field is a byte order mark for
/// all integer fields, specifying little-endian byte order.
/// </summary>
public ushort ByteOrder { get; set; }
public ushort ByteOrder;
/// <summary>
/// This field MUST be set to 0x0009, or 0x000c, depending on the Major
@@ -45,23 +47,21 @@ namespace SabreTools.Models.CFB
/// If Major Version is 4, the Sector Shift MUST be 0x000C, specifying a
/// sector size of 4096 bytes.
/// </summary>
public ushort SectorShift { get; set; }
public ushort SectorShift;
/// <summary>
/// This field MUST be set to 0x0006. This field specifies the sector size
/// of the Mini Stream as a power of 2. The sector size of the Mini Stream
/// MUST be 64 bytes.
/// </summary>
public ushort MiniSectorShift { get; set; }
public ushort MiniSectorShift;
/// <summary>
/// This field MUST be set to all zeroes.
/// </summary>
#if NET48
public byte[] Reserved { get; set; }
#else
public byte[]? Reserved { get; set; }
#endif
/// <remarks>6 bytes</remarks>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[]? Reserved;
/// <summary>
/// This integer field contains the count of the number of directory sectors
@@ -70,18 +70,18 @@ namespace SabreTools.Models.CFB
/// If Major Version is 3, the Number of Directory Sectors MUST be zero. This
/// field is not supported for version 3 compound files.
/// </summary>
public uint NumberOfDirectorySectors { get; set; }
public uint NumberOfDirectorySectors;
/// <summary>
/// This integer field contains the count of the number of FAT sectors in the
/// compound file.
/// </summary>
public uint NumberOfFATSectors { get; set; }
public uint NumberOfFATSectors;
/// <summary>
/// This integer field contains the starting sector number for the directory stream.
/// </summary>
public uint FirstDirectorySectorLocation { get; set; }
public uint FirstDirectorySectorLocation;
/// <summary>
/// This integer field MAY contain a sequence number that is incremented every time
@@ -89,7 +89,7 @@ namespace SabreTools.Models.CFB
/// This is the field that MUST be set to all zeroes if file transactions are not
/// implemented.
/// </summary>
public uint TransactionSignatureNumber { get; set; }
public uint TransactionSignatureNumber;
/// <summary>
/// This integer field MUST be set to 0x00001000. This field specifies the maximum
@@ -98,38 +98,36 @@ namespace SabreTools.Models.CFB
/// greater than or equal to this cutoff size must be allocated as normal sectors from
/// the FAT.
/// </summary>
public uint MiniStreamCutoffSize { get; set; }
public uint MiniStreamCutoffSize;
/// <summary>
/// This integer field contains the starting sector number for the mini FAT.
/// </summary>
public uint FirstMiniFATSectorLocation { get; set; }
public uint FirstMiniFATSectorLocation;
/// <summary>
/// This integer field contains the count of the number of mini FAT sectors in the
/// compound file.
/// </summary>
public uint NumberOfMiniFATSectors { get; set; }
public uint NumberOfMiniFATSectors;
/// <summary>
/// This integer field contains the starting sector number for the DIFAT.
/// </summary>
public uint FirstDIFATSectorLocation { get; set; }
public uint FirstDIFATSectorLocation;
/// <summary>
/// This integer field contains the count of the number of DIFAT sectors in the
/// compound file.
/// </summary>
public uint NumberOfDIFATSectors { get; set; }
public uint NumberOfDIFATSectors;
/// <summary>
/// This array of 32-bit integer fields contains the first 109 FAT sector
/// locations of the compound file
/// </summary>
#if NET48
public SectorNumber[] DIFAT { get; set; }
#else
public SectorNumber?[]? DIFAT { get; set; }
#endif
/// <remarks>109 entries</remarks>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 109)]
public SectorNumber[]? DIFAT;
}
}

View File

@@ -36,11 +36,7 @@ namespace SabreTools.Models.CFB
/// <summary>
/// 4 bytes of reserved data
/// </summary>
#if NET48
public byte[] Reserved { get; set; }
#else
public byte[]? Reserved { get; set; }
#endif
#endregion
@@ -54,11 +50,7 @@ namespace SabreTools.Models.CFB
/// <summary>
/// 16 bytes of unknown data
/// </summary>
#if NET48
public byte[] Unknown { get; set; }
#else
public byte[]? Unknown { get; set; }
#endif
#endregion
@@ -83,11 +75,7 @@ namespace SabreTools.Models.CFB
/// Properties
/// </summary>
/// <remarks>Each Variant might be followed by an index and offset value</remarks>
#if NET48
public Variant[] Properties { get; set; }
#else
public Variant?[]? Properties { get; set; }
#endif
public Variant[]? Properties { get; set; }
#endregion
}

View File

@@ -40,10 +40,6 @@ namespace SabreTools.Models.CFB
/// MUST contain an instance of the type, according to the value
/// in the <see cref="VariantType"/> field.
/// </summary>
#if NET48
public object Union { get; set; }
#else
public object? Union { get; set; }
#endif
}
}

View File

@@ -1,28 +1,31 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
public class CompressedMapEntryV5
[StructLayout(LayoutKind.Sequential)]
public sealed class CompressedMapEntryV5
{
/// <summary>
/// Compression type
/// </summary>
public byte Compression { get; set; }
public byte Compression;
/// <summary>
/// Compressed length
/// </summary>
/// <remarks>Actually UInt24</remarks>
public uint CompLength { get; set; }
public uint CompLength;
/// <summary>
/// Offset
/// </summary>
/// <remarks>Actually UInt48</remarks>
public ulong Offset { get; set; }
public ulong Offset;
/// <summary>
/// CRC-16 of the data
/// </summary>
public ushort CRC { get; set; }
public ushort CRC;
}
}

View File

@@ -1,42 +1,45 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
public class CompressedMapHeaderV5
[StructLayout(LayoutKind.Sequential)]
public sealed class CompressedMapHeaderV5
{
/// <summary>
/// Length of compressed map
/// </summary>
public uint Length { get; set; }
public uint Length;
/// <summary>
/// Offset of first block
/// </summary>
/// <remarks>Actually UInt48</remarks>
public ulong DataStart { get; set; }
public ulong DataStart;
/// <summary>
/// CRC-16 of the map
/// </summary>
public ushort CRC { get; set; }
public ushort CRC;
/// <summary>
/// Bits used to encode complength
/// </summary>
public byte LengthBits { get; set; }
public byte LengthBits;
/// <summary>
/// Bits used to encode self-refs
/// </summary>
public byte HunkBits { get; set; }
public byte HunkBits;
/// <summary>
/// Bits used to encode parent unit refs
/// </summary>
public byte ParentUnitBits { get; set; }
public byte ParentUnitBits;
/// <summary>
/// Future use
/// </summary>
public byte Reserved { get; set; }
public byte Reserved;
}
}

View File

@@ -6,11 +6,7 @@ namespace SabreTools.Models.CHD
/// <summary>
/// 'MComprHD'
/// </summary>
#if NET48
public string Tag { get; set; }
#else
public string? Tag { get; set; }
#endif
/// <summary>
/// Length of header (including tag and length fields)

View File

@@ -41,19 +41,11 @@
/// <summary>
/// MD5 checksum of raw data
/// </summary>
#if NET48
public byte[] MD5 { get; set; } = new byte[16];
#else
public byte[]? MD5 { get; set; } = new byte[16];
#endif
/// <summary>
/// MD5 checksum of parent file
/// </summary>
#if NET48
public byte[] ParentMD5 { get; set; } = new byte[16];
#else
public byte[]? ParentMD5 { get; set; } = new byte[16];
#endif
}
}

View File

@@ -41,20 +41,12 @@
/// <summary>
/// MD5 checksum of raw data
/// </summary>
#if NET48
public byte[] MD5 { get; set; } = new byte[16];
#else
public byte[]? MD5 { get; set; } = new byte[16];
#endif
/// <summary>
/// MD5 checksum of parent file
/// </summary>
#if NET48
public byte[] ParentMD5 { get; set; } = new byte[16];
#else
public byte[]? ParentMD5 { get; set; } = new byte[16];
#endif
/// <summary>
/// Number of bytes per sector

View File

@@ -31,20 +31,12 @@
/// <summary>
/// MD5 checksum of raw data
/// </summary>
#if NET48
public byte[] MD5 { get; set; } = new byte[16];
#else
public byte[]? MD5 { get; set; } = new byte[16];
#endif
/// <summary>
/// MD5 checksum of parent file
/// </summary>
#if NET48
public byte[] ParentMD5 { get; set; } = new byte[16];
#else
public byte[]? ParentMD5 { get; set; } = new byte[16];
#endif
/// <summary>
/// Number of bytes per hunk
@@ -54,19 +46,11 @@
/// <summary>
/// SHA1 checksum of raw data
/// </summary>
#if NET48
public byte[] SHA1 { get; set; } = new byte[20];
#else
public byte[]? SHA1 { get; set; } = new byte[20];
#endif
/// <summary>
/// SHA1 checksum of parent file
/// </summary>
#if NET48
public byte[] ParentSHA1 { get; set; } = new byte[20];
#else
public byte[]? ParentSHA1 { get; set; } = new byte[20];
#endif
}
}

View File

@@ -36,28 +36,16 @@
/// <summary>
/// Combined raw+meta SHA1
/// </summary>
#if NET48
public byte[] SHA1 { get; set; } = new byte[20];
#else
public byte[]? SHA1 { get; set; } = new byte[20];
#endif
/// <summary>
/// Combined raw+meta SHA1 of parent
/// </summary>
#if NET48
public byte[] ParentSHA1 { get; set; } = new byte[20];
#else
public byte[]? ParentSHA1 { get; set; } = new byte[20];
#endif
/// <summary>
/// Raw data SHA1
/// </summary>
#if NET48
public byte[] RawSHA1 { get; set; } = new byte[20];
#else
public byte[]? RawSHA1 { get; set; } = new byte[20];
#endif
}
}

View File

@@ -36,28 +36,16 @@
/// <summary>
/// Raw data SHA1
/// </summary>
#if NET48
public byte[] RawSHA1 { get; set; }
#else
public byte[]? RawSHA1 { get; set; }
#endif
/// <summary>
/// Combined raw+meta SHA1
/// </summary>
#if NET48
public byte[] SHA1 { get; set; }
#else
public byte[]? SHA1 { get; set; }
#endif
/// <summary>
/// Combined raw+meta SHA1 of parent
/// </summary>
#if NET48
public byte[] ParentSHA1 { get; set; }
#else
public byte[]? ParentSHA1 { get; set; }
#endif
}
}

View File

@@ -1,16 +1,19 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
public class MapV1
[StructLayout(LayoutKind.Sequential)]
public sealed class MapV1
{
/// <summary>
/// Starting offset within the file
/// </summary>
public ulong StartingOffset { get; set; }
public ulong StartingOffset;
/// <summary>
/// Length of data; If == hunksize, data is uncompressed
/// </summary>
public ulong Length { get; set; }
public ulong Length;
}
}

View File

@@ -1,31 +1,34 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
public class MapV3
[StructLayout(LayoutKind.Sequential)]
public sealed class MapV3
{
/// <summary>
/// Starting offset within the file
/// </summary>
public ulong StartingOffset { get; set; }
public ulong StartingOffset;
/// <summary>
/// 32-bit CRC of the uncompressed data
/// </summary>
public uint CRC32 { get; set; }
public uint CRC32;
/// <summary>
/// Lower 16 bits of length
/// </summary>
public ushort LengthLo { get; set; }
public ushort LengthLo;
/// <summary>
/// Upper 8 bits of length
/// </summary>
public byte LengthHi { get; set; }
public byte LengthHi;
/// <summary>
/// Flags, indicating compression info
/// </summary>
public byte Flags { get; set; }
public byte Flags;
}
}

View File

@@ -1,11 +1,14 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.CHD
{
/// <see href="https://github.com/mamedev/mame/blob/master/src/lib/util/chd.h"/>
[StructLayout(LayoutKind.Sequential)]
public class UncompressedMapV5
{
/// <summary>
/// Starting offset / hunk size
/// </summary>
public uint StartingOffset { get; set; }
public uint StartingOffset;
}
}

View File

@@ -12,71 +12,43 @@ namespace SabreTools.Models.Charts
/// Title of the song.
/// </summary>
/// <remarks>name</remarks>
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
/// <summary>
/// Artist(s) or band(s) behind the song.
/// </summary>
/// <remarks>artist</remarks>
#if NET48
public string Artist { get; set; }
#else
public string? Artist { get; set; }
#endif
/// <summary>
/// Title of the album the song is featured in.
/// </summary>
/// <remarks>album</remarks>
#if NET48
public string Album { get; set; }
#else
public string? Album { get; set; }
#endif
/// <summary>
/// Genre of the song.
/// </summary>
/// <remarks>genre</remarks>
#if NET48
public string Genre { get; set; }
#else
public string? Genre { get; set; }
#endif
/// <summary>
/// Sub-genre for the song.
/// </summary>
/// <remarks>sub_genre</remarks>
#if NET48
public string SubGenre { get; set; }
#else
public string? SubGenre { get; set; }
#endif
/// <summary>
/// Year of the songs release.
/// </summary>
/// <remarks>year</remarks>
#if NET48
public string Year { get; set; }
#else
public string? Year { get; set; }
#endif
/// <summary>
/// Community member responsible for charting the song.
/// </summary>
/// <remarks>charter, frets</remarks>
#if NET48
public string Charter { get; set; }
#else
public string? Charter { get; set; }
#endif
/// <summary>
/// Version number for the song.
@@ -118,11 +90,7 @@ namespace SabreTools.Models.Charts
/// Flavor text for this song, usually shown after picking the song or during loading.
/// </summary>
/// <remarks>loading_phrase</remarks>
#if NET48
public string LoadingPhrase { get; set; }
#else
public string? LoadingPhrase { get; set; }
#endif
#endregion
@@ -132,53 +100,33 @@ namespace SabreTools.Models.Charts
/// (FoFiX) Hex color to use in the song screen for the cassette.
/// </summary>
/// <remarks>cassettecolor</remarks>
#if NET48
public string CassetteColor { get; set; }
#else
public string? CassetteColor { get; set; }
#endif
/// <summary>
/// (FoFiX) Miscellaneous tags for the chart.
/// Only known valid value is `cover`.
/// </summary>
/// <remarks>tags</remarks>
#if NET48
public string Tags { get; set; }
#else
public string? Tags { get; set; }
#endif
/// <summary>
/// (PS) Two timestamps in milliseconds for preview start and end time.
/// Example: `55000 85000`
/// </summary>
/// <remarks>preview</remarks>
#if NET48
public long[] Preview { get; set; }
#else
public long[]? Preview { get; set; }
#endif
/// <summary>
/// (CH) Playlist that the song should show up in.
/// </summary>
/// <remarks>playlist</remarks>
#if NET48
public string Playlist { get; set; }
#else
public string? Playlist { get; set; }
#endif
/// <summary>
/// (CH) Sub-playlist that the song should show up in.
/// </summary>
/// <remarks>sub_playlist</remarks>
#if NET48
public string SubPlaylist { get; set; }
#else
public string? SubPlaylist { get; set; }
#endif
/// <summary>
/// (CH) Indicates if this song is a modchart.
@@ -350,51 +298,31 @@ namespace SabreTools.Models.Charts
/// Specifies a voice type for the singer (either "male" or "female").
/// </summary>
/// <remarks>vocal_gender</remarks>
#if NET48
public string VocalGender { get; set; }
#else
public string? VocalGender { get; set; }
#endif
/// <summary>
/// Specifies a tuning for 17-fret Pro Guitar.
/// </summary>
/// <remarks>real_guitar_tuning</remarks>
#if NET48
public string RealGuitarTuning { get; set; }
#else
public string? RealGuitarTuning { get; set; }
#endif
/// <summary>
/// Specifies a tuning for 22-fret Pro Guitar.
/// </summary>
/// <remarks>real_guitar_22_tuning</remarks>
#if NET48
public string RealGuitar22Tuning { get; set; }
#else
public string? RealGuitar22Tuning { get; set; }
#endif
/// <summary>
/// Specifies a tuning for 17-fret Pro Bass.
/// </summary>
/// <remarks>real_bass_tuning</remarks>
#if NET48
public string RealBassTuning { get; set; }
#else
public string? RealBassTuning { get; set; }
#endif
/// <summary>
/// Specifies a tuning for 22-fret Pro Bass.
/// </summary>
/// <remarks>real_bass_22_tuning</remarks>
#if NET48
public string RealBass22Tuning { get; set; }
#else
public string? RealBass22Tuning { get; set; }
#endif
/// <summary>
/// Specifies the number of lanes for the right hand in Real Keys.
@@ -479,11 +407,7 @@ namespace SabreTools.Models.Charts
/// Valid values are "none", "half", or "full".
/// </summary>
/// <remarks>early_hit_window_size</remarks>
#if NET48
public string EarlyHitWindowSize { get; set; }
#else
public string? EarlyHitWindowSize { get; set; }
#endif
/// <summary>
/// (CH) Sets whether or not end events in the chart will be respected.
@@ -560,31 +484,19 @@ namespace SabreTools.Models.Charts
/// Included in either the chart folder or the game the chart was made for, or sourced from this repository of icons.
/// </summary>
/// <remarks>icon</remarks>
#if NET48
public string Icon { get; set; }
#else
public string? Icon { get; set; }
#endif
/// <summary>
/// Name for a background image file.
/// </summary>
/// <remarks>background</remarks>
#if NET48
public string Background { get; set; }
#else
public string? Background { get; set; }
#endif
/// <summary>
/// Name for a background video file.
/// </summary>
/// <remarks>video</remarks>
#if NET48
public string Video { get; set; }
#else
public string? Video { get; set; }
#endif
/// <summary>
/// Name for a background video file.
@@ -610,11 +522,7 @@ namespace SabreTools.Models.Charts
/// Name for a cover image file.
/// </summary>
/// <remarks>cover</remarks>
#if NET48
public string Cover { get; set; }
#else
public string? Cover { get; set; }
#endif
#endregion
@@ -624,41 +532,25 @@ namespace SabreTools.Models.Charts
/// (PS) Name for banner A.
/// </summary>
/// <remarks>link_name_a</remarks>
#if NET48
public string LinkNameA { get; set; }
#else
public string? LinkNameA { get; set; }
#endif
/// <summary>
/// (PS) Name for banner B.
/// </summary>
/// <remarks>link_name_b</remarks>
#if NET48
public string LinkNameB { get; set; }
#else
public string? LinkNameB { get; set; }
#endif
/// <summary>
/// (PS) Link that clicking banner A will open.
/// </summary>
/// <remarks>banner_link_a</remarks>
#if NET48
public string BannerLinkA { get; set; }
#else
public string? BannerLinkA { get; set; }
#endif
/// <summary>
/// (PS) Link that clicking banner B will open.
/// </summary>
/// <remarks>banner_link_b</remarks>
#if NET48
public string BannerLinkB { get; set; }
#else
public string? BannerLinkB { get; set; }
#endif
#endregion
@@ -668,21 +560,13 @@ namespace SabreTools.Models.Charts
/// (FoFiX) High score data.
/// </summary>
/// <remarks>scores</remarks>
#if NET48
public string Scores { get; set; }
#else
public string? Scores { get; set; }
#endif
/// <summary>
/// (FoFiX) Additional score data.
/// </summary>
/// <remarks>scores_ext</remarks>
#if NET48
public string ScoresExt { get; set; }
#else
public string? ScoresExt { get; set; }
#endif
/// <summary>
/// (FoFiX) Play count.
@@ -700,31 +584,19 @@ namespace SabreTools.Models.Charts
/// (FoFiX) Career ID for this song.
/// </summary>
/// <remarks>unlock_id</remarks>
#if NET48
public string UnlockId { get; set; }
#else
public string? UnlockId { get; set; }
#endif
/// <summary>
/// (FoFiX) The career ID that must be completed to unlock this song.
/// </summary>
/// <remarks>unlock_require</remarks>
#if NET48
public string UnlockRequire { get; set; }
#else
public string? UnlockRequire { get; set; }
#endif
/// <summary>
/// (FoFiX) Text to display if the song is locked.
/// </summary>
/// <remarks>unlock_text</remarks>
#if NET48
public string UnlockText { get; set; }
#else
public string? UnlockText { get; set; }
#endif
/// <summary>
/// (FoFiX) Indicates if the song is unlocked.

View File

@@ -10,20 +10,12 @@ namespace SabreTools.Models.Charts
/// A space-separated list of .ini sections to include in the career.
/// </summary>
/// <remarks>sections</remarks>
#if NET48
public string[] SectionList { get; set; }
#else
public string[]? SectionList { get; set; }
#endif
/// <summary>
/// `name` - Display name of the tier.
/// `unlock_id` - Name used for associating a song with this tier, and for checking unlock requirements.
/// </summary>
#if NET48
public Dictionary<string, (string Name, string UnlockId)> Sections { get; set; }
#else
public Dictionary<string, (string? Name, string? UnlockId)>? Sections { get; set; }
#endif
}
}

View File

@@ -5,20 +5,12 @@ namespace SabreTools.Models.ClrMamePro
{
/// <remarks>name</remarks>
[Required]
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public string[] ADDITIONAL_ELEMENTS { get; set; }
#else
public string[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -5,35 +5,19 @@ namespace SabreTools.Models.ClrMamePro
{
/// <remarks>name</remarks>
[Required]
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
/// <remarks>description</remarks>
[Required]
#if NET48
public string Description { get; set; }
#else
public string? Description { get; set; }
#endif
/// <remarks>default</remarks>
#if NET48
public string Default { get; set; }
#else
public string? Default { get; set; }
#endif
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public string[] ADDITIONAL_ELEMENTS { get; set; }
#else
public string[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -5,42 +5,22 @@ namespace SabreTools.Models.ClrMamePro
{
/// <remarks>type, (cpu|audio)</remarks>
[Required]
#if NET48
public string Type { get; set; }
#else
public string? Type { get; set; }
#endif
/// <remarks>name</remarks>
[Required]
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
/// <remarks>flags</remarks>
#if NET48
public string Flags { get; set; }
#else
public string? Flags { get; set; }
#endif
/// <remarks>clock, Numeric?</remarks>
#if NET48
public string Clock { get; set; }
#else
public string? Clock { get; set; }
#endif
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public object[] ADDITIONAL_ELEMENTS { get; set; }
#else
public object[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -4,118 +4,54 @@ namespace SabreTools.Models.ClrMamePro
public class ClrMamePro
{
/// <remarks>name</remarks>
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
/// <remarks>description</remarks>
#if NET48
public string Description { get; set; }
#else
public string? Description { get; set; }
#endif
/// <remarks>rootdir</remarks>
#if NET48
public string RootDir { get; set; }
#else
public string? RootDir { get; set; }
#endif
/// <remarks>category</remarks>
#if NET48
public string Category { get; set; }
#else
public string? Category { get; set; }
#endif
/// <remarks>version</remarks>
#if NET48
public string Version { get; set; }
#else
public string? Version { get; set; }
#endif
/// <remarks>date</remarks>
#if NET48
public string Date { get; set; }
#else
public string? Date { get; set; }
#endif
/// <remarks>author</remarks>
#if NET48
public string Author { get; set; }
#else
public string? Author { get; set; }
#endif
/// <remarks>homepage</remarks>
#if NET48
public string Homepage { get; set; }
#else
public string? Homepage { get; set; }
#endif
/// <remarks>url</remarks>
#if NET48
public string Url { get; set; }
#else
public string? Url { get; set; }
#endif
/// <remarks>comment</remarks>
#if NET48
public string Comment { get; set; }
#else
public string? Comment { get; set; }
#endif
/// <remarks>header</remarks>
#if NET48
public string Header { get; set; }
#else
public string? Header { get; set; }
#endif
/// <remarks>type</remarks>
#if NET48
public string Type { get; set; }
#else
public string? Type { get; set; }
#endif
/// <remarks>forcemerging</remarks>
#if NET48
public string ForceMerging { get; set; }
#else
public string? ForceMerging { get; set; }
#endif
/// <remarks>forcezipping</remarks>
#if NET48
public string ForceZipping { get; set; }
#else
public string? ForceZipping { get; set; }
#endif
/// <remarks>forcepacking</remarks>
#if NET48
public string ForcePacking { get; set; }
#else
public string? ForcePacking { get; set; }
#endif
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public string[] ADDITIONAL_ELEMENTS { get; set; }
#else
public string[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -5,34 +5,18 @@ namespace SabreTools.Models.ClrMamePro
{
/// <remarks>name</remarks>
[Required]
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
/// <remarks>entry</remarks>
#if NET48
public string[] Entry { get; set; }
#else
public string[]? Entry { get; set; }
#endif
/// <remarks>default, (yes|no) "no"</remarks>
#if NET48
public string Default { get; set; }
#else
public string? Default { get; set; }
#endif
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public object[] ADDITIONAL_ELEMENTS { get; set; }
#else
public object[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -5,55 +5,27 @@ namespace SabreTools.Models.ClrMamePro
{
/// <remarks>name</remarks>
[Required]
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
/// <remarks>md5</remarks>
#if NET48
public string MD5 { get; set; }
#else
public string? MD5 { get; set; }
#endif
/// <remarks>sha1</remarks>
#if NET48
public string SHA1 { get; set; }
#else
public string? SHA1 { get; set; }
#endif
/// <remarks>merge</remarks>
#if NET48
public string Merge { get; set; }
#else
public string? Merge { get; set; }
#endif
/// <remarks>status</remarks>
#if NET48
public string Status { get; set; }
#else
public string? Status { get; set; }
#endif
/// <remarks>flags</remarks>
#if NET48
public string Flags { get; set; }
#else
public string? Flags { get; set; }
#endif
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public string[] ADDITIONAL_ELEMENTS { get; set; }
#else
public string[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -5,48 +5,24 @@ namespace SabreTools.Models.ClrMamePro
{
/// <remarks>status, (good|imperfect|preliminary)</remarks>
[Required]
#if NET48
public string Status { get; set; }
#else
public string? Status { get; set; }
#endif
/// <remarks>color, (good|imperfect|preliminary)</remarks>
#if NET48
public string Color { get; set; }
#else
public string? Color { get; set; }
#endif
/// <remarks>sound, (good|imperfect|preliminary)</remarks>
#if NET48
public string Sound { get; set; }
#else
public string? Sound { get; set; }
#endif
/// <remarks>palettesize, Numeric?</remarks>
#if NET48
public string PaletteSize { get; set; }
#else
public string? PaletteSize { get; set; }
#endif
/// <remarks>blit, (plain|dirty)</remarks>
#if NET48
public string Blit { get; set; }
#else
public string? Blit { get; set; }
#endif
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public object[] ADDITIONAL_ELEMENTS { get; set; }
#else
public object[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -7,168 +7,80 @@ namespace SabreTools.Models.ClrMamePro
{
/// <remarks>name</remarks>
[Required]
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
/// <remarks>description</remarks>
#if NET48
public string Description { get; set; }
#else
public string? Description { get; set; }
#endif
/// <remarks>year</remarks>
#if NET48
public string Year { get; set; }
#else
public string? Year { get; set; }
#endif
/// <remarks>manufacturer</remarks>
#if NET48
public string Manufacturer { get; set; }
#else
public string? Manufacturer { get; set; }
#endif
/// <remarks>category</remarks>
#if NET48
public string Category { get; set; }
#else
public string? Category { get; set; }
#endif
/// <remarks>cloneof</remarks>
#if NET48
public string CloneOf { get; set; }
#else
public string? CloneOf { get; set; }
#endif
/// <remarks>romof</remarks>
#if NET48
public string RomOf { get; set; }
#else
public string? RomOf { get; set; }
#endif
/// <remarks>sampleof</remarks>
#if NET48
public string SampleOf { get; set; }
#else
public string? SampleOf { get; set; }
#endif
/// <remarks>release</remarks>
#if NET48
public Release[] Release { get; set; }
#else
public Release[]? Release { get; set; }
#endif
/// <remarks>biosset</remarks>
#if NET48
public BiosSet[] BiosSet { get; set; }
#else
public BiosSet[]? BiosSet { get; set; }
#endif
/// <remarks>rom</remarks>
#if NET48
public Rom[] Rom { get; set; }
#else
public Rom[]? Rom { get; set; }
#endif
/// <remarks>disk</remarks>
#if NET48
public Disk[] Disk { get; set; }
#else
public Disk[]? Disk { get; set; }
#endif
/// <remarks>sample</remarks>
#if NET48
public Sample[] Sample { get; set; }
#else
public Sample[]? Sample { get; set; }
#endif
/// <remarks>archive</remarks>
#if NET48
public Archive[] Archive { get; set; }
#else
public Archive[]? Archive { get; set; }
#endif
#region Aaru Extensions
/// <remarks>media, Appears after Disk</remarks>
#if NET48
public Media[] Media { get; set; }
#else
public Media[]? Media { get; set; }
#endif
#endregion
#region MAME Extensions
/// <remarks>chip, Appears after Archive</remarks>
#if NET48
public Chip[] Chip { get; set; }
#else
public Chip[]? Chip { get; set; }
#endif
/// <remarks>video, Appears after Chip</remarks>
#if NET48
public Video[] Video { get; set; }
#else
public Video[]? Video { get; set; }
#endif
/// <remarks>sound, Appears after Video</remarks>
#if NET48
public Sound Sound { get; set; }
#else
public Sound? Sound { get; set; }
#endif
/// <remarks>input, Appears after Sound</remarks>
#if NET48
public Input Input { get; set; }
#else
public Input? Input { get; set; }
#endif
/// <remarks>dipswitch, Appears after Input</remarks>
#if NET48
public DipSwitch[] DipSwitch { get; set; }
#else
public DipSwitch[]? DipSwitch { get; set; }
#endif
/// <remarks>driver, Appears after DipSwitch</remarks>
#if NET48
public Driver Driver { get; set; }
#else
public Driver? Driver { get; set; }
#endif
#endregion
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public string[] ADDITIONAL_ELEMENTS { get; set; }
#else
public string[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -5,56 +5,28 @@ namespace SabreTools.Models.ClrMamePro
{
/// <remarks>players, Numeric/remarks>
[Required]
#if NET48
public string Players { get; set; }
#else
public string? Players { get; set; }
#endif
/// <remarks>control</remarks>
#if NET48
public string Control { get; set; }
#else
public string? Control { get; set; }
#endif
/// <remarks>buttons, Numeric</remarks>
[Required]
#if NET48
public string Buttons { get; set; }
#else
public string? Buttons { get; set; }
#endif
/// <remarks>coins, Numeric</remarks>
#if NET48
public string Coins { get; set; }
#else
public string? Coins { get; set; }
#endif
/// <remarks>tilt, (yes|no) "no"</remarks>
#if NET48
public string Tilt { get; set; }
#else
public string? Tilt { get; set; }
#endif
/// <remarks>service, (yes|no) "no"</remarks>
#if NET48
public string Service { get; set; }
#else
public string? Service { get; set; }
#endif
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public object[] ADDITIONAL_ELEMENTS { get; set; }
#else
public object[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -5,48 +5,24 @@ namespace SabreTools.Models.ClrMamePro
{
/// <remarks>name</remarks>
[Required]
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
/// <remarks>md5</remarks>
#if NET48
public string MD5 { get; set; }
#else
public string? MD5 { get; set; }
#endif
/// <remarks>sha1</remarks>
#if NET48
public string SHA1 { get; set; }
#else
public string? SHA1 { get; set; }
#endif
/// <remarks>sha256</remarks>
#if NET48
public string SHA256 { get; set; }
#else
public string? SHA256 { get; set; }
#endif
/// <remarks>spamsum</remarks>
#if NET48
public string SpamSum { get; set; }
#else
public string? SpamSum { get; set; }
#endif
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public string[] ADDITIONAL_ELEMENTS { get; set; }
#else
public string[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -3,27 +3,15 @@ namespace SabreTools.Models.ClrMamePro
public class MetadataFile
{
/// <remarks>clrmamepro</remarks>
#if NET48
public ClrMamePro ClrMamePro { get; set; }
#else
public ClrMamePro? ClrMamePro { get; set; }
#endif
/// <remarks>game, machine, resource, set</remarks>
#if NET48
public GameBase[] Game { get; set; }
#else
public GameBase?[]? Game { get; set; }
#endif
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public string[] ADDITIONAL_ELEMENTS { get; set; }
#else
public string[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -5,49 +5,25 @@ namespace SabreTools.Models.ClrMamePro
{
/// <remarks>name</remarks>
[Required]
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
/// <remarks>region</remarks>
[Required]
#if NET48
public string Region { get; set; }
#else
public string? Region { get; set; }
#endif
/// <remarks>language</remarks>
#if NET48
public string Language { get; set; }
#else
public string? Language { get; set; }
#endif
/// <remarks>date</remarks>
#if NET48
public string Date { get; set; }
#else
public string? Date { get; set; }
#endif
/// <remarks>default</remarks>
#if NET48
public string Default { get; set; }
#else
public string? Default { get; set; }
#endif
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public string[] ADDITIONAL_ELEMENTS { get; set; }
#else
public string[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -5,181 +5,93 @@ namespace SabreTools.Models.ClrMamePro
{
/// <remarks>name</remarks>
[Required]
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
/// <remarks>size, Numeric</remarks>
[Required]
#if NET48
public string Size { get; set; }
#else
public string? Size { get; set; }
#endif
/// <remarks>crc</remarks>
#if NET48
public string CRC { get; set; }
#else
public string? CRC { get; set; }
#endif
/// <remarks>md5</remarks>
#if NET48
public string MD5 { get; set; }
#else
public string? MD5 { get; set; }
#endif
/// <remarks>sha1</remarks>
#if NET48
public string SHA1 { get; set; }
#else
public string? SHA1 { get; set; }
#endif
/// <remarks>merge</remarks>
#if NET48
public string Merge { get; set; }
#else
public string? Merge { get; set; }
#endif
/// <remarks>status</remarks>
#if NET48
public string Status { get; set; }
#else
public string? Status { get; set; }
#endif
/// <remarks>flags</remarks>
#if NET48
public string Flags { get; set; }
#else
public string? Flags { get; set; }
#endif
/// <remarks>date</remarks>
#if NET48
public string Date { get; set; }
#else
public string? Date { get; set; }
#endif
#region Hash Extensions
/// <remarks>sha256; Also in No-Intro spec; Appears after SHA1</remarks>
#if NET48
public string SHA256 { get; set; }
#else
public string? SHA256 { get; set; }
#endif
/// <remarks>sha384; Appears after SHA256</remarks>
#if NET48
public string SHA384 { get; set; }
#else
public string? SHA384 { get; set; }
#endif
/// <remarks>sha512; Appears after SHA384</remarks>
#if NET48
public string SHA512 { get; set; }
#else
public string? SHA512 { get; set; }
#endif
/// <remarks>spamsum; Appears after SHA512</remarks>
#if NET48
public string SpamSum { get; set; }
#else
public string? SpamSum { get; set; }
#endif
#endregion
#region DiscImgeCreator Extensions
/// <remarks>xxh3_64; Appears after SpamSum</remarks>
#if NET48
public string xxHash364 { get; set; }
#else
public string? xxHash364 { get; set; }
#endif
/// <remarks>xxh3_128; Appears after xxHash364</remarks>
#if NET48
public string xxHash3128 { get; set; }
#else
public string? xxHash3128 { get; set; }
#endif
#endregion
#region MAME Extensions
/// <remarks>region; Appears after Status</remarks>
#if NET48
public string Region { get; set; }
#else
public string? Region { get; set; }
#endif
/// <remarks>offs; Appears after Flags</remarks>
#if NET48
public string Offs { get; set; }
#else
public string? Offs { get; set; }
#endif
#endregion
#region No-Intro Extensions
/// <remarks>serial; Appears after Offs</remarks>
#if NET48
public string Serial { get; set; }
#else
public string? Serial { get; set; }
#endif
/// <remarks>header; Appears after Serial</remarks>
#if NET48
public string Header { get; set; }
#else
public string? Header { get; set; }
#endif
#endregion
#region RomVault Extensions
/// <remarks>inverted; Boolean; Appears after Date</remarks>
#if NET48
public string Inverted { get; set; }
#else
public string? Inverted { get; set; }
#endif
/// <remarks>mia; Boolean; Appears after Inverted</remarks>
#if NET48
public string MIA { get; set; }
#else
public string? MIA { get; set; }
#endif
#endregion
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public string[] ADDITIONAL_ELEMENTS { get; set; }
#else
public string[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -4,108 +4,48 @@ namespace SabreTools.Models.ClrMamePro
public class RomVault
{
/// <remarks>name</remarks>
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
/// <remarks>description</remarks>
#if NET48
public string Description { get; set; }
#else
public string? Description { get; set; }
#endif
/// <remarks>rootdir</remarks>
#if NET48
public string RootDir { get; set; }
#else
public string? RootDir { get; set; }
#endif
/// <remarks>category</remarks>
#if NET48
public string Category { get; set; }
#else
public string? Category { get; set; }
#endif
/// <remarks>version</remarks>
#if NET48
public string Version { get; set; }
#else
public string? Version { get; set; }
#endif
/// <remarks>date</remarks>
#if NET48
public string Date { get; set; }
#else
public string? Date { get; set; }
#endif
/// <remarks>author</remarks>
#if NET48
public string Author { get; set; }
#else
public string? Author { get; set; }
#endif
/// <remarks>homepage</remarks>
#if NET48
public string Homepage { get; set; }
#else
public string? Homepage { get; set; }
#endif
/// <remarks>url</remarks>
#if NET48
public string Url { get; set; }
#else
public string? Url { get; set; }
#endif
/// <remarks>comment</remarks>
#if NET48
public string Comment { get; set; }
#else
public string? Comment { get; set; }
#endif
/// <remarks>header</remarks>
#if NET48
public string Header { get; set; }
#else
public string? Header { get; set; }
#endif
/// <remarks>type</remarks>
#if NET48
public string Type { get; set; }
#else
public string? Type { get; set; }
#endif
/// <remarks>forcemerging</remarks>
#if NET48
public string ForceMerging { get; set; }
#else
public string? ForceMerging { get; set; }
#endif
/// <remarks>forcezipping</remarks>
#if NET48
public string ForceZipping { get; set; }
#else
public string? ForceZipping { get; set; }
#endif
/// <remarks>forcepacking</remarks>
#if NET48
public string ForcePacking { get; set; }
#else
public string? ForcePacking { get; set; }
#endif
}
}

View File

@@ -5,20 +5,12 @@ namespace SabreTools.Models.ClrMamePro
{
/// <remarks>name</remarks>
[Required]
#if NET48
public string Name { get; set; }
#else
public string? Name { get; set; }
#endif
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public string[] ADDITIONAL_ELEMENTS { get; set; }
#else
public string[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -5,20 +5,12 @@ namespace SabreTools.Models.ClrMamePro
{
/// <remarks>channels, Numeric?</remarks>
[Required]
#if NET48
public string Channels { get; set; }
#else
public string? Channels { get; set; }
#endif
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public object[] ADDITIONAL_ELEMENTS { get; set; }
#else
public object[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -5,63 +5,31 @@ namespace SabreTools.Models.ClrMamePro
{
/// <remarks>screen, (raster|vector)</remarks>
[Required]
#if NET48
public string Screen { get; set; }
#else
public string? Screen { get; set; }
#endif
/// <remarks>orientation, (vertical|horizontal)</remarks>
[Required]
#if NET48
public string Orientation { get; set; }
#else
public string? Orientation { get; set; }
#endif
/// <remarks>x, Numeric?</remarks>
#if NET48
public string X { get; set; }
#else
public string? X { get; set; }
#endif
/// <remarks>y, Numeric?</remarks>
#if NET48
public string Y { get; set; }
#else
public string? Y { get; set; }
#endif
/// <remarks>aspectx, Numeric?</remarks>
#if NET48
public string AspectX { get; set; }
#else
public string? AspectX { get; set; }
#endif
/// <remarks>aspecty, Numeric?</remarks>
#if NET48
public string AspectY { get; set; }
#else
public string? AspectY { get; set; }
#endif
/// <remarks>freq, Numeric?</remarks>
#if NET48
public string Freq { get; set; }
#else
public string? Freq { get; set; }
#endif
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
#if NET48
public object[] ADDITIONAL_ELEMENTS { get; set; }
#else
public object[]? ADDITIONAL_ELEMENTS { get; set; }
#endif
#endregion
}

View File

@@ -1,21 +1,22 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.Compression.LZ
{
/// <summary>
/// Format of first 14 byte of LZ compressed file
/// </summary>
/// <see href="https://github.com/wine-mirror/wine/blob/master/dlls/kernel32/lzexpand.c"/>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public sealed class FileHeaader
{
#if NET48
public string Magic { get; set; }
#else
public string? Magic { get; set; }
#endif
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string? Magic;
public byte CompressionType { get; set; }
public byte CompressionType;
public char LastChar { get; set; }
[MarshalAs(UnmanagedType.U1)]
public char LastChar;
public uint RealLength { get; set; }
public uint RealLength;
}
}

View File

@@ -7,11 +7,7 @@ namespace SabreTools.Models.Compression.LZ
/// <summary>
/// Internal backing stream
/// </summary>
#if NET48
public Stream Source { get; set; }
#else
public Stream? Source { get; set; }
#endif
/// <summary>
/// The last char of the filename for replacement
@@ -36,11 +32,7 @@ namespace SabreTools.Models.Compression.LZ
/// <summary>
/// The rotating LZ table
/// </summary>
#if NET48
public byte[] Table { get; set; }
#else
public byte[]? Table { get; set; }
#endif
/// <summary>
/// CURrent TABle ENTry
@@ -65,11 +57,7 @@ namespace SabreTools.Models.Compression.LZ
/// <summary>
/// GETLEN bytes
/// </summary>
#if NET48
public byte[] Window { get; set; }
#else
public byte[]? Window { get; set; }
#endif
/// <summary>
/// Current read

View File

@@ -11,80 +11,48 @@ namespace SabreTools.Models.Compression.LZX
/// Aligned offset tree
/// </summary>
/// <remarks>8 elements, 3 bits each</remarks>
#if NET48
public byte[] AlignedOffsetTree { get; set; }
#else
public byte[]? AlignedOffsetTree { get; set; }
#endif
/// <summary>
/// Pretree for first 256 elements of main tree
/// </summary>
/// <remarks>20 elements, 4 bits each</remarks>
#if NET48
public byte[] PretreeFirst256 { get; set; }
#else
public byte[]? PretreeFirst256 { get; set; }
#endif
/// <summary>
/// Path lengths of first 256 elements of main tree
/// </summary>
/// <remarks>Encoded using pretree</remarks>
#if NET48
public int[] PathLengthsFirst256 { get; set; }
#else
public int[]? PathLengthsFirst256 { get; set; }
#endif
/// <summary>
/// Pretree for remainder of main tree
/// </summary>
/// <remarks>20 elements, 4 bits each</remarks>
#if NET48
public byte[] PretreeRemainder { get; set; }
#else
public byte[]? PretreeRemainder { get; set; }
#endif
/// <summary>
/// Path lengths of remaining elements of main tree
/// </summary>
/// <remarks>Encoded using pretree</remarks>
#if NET48
public int[] PathLengthsRemainder { get; set; }
#else
public int[]? PathLengthsRemainder { get; set; }
#endif
/// <summary>
/// Pretree for length tree
/// </summary>
/// <remarks>20 elements, 4 bits each</remarks>
#if NET48
public byte[] PretreeLengthTree { get; set; }
#else
public byte[]? PretreeLengthTree { get; set; }
#endif
/// <summary>
/// Path lengths of elements in length tree
/// </summary>
/// <remarks>Encoded using pretree</remarks>
#if NET48
public int[] PathLengthsLengthTree { get; set; }
#else
public int[]? PathLengthsLengthTree { get; set; }
#endif
/// <summary>
/// Token sequence (matches and literals)
/// </summary>
/// <remarks>Variable</remarks>
#if NET48
public byte[] TokenSequence { get; set; }
#else
public byte[]? TokenSequence { get; set; }
#endif
}
}

View File

@@ -14,19 +14,11 @@ namespace SabreTools.Models.Compression.LZX
/// <summary>
/// Block header
/// </summary>
#if NET48
public BlockHeader Header { get; set; }
#else
public BlockHeader? Header { get; set; }
#endif
/// <summary>
/// Block data
/// </summary>
#if NET48
public BlockData BlockData { get; set; }
#else
public BlockData? BlockData { get; set; }
#endif
}
}

View File

@@ -15,11 +15,11 @@ namespace SabreTools.Models.Compression.LZX
/// <summary>
/// Chunk header
/// </summary>
public ChunkHeader Header { get; set; }
public ChunkHeader? Header { get; set; }
/// <summary>
/// Block headers and data
/// </summary>
public Block[] Blocks { get; set; }
public Block[]? Blocks { get; set; }
}
}

View File

@@ -44,11 +44,7 @@ namespace SabreTools.Models.Compression.LZX
/// Can use the direct memcpy function, as specified in [IEEE1003.1]
/// </summary>
/// <remarks>Encoded directly in the byte stream, not in the bitstream of byte-swapped 16-bit words</remarks>
#if NET48
public byte[] RawDataBytes { get; set; }
#else
public byte[]? RawDataBytes { get; set; }
#endif
/// <summary>
/// Only if uncompressed size is odd

View File

@@ -10,70 +10,42 @@ namespace SabreTools.Models.Compression.LZX
/// Pretree for first 256 elements of main tree
/// </summary>
/// <remarks>20 elements, 4 bits each</remarks>
#if NET48
public byte[] PretreeFirst256 { get; set; }
#else
public byte[]? PretreeFirst256 { get; set; }
#endif
/// <summary>
/// Path lengths of first 256 elements of main tree
/// </summary>
/// <remarks>Encoded using pretree</remarks>
#if NET48
public int[] PathLengthsFirst256 { get; set; }
#else
public int[]? PathLengthsFirst256 { get; set; }
#endif
/// <summary>
/// Pretree for remainder of main tree
/// </summary>
/// <remarks>20 elements, 4 bits each</remarks>
#if NET48
public byte[] PretreeRemainder { get; set; }
#else
public byte[]? PretreeRemainder { get; set; }
#endif
/// <summary>
/// Path lengths of remaining elements of main tree
/// </summary>
/// <remarks>Encoded using pretree</remarks>
#if NET48
public int[] PathLengthsRemainder { get; set; }
#else
public int[]? PathLengthsRemainder { get; set; }
#endif
/// <summary>
/// Pretree for length tree
/// </summary>
/// <remarks>20 elements, 4 bits each</remarks>
#if NET48
public byte[] PretreeLengthTree { get; set; }
#else
public byte[]? PretreeLengthTree { get; set; }
#endif
/// <summary>
/// Path lengths of elements in length tree
/// </summary>
/// <remarks>Encoded using pretree</remarks>
#if NET48
public int[] PathLengthsLengthTree { get; set; }
#else
public int[]? PathLengthsLengthTree { get; set; }
#endif
/// <summary>
/// Token sequence (matches and literals)
/// </summary>
/// <remarks>Variable</remarks>
#if NET48
public byte[] TokenSequence { get; set; }
#else
public byte[]? TokenSequence { get; set; }
#endif
}
}

View File

@@ -23,19 +23,11 @@ namespace SabreTools.Models.Compression.MSZIP
/// <summary>
/// Block header
/// </summary>
#if NET48
public BlockHeader BlockHeader { get; set; }
#else
public BlockHeader? BlockHeader { get; set; }
#endif
/// <summary>
/// Compressed blocks
/// </summary>
#if NET48
public DeflateBlock[] CompressedBlocks { get; set; }
#else
public DeflateBlock[]? CompressedBlocks { get; set; }
#endif
}
}

View File

@@ -10,19 +10,11 @@ namespace SabreTools.Models.Compression.MSZIP
/// <summary>
/// Huffman code lengths for the literal / length alphabet
/// </summary>
#if NET48
public virtual uint[] LiteralLengths { get; set; }
#else
public virtual uint[]? LiteralLengths { get; set; }
#endif
/// <summary>
/// Huffman distance codes for the literal / length alphabet
/// </summary>
#if NET48
public virtual uint[] DistanceCodes { get; set; }
#else
public virtual uint[]? DistanceCodes { get; set; }
#endif
}
}

View File

@@ -15,20 +15,12 @@ namespace SabreTools.Models.Compression.MSZIP
/// <summary>
/// Deflate block (RFC-1951) header
/// </summary>
#if NET48
public DeflateBlockHeader Header { get; set; }
#else
public DeflateBlockHeader? Header { get; set; }
#endif
/// <summary>
/// Compression-specific data header
/// </summary>
#if NET48
public DataHeader DataHeader { get; set; }
#else
public DataHeader? DataHeader { get; set; }
#endif
/// <summary>
/// MSZIP data
@@ -38,10 +30,6 @@ namespace SabreTools.Models.Compression.MSZIP
/// compressed or uncompressed data. Keep this in mind when using the built
/// versions of this model.
/// </remarks>
#if NET48
public byte[] Data { get; set; }
#else
public byte[]? Data { get; set; }
#endif
}
}

View File

@@ -14,11 +14,7 @@ namespace SabreTools.Models.Compression.MSZIP
/// <summary>
/// Huffman code lengths for the literal / length alphabet
/// </summary>
#if NET48
public override uint[] LiteralLengths
#else
public override uint[]? LiteralLengths
#endif
{
get
{
@@ -56,11 +52,7 @@ namespace SabreTools.Models.Compression.MSZIP
/// <summary>
/// Huffman distance codes for the literal / length alphabet
/// </summary>
#if NET48
public override uint[] DistanceCodes
#else
public override uint[]? DistanceCodes
#endif
{
get
{
@@ -90,20 +82,12 @@ namespace SabreTools.Models.Compression.MSZIP
/// <summary>
/// Huffman code lengths for the literal / length alphabet
/// </summary>
#if NET48
private uint[] _literalLengths = null;
#else
private uint[]? _literalLengths = null;
#endif
/// <summary>
/// Huffman distance codes for the literal / length alphabet
/// </summary>
#if NET48
private uint[] _distanceCodes = null;
#else
private uint[]? _distanceCodes = null;
#endif
#endregion
}

View File

@@ -10,11 +10,7 @@ namespace SabreTools.Models.Compression.Quantum
/// order in the table, and with every symbol in the table
/// having a frequency of 1
/// </remarks>
#if NET48
public ModelSymbol[] Symbols { get; set; }
#else
public ModelSymbol?[]? Symbols { get; set; }
#endif
/// <remarks>
/// The initial total frequency is equal to the number of entries

View File

@@ -15,11 +15,7 @@ namespace SabreTools.Models.CueSheets
/// <summary>
/// filename
/// </summary>
#if NET48
public string FileName { get; set; }
#else
public string? FileName { get; set; }
#endif
/// <summary>
/// filetype
@@ -29,10 +25,6 @@ namespace SabreTools.Models.CueSheets
/// <summary>
/// List of TRACK in FILE
/// </summary>
#if NET48
public CueTrack[] Tracks { get; set; }
#else
public CueTrack?[]? Tracks { get; set; }
#endif
}
}

View File

@@ -11,55 +11,31 @@ namespace SabreTools.Models.CueSheets
/// <summary>
/// CATALOG
/// </summary>
#if NET48
public string Catalog { get; set; }
#else
public string? Catalog { get; set; }
#endif
/// <summary>
/// CDTEXTFILE
/// </summary>
#if NET48
public string CdTextFile { get; set; }
#else
public string? CdTextFile { get; set; }
#endif
/// <summary>
/// PERFORMER
/// </summary>
#if NET48
public string Performer { get; set; }
#else
public string? Performer { get; set; }
#endif
/// <summary>
/// SONGWRITER
/// </summary>
#if NET48
public string Songwriter { get; set; }
#else
public string? Songwriter { get; set; }
#endif
/// <summary>
/// TITLE
/// </summary>
#if NET48
public string Title { get; set; }
#else
public string? Title { get; set; }
#endif
/// <summary>
/// List of FILE in cuesheet
/// </summary>
#if NET48
public CueFile[] Files { get; set; }
#else
public CueFile?[]? Files { get; set; }
#endif
}
}

View File

@@ -27,65 +27,37 @@ namespace SabreTools.Models.CueSheets
/// ISRC
/// </summary>
/// <remarks>12 characters in length</remarks>
#if NET48
public string ISRC { get; set; }
#else
public string? ISRC { get; set; }
#endif
/// <summary>
/// PERFORMER
/// </summary>
#if NET48
public string Performer { get; set; }
#else
public string? Performer { get; set; }
#endif
/// <summary>
/// SONGWRITER
/// </summary>
#if NET48
public string Songwriter { get; set; }
#else
public string? Songwriter { get; set; }
#endif
/// <summary>
/// TITLE
/// </summary>
#if NET48
public string Title { get; set; }
#else
public string? Title { get; set; }
#endif
/// <summary>
/// PREGAP
/// </summary>
#if NET48
public PreGap PreGap { get; set; }
#else
public PreGap? PreGap { get; set; }
#endif
/// <summary>
/// List of INDEX in TRACK
/// </summary>
/// <remarks>Must start with 0 or 1 and then sequential</remarks>
#if NET48
public CueIndex[] Indices { get; set; }
#else
public CueIndex?[]? Indices { get; set; }
#endif
/// <summary>
/// POSTGAP
/// </summary>
#if NET48
public PostGap PostGap { get; set; }
#else
public PostGap? PostGap { get; set; }
#endif
}
}

View File

@@ -1,6 +1,6 @@
namespace SabreTools.Models.DVD
{
/// <see href="https://dvd.sourceforge.net/dvdinfo/ifo.html"/>
/// <see href="https://dvd.sourceforge.net/dvdinfo/ifo_vmg.html"/>
public sealed class AudioSubPictureAttributesTable
{
/// <summary>
@@ -11,11 +11,7 @@ namespace SabreTools.Models.DVD
/// <summary>
/// Reserved
/// </summary>
#if NET48
public byte[] Reserved { get; set; }
#else
public byte[]? Reserved { get; set; }
#endif
public ushort Reserved { get; set; }
/// <summary>
/// End address (last byte of last VTS_ATRT)
@@ -25,19 +21,12 @@ namespace SabreTools.Models.DVD
/// <summary>
/// Offset to VTS_ATRT n
/// </summary>
#if NET48
public uint[] Offsets { get; set; }
#else
/// <remarks>NumberOfTitleSets entries</remarks>
public uint[]? Offsets { get; set; }
#endif
/// <summary>
/// Entries
/// </summary>
#if NET48
public AudioSubPictureAttributesTableEntry[] Entries { get; set; }
#else
public AudioSubPictureAttributesTableEntry?[]? Entries { get; set; }
#endif
public AudioSubPictureAttributesTableEntry[]? Entries { get; set; }
}
}

View File

@@ -1,6 +1,6 @@
namespace SabreTools.Models.DVD
{
/// <see href="https://dvd.sourceforge.net/dvdinfo/ifo.html"/>
/// <see href="https://dvd.sourceforge.net/dvdinfo/ifo_vmg.html"/>
public sealed class AudioSubPictureAttributesTableEntry
{
/// <summary>
@@ -18,10 +18,6 @@ namespace SabreTools.Models.DVD
/// Copy of VTS attributes (offset 100 and on from the VTS IFO
/// file, usually 0x300 bytes long)
/// </summary>
#if NET48
public byte[] AttributesCopy { get; set; }
#else
public byte[]? AttributesCopy { get; set; }
#endif
}
}

View File

@@ -11,11 +11,7 @@ namespace SabreTools.Models.DVD
/// <summary>
/// Reserved
/// </summary>
#if NET48
public byte[] Reserved { get; set; }
#else
public byte[]? Reserved { get; set; }
#endif
public ushort Reserved { get; set; }
/// <summary>
/// End address (last byte of last entry)
@@ -25,10 +21,7 @@ namespace SabreTools.Models.DVD
/// <summary>
/// 12-byte entries
/// </summary>
#if NET48
public CellAddressTableEntry[] Entries { get; set; }
#else
public CellAddressTableEntry?[]? Entries { get; set; }
#endif
/// <remarks>NumberOfVOBIDs entries</remarks>
public CellAddressTableEntry[]? Entries { get; set; }
}
}

View File

@@ -1,31 +1,34 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.DVD
{
/// <see href="https://dvd.sourceforge.net/dvdinfo/ifo.html"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class CellAddressTableEntry
{
/// <summary>
/// VOBidn
/// </summary>
public ushort VOBIdentity { get; set; }
public ushort VOBIdentity;
/// <summary>
/// CELLidn
/// </summary>
public byte CellIdentity { get; set; }
public byte CellIdentity;
/// <summary>
/// Reserved
/// </summary>
public byte Reserved { get; set; }
public byte Reserved;
/// <summary>
/// Starting sector within VOB
/// </summary>
public uint StartingSectorWithinVOB { get; set; }
public uint StartingSectorWithinVOB;
/// <summary>
/// Ending sector within VOB
/// </summary>
public uint EndingSectorWithinVOB { get; set; }
public uint EndingSectorWithinVOB;
}
}

View File

@@ -11,11 +11,7 @@ namespace SabreTools.Models.DVD
/// <summary>
/// Reserved
/// </summary>
#if NET48
public byte[] Reserved { get; set; }
#else
public byte[]? Reserved { get; set; }
#endif
public ushort Reserved { get; set; }
/// <summary>
/// End address (last byte of last PGC in last LU)
@@ -26,19 +22,13 @@ namespace SabreTools.Models.DVD
/// <summary>
/// Language Units
/// </summary>
#if NET48
public LanguageUnitTableEntry[] Entries { get; set; }
#else
public LanguageUnitTableEntry?[]? Entries { get; set; }
#endif
/// <remarks>NumberOfVOBIDs entries</remarks>
public LanguageUnitTableEntry[]? Entries { get; set; }
/// <summary>
/// Program Chains
/// </summary>
#if NET48
public ProgramChainTable[] ProgramChains { get; set; }
#else
public ProgramChainTable?[]? ProgramChains { get; set; }
#endif
/// <remarks>NumberOfVOBIDs entries</remarks>
public ProgramChainTable[]? ProgramChains { get; set; }
}
}

View File

@@ -1,26 +1,29 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.DVD
{
/// <see href="https://dvd.sourceforge.net/dvdinfo/ifo_vmg.html"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class LanguageUnitTableEntry
{
/// <summary>
/// ISO639 language code
/// ISO639 language code
/// </summary>
public ushort ISO639LanguageCode { get; set; }
public ushort ISO639LanguageCode;
/// <summary>
/// Reserved for language code extension
/// </summary>
public byte Reserved { get; set; }
public byte Reserved;
/// <summary>
/// Menu existence flag [80 = title]
/// </summary>
public byte MenuExistenceFlag { get; set; }
public byte MenuExistenceFlag;
/// <summary>
/// Offset to VMGM_LU, relative to VMGM_PGCI_UT
/// </summary>
public uint LanguageUnitOffset { get; set; }
public uint LanguageUnitOffset;
}
}

View File

@@ -25,21 +25,13 @@ namespace SabreTools.Models.DVD
/// <summary>
/// Entries
/// </summary>
#if NET48
public ParentalManagementMasksTableEntry[] Entries { get; set; }
#else
public ParentalManagementMasksTableEntry?[]? Entries { get; set; }
#endif
public ParentalManagementMasksTableEntry[]? Entries { get; set; }
/// <summary>
/// The PTL_MAIT contains the 16-bit masks for the VMG and
/// all title sets for parental management level 8 followed
/// by the masks for level 7, and so on to level 1.
/// </summary>
#if NET48
public byte[][] BitMasks { get; set; }
#else
public byte[][]? BitMasks { get; set; }
#endif
}
}

View File

@@ -1,25 +1,24 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.DVD
{
/// <see href="https://dvd.sourceforge.net/dvdinfo/ifo_vmg.html"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class ParentalManagementMasksTableEntry
{
/// <summary>
/// Country code
/// </summary>
public ushort CountryCode { get; set; }
public ushort CountryCode;
/// <summary>
/// Reserved
/// </summary>
#if NET48
public byte[] Reserved { get; set; }
#else
public byte[]? Reserved { get; set; }
#endif
public ushort Reserved;
/// <summary>
/// Offset to PTL_MAIT
/// </summary>
public uint Offset { get; set; }
public uint Offset;
}
}

View File

@@ -11,11 +11,7 @@ namespace SabreTools.Models.DVD
/// <summary>
/// Reserved
/// </summary>
#if NET48
public byte[] Reserved { get; set; }
#else
public byte[]? Reserved { get; set; }
#endif
public ushort Reserved { get; set; }
/// <summary>
/// End address (last byte of last PGC in this LU)
@@ -26,10 +22,7 @@ namespace SabreTools.Models.DVD
/// <summary>
/// Program Chains
/// </summary>
#if NET48
public ProgramChainTableEntry[] Entries { get; set; }
#else
public ProgramChainTableEntry?[]? Entries { get; set; }
#endif
/// <remarks>NumberOfProgramChains entries</remarks>
public ProgramChainTableEntry[]? Entries { get; set; }
}
}

View File

@@ -1,26 +1,30 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.DVD
{
/// <see href="https://dvd.sourceforge.net/dvdinfo/ifo_vmg.html"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class ProgramChainTableEntry
{
/// <summary>
/// PGC category
/// </summary>
public ProgramChainCategory Category { get; set; }
[MarshalAs(UnmanagedType.U1)]
public ProgramChainCategory Category;
/// <summary>
/// Unknown
/// </summary>
public byte Unknown { get; set; }
public byte Unknown;
/// <summary>
/// Parental management mask
/// </summary>
public ushort ParentalManagementMask { get; set; }
public ushort ParentalManagementMask;
/// <summary>
/// Offset to VMGM_PGC, relative to VMGM_LU
/// </summary>
public uint Offset { get; set; }
public uint Offset;
}
}

View File

@@ -11,11 +11,7 @@ namespace SabreTools.Models.DVD
/// <summary>
/// Reserved
/// </summary>
#if NET48
public byte[] Reserved { get; set; }
#else
public byte[]? Reserved { get; set; }
#endif
public ushort Reserved { get; set; }
/// <summary>
/// End address (last byte of last entry)
@@ -25,10 +21,7 @@ namespace SabreTools.Models.DVD
/// <summary>
/// 12-byte entries
/// </summary>
#if NET48
public TitlesTableEntry[] Entries { get; set; }
#else
public TitlesTableEntry?[]? Entries { get; set; }
#endif
/// <remarks>NumberOfTitles entries</remarks>
public TitlesTableEntry[]? Entries { get; set; }
}
}

View File

@@ -1,42 +1,46 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.DVD
{
/// <see href="https://dvd.sourceforge.net/dvdinfo/ifo_vmg.html"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class TitlesTableEntry
{
/// <summary>
/// Title type
/// </summary>
public TitleType TitleType { get; set; }
[MarshalAs(UnmanagedType.U1)]
public TitleType TitleType;
/// <summary>
/// Number of angles
/// </summary>
public byte NumberOfAngles { get; set; }
public byte NumberOfAngles;
/// <summary>
/// Number of chapters (PTTs)
/// </summary>
public ushort NumberOfChapters { get; set; }
public ushort NumberOfChapters;
/// <summary>
/// Parental management mask
/// </summary>
public ushort ParentalManagementMask { get; set; }
public ushort ParentalManagementMask;
/// <summary>
/// Video Title Set number (VTSN)
/// </summary>
public byte VideoTitleSetNumber { get; set; }
public byte VideoTitleSetNumber;
/// <summary>
/// Title number within VTS (VTS_TTN)
/// </summary>
public byte TitleNumberWithinVTS { get; set; }
public byte TitleNumberWithinVTS;
/// <summary>
/// Start sector for VTS, referenced to whole disk
/// (video_ts.ifo starts at sector 00000000)
/// </summary>
public uint VTSStartSector { get; set; }
public uint VTSStartSector;
}
}

View File

@@ -11,10 +11,6 @@ namespace SabreTools.Models.DVD
/// <summary>
/// Starting sector within VOB of nth VOBU
/// </summary>
#if NET48
public uint[] StartingSectors { get; set; }
#else
public uint[]? StartingSectors { get; set; }
#endif
}
}

View File

@@ -1,26 +1,26 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.DVD
{
/// <see href="https://dvd.sourceforge.net/dvdinfo/ifo.html"/>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public sealed class VideoManagerIFO
{
/// <summary>
/// "DVDVIDEO-VMG"
/// </summary>
#if NET48
public string Signature { get; set; }
#else
public string? Signature { get; set; }
#endif
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
public string? Signature;
/// <summary>
/// Last sector of VMG set (last sector of BUP)
/// </summary>
public uint LastVMGSetSector { get; set; }
public uint LastVMGSetSector;
/// <summary>
/// Last sector of IFO
/// </summary>
public uint LastIFOSector { get; set; }
public uint LastIFOSector;
/// <summary>
/// Version number
@@ -28,151 +28,132 @@ namespace SabreTools.Models.DVD
/// - Byte 1, Bits 7-4 - Major version number
/// - Byte 1, Bits 3-0 - Minor version number
/// </summary>
public ushort VersionNumber { get; set; }
public ushort VersionNumber;
/// <summary>
/// VMG category
/// </summary>
/// <remarks>byte1=prohibited region mask</remarks>
public uint VMGCategory { get; set; }
public uint VMGCategory;
/// <summary>
/// Number of volumes
/// </summary>
public ushort NumberOfVolumes { get; set; }
public ushort NumberOfVolumes;
/// <summary>
/// Volume number
/// </summary>
public ushort VolumeNumber { get; set; }
public ushort VolumeNumber;
/// <summary>
/// Side ID
/// </summary>
public byte SideID { get; set; }
public byte SideID;
/// <summary>
/// Number of title sets
/// </summary>
public ushort NumberOfTitleSets { get; set; }
public ushort NumberOfTitleSets;
/// <summary>
/// Provider ID
/// </summary>
#if NET48
public byte[] ProviderID { get; set; }
#else
public byte[]? ProviderID { get; set; }
#endif
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[]? ProviderID;
/// <summary>
/// VMG POS
/// </summary>
public ulong VMGPOS { get; set; }
public ulong VMGPOS;
/// <summary>
/// End byte address of VMGI_MAT
/// </summary>
public uint InformationManagementTableEndByteAddress { get; set; }
public uint InformationManagementTableEndByteAddress;
/// <summary>
/// Start address of FP_PGC (First Play program chain)
/// </summary>
public uint FirstPlayProgramChainStartAddress { get; set; }
public uint FirstPlayProgramChainStartAddress;
/// <summary>
/// Start sector of Menu VOB
/// </summary>
public uint MenuVOBStartSector { get; set; }
public uint MenuVOBStartSector;
/// <summary>
/// Sector pointer to TT_SRPT (table of titles)
/// </summary>
public uint TableOfTitlesSectorPointer { get; set; }
public uint TableOfTitlesSectorPointer;
/// <summary>
/// Sector pointer to VMGM_PGCI_UT (Menu Program Chain table)
/// </summary>
public uint MenuProgramChainTableSectorPointer { get; set; }
public uint MenuProgramChainTableSectorPointer;
/// <summary>
/// Sector pointer to VMG_PTL_MAIT (Parental Management masks)
/// </summary>
public uint ParentalManagementMasksSectorPointer { get; set; }
public uint ParentalManagementMasksSectorPointer;
/// <summary>
/// Sector pointer to VMG_VTS_ATRT (copies of VTS audio/sub-picture attributes)
/// </summary>
public uint AudioSubPictureAttributesSectorPointer { get; set; }
public uint AudioSubPictureAttributesSectorPointer;
/// <summary>
/// Sector pointer to VMG_TXTDT_MG (text data)
/// </summary>
public uint TextDataSectorPointer { get; set; }
public uint TextDataSectorPointer;
/// <summary>
/// Sector pointer to VMGM_C_ADT (menu cell address table)
/// </summary>
public uint MenuCellAddressTableSectorPointer { get; set; }
public uint MenuCellAddressTableSectorPointer;
/// <summary>
/// Sector pointer to VMGM_VOBU_ADMAP (menu VOBU address map)
/// </summary>
public uint MenuVOBUAddressMapSectorPointer { get; set; }
public uint MenuVOBUAddressMapSectorPointer;
/// <summary>
/// Video attributes of VMGM_VOBS
/// </summary>
#if NET48
public byte[] VideoAttributes { get; set; }
#else
public byte[]? VideoAttributes { get; set; }
#endif
public ushort VideoAttributes;
/// <summary>
/// Number of audio streams in VMGM_VOBS
/// </summary>
public ushort NumberOfAudioStreams { get; set; }
public ushort NumberOfAudioStreams;
/// <summary>
/// Audio attributes of VMGM_VOBS
/// </summary>
#if NET48
public byte[][] AudioAttributes { get; set; }
#else
public byte[][]? AudioAttributes { get; set; }
#endif
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public ulong[]? AudioAttributes;
/// <summary>
/// Unknown
/// </summary>
#if NET48
public byte[] Unknown { get; set; }
#else
public byte[]? Unknown { get; set; }
#endif
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[]? Unknown;
/// <summary>
/// Number of subpicture streams in VMGM_VOBS (0 or 1)
/// </summary>
public ushort NumberOfSubpictureStreams { get; set; }
public ushort NumberOfSubpictureStreams;
/// <summary>
/// Subpicture attributes of VMGM_VOBS
/// </summary>
#if NET48
public byte[] SubpictureAttributes { get; set; }
#else
public byte[]? SubpictureAttributes { get; set; }
#endif
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[]? SubpictureAttributes;
/// <summary>
/// Reserved
/// </summary>
#if NET48
public byte[] Reserved { get; set; }
#else
public byte[]? Reserved { get; set; }
#endif
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 164)]
public byte[]? Reserved;
}
}

View File

@@ -1,26 +1,26 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.DVD
{
/// <see href="https://dvd.sourceforge.net/dvdinfo/ifo.html"/>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public sealed class VideoTitleSetIFO
{
/// <summary>
/// "DVDVIDEO-VTS"
/// </summary>
#if NET48
public string Signature { get; set; }
#else
public string? Signature { get; set; }
#endif
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
public string? Signature;
/// <summary>
/// Last sector of title set (last sector of BUP)
/// </summary>
public uint LastTitleSetSector { get; set; }
public uint LastTitleSetSector;
/// <summary>
/// Last sector of IFO
/// </summary>
public uint LastIFOSector { get; set; }
public uint LastIFOSector;
/// <summary>
/// Version number
@@ -28,161 +28,142 @@ namespace SabreTools.Models.DVD
/// - Byte 1, Bits 7-4 - Major version number
/// - Byte 1, Bits 3-0 - Minor version number
/// </summary>
public ushort VersionNumber { get; set; }
public ushort VersionNumber;
/// <summary>
/// VTS category
/// </summary>
/// <remarks>0=unspecified, 1=Karaoke</remarks>
public uint VMGCategory { get; set; }
public uint VMGCategory;
/// <summary>
/// Number of volumes
/// </summary>
public ushort NumberOfVolumes { get; set; }
public ushort NumberOfVolumes;
/// <summary>
/// Volume number
/// </summary>
public ushort VolumeNumber { get; set; }
public ushort VolumeNumber;
/// <summary>
/// Side ID
/// </summary>
public byte SideID { get; set; }
public byte SideID;
/// <summary>
/// Number of title sets
/// </summary>
public ushort NumberOfTitleSets { get; set; }
public ushort NumberOfTitleSets;
/// <summary>
/// Provider ID
/// </summary>
#if NET48
public byte[] ProviderID { get; set; }
#else
public byte[]? ProviderID { get; set; }
#endif
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[]? ProviderID;
/// <summary>
/// VMG POS
/// </summary>
public ulong VMGPOS { get; set; }
public ulong VMGPOS;
/// <summary>
/// End byte address of VTS_MAT
/// </summary>
public uint InformationManagementTableEndByteAddress { get; set; }
public uint InformationManagementTableEndByteAddress;
/// <summary>
/// Start address of FP_PGC (First Play program chain)
/// </summary>
public uint FirstPlayProgramChainStartAddress { get; set; }
public uint FirstPlayProgramChainStartAddress;
/// <summary>
/// Start sector of Menu VOB
/// </summary>
public uint MenuVOBStartSector { get; set; }
public uint MenuVOBStartSector;
/// <summary>
/// Start sector of Title VOB
/// </summary>
public uint TitleVOBStartSector { get; set; }
public uint TitleVOBStartSector;
/// <summary>
/// Sector pointer to VTS_PTT_SRPT (table of Titles and Chapters)
/// </summary>
public uint TableOfTitlesAndChaptersSectorPointer { get; set; }
public uint TableOfTitlesAndChaptersSectorPointer;
/// <summary>
/// Sector pointer to VTS_PGCI (Title Program Chain table)
/// </summary>
public uint TitleProgramChainTableSectorPointer { get; set; }
public uint TitleProgramChainTableSectorPointer;
/// <summary>
/// Sector pointer to VTSM_PGCI_UT (Menu Program Chain table)
/// </summary>
public uint MenuProgramChainTableSectorPointer { get; set; }
public uint MenuProgramChainTableSectorPointer;
/// <summary>
/// Sector pointer to VTS_TMAPTI (time map)
/// </summary>
public uint TimeMapSectorPointer { get; set; }
public uint TimeMapSectorPointer;
/// <summary>
/// Sector pointer to VTSM_C_ADT (menu cell address table)
/// </summary>
public uint MenuCellAddressTableSectorPointer { get; set; }
public uint MenuCellAddressTableSectorPointer;
/// <summary>
/// Sector pointer to VTSM_VOBU_ADMAP (menu VOBU address map)
/// </summary>
public uint MenuVOBUAddressMapSectorPointer { get; set; }
public uint MenuVOBUAddressMapSectorPointer;
/// <summary>
/// Sector pointer to VTS_C_ADT (title set cell address table)
/// </summary>
public uint TitleSetCellAddressTableSectorPointer { get; set; }
public uint TitleSetCellAddressTableSectorPointer;
/// <summary>
/// Sector pointer to VTS_VOBU_ADMAP (title set VOBU address map)
/// </summary>
public uint TitleSetVOBUAddressMapSectorPointer { get; set; }
public uint TitleSetVOBUAddressMapSectorPointer;
/// <summary>
/// Video attributes of VTSM_VOBS
/// </summary>
#if NET48
public byte[] VideoAttributes { get; set; }
#else
public byte[]? VideoAttributes { get; set; }
#endif
public ushort VideoAttributes;
/// <summary>
/// Number of audio streams in VTSM_VOBS
/// </summary>
public ushort NumberOfAudioStreams { get; set; }
public ushort NumberOfAudioStreams;
/// <summary>
/// Audio attributes of VTSM_VOBS
/// </summary>
#if NET48
public byte[][] AudioAttributes { get; set; }
#else
public byte[][]? AudioAttributes { get; set; }
#endif
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public ulong[]? AudioAttributes;
/// <summary>
/// Unknown
/// </summary>
#if NET48
public byte[] Unknown { get; set; }
#else
public byte[]? Unknown { get; set; }
#endif
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[]? Unknown;
/// <summary>
/// Number of subpicture streams in VTSM_VOBS (0 or 1)
/// </summary>
public ushort NumberOfSubpictureStreams { get; set; }
public ushort NumberOfSubpictureStreams;
/// <summary>
/// Subpicture attributes of VTSM_VOBS
/// </summary>
#if NET48
public byte[] SubpictureAttributes { get; set; }
#else
public byte[]? SubpictureAttributes { get; set; }
#endif
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[]? SubpictureAttributes;
/// <summary>
/// Reserved
/// </summary>
#if NET48
public byte[] Reserved { get; set; }
#else
public byte[]? Reserved { get; set; }
#endif
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 164)]
public byte[]? Reserved;
}
}

14
Delphi/Constants.cs Normal file
View File

@@ -0,0 +1,14 @@
/// <remarks>
/// Information sourced from https://stackoverflow.com/questions/18720045/what-are-the-list-of-all-possible-values-for-dvclal
/// </remarks>
namespace SabreTools.Models.Delphi
{
public static class Constants
{
public static readonly byte[] DVCLALStandard = [0x23, 0x78, 0x5D, 0x23, 0xB6, 0xA5, 0xF3, 0x19, 0x43, 0xF3, 0x40, 0x02, 0x26, 0xD1, 0x11, 0xC7];
public static readonly byte[] DVCLALProfessional = [0xA2, 0x8C, 0xDF, 0x98, 0x7B, 0x3C, 0x3A, 0x79, 0x26, 0x71, 0x3F, 0x09, 0x0F, 0x2A, 0x25, 0x17];
public static readonly byte[] DVCLALEnterprise = [0x26, 0x3D, 0x4F, 0x38, 0xC2, 0x82, 0x37, 0xB8, 0xF3, 0x24, 0x42, 0x03, 0x17, 0x9B, 0x3A, 0x83];
}
}

View File

@@ -0,0 +1,14 @@
/// <remarks>
/// Information sourced from https://docwiki.embarcadero.com/Libraries/Alexandria/en/System.PackageInfoTable
/// </remarks>
namespace SabreTools.Models.Delphi
{
public class PackageInfoTable
{
public int UnitCount { get; set; }
public PackageUnitEntry[]? UnitInfo { get; set; }
public PackageTypeInfo? TypeInfo { get; set; }
}
}

19
Delphi/PackageTypeInfo.cs Normal file
View File

@@ -0,0 +1,19 @@
/// <remarks>
/// Information sourced from https://docwiki.embarcadero.com/Libraries/Sydney/en/System.TPackageTypeInfo
/// </remarks>
namespace SabreTools.Models.Delphi
{
public class PackageTypeInfo
{
public int TypeCount { get; set; }
/// <remarks>
/// System-dependent pointer type, assumed to be encoded for x86
/// </remarks>
public uint[]? TypeTable { get; set; }
public int UnitCount { get; set; }
public string[]? UnitNames { get; set; }
}
}

View File

@@ -0,0 +1,21 @@
using System.Runtime.InteropServices;
/// <remarks>
/// Information sourced from https://docwiki.embarcadero.com/Libraries/Alexandria/en/System.PackageUnitEntry
/// </remarks>
namespace SabreTools.Models.Delphi
{
[StructLayout(LayoutKind.Sequential)]
public class PackageUnitEntry
{
/// <remarks>
/// System-dependent pointer type, assumed to be encoded for x86
/// </remarks>
public uint Init;
/// <remarks>
/// System-dependent pointer type, assumed to be encoded for x86
/// </remarks>
public uint FInit;
}
}

Some files were not shown because too many files have changed in this diff Show More