88 Commits
1.5.2 ... 1.7.0

Author SHA1 Message Date
Matt Nadareski
81b53c9785 Bump version 2025-09-01 15:05:53 -04:00
Matt Nadareski
54c05f2746 Sync changes from downstream 2025-09-01 15:05:15 -04:00
Matt Nadareski
4a4d7ceddf Make this more clear 2025-08-28 23:37:18 -04:00
Matt Nadareski
0f029c5979 Fix one 2025-08-28 21:29:23 -04:00
Matt Nadareski
bb4fee91d9 Sort some things around PE 2025-08-28 21:18:39 -04:00
Matt Nadareski
ed56e2543d Convert this to an array 2025-08-28 12:12:04 -04:00
Matt Nadareski
d675673e50 More descriptive names 2025-08-28 09:47:01 -04:00
Matt Nadareski
ebee967c7f Clean up gzip and tar a bit 2025-08-28 09:27:08 -04:00
Matt Nadareski
f5da54eaac Fix some tar model issues 2025-08-28 08:56:11 -04:00
Matt Nadareski
2350c1af27 Add placeholder models 2025-08-28 07:46:23 -04:00
Matt Nadareski
454d507b41 Source my sources 2025-08-28 07:40:09 -04:00
Matt Nadareski
10de4acbb9 File ending thing for PKZIP 2025-08-28 07:38:11 -04:00
Matt Nadareski
8ec91d8d04 Add a couple missing extra field structures 2025-08-27 22:28:06 -04:00
Matt Nadareski
1d62d69a53 Interleaved types don't need to be here 2025-08-27 22:09:28 -04:00
Matt Nadareski
5b5fed8932 Rename a few things 2025-08-27 21:09:30 -04:00
Matt Nadareski
32123d4b80 Fix one more PKZIP extra field 2025-08-27 20:40:32 -04:00
Matt Nadareski
f5717c3929 Forgot to sync change here 2025-08-27 19:19:36 -04:00
Matt Nadareski
e8db261d73 Start making some fixes to PKZIP 2025-08-27 19:14:31 -04:00
Matt Nadareski
9557f43dab Add placeholder extras field 2025-08-27 18:43:26 -04:00
Matt Nadareski
51b9c1a016 Make PKZIP models a bit easier to follow 2025-08-27 12:51:57 -04:00
Matt Nadareski
bb3cd54865 Remove now-useless note 2025-08-15 10:13:31 -04:00
Matt Nadareski
0c6060a901 Clickable sources, archive links for dead pages 2025-08-15 10:09:43 -04:00
Matt Nadareski
c18770f627 Upstream changes from WiseUnpacker 2025-08-15 08:59:29 -04:00
Matt Nadareski
c2a5d6770c Upstream changes from WiseUnpacker 2025-08-13 12:22:11 -04:00
Matt Nadareski
4ef79ccdca Upstream changes from WiseUnpacker 2025-08-10 21:44:23 -04:00
Matt Nadareski
cf5135f330 Slight NE cleanup 2025-08-10 20:36:53 -04:00
Matt Nadareski
6d989209db Update NE notes and structure a bit more 2025-08-10 20:15:49 -04:00
Matt Nadareski
cc48593646 Upstream changes from WiseUnpacker 2025-08-09 10:26:37 -04:00
Matt Nadareski
415d571b65 Upstream changes from WiseUnpacker 2025-08-06 09:33:51 -04:00
Matt Nadareski
4a6e244b38 Upstream changes from WiseUnpacker 2025-08-04 12:16:34 -04:00
Matt Nadareski
771a39517f Upstream changes from WiseUnpacker 2025-08-01 16:06:32 -04:00
Matt Nadareski
b072a3809c Fix enum 2025-08-01 10:32:17 -04:00
Matt Nadareski
341585206a Add Wise Installer models from REWise
All credit to CYBERDEV for their work in documenting these structures in the first place
2025-07-31 22:35:04 -04:00
Matt Nadareski
2dc2ab5dd1 Add OLE models 2025-07-30 22:46:37 -04:00
Matt Nadareski
144a3ce52b Fix CFB comments 2025-07-29 22:45:15 -04:00
Matt Nadareski
85199789f7 Add new Matroshka package comment 2025-07-28 07:54:29 -04:00
Matt Nadareski
fb39216c82 Bump verison 2025-07-24 09:11:34 -04:00
Matt Nadareski
1a2de39868 Fix Dir serialization issue 2025-07-24 09:11:10 -04:00
Matt Nadareski
f18b6c8850 Bump version 2025-07-23 09:48:18 -04:00
Matt Nadareski
8f1e49e464 Add .NET Standard 2.0 and 2.1 2025-07-23 09:43:12 -04:00
Matt Nadareski
6547242f93 Clean up more Matroskha comments 2025-07-21 11:27:20 -04:00
Matt Nadareski
edf00f3ab2 Add analysis block comment 2025-07-21 11:25:18 -04:00
Matt Nadareski
bce4736037 Clean up more Matroskha comments 2025-07-21 11:23:25 -04:00
Matt Nadareski
81f28974c0 More remark corrections based on more samples 2025-07-21 11:10:35 -04:00
Matt Nadareski
30ebe84af4 Remove disproven theory 2025-07-21 11:08:01 -04:00
Matt Nadareski
b07fbdedd6 Add secondary length note 2025-07-21 09:39:31 -04:00
Matt Nadareski
cd8fff4a86 Slight tweaks to Matroska entry notes 2025-07-21 09:21:56 -04:00
Matt Nadareski
3d3275e3cb Add SecuROM Matroshka models
All research thanks to HeroponRikiBestest
2025-07-21 09:11:37 -04:00
Matt Nadareski
4c76ce1230 Add SecuROM DFA models
All research thanks to HeroponRikiBestest
2025-07-21 08:10:25 -04:00
Matt Nadareski
0c4e3b4bf2 Dirs can be nested 2025-06-24 12:32:14 -04:00
Matt Nadareski
e8f4386199 Add mess alternative ListXML model 2025-05-28 09:53:05 -04:00
Matt Nadareski
ab66ccf3c5 Update copyright 2024-12-30 21:19:05 -05:00
Matt Nadareski
cc60d54a33 Remove unnecessary action step 2024-12-30 21:18:59 -05:00
Matt Nadareski
e805f4cb9a Ensure .NET versions are installed for testing 2024-12-19 10:50:01 -05:00
Matt Nadareski
328c893a38 Ensure .NET versions are installed for testing 2024-12-19 10:45:08 -05:00
Matt Nadareski
ab2a12c996 Bump version 2024-12-16 12:10:13 -05:00
Matt Nadareski
362b123661 Allow symbols to be packed 2024-12-16 11:37:18 -05:00
Matt Nadareski
4a8a4746a2 Add big-endian note for PS4 PKG 2024-12-16 11:31:38 -05:00
Deterous
3f368a3be8 Create model for PS4 app.pkg header (#7)
* Create model for PS4 app.pkg header

* Rename PS4 app.pkg class

* Fix typo

* Requested changes

* Add newline
2024-12-15 20:12:06 -05:00
Matt Nadareski
2749c2f5bd Bump version 2024-12-11 11:25:41 -05:00
Matt Nadareski
41ce962700 Reorder LZ constants 2024-12-11 11:10:01 -05:00
Matt Nadareski
85b7103bd3 Re-rename Expand to SZDD for consistency 2024-12-11 11:09:28 -05:00
Matt Nadareski
4c61a191e8 Remove MS-ZIP Block type 2024-12-11 11:00:44 -05:00
Matt Nadareski
0f70598969 Add LZ prefixes for easier checking 2024-12-11 10:58:47 -05:00
Matt Nadareski
d6b057d808 Move LZ models out of Compression namespace 2024-12-11 10:54:10 -05:00
Matt Nadareski
3d8036e7b5 Remove things that Compression doesn't need anymore 2024-12-11 10:46:28 -05:00
Matt Nadareski
bb35946866 Ensure KWAJ header flags serialized 2024-12-11 04:19:02 -05:00
Matt Nadareski
78f9f1b36f Fix KWAJ serialization 2024-12-11 04:16:23 -05:00
Matt Nadareski
9d1b1ca36d Further simplify LZ models 2024-12-11 03:48:10 -05:00
Matt Nadareski
6e1f8bf55e Fix issues with MS-LZ models 2024-12-11 01:50:02 -05:00
Matt Nadareski
a19afc240c Bump version 2024-12-10 15:28:49 -05:00
Matt Nadareski
148e97ef64 Add now-supported DOSCenter SHA-1 attribute 2024-12-07 23:28:52 -05:00
Matt Nadareski
676b446025 Add badge for build status 2024-12-06 10:48:43 -05:00
Matt Nadareski
aeff75d8d3 Rename workflow file, add releases to README 2024-12-06 10:47:42 -05:00
Matt Nadareski
e20e515f56 Attempt to use publish script 2024-12-06 10:43:08 -05:00
Matt Nadareski
bf02266f0f Bump version 2024-11-29 19:51:47 -05:00
Matt Nadareski
b521e503c2 Rearrange SGA 2024-11-28 20:26:58 -05:00
Matt Nadareski
48e79d26ed Ensure nullable arrays are correct 2024-11-27 23:37:25 -05:00
Matt Nadareski
989ef41c6d Get/Set may be fully disallowed? 2024-11-27 21:31:33 -05:00
Matt Nadareski
6b0c4c3024 Bump version 2024-11-27 21:15:05 -05:00
Matt Nadareski
4b54d0f4dc Fix build 2024-11-27 21:09:01 -05:00
Matt Nadareski
2bc1cfc5d0 Cleanup from issues in Serialization 2024-11-27 21:03:50 -05:00
Matt Nadareski
362abfdc64 Remove layout from CopyrightRecord 2024-11-27 10:38:58 -05:00
Matt Nadareski
a06ff8f8b3 Bump version 2024-11-20 14:03:14 -05:00
Matt Nadareski
7269e91913 Partially add VBSP lump 40 2024-11-19 14:34:32 -05:00
Matt Nadareski
c118271565 Add VBSP lump 29 2024-11-19 14:30:54 -05:00
Matt Nadareski
71ccbc6ab1 Fix issues found during Serialization update 2024-11-19 12:47:09 -05:00
Matt Nadareski
ed5c1a7173 Use array-of-array instead of multidimensional array 2024-11-18 23:35:47 -05:00
360 changed files with 7030 additions and 1359 deletions

View File

@@ -1,4 +1,4 @@
name: Nuget Pack
name: Build and Test
on:
push:
@@ -16,25 +16,22 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 9.0.x
dotnet-version: |
6.0.x
8.0.x
9.0.x
- name: Restore dependencies
run: dotnet restore
- name: Pack
run: dotnet pack
- name: Run tests
run: dotnet test
- name: Upload build
uses: actions/upload-artifact@v4
with:
name: 'Nuget Package'
path: 'SabreTools.Models/bin/Release/*.nupkg'
- name: Run publish script
run: ./publish-nix.sh
- name: Upload to rolling
uses: ncipollo/release-action@v1.14.0
with:
allowUpdates: True
artifacts: 'SabreTools.Models/bin/Release/*.nupkg'
artifacts: "*.nupkg,*.snupkg"
body: 'Last built commit: ${{ github.sha }}'
name: 'Rolling Release'
prerelease: True

View File

@@ -11,7 +11,13 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 9.0.x
dotnet-version: |
6.0.x
8.0.x
9.0.x
- name: Build
run: dotnet build
run: dotnet build
- name: Run tests
run: dotnet test

View File

@@ -1,13 +1,63 @@
# SabreTools.Models
[![Build and Test](https://github.com/SabreTools/SabreTools.Models/actions/workflows/build_and_test.yml/badge.svg?branch=main)](https://github.com/SabreTools/SabreTools.Models/actions/workflows/build_and_test.yml)
This library comprises of models that represent either directly serializable or representative structures for all SabreTools projects. All of the main models representing metadata files should have parsers created outside of the current code.
Find the link to the Nuget package [here](https://www.nuget.org/packages/SabreTools.Models).
## Missing Metadata Models
## Releases
The following metadata file formats do not have models included in this library yet and, as such, do not have serializers:
For the most recent stable build, download the latest release here: [Releases Page](https://github.com/SabreTools/SabreTools.Models/releases)
- Missfile
- SabreJSON
- SabreDAT XML
For the latest WIP build here: [Rolling Release](https://github.com/SabreTools/SabreTools.Models/releases/rolling)
## Notable Information Sources
Not all of this information was able to be gathered directly from the files in question, so here is a non-exhaustive list of sites and projects that allow this project to exist. Most of the models also have direct links to specific pages or code snippets, where available.
| Site/Project | Models Directory |
| --- | --- |
| [3DBrew](https://www.3dbrew.org/wiki/Main_Page) | N3DS |
| [Aaru Data Preservation Suite](https://github.com/aaru-dps) | PIC |
| [Advanced Access Content System Licensing Administrator (AACS LA)](https://aacsla.com/) | AACS |
| [BYTE*](https://web.archive.org/web/20240703222951/https://bytepointer.com/index.htm) | NewExecutable |
| [cabextract/libmspack](https://www.cabextract.org.uk/) | LZ |
| [DBox](https://dbox.tools/) | Xbox |
| [DebugInfo.com](https://www.debuginfo.com/index.html) | PortableExecutable |
| [Devilsclaw](https://devilsclaws.net/) | PFF |
| [DSiBrew](https://dsibrew.org/wiki/Main_Page) | Nitro |
| [DVD Resources for Open Source Development](https://dvd.sourceforge.net/) | DVD |
| [EDM/2](https://www.edm2.com/index.php/Main_Page) | LinearExecutable |
| [faydoc.tripod.com](https://faydoc.tripod.com/formats/) | LinearExecutable |
| [GuitarGame_ChartFormats](https://github.com/TheNathannator/GuitarGame_ChartFormats/) | Charts |
| [HandWiki](https://handwiki.org/wiki/Start) | Quantum |
| [HLLib](https://github.com/RavuAlHemio/hllib/) | BSP, GCF, NCF, PAK, SGA, VPK, WAD3, XZP |
| [IBM Documentation](https://www.ibm.com/docs/en) | TAR |
| [IETF](https://www.ietf.org/) | GZIP |
| [Independent Commodore Library](https://petlibrary.tripod.com/) | PKZIP |
| [Ladislav Zezula](http://zezula.net/en/tools/main.html) | MoPaQ |
| [libbdplus](https://github.com/mwgoldsmith/bdplus) | BD+ |
| [libexe](https://github.com/libyal/libexe/) | NewExecutable |
| [MAME](https://github.com/mamedev/mame/) | CHD |
| [Matthew Russotto](http://www.russotto.net/quantumcomp.html) | Compression/Quantum |
| [Microsoft Learn](https://learn.microsoft.com/en-us/) | BMP, CFB, Compression/LZX, Compression/MSZIP, MicrosoftCabinet, OLE, PortableExecutable, SecuROM, WiseInstaller |
| [msitools](https://github.com/GNOME/msitools/) | CFB |
| [OSDev.org](https://wiki.osdev.org/Expanded_Main_Page) | MSDOS, NewExecutable |
| [PInvoke.net](http://www.pinvoke.net/index.aspx) | MSDOS |
| [PKWARE(?)](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) | PKZIP |
| [PS3 Developer Wiki](https://www.psdevwiki.com/ps3/) | IRD, PlayStation3 |
| [RanseiLink](https://github.com/Deijin27/RanseiLink) | Nitro |
| [Reverse Engineering Wise](https://codeberg.org/CYBERDEV/REWise) | WiseInstaller |
| [SharpCompress](https://github.com/adamhathcock/sharpcompress) | PKZIP |
| [Source SDK 2013](https://github.com/ValveSoftware/source-sdk-2013) | BSP |
| [Technical Committee T10](https://www.t10.org/) | PIC |
| [The Go tools for Windows + Assembler](https://www.godevtool.com/) | PortableExecutable |
| [The Whole Half-Life](https://twhl.info/wiki/page/Specification:_WAD3) | WAD3 |
| [Unshield](https://github.com/twogood/unshield) | InstallShieldCabinet |
| [unshieldv3](https://github.com/wfr/unshieldv3) | InstallShieldArchiveV3 |
| [Valve Developer Community](https://developer.valvesoftware.com/wiki/Main_Page) | BSP, VPK |
| [w4kfu's bl0g](https://web.archive.org/web/20250206143756/http://blog.w4kfu.com/) | SafeDisc |
| [Wine](https://github.com/wine-mirror/wine/) | LZ |
| [XboxDevWiki.net](https://xboxdevwiki.net/Main_Page) | Xbox |
| [XeNTaX Game Research Forum](http://web.archive.org/web/20231031162306/https://forum.xentax.com/) | SFFS |

View File

@@ -5,7 +5,6 @@ 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>

View File

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

View File

@@ -12,6 +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>
public DriveRevocationListEntry?[]? EntryFields { get; set; }
public DriveRevocationListEntry[]? EntryFields { get; set; }
}
}

View File

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

View File

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

View File

@@ -12,6 +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>
public HostRevocationListEntry?[]? EntryFields { get; set; }
public HostRevocationListEntry[]? EntryFields { get; set; }
}
}

View File

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

View File

@@ -7,6 +7,6 @@ namespace SabreTools.Models.ArchiveDotOrg
public class Files
{
[XmlElement("file")]
public File?[]? File { get; set; }
public File[]? File { get; set; }
}
}

View File

@@ -8,6 +8,6 @@ namespace SabreTools.Models.AttractMode
[Required]
public string[]? Header { get; set; }
public Row?[]? Row { get; set; }
public Row[]? Row { get; set; }
}
}

View File

@@ -1,3 +1,5 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.BDPlus
{
/// <see href="https://github.com/mwgoldsmith/bdplus/blob/master/src/libbdplus/bdsvm/loader.c"/>
@@ -6,40 +8,39 @@ namespace SabreTools.Models.BDPlus
/// <summary>
/// "BDSVM_CC"
/// </summary>
/// <remarks>8 bytes</remarks>
public string? Signature { get; set; }
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string? Signature;
/// <summary>
/// Unknown data
/// </summary>
/// <remarks>5 bytes</remarks>
public byte[]? Unknown1 { get; set; }
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public byte[]? Unknown1 = new byte[5];
/// <summary>
/// Version year
/// </summary>
public ushort Year { get; set; }
public ushort Year;
/// <summary>
/// Version month
/// </summary>
public byte Month { get; set; }
public byte Month;
/// <summary>
/// Version day
/// </summary>
public byte Day { get; set; }
public byte Day;
/// <summary>
/// Unknown data
/// </summary>
/// <remarks>4 bytes</remarks>
public byte[]? Unknown2 { get; set; }
public uint Unknown2;
/// <summary>
/// Length
/// </summary>
public uint Length { get; set; }
public uint Length;
/// <summary>
/// Length bytes of data

View File

@@ -34,6 +34,11 @@ namespace SabreTools.Models.BSP
/// </summary>
public VerticesLump? VerticesLump { get; set; }
/// <summary>
/// LUMP_VISIBILITY [4]
/// </summary>
public VisibilityLump? VisibilityLump { get; set; }
/// <summary>
/// LUMP_NODES [5]
/// </summary>

View File

@@ -17,6 +17,7 @@ namespace SabreTools.Models.BSP
/// Lumps
/// </summary>
/// <remarks>15 entries</remarks>
public BspLumpEntry[]? Lumps { get; set; }
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.BSP_HEADER_LUMPS)]
public BspLumpEntry[]? Lumps;
}
}

View File

@@ -27,17 +27,17 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Defines bounding box
/// </summary>
public Vector3D Mins;
public Vector3D? Mins;
/// <summary>
/// Defines bounding box
/// </summary>
public Vector3D Maxs;
public Vector3D? Maxs;
/// <summary>
/// Coordinates to move the coordinate system
/// </summary>
public Vector3D OriginVector;
public Vector3D? OriginVector;
/// <summary>
/// Index into nodes array

View File

@@ -22,7 +22,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// S-vector
/// </summary>
public Vector3D SVector;
public Vector3D? SVector;
/// <summary>
/// Texture shift in the S direction
@@ -32,7 +32,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// T-vector
/// </summary>
public Vector3D TVector;
public Vector3D? TVector;
/// <summary>
/// Texture shift in the T direction

View File

@@ -7,7 +7,7 @@ namespace SabreTools.Models.BSP
/// </summary>
/// <see href="https://developer.valvesoftware.com/wiki/BSP_(Source)"/>
[StructLayout(LayoutKind.Sequential)]
public struct ColorRGBExp32
public class ColorRGBExp32
{
public byte Red;

View File

@@ -8,7 +8,7 @@ namespace SabreTools.Models.BSP
/// </summary>
/// <see href="https://developer.valvesoftware.com/wiki/BSP_(Source)"/>
[StructLayout(LayoutKind.Sequential)]
public struct CompressedLightCube
public class CompressedLightCube
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public ColorRGBExp32[]? Colors;

View File

@@ -25,7 +25,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Start position used for orientation
/// </summary>
public Vector3D startPosition;
public Vector3D? StartPosition;
/// <summary>
/// Index into LUMP_DISP_VERTS.

View File

@@ -18,7 +18,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Vector field defining displacement volume.
/// </summary>
public Vector3D Vec;
public Vector3D? Vec;
/// <summary>
/// Displacement distances.

View File

@@ -16,7 +16,7 @@ namespace SabreTools.Models.BSP
[StructLayout(LayoutKind.Sequential)]
public sealed class LeafAmbientLighting
{
public CompressedLightCube Cube;
public CompressedLightCube? Cube;
/// <summary>
/// Fixed point fraction of leaf bounds

View File

@@ -13,6 +13,6 @@ namespace SabreTools.Models.BSP
/// Lightmap RGB values
/// </summary>
/// <remarks>Array of 3-byte values</remarks>
public byte[,]? Lightmap { get; set; }
public byte[][]? Lightmap { get; set; }
}
}

View File

@@ -27,12 +27,12 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Minima of all vertices
/// </summary>
public Vector3D Mins;
public Vector3D? Mins;
/// <summary>
/// Maxima of all vertices
/// </summary>
public Vector3D Maxs;
public Vector3D? Maxs;
/// <remarks>Since v1</remarks>
public int Area;

View File

@@ -41,6 +41,6 @@ namespace SabreTools.Models.BSP
/// <summary>
/// <see cref="VertexIndexCount">
/// </summary>
public int[]? VertexIndices;
public int[]? VertexIndicies;
}
}

View File

@@ -41,8 +41,8 @@ namespace SabreTools.Models.BSP
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public Vector3D[]? UVPoints = new Vector3D[4];
public Vector3D Origin;
public Vector3D? Origin;
public Vector3D BasisNormal;
public Vector3D? BasisNormal;
}
}

View File

@@ -0,0 +1,43 @@
namespace SabreTools.Models.BSP
{
/// <summary>
/// The Pakfile lump (Lump 40) is a special lump that can contains
/// multiple files which are embedded into the bsp file. Usually,
/// they contain special texture (.vtf) and material (.vmt) files
/// which are used to store the reflection maps from env_cubemap
/// entities in the map; these files are built and placed in the
/// Pakfile lump when the buildcubemaps console command is executed.
/// The Pakfile can optionally contain such things as custom textures
/// and prop models used in the map, and are placed into the bsp file
/// by using the BSPZIP program (or alternate programs such as Pakrat).
/// These files are integrated into the game engine's file system
/// and will be loaded preferentially before externally located
/// files are used.
///
/// The format of the Pakfile lump is identical to that used by the
/// Zip compression utility when no compression is specified (i.e.,
/// the individual files are stored in uncompressed format). In some
/// branches, such as , LZMA compression can be used as well. If the
/// Pakfile lump is extracted and written to a file, it can therefore
/// be opened with WinZip and similar programs.
///
/// The header public/zip_uncompressed.h defines the structures
/// present in the Pakfile lump. The last element in the lump is a
/// ZIP_EndOfCentralDirRecord structure. This points to an array of
/// ZIP_FileHeader structures immediately preceeding it, one for each
/// file present in the Pak. Each of these headers then point to
/// ZIP_LocalFileHeader structures that are followed by that file's
/// data.
///
/// The Pakfile lump is usually the last element of the bsp file.
/// </summary>
/// <see href="https://developer.valvesoftware.com/wiki/BSP_(Source)"/>
public sealed class PakfileLump
{
/// <summary>
/// Pakfile data
/// </summary>
/// TODO: Split and/or decompress data?
public byte[]? Data;
}
}

View File

@@ -0,0 +1,11 @@
namespace SabreTools.Models.BSP
{
/// <see href="https://developer.valvesoftware.com/wiki/BSP_(Source)"/>
public sealed class PhysCollideLump : Lump
{
/// <summary>
/// Models
/// </summary>
public PhysModel[]? Models { get; set; }
}
}

View File

@@ -0,0 +1,42 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.BSP
{
/// <summary>
/// The physcollide lump (Lump 29) contains physics data for the world.
/// </summary>
/// <see href="https://developer.valvesoftware.com/wiki/BSP_(Source)"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class PhysModel
{
/// <summary>
/// Perhaps the index of the model to which this physics model applies?
/// </summary>
public int ModelIndex;
/// <summary>
/// Total size of the collision data sections
/// </summary>
public int DataSize;
/// <summary>
/// Size of the text section
/// </summary>
public int KeydataSize;
/// <summary>
/// Number of collision data sections
/// </summary>
public int SolidCount;
/// <summary>
/// Collision data of length <see cref="SolidCount"/>
/// </summary>
public PhysSolid[]? Solids;
/// <summary>
/// Key data of size <see cref="KeydataSize"/>
/// </summary>
public byte[]? TextData;
}
}

View File

@@ -0,0 +1,25 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.BSP
{
/// <summary>
/// The last two parts appear to be identical to the PHY file format,
/// which means their exact contents are unknown. Note that the
/// compactsurfaceheader_t structure contains the data size of each
/// collision data section (including the rest of the header)
/// </summary>
/// <see href="https://developer.valvesoftware.com/wiki/BSP_(Source)"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class PhysSolid
{
/// <summary>
/// Size of the collision data
/// </summary>
public int Size;
/// <summary>
/// Collision data of length <see cref="Size"/>
/// </summary>
public byte[]? CollisionData;
}
}

View File

@@ -25,7 +25,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// The planes normal vector
/// </summary>
public Vector3D NormalVector;
public Vector3D? NormalVector;
/// <summary>
/// Plane equation is: vNormal * X = fDist

View File

@@ -8,10 +8,10 @@ namespace SabreTools.Models.BSP
/// from the cardinal Z axis.
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct QAngle
public class QAngle
{
public float X { get; set; }
public float Y { get; set; }
public float Z { get; set; }
public float X;
public float Y;
public float Z;
}
}

View File

@@ -19,6 +19,6 @@ namespace SabreTools.Models.BSP
/// Model name
/// </summary>
/// <remarks>[dictEntries][128]</remarks>
public char[,]? Name;
public char[][]? Name;
}
}

View File

@@ -39,12 +39,12 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Origin
/// </summary>
public Vector3D Origin;
public Vector3D? Origin;
/// <summary>
/// Orientation (pitch yaw roll)
/// </summary>
public QAngle Angles;
public QAngle? Angles;
#endregion
@@ -90,7 +90,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// For lighting
/// </summary>
public Vector3D LightingOrigin;
public Vector3D? LightingOrigin;
#endregion
@@ -151,7 +151,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Per instance color and alpha modulation
/// </summary>
public ColorRGBExp32 DiffuseModulation;
public ColorRGBExp32? DiffuseModulation;
#endregion

View File

@@ -16,7 +16,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// RGB reflectivity
/// </summary>
public Vector3D Reflectivity;
public Vector3D? Reflectivity;
/// <summary>
/// Index into TexdataStringTable

View File

@@ -153,7 +153,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// LUMP_DISPINFO [26]
/// </summary>
public DispInfosLump? DispInfoLump { get; set; }
public DispInfosLump? DispInfosLump { get; set; }
/// <summary>
/// LUMP_ORIGINALFACES [27]
@@ -166,8 +166,10 @@ namespace SabreTools.Models.BSP
/// TODO: Find definition and implement
// public PhysDispLump? PhysDispLump { get; set; }
// TODO: Implement Lump 29
// https://developer.valvesoftware.com/wiki/BSP_(Source)#Physics
/// <summary>
/// LUMP_PHYSCOLLIDE [29]
/// </summary>
public PhysCollideLump? PhysCollideLump { get; set; }
/// <summary>
/// LUMP_VERTNORMALS [30]
@@ -190,7 +192,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// LUMP_DISP_VERTS [33]
/// </summary>
public DispVertsLump? DispVertLump { get; set; }
public DispVertsLump? DispVertsLump { get; set; }
/// <summary>
/// LUMP_DISP_LIGHTMAP_SAMPLE_POSITIONS [34]
@@ -227,8 +229,10 @@ namespace SabreTools.Models.BSP
/// TODO: Find definition and implement
// public PrimIndicesLump? PrimIndicesLump { get; set; }
// TODO: Implement Lump 40
// https://developer.valvesoftware.com/wiki/BSP_(Source)#Pakfile
/// <summary>
/// LUMP_PAKFILE [40]
/// </summary>
public PakfileLump? PakfileLump { get; set; }
/// <summary>
/// LUMP_CLIPPORTALVERTS [41]
@@ -239,7 +243,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// LUMP_CUBEMAPS [42]
/// </summary>
public CubemapsLump? CubemapLump { get; set; }
public CubemapsLump? CubemapsLump { get; set; }
/// <summary>
/// LUMP_TEXDATA_STRING_DATA [43]
@@ -304,7 +308,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// LUMP_WORLDLIGHTS_HDR [54]
/// </summary>
public WorldLightsLump? WorldLightsLump { get; set; }
public WorldLightsLump? HDRWorldLightsLump { get; set; }
/// <summary>
/// LUMP_LEAF_AMBIENT_LIGHTING_HDR [55]
@@ -353,7 +357,7 @@ namespace SabreTools.Models.BSP
// public PhysLevelLump? PhysLevelLump { get; set; }
/// <summary>
/// LUMP_DISP_MULTIBLEND [64]
/// LUMP_DISP_MULTIBLEND [63]
/// </summary>
/// TODO: Find definition and implement
// public DispMultiBlendLump? DispMultiBlendLump { get; set; }

View File

@@ -83,7 +83,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Precaculated light info for entities.
/// </summary>
public CompressedLightCube AmbientLighting;
public CompressedLightCube? AmbientLighting;
#endregion

View File

@@ -15,17 +15,17 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Bounding box
/// </summary>
public Vector3D Mins;
public Vector3D? Mins;
/// <summary>
/// Bounding box
/// </summary>
public Vector3D Maxs;
public Vector3D? Maxs;
/// <summary>
/// For sounds or lights
/// </summary>
public Vector3D OriginVector;
public Vector3D? OriginVector;
/// <summary>
/// Index into nodes

View File

@@ -22,7 +22,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Texture S-vector
/// </summary>
public Vector3D TextureSVector;
public Vector3D? TextureSVector;
/// <summary>
/// Texture shift in the S direction
@@ -32,7 +32,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Texture T-vector
/// </summary>
public Vector3D TextureTVector;
public Vector3D? TextureTVector;
/// <summary>
/// Texture shift in the T direction
@@ -42,7 +42,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Lightmap S-vector
/// </summary>
public Vector3D LightmapSVector;
public Vector3D? LightmapSVector;
/// <summary>
/// Lightmap shift in the S direction
@@ -52,7 +52,7 @@ namespace SabreTools.Models.BSP
/// <summary>
/// Lightmap T-vector
/// </summary>
public Vector3D LightmapTVector;
public Vector3D? LightmapTVector;
/// <summary>
/// Lightmap shift in the T direction

View File

@@ -8,10 +8,10 @@ namespace SabreTools.Models.BSP
/// spec and the code of the hlbsp project.
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct Vector3D
public class Vector3D
{
public float X { get; set; }
public float Y { get; set; }
public float Z { get; set; }
public float X;
public float Y;
public float Z;
}
}

View File

@@ -17,6 +17,6 @@ namespace SabreTools.Models.BSP
public int NumClusters { get; set; }
/// <remarks>[numclusters][2]</remarks>
public int[,]? ByteOffsets { get; set; }
public int[][]? ByteOffsets { get; set; }
}
}

View File

@@ -14,14 +14,14 @@ namespace SabreTools.Models.BSP
[StructLayout(LayoutKind.Sequential)]
public sealed class WorldLight
{
public Vector3D Origin;
public Vector3D? Origin;
public Vector3D Intensity;
public Vector3D? Intensity;
/// <summary>
/// For surfaces and spotlights
/// </summary>
public Vector3D Normal;
public Vector3D? Normal;
public int Cluster;

View File

@@ -0,0 +1,10 @@
namespace SabreTools.Models.BZip2
{
/// <summary>
/// This is a placeholder model for future work
/// </summary>
public class Archive
{
}
}

View File

@@ -22,18 +22,18 @@ namespace SabreTools.Models.CFB
[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;
/// <summary>
/// This field MUST match the length of the Directory Entry Name Unicode
/// string in bytes. The length MUST be a multiple of 2 and include the
/// terminating null character in the count. This length MUST NOT exceed 64,
/// the maximum size of the Directory Entry Name field.
/// </summary>
public ushort NameLength;
/// <summary>
/// This field MUST be 0x00, 0x01, 0x02, or 0x05, depending on the
/// actual type of object. All other values are not valid.
/// </summary>
[MarshalAs(UnmanagedType.U1)]
public ObjectType ObjectType;

View File

@@ -6,6 +6,6 @@ namespace SabreTools.Models.ClrMamePro
public ClrMamePro? ClrMamePro { get; set; }
/// <remarks>game, machine, resource, set</remarks>
public GameBase?[]? Game { get; set; }
public GameBase[]? Game { get; set; }
}
}

View File

@@ -1,18 +0,0 @@
namespace SabreTools.Models.Compression.Deflate
{
/// <see href="https://www.rfc-editor.org/rfc/rfc1951"/>
public class BlockHeader
{
/// <summary>
/// Set if and only if this is the last block of the data set.
/// </summary>
/// <remarks>Bit 0</remarks>
public bool BFINAL { get; set; }
/// <summary>
/// Specifies how the data are compressed
/// </summary>
/// <remarks>Bits 1-2</remarks>
public CompressionType BTYPE { get; set; }
}
}

View File

@@ -1,20 +0,0 @@
namespace SabreTools.Models.Compression.Deflate
{
/// <summary>
/// Compression with Huffman codes (BTYPE=01 or BTYPE=02)
/// </summary>
/// <see href="https://interoperability.blob.core.windows.net/files/MS-MCI/%5bMS-MCI%5d.pdf"/>
/// <see href="https://www.rfc-editor.org/rfc/rfc1951"/>
public abstract class CompressedDataHeader : DataHeader
{
/// <summary>
/// Huffman code lengths for the literal / length alphabet
/// </summary>
public virtual uint[]? LiteralLengths { get; set; }
/// <summary>
/// Huffman distance codes for the literal / length alphabet
/// </summary>
public virtual uint[]? DistanceCodes { get; set; }
}
}

View File

@@ -1,136 +0,0 @@
namespace SabreTools.Models.Compression.Deflate
{
/// <see href="https://www.rfc-editor.org/rfc/rfc1951"/>
public static class Constants
{
/// <summary>
/// Bits in base literal/length lookup table
/// </summary>
public const int ZIPLBITS = 9;
/// <summary>
/// Bits in base distance lookup table
/// </summary>
public const int ZIPDBITS = 6;
/// <summary>
/// Maximum bit length of any code
/// </summary>
public const int ZIPBMAX = 16;
/// <summary>
/// Maximum number of codes in any set
/// </summary>
public const int ZIPN_MAX = 288;
#region Fixed Huffman Codes
/// <summary>
/// Fixed Huffman code lengths for the literal / length alphabet
/// </summary>
public static readonly uint[] FixedLiteralLengths =
[
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8,
9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9,
7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7,
8, 8, 8, 8, 8, 8, 8, 8,
];
/// <summary>
/// Fixed Huffman distance codes for the literal / length alphabet
/// </summary>
public static readonly uint[] FixedDistanceCodes =
[
5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5,
];
#endregion
#region Literal and Length Alphabets
/// <summary>
/// Extra bits for distance codes
/// </summary>
public static readonly ushort[] DistanceExtraBits =
[
0, 0, 0, 0, 1, 1, 2, 2, 3, 3,
4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
9, 9, 10, 10, 11, 11, 12, 12, 13, 13
];
/// <summary>
/// Copy offsets for distance codes 0..29
/// </summary>
public static readonly ushort[] DistanceOffsets =
[
1, 2, 3, 4, 5, 7, 9, 13, 17, 25,
33, 49, 65, 97, 129, 193, 257, 385, 513, 769,
1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577
];
/// <summary>
/// Extra bits for literal codes 257..285
/// </summary>
public static readonly ushort[] LiteralExtraBits =
[
0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
4, 4, 4, 4, 5, 5, 5, 5, 0,
];
/// <summary>
/// Copy lengths for literal codes 257..285
/// </summary>
public static readonly ushort[] LiteralLengths =
[
3, 4, 5, 6, 7, 8, 9, 10, 11, 13,
15, 17, 19, 23, 27, 31, 35, 43, 51, 59,
67, 83, 99, 115, 131, 163, 195, 227, 258,
];
/// <summary>
/// Order of the bit length code lengths
/// </summary>
public static readonly byte[] BitLengthOrder =
[
16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
];
#endregion
}
}

View File

@@ -1,11 +0,0 @@
namespace SabreTools.Models.Compression.Deflate
{
/// <summary>
/// Base class for all data headers (BTYPE=00, BTYPE=01, or BTYPE=02)
/// </summary>
/// <see href="https://www.rfc-editor.org/rfc/rfc1951"/>
public abstract class DataHeader
{
// No common fields between all data headers
}
}

View File

@@ -1,11 +0,0 @@
namespace SabreTools.Models.Compression.Deflate
{
/// <summary>
/// Compression with dynamic Huffman codes (BTYPE=10)
/// </summary>
/// <see href="https://www.rfc-editor.org/rfc/rfc1951"/>
public class DynamicCompressedDataHeader : CompressedDataHeader
{
// Codes are provided externally
}
}

View File

@@ -1,26 +0,0 @@
namespace SabreTools.Models.Compression.Deflate
{
/// <see href="https://www.rfc-editor.org/rfc/rfc1951"/>
public enum CompressionType : byte
{
/// <summary>
/// no compression
/// </summary>
NoCompression = 0b00,
/// <summary>
/// Compressed with fixed Huffman codes
/// </summary>
FixedHuffman = 0b01,
/// <summary>
/// Compressed with dynamic Huffman codes
/// </summary>
DynamicHuffman = 0b10,
/// <summary>
/// Reserved (error)
/// </summary>
Reserved = 0b11,
}
}

View File

@@ -1,24 +0,0 @@
namespace SabreTools.Models.Compression.Deflate
{
/// <summary>
/// Compression with fixed Huffman codes (BTYPE=01)
/// </summary>
/// <see href="https://interoperability.blob.core.windows.net/files/MS-MCI/%5bMS-MCI%5d.pdf"/>
/// <see href="https://www.rfc-editor.org/rfc/rfc1951"/>
public class FixedCompressedDataHeader : CompressedDataHeader
{
#region Properties
/// <summary>
/// Huffman code lengths for the literal / length alphabet
/// </summary>
public override uint[]? LiteralLengths => Constants.FixedLiteralLengths;
/// <summary>
/// Huffman distance codes for the literal / length alphabet
/// </summary>
public override uint[]? DistanceCodes => Constants.FixedDistanceCodes;
#endregion
}
}

View File

@@ -1,21 +0,0 @@
namespace SabreTools.Models.Compression.Deflate
{
/// <summary>
/// Non-compressed blocks (BTYPE=00)
/// </summary>
/// <see href="https://www.rfc-editor.org/rfc/rfc1951"/>
public class NonCompressedBlockHeader : DataHeader
{
/// <summary>
/// The number of data bytes in the block
/// </summary>
/// <remarks>Bytes 0-1</remarks>
public ushort LEN { get; set; }
/// <summary>
/// The one's complement of LEN
/// </summary>
/// <remarks>Bytes 2-3</remarks>
public ushort NLEN { get; set; }
}
}

View File

@@ -1,23 +0,0 @@
namespace SabreTools.Models.Compression.LZ
{
public static class Constants
{
public const int GETLEN = 2048;
public const int LZ_MAGIC_LEN = 8;
public const int LZ_HEADER_LEN = 14;
public static readonly byte[] MagicBytes = [0x53, 0x5a, 0x44, 0x44, 0x88, 0xf0, 0x27, 0x33];
public static readonly string MagicString = System.Text.Encoding.ASCII.GetString(MagicBytes);
public const ulong MagicUInt64 = 0x3327f08844445a53;
public const int LZ_TABLE_SIZE = 0x1000;
public const int MAX_LZSTATES = 16;
public const int LZ_MIN_HANDLE = 0x400;
}
}

View File

@@ -1,17 +0,0 @@
namespace SabreTools.Models.Compression.LZ
{
/// <see href="https://github.com/wine-mirror/wine/blob/master/include/lzexpand.h"/>
public enum LZERROR
{
LZERROR_OK = 1,
LZERROR_NOT_LZ = 0,
LZERROR_BADINHANDLE = -1,
LZERROR_BADOUTHANDLE = -2,
LZERROR_READ = -3,
LZERROR_WRITE = -4,
LZERROR_GLOBALLOC = -5,
LZERROR_GLOBLOCK = -6,
LZERROR_BADVALUE = -7,
LZERROR_UNKNOWNALG = -8,
}
}

View File

@@ -1,22 +0,0 @@
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
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string? Magic;
public byte CompressionType;
[MarshalAs(UnmanagedType.U1)]
public char LastChar;
public uint RealLength;
}
}

View File

@@ -1,72 +0,0 @@
using System.IO;
namespace SabreTools.Models.Compression.LZ
{
public sealed class State
{
/// <summary>
/// Internal backing stream
/// </summary>
public Stream? Source { get; set; }
/// <summary>
/// The last char of the filename for replacement
/// </summary>
public char LastChar { get; set; }
/// <summary>
/// Decompressed length of the file
/// </summary>
public uint RealLength { get; set; }
/// <summary>
/// Position the decompressor currently is
/// </summary>
public uint RealCurrent { get; set; }
/// <summary>
/// Position the user wants to read from
/// </summary>
public uint RealWanted { get; set; }
/// <summary>
/// The rotating LZ table
/// </summary>
public byte[]? Table { get; set; }
/// <summary>
/// CURrent TABle ENTry
/// </summary>
public uint CurrentTableEntry { get; set; }
/// <summary>
/// Length and position of current string
/// </summary>
public byte StringLength { get; set; }
/// <summary>
/// From stringtable
/// </summary>
public uint StringPosition { get; set; }
/// <summary>
/// Bitmask within blocks
/// </summary>
public ushort ByteType { get; set; }
/// <summary>
/// GETLEN bytes
/// </summary>
public byte[]? Window { get; set; }
/// <summary>
/// Current read
/// </summary>
public uint WindowCurrent { get; set; }
/// <summary>
/// Length last got
/// </summary>
public uint WindowLength { get; set; }
}
}

View File

@@ -1,33 +0,0 @@
namespace SabreTools.Models.Compression.MSZIP
{
/// <summary>
/// Each MSZIP block MUST consist of a 2-byte MSZIP signature and one or more RFC 1951 blocks. The
/// 2-byte MSZIP signature MUST consist of the bytes 0x43 and 0x4B. The MSZIP signature MUST be
/// the first 2 bytes in the MSZIP block. The MSZIP signature is shown in the following packet diagram.
///
/// Each MSZIP block is the result of a single deflate compression operation, as defined in [RFC1951].
/// The compressor that performs the compression operation MUST generate one or more RFC 1951
/// blocks, as defined in [RFC1951]. The number, deflation mode, and type of RFC 1951 blocks in each
/// MSZIP block is determined by the compressor, as defined in [RFC1951]. The last RFC 1951 block in
/// each MSZIP block MUST be marked as the "end" of the stream(1), as defined by [RFC1951]
/// section 3.2.3. Decoding trees MUST be discarded after each RFC 1951 block, but the history buffer
/// MUST be maintained.Each MSZIP block MUST represent no more than 32 KB of uncompressed data.
///
/// The maximum compressed size of each MSZIP block is 32 KB + 12 bytes. This enables the MSZIP
/// block to contain 32 KB of data split between two noncompressed RFC 1951 blocks, each of which
/// has a value of BTYPE = 00.
/// </summary>
/// <see href="https://interoperability.blob.core.windows.net/files/MS-MCI/%5bMS-MCI%5d.pdf"/>
public class Block
{
/// <summary>
/// Block header
/// </summary>
public BlockHeader? BlockHeader { get; set; }
/// <summary>
/// Compressed blocks
/// </summary>
public DeflateBlock[]? CompressedBlocks { get; set; }
}
}

View File

@@ -4,6 +4,18 @@ namespace SabreTools.Models.Compression.MSZIP
/// Each MSZIP block MUST consist of a 2-byte MSZIP signature and one or more RFC 1951 blocks. The
/// 2-byte MSZIP signature MUST consist of the bytes 0x43 and 0x4B. The MSZIP signature MUST be
/// the first 2 bytes in the MSZIP block. The MSZIP signature is shown in the following packet diagram.
///
/// Each MSZIP block is the result of a single deflate compression operation, as defined in [RFC1951].
/// The compressor that performs the compression operation MUST generate one or more RFC 1951
/// blocks, as defined in [RFC1951]. The number, deflation mode, and type of RFC 1951 blocks in each
/// MSZIP block is determined by the compressor, as defined in [RFC1951]. The last RFC 1951 block in
/// each MSZIP block MUST be marked as the "end" of the stream(1), as defined by [RFC1951]
/// section 3.2.3. Decoding trees MUST be discarded after each RFC 1951 block, but the history buffer
/// MUST be maintained.Each MSZIP block MUST represent no more than 32 KB of uncompressed data.
///
/// The maximum compressed size of each MSZIP block is 32 KB + 12 bytes. This enables the MSZIP
/// block to contain 32 KB of data split between two noncompressed RFC 1951 blocks, each of which
/// has a value of BTYPE = 00.
/// </summary>
/// <see href="https://interoperability.blob.core.windows.net/files/MS-MCI/%5bMS-MCI%5d.pdf"/>
public class BlockHeader

View File

@@ -1,20 +0,0 @@
namespace SabreTools.Models.Compression.MSZIP
{
/// <see href="https://github.com/wine-mirror/wine/blob/master/dlls/cabinet/cabinet.h"/>
public static class Constants
{
/// <summary>
/// Window size
/// </summary>
public const ushort ZIPWSIZE = 0x8000;
/// <summary>
/// And'ing with Zipmask[n] masks the lower n bits
/// </summary>
public static readonly ushort[] BitMasks =
[
0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
];
}
}

View File

@@ -1,35 +0,0 @@
namespace SabreTools.Models.Compression.MSZIP
{
/// <summary>
/// Each MSZIP block is the result of a single deflate compression operation, as defined in [RFC1951].
/// The compressor that performs the compression operation MUST generate one or more RFC 1951
/// blocks, as defined in [RFC1951]. The number, deflation mode, and type of RFC 1951 blocks in each
/// MSZIP block is determined by the compressor, as defined in [RFC1951]. The last RFC 1951 block in
/// each MSZIP block MUST be marked as the "end" of the stream(1), as defined by [RFC1951]
/// section 3.2.3. Decoding trees MUST be discarded after each RFC 1951 block, but the history buffer
/// MUST be maintained.Each MSZIP block MUST represent no more than 32 KB of uncompressed data.
/// </summary>
/// <see href="https://interoperability.blob.core.windows.net/files/MS-MCI/%5bMS-MCI%5d.pdf"/>
public class DeflateBlock
{
/// <summary>
/// Deflate block (RFC-1951) header
/// </summary>
public Deflate.BlockHeader? Header { get; set; }
/// <summary>
/// Compression-specific data header
/// </summary>
public Deflate.DataHeader? DataHeader { get; set; }
/// <summary>
/// MSZIP data
/// </summary>
/// <remarks>
/// Depending on the implementation of these models, this property could either be
/// compressed or uncompressed data. Keep this in mind when using the built
/// versions of this model.
/// </remarks>
public byte[]? Data { get; set; }
}
}

View File

@@ -1,6 +1,6 @@
namespace SabreTools.Models.Compression.Quantum
{
/// <see href="www.russotto.net/quantumcomp.html"/>
/// <see href="http://www.russotto.net/quantumcomp.html"/>
public static class Constants
{
public static readonly int[] PositionSlot =

View File

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

View File

@@ -25,6 +25,6 @@ namespace SabreTools.Models.CueSheets
/// <summary>
/// List of TRACK in FILE
/// </summary>
public CueTrack?[]? Tracks { get; set; }
public CueTrack[]? Tracks { get; set; }
}
}

View File

@@ -36,6 +36,6 @@ namespace SabreTools.Models.CueSheets
/// <summary>
/// List of FILE in cuesheet
/// </summary>
public CueFile?[]? Files { get; set; }
public CueFile[]? Files { get; set; }
}
}

View File

@@ -53,7 +53,7 @@ namespace SabreTools.Models.CueSheets
/// List of INDEX in TRACK
/// </summary>
/// <remarks>Must start with 0 or 1 and then sequential</remarks>
public CueIndex?[]? Indices { get; set; }
public CueIndex[]? Indices { get; set; }
/// <summary>
/// POSTGAP

View File

@@ -15,6 +15,9 @@ namespace SabreTools.Models.DosCenter
[Required]
public string? CRC { get; set; }
/// <remarks>sha1, attribute</remarks>
public string? SHA1 { get; set; }
/// <remarks>date, attribute</remarks>
public string? Date { get; set; }
}

View File

@@ -21,7 +21,7 @@ namespace SabreTools.Models.GCF
/// <summary>
/// Block entries data
/// </summary>
public BlockEntry?[]? BlockEntries { get; set; }
public BlockEntry[]? BlockEntries { get; set; }
/// <summary>
/// Fragmentation map header data
@@ -31,7 +31,7 @@ namespace SabreTools.Models.GCF
/// <summary>
/// Fragmentation map data
/// </summary>
public FragmentationMap?[]? FragmentationMaps { get; set; }
public FragmentationMap[]? FragmentationMaps { get; set; }
/// <summary>
/// Block entry map header data
@@ -43,7 +43,7 @@ namespace SabreTools.Models.GCF
/// Block entry map data
/// </summary>
/// <remarks>Part of version 5 but not version 6.</remarks>
public BlockEntryMap?[]? BlockEntryMaps { get; set; }
public BlockEntryMap[]? BlockEntryMaps { get; set; }
/// <summary>
/// Directory header data
@@ -53,7 +53,7 @@ namespace SabreTools.Models.GCF
/// <summary>
/// Directory entries data
/// </summary>
public DirectoryEntry?[]? DirectoryEntries { get; set; }
public DirectoryEntry[]? DirectoryEntries { get; set; }
/// <summary>
/// Directory names data
@@ -63,22 +63,22 @@ namespace SabreTools.Models.GCF
/// <summary>
/// Directory info 1 entries data
/// </summary>
public DirectoryInfo1Entry?[]? DirectoryInfo1Entries { get; set; }
public DirectoryInfo1Entry[]? DirectoryInfo1Entries { get; set; }
/// <summary>
/// Directory info 2 entries data
/// </summary>
public DirectoryInfo2Entry?[]? DirectoryInfo2Entries { get; set; }
public DirectoryInfo2Entry[]? DirectoryInfo2Entries { get; set; }
/// <summary>
/// Directory copy entries data
/// </summary>
public DirectoryCopyEntry?[]? DirectoryCopyEntries { get; set; }
public DirectoryCopyEntry[]? DirectoryCopyEntries { get; set; }
/// <summary>
/// Directory local entries data
/// </summary>
public DirectoryLocalEntry?[]? DirectoryLocalEntries { get; set; }
public DirectoryLocalEntry[]? DirectoryLocalEntries { get; set; }
/// <summary>
/// Directory map header data
@@ -88,7 +88,7 @@ namespace SabreTools.Models.GCF
/// <summary>
/// Directory map entries data
/// </summary>
public DirectoryMapEntry?[]? DirectoryMapEntries { get; set; }
public DirectoryMapEntry[]? DirectoryMapEntries { get; set; }
/// <summary>
/// Checksum header data
@@ -103,12 +103,12 @@ namespace SabreTools.Models.GCF
/// <summary>
/// Checksum map entries data
/// </summary>
public ChecksumMapEntry?[]? ChecksumMapEntries { get; set; }
public ChecksumMapEntry[]? ChecksumMapEntries { get; set; }
/// <summary>
/// Checksum entries data
/// </summary>
public ChecksumEntry?[]? ChecksumEntries { get; set; }
public ChecksumEntry[]? ChecksumEntries { get; set; }
/// <summary>
/// Data block header data

View File

@@ -6,13 +6,13 @@ namespace SabreTools.Models.GZIP
/// <summary>
/// Header including optional fields
/// </summary>
public Header? Header;
public Header? Header { get; set; }
// Compressed blocks live here
/// <summary>
/// Trailer
/// </summary>
public Trailer? Trailer;
public Trailer? Trailer { get; set; }
}
}

View File

@@ -7,20 +7,20 @@ namespace SabreTools.Models.GZIP
/// SI1 and SI2 provide a subfield ID, typically two ASCII letters
/// with some mnemonic value.
/// </summary>
public byte SI1;
public byte SubfieldID1 { get; set; }
/// <summary>
/// SI1 and SI2 provide a subfield ID, typically two ASCII letters
/// with some mnemonic value.
/// </summary>
public byte SI2;
public byte SubfieldID2 { get; set; }
/// <summary>
/// LEN gives the length of the subfield data, excluding the 4
/// initial bytes.
/// </summary>
public ushort LEN;
public ushort Length { get; set; }
public byte[]? Data;
public byte[]? Data { get; set; }
}
}

View File

@@ -6,22 +6,22 @@ namespace SabreTools.Models.GZIP
/// <summary>
/// IDentification 1 (0x1F)
/// </summary>
public byte ID1;
public byte ID1 { get; set; }
/// <summary>
/// IDentification 2 (0x8B)
/// </summary>
public byte ID2;
public byte ID2 { get; set; }
/// <summary>
/// Compression Method
/// </summary>
public CompressionMethod CM;
public CompressionMethod CompressionMethod { get; set; }
/// <summary>
/// FLaGs
/// </summary>
public Flags FLG;
public Flags Flags { get; set; }
/// <summary>
/// Modification TIME
@@ -35,12 +35,12 @@ namespace SabreTools.Models.GZIP
/// compression started. MTIME = 0 means no time stamp is
/// available.
/// </summary>
public uint MTIME;
public uint LastModifiedTime { get; set; }
/// <summary>
/// eXtra FLags
/// </summary>
public ExtraFlags XFL;
public ExtraFlags ExtraFlags { get; set; }
/// <summary>
/// Operating System
@@ -49,7 +49,7 @@ namespace SabreTools.Models.GZIP
/// took place. This may be useful in determining end-of-line
/// convention for text files.
/// </summary>
public OperatingSystem OS;
public OperatingSystem OperatingSystem { get; set; }
/// <summary>
/// eXtra LENgth
@@ -57,7 +57,7 @@ namespace SabreTools.Models.GZIP
/// If FLG.FEXTRA is set, this gives the length of the optional
/// extra field.
/// </summary>
public ushort XLEN;
public ushort ExtraLength { get; set; }
/// <summary>
/// Extra field
@@ -66,23 +66,23 @@ namespace SabreTools.Models.GZIP
/// the header, with total length XLEN bytes. It consists of a
/// series of subfields, each of the form <see cref="ExtraFieldData"/>.
/// </summary>
public ExtraFieldData[]? ExtraField;
public ExtraFieldData[]? ExtraField { get; set; }
/// <summary>
/// Original filename before compression, zero-terminated
/// Original filename before compression, null-terminated
/// </summary>
public string? OriginalFileName;
public string? OriginalFileName { get; set; }
/// <summary>
/// File comment, zero terminated
/// File comment, null terminated
/// </summary>
public string? FileComment;
public string? FileComment { get; set; }
/// <summary>
/// The CRC16 consists of the two least significant bytes of the
/// CRC32 for all bytes of the gzip header up to and not including
/// the CRC16.
/// </summary>
public ushort? CRC16;
public ushort? CRC16 { get; set; }
}
}

View File

@@ -13,7 +13,7 @@ namespace SabreTools.Models.GZIP
/// ordering ISO documents. See gopher://info.itu.ch for an
/// online version of ITU-T V.42.)
/// </summary>
public uint CRC32;
public uint CRC32 { get; set; }
/// <summary>
/// Input SIZE
@@ -21,6 +21,6 @@ namespace SabreTools.Models.GZIP
/// This contains the size of the original (uncompressed) input
/// data modulo 2^32.
/// </summary>
public uint ISIZE;
public uint InputSize { get; set; }
}
}

View File

@@ -40,7 +40,7 @@ namespace SabreTools.Models.InstallShieldCabinet
/// <summary>
/// Standard file descriptors
/// </summary>
public FileDescriptor?[]? FileDescriptors { get; set; }
public FileDescriptor[]? FileDescriptors { get; set; }
#endregion
@@ -54,7 +54,7 @@ namespace SabreTools.Models.InstallShieldCabinet
/// <summary>
/// File groups
/// </summary>
public FileGroup?[]? FileGroups { get; set; }
public FileGroup[]? FileGroups { get; set; }
#endregion
@@ -68,7 +68,7 @@ namespace SabreTools.Models.InstallShieldCabinet
/// <summary>
/// Components
/// </summary>
public Component?[]? Components { get; set; }
public Component[]? Components { get; set; }
#endregion
}

View File

@@ -0,0 +1,17 @@
namespace SabreTools.Models.LZ
{
public static class Constants
{
public const string KWAJPrefix = "KWAJ";
public static readonly byte[] KWAJSignatureBytes = [0x4B, 0x57, 0x41, 0x4A, 0x88, 0xF0, 0x27, 0xD1];
public const string QBasicPrefix = "SZ ";
public static readonly byte[] QBasicSignatureBytes = [0x53, 0x5A, 0x20, 0x88, 0xF0, 0x27, 0x33, 0xD1];
public const string SZDDPrefix = "SZDD";
public static readonly byte[] SZDDSignatureBytes = [0x53, 0x5A, 0x44, 0x44, 0x88, 0xF0, 0x27, 0x33];
}
}

View File

@@ -0,0 +1,82 @@
using System;
namespace SabreTools.Models.LZ
{
/// <see href="https://www.cabextract.org.uk/libmspack/doc/szdd_kwaj_format.html"/>
public enum KWAJCompressionType : ushort
{
/// <summary>
/// No compression
/// </summary>
NoCompression = 0,
/// <summary>
/// No compression, data is XORed with byte 0xFF
/// </summary>
NoCompressionXor = 1,
/// <summary>
/// The same compression method as the QBasic variant of SZDD
/// </summary>
QBasic = 2,
/// <summary>
/// LZ + Huffman "Jeff Johnson" compression
/// </summary>
LZH = 3,
/// <summary>
/// MS-ZIP
/// </summary>
MSZIP = 4,
}
/// <see href="https://www.cabextract.org.uk/libmspack/doc/szdd_kwaj_format.html"/>
[Flags]
public enum KWAJHeaderFlags : ushort
{
/// <summary>
/// Header extensions contains 4-byte decompressed length
/// </summary>
HasDecompressedLength = 0x0001,
/// <summary>
/// Header extensions contains 2-byte unknown value
/// </summary>
HasUnknownFlag = 0x0002,
/// <summary>
/// Header extensions contains 2-byte prefix followed by
/// that many bytes of (unknown purpose) data
/// </summary>
HasPrefixedData = 0x0004,
/// <summary>
/// Header extensions contains null-terminated string of
/// max length 8 representing the file name
/// </summary>
HasFileName = 0x0008,
/// <summary>
/// Header extensions contains null-terminated string of
/// max length 3 representing the file name
/// </summary>
HasFileExtension = 0x0010,
/// <summary>
/// Header extensions contains 2-byte prefix followed by
/// that many bytes of (arbitrary text) data
/// </summary>
HasAdditionalText = 0x0020,
}
/// <see href="https://github.com/wine-mirror/wine/blob/master/dlls/kernel32/lzexpand.c"/>
/// <see href="https://www.cabextract.org.uk/libmspack/doc/szdd_kwaj_format.html"/>
public enum ExpandCompressionType : byte
{
/// <summary>
/// Only valid compression type: 'A'
/// </summary>
A = 0x41,
}
}

View File

@@ -0,0 +1,21 @@
namespace SabreTools.Models.LZ
{
/// <summary>
/// LZ variant with variable compression
/// </summary>
/// <see href="https://www.cabextract.org.uk/libmspack/doc/szdd_kwaj_format.html"/>
public sealed class KWAJFile
{
/// <summary>
/// Header
/// </summary>
public KWAJHeader? Header { get; set; }
/// <summary>
/// Optional extensions defined by <see cref="KWAJHeader.HeaderFlags"/>
/// </summary>
public KWAJHeaderExtensions? HeaderExtensions { get; set; }
// Followed immediately by compressed data
}
}

View File

@@ -0,0 +1,35 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.LZ
{
/// <summary>
/// LZ variant with variable compression
/// </summary>
/// <see href="https://www.cabextract.org.uk/libmspack/doc/szdd_kwaj_format.html"/>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public sealed class KWAJHeader
{
/// <summary>
/// "KWAJ" signature
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public byte[]? Magic;
/// <summary>
/// Compression method
/// </summary>
[MarshalAs(UnmanagedType.U2)]
public KWAJCompressionType CompressionType;
/// <summary>
/// File offset of compressed data
/// </summary>
public ushort DataOffset;
/// <summary>
/// Header flags to mark header extensions
/// </summary>
[MarshalAs(UnmanagedType.U2)]
public KWAJHeaderFlags HeaderFlags;
}
}

View File

@@ -0,0 +1,51 @@
namespace SabreTools.Models.LZ
{
/// <summary>
/// Additional information stored after the KWAJ header
/// </summary>
/// <see href="https://www.cabextract.org.uk/libmspack/doc/szdd_kwaj_format.html"/>
public sealed class KWAJHeaderExtensions
{
/// <summary>
/// Decompressed length of file
/// </summary>
public uint? DecompressedLength { get; set; }
/// <summary>
/// Unknown purpose
/// </summary>
public ushort? UnknownPurpose { get; set; }
/// <summary>
/// Length of <see cref="UnknownData"/>
/// </summary>
public ushort? UnknownDataLength { get; set; }
/// <summary>
/// Unknown purpose data whose length is defined
/// by <see cref="UnknownDataLength"/>
/// </summary>
public byte[]? UnknownData { get; set; }
/// <summary>
/// Null-terminated string with max length 8: file name
/// </summary>
public string? FileName { get; set; }
/// <summary>
/// Null-terminated string with max length 3: file extension
/// </summary>
public string? FileExtension { get; set; }
/// <summary>
/// Length of <see cref="ArbitraryText"/>
/// </summary>
public ushort? ArbitraryTextLength { get; set; }
/// <summary>
/// Arbitrary text data whose length is defined
/// by <see cref="ArbitraryTextLength"/>
/// </summary>
public byte[]? ArbitraryText { get; set; }
}
}

View File

@@ -0,0 +1,16 @@
namespace SabreTools.Models.LZ
{
/// <summary>
/// LZ variant used in QBasic 4.5 installer
/// </summary>
/// <see href="https://www.cabextract.org.uk/libmspack/doc/szdd_kwaj_format.html"/>
public sealed class QBasicFile
{
/// <summary>
/// Header
/// </summary>
public QBasicHeader? Header { get; set; }
// Followed immediately by compressed data
}
}

View File

@@ -0,0 +1,23 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.LZ
{
/// <summary>
/// LZ variant used in QBasic 4.5 installer
/// </summary>
/// <see href="https://www.cabextract.org.uk/libmspack/doc/szdd_kwaj_format.html"/>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public sealed class QBasicHeader
{
/// <summary>
/// "SZ" signature
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public byte[]? Magic;
/// <summary>
/// The integer length of the file when unpacked
/// </summary>
public uint RealLength;
}
}

View File

@@ -0,0 +1,17 @@
namespace SabreTools.Models.LZ
{
/// <summary>
/// Standard LZ variant
/// </summary>
/// <see href="https://github.com/wine-mirror/wine/blob/master/dlls/kernel32/lzexpand.c"/>
/// <see href="https://www.cabextract.org.uk/libmspack/doc/szdd_kwaj_format.html"/>
public sealed class SZDDFile
{
/// <summary>
/// Header
/// </summary>
public SZDDHeader? Header { get; set; }
// Followed immediately by compressed data
}
}

View File

@@ -0,0 +1,38 @@
using System.Runtime.InteropServices;
namespace SabreTools.Models.LZ
{
/// <summary>
/// Standard LZ variant
/// </summary>
/// <see href="https://github.com/wine-mirror/wine/blob/master/dlls/kernel32/lzexpand.c"/>
/// <see href="https://www.cabextract.org.uk/libmspack/doc/szdd_kwaj_format.html"/>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public sealed class SZDDHeader
{
/// <summary>
/// "SZDD" signature
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public byte[]? Magic;
/// <summary>
/// Compression mode
/// </summary>
/// <remarks>Only <see cref="ExpandCompressionType.A"/> is supported</remarks>
[MarshalAs(UnmanagedType.U1)]
public ExpandCompressionType CompressionType;
/// <summary>
/// The character missing from the end of the filename
/// </summary>
/// <remarks>0 means unknown</remarks>
[MarshalAs(UnmanagedType.U1)]
public char LastChar;
/// <summary>
/// The integer length of the file when unpacked
/// </summary>
public uint RealLength;
}
}

View File

@@ -51,6 +51,6 @@
/// <summary>
/// Table entries in the bundle
/// </summary>
public EntryTableEntry?[]? TableEntries { get; set; }
public EntryTableEntry[]? TableEntries { get; set; }
}
}

View File

@@ -23,69 +23,69 @@ namespace SabreTools.Models.LinearExecutable
/// <summary>
/// Object table
/// </summary>
public ObjectTableEntry?[]? ObjectTable { get; set; }
public ObjectTableEntry[]? ObjectTable { get; set; }
/// <summary>
/// Object page map
/// </summary>
public ObjectPageMapEntry?[]? ObjectPageMap { get; set; }
public ObjectPageMapEntry[]? ObjectPageMap { get; set; }
// TODO: Object iterate data map table (Undefined)
/// <summary>
/// Resource table
/// </summary>
public ResourceTableEntry?[]? ResourceTable { get; set; }
public ResourceTableEntry[]? ResourceTable { get; set; }
/// <summary>
/// Resident Name table
/// </summary>
public ResidentNamesTableEntry?[]? ResidentNamesTable { get; set; }
public ResidentNamesTableEntry[]? ResidentNamesTable { get; set; }
/// <summary>
/// Entry table
/// </summary>
public EntryTableBundle?[]? EntryTable { get; set; }
public EntryTableBundle[]? EntryTable { get; set; }
/// <summary>
/// Module format directives table (optional)
/// </summary>
public ModuleFormatDirectivesTableEntry?[]? ModuleFormatDirectivesTable { get; set; }
public ModuleFormatDirectivesTableEntry[]? ModuleFormatDirectivesTable { get; set; }
/// <summary>
/// Verify record directive table (optional)
/// </summary>
public VerifyRecordDirectiveTableEntry?[]? VerifyRecordDirectiveTable { get; set; }
public VerifyRecordDirectiveTableEntry[]? VerifyRecordDirectiveTable { get; set; }
/// <summary>
/// Fix-up page table
/// </summary>
public FixupPageTableEntry?[]? FixupPageTable { get; set; }
public FixupPageTableEntry[]? FixupPageTable { get; set; }
/// <summary>
/// Fix-up record table
/// </summary>
public FixupRecordTableEntry?[]? FixupRecordTable { get; set; }
public FixupRecordTableEntry[]? FixupRecordTable { get; set; }
/// <summary>
/// Import module name table
/// </summary>
public ImportModuleNameTableEntry?[]? ImportModuleNameTable { get; set; }
public ImportModuleNameTableEntry[]? ImportModuleNameTable { get; set; }
/// <summary>
/// Import procedure name table
/// </summary>
public ImportModuleProcedureNameTableEntry?[]? ImportModuleProcedureNameTable { get; set; }
public ImportModuleProcedureNameTableEntry[]? ImportModuleProcedureNameTable { get; set; }
/// <summary>
/// Per-Page checksum table
/// </summary>
public PerPageChecksumTableEntry?[]? PerPageChecksumTable { get; set; }
public PerPageChecksumTableEntry[]? PerPageChecksumTable { get; set; }
/// <summary>
/// Non-Resident Name table
/// </summary>
public NonResidentNamesTableEntry?[]? NonResidentNamesTable { get; set; }
public NonResidentNamesTableEntry[]? NonResidentNamesTable { get; set; }
// TODO: Non-resident directives data (Undefined)

View File

@@ -1,4 +1,6 @@
namespace SabreTools.Models.LinearExecutable
using System.Runtime.InteropServices;
namespace SabreTools.Models.LinearExecutable
{
/// <summary>
/// The resident and non-resident name tables define the ASCII names and ordinal
@@ -25,6 +27,7 @@
/// </summary>
/// <see href="https://faydoc.tripod.com/formats/exe-LE.htm"/>
/// <see href="http://www.edm2.com/index.php/LX_-_Linear_eXecutable_Module_Format_Description"/>
[StructLayout(LayoutKind.Sequential)]
public sealed class NonResidentNamesTableEntry
{
/// <summary>
@@ -39,7 +42,7 @@
/// signifies that additional information is contained in the linear EXE module and
/// will be used in the future for parameter type checking.
/// </remarks>
public byte Length { get; set; } // TODO: Remove in lieu of AnsiBStr
public byte Length { get; set; }
/// <summary>
/// ASCII String.

View File

@@ -0,0 +1,16 @@
using System.Xml;
using System.Xml.Serialization;
namespace SabreTools.Models.Listxml
{
[XmlRoot("mess")]
public class Mess
{
[XmlAttribute("version")]
public string? Version { get; set; }
[XmlElement("machine", typeof(Machine))]
[XmlElement("game", typeof(Game))]
public GameBase[]? Game { get; set; }
}
}

View File

@@ -10,6 +10,9 @@ namespace SabreTools.Models.Logiqx
[XmlAttribute("name")]
public string? Name { get; set; }
[XmlElement("dir", typeof(Dir))]
public Dir[]? Subdir { get; set; }
[XmlElement("game", typeof(Game))]
[XmlElement("machine", typeof(Machine))]
public GameBase[]? Game { get; set; }

View File

@@ -24,6 +24,6 @@ namespace SabreTools.Models.MSDOS
/// make the loader add start segment address to the value at offset
/// 1*0x10+0x1A=0x2A within the program data.
/// </summary>
public RelocationEntry?[]? RelocationTable { get; set; }
public RelocationEntry[]? RelocationTable { get; set; }
}
}

View File

@@ -100,7 +100,7 @@ namespace SabreTools.Models.Metadata
string[]? asArray = Read<string[]>(key);
if (asArray != null)
#if NETFRAMEWORK
#if NETFRAMEWORK || NETSTANDARD2_0
return string.Join(",", asArray);
#else
return string.Join(',', asArray);

View File

@@ -51,6 +51,6 @@
/// <summary>
/// Data blocks associated with this folder
/// </summary>
public CFDATA?[]? DataBlocks { get; set; }
public CFDATA[]? DataBlocks { get; set; }
}
}

View File

@@ -17,11 +17,11 @@
/// <summary>
/// One or more CFFOLDER entries
/// </summary>
public CFFOLDER?[]? Folders { get; set; }
public CFFOLDER[]? Folders { get; set; }
/// <summary>
/// A series of one or more cabinet file (CFFILE) entries
/// </summary>
public CFFILE?[]? Files { get; set; }
public CFFILE[]? Files { get; set; }
}
}

View File

@@ -37,12 +37,12 @@
/// <summary>
/// Hash Table (optional)
/// </summary>
public HashEntry?[]? HashTable { get; set; }
public HashEntry[]? HashTable { get; set; }
/// <summary>
/// Block Table (optional)
/// </summary>
public BlockEntry?[]? BlockTable { get; set; }
public BlockEntry[]? BlockTable { get; set; }
/// <summary>
/// Hi-Block Table (optional)

View File

@@ -128,7 +128,7 @@
/// <summary>
/// Compressed size of the BET block
/// </summary>
public ulong BetTablesize { get; set; }
public ulong BetTableSize { get; set; }
/// <summary>
/// Size of raw data chunk to calculate MD5.

View File

@@ -25,7 +25,7 @@ namespace SabreTools.Models.N3DS
/// <remarks>
/// https://www.3dbrew.org/wiki/CIA#Certificate_Chain
/// </remarks>
public Certificate?[]? CertificateChain { get; set; }
public Certificate[]? CertificateChain { get; set; }
/// <summary>
/// Ticket
@@ -40,7 +40,7 @@ namespace SabreTools.Models.N3DS
/// <summary>
/// Content file data
/// </summary>
public NCCHHeader?[]? Partitions { get; set; }
public NCCHHeader[]? Partitions { get; set; }
/// <summary>
/// Content file data

View File

@@ -23,21 +23,21 @@ namespace SabreTools.Models.N3DS
/// <summary>
/// NCCH partitions
/// </summary>
public NCCHHeader?[]? Partitions { get; set; }
public NCCHHeader[]? Partitions { get; set; }
/// <summary>
/// NCCH extended headers
/// </summary>
public NCCHExtendedHeader?[]? ExtendedHeaders { get; set; }
public NCCHExtendedHeader[]? ExtendedHeaders { get; set; }
/// <summary>
/// ExeFS headers associated with each partition
/// </summary>
public ExeFSHeader?[]? ExeFSHeaders { get; set; }
public ExeFSHeader[]? ExeFSHeaders { get; set; }
/// <summary>
/// RomFS headers associated with each partition
/// </summary>
public RomFSHeader?[]? RomFSHeaders { get; set; }
public RomFSHeader[]? RomFSHeaders { get; set; }
}
}

View File

@@ -16,7 +16,7 @@
/// <summary>
/// File headers (10 headers maximum, 16 bytes each)
/// </summary>
public ExeFSFileHeader?[]? FileHeaders { get; set; }
public ExeFSFileHeader[]? FileHeaders { get; set; }
/// <summary>
/// Reserved

View File

@@ -46,7 +46,7 @@
/// <summary>
/// Offset & Length partition table, in media units
/// </summary>
public PartitionTableEntry?[]? PartitionsTable { get; set; }
public PartitionTableEntry[]? PartitionsTable { get; set; }
#endregion

View File

@@ -173,6 +173,6 @@ namespace SabreTools.Models.N3DS
/// <remarks>
/// https://www.3dbrew.org/wiki/Ticket#Certificate_Chain
/// </remarks>
public Certificate?[]? CertificateChain { get; set; }
public Certificate[]? CertificateChain { get; set; }
}
}

View File

@@ -136,13 +136,13 @@ namespace SabreTools.Models.N3DS
/// <summary>
/// There are 64 of these records, usually only the first is used.
/// </summary>
public ContentInfoRecord?[]? ContentInfoRecords { get; set; }
public ContentInfoRecord[]? ContentInfoRecords { get; set; }
/// <summary>
/// There is one of these for each content contained in this title.
/// (Determined by "Content Count" in the TMD Header).
/// </summary>
public ContentChunkRecord?[]? ContentChunkRecords { get; set; }
public ContentChunkRecord[]? ContentChunkRecords { get; set; }
/// <summary>
/// Certificate chain
@@ -150,6 +150,6 @@ namespace SabreTools.Models.N3DS
/// <remarks>
/// https://www.3dbrew.org/wiki/Title_metadata#Certificate_Chain
/// </remarks>
public Certificate?[]? CertificateChain { get; set; }
public Certificate[]? CertificateChain { get; set; }
}
}

View File

@@ -21,7 +21,7 @@ namespace SabreTools.Models.NCF
/// <summary>
/// Directory entries data
/// </summary>
public DirectoryEntry?[]? DirectoryEntries { get; set; }
public DirectoryEntry[]? DirectoryEntries { get; set; }
/// <summary>
/// Directory names data
@@ -31,22 +31,22 @@ namespace SabreTools.Models.NCF
/// <summary>
/// Directory info 1 entries data
/// </summary>
public DirectoryInfo1Entry?[]? DirectoryInfo1Entries { get; set; }
public DirectoryInfo1Entry[]? DirectoryInfo1Entries { get; set; }
/// <summary>
/// Directory info 2 entries data
/// </summary>
public DirectoryInfo2Entry?[]? DirectoryInfo2Entries { get; set; }
public DirectoryInfo2Entry[]? DirectoryInfo2Entries { get; set; }
/// <summary>
/// Directory copy entries data
/// </summary>
public DirectoryCopyEntry?[]? DirectoryCopyEntries { get; set; }
public DirectoryCopyEntry[]? DirectoryCopyEntries { get; set; }
/// <summary>
/// Directory local entries data
/// </summary>
public DirectoryLocalEntry?[]? DirectoryLocalEntries { get; set; }
public DirectoryLocalEntry[]? DirectoryLocalEntries { get; set; }
/// <summary>
/// Unknown header data
@@ -56,7 +56,7 @@ namespace SabreTools.Models.NCF
/// <summary>
/// Unknown entries data
/// </summary>
public UnknownEntry?[]? UnknownEntries { get; set; }
public UnknownEntry[]? UnknownEntries { get; set; }
/// <summary>
/// Checksum header data
@@ -71,11 +71,11 @@ namespace SabreTools.Models.NCF
/// <summary>
/// Checksum map entries data
/// </summary>
public ChecksumMapEntry?[]? ChecksumMapEntries { get; set; }
public ChecksumMapEntry[]? ChecksumMapEntries { get; set; }
/// <summary>
/// Checksum entries data
/// </summary>
public ChecksumEntry?[]? ChecksumEntries { get; set; }
public ChecksumEntry[]? ChecksumEntries { get; set; }
}
}

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