mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
[STFS] Implement GetInformation.
This commit is contained in:
@@ -51,6 +51,7 @@
|
|||||||
<ProjectReference Include="..\Aaru.Helpers\Aaru.Helpers.csproj"/>
|
<ProjectReference Include="..\Aaru.Helpers\Aaru.Helpers.csproj"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Humanizer"/>
|
||||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection"/>
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection"/>
|
||||||
<PackageReference Include="SharpCompress"/>
|
<PackageReference Include="SharpCompress"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
144
Aaru.Archives/Localization/Localization.Designer.cs
generated
144
Aaru.Archives/Localization/Localization.Designer.cs
generated
@@ -506,5 +506,149 @@ namespace Aaru.Archives {
|
|||||||
return ResourceManager.GetString("Conditions", resourceCulture);
|
return ResourceManager.GetString("Conditions", resourceCulture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static string Console_package {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Console_package", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Live_package {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Live_package", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Microsoft_package {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Microsoft_package", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Certificate_owner_console_ID_0_1_2_3_4 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Certificate_owner_console_ID_0_1_2_3_4", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Certificate_owner_console_part_number_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Certificate_owner_console_part_number_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Certificate_owner_console_type_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Certificate_owner_console_type_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Certificate_date_of_generation_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Certificate_date_of_generation_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Signatures_SHA1_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Signatures_SHA1_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Header_size_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Header_size_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Content_type_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Content_type_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Content_size_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Content_size_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Title_ID_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Title_ID_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Media_ID_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Media_ID_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Publisher_name_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Publisher_name_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Title_name_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Title_name_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Metadata_version_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Metadata_version_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Version_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Version_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Base_version_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Base_version_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Descriptor_type_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Descriptor_type_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Display_name_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Display_name_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Display_description_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Display_description_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Device_ID_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Device_ID_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Console_ID_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Console_ID_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string Profile_ID_0 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Profile_ID_0", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -246,4 +246,76 @@
|
|||||||
<data name="Conditions" xml:space="preserve">
|
<data name="Conditions" xml:space="preserve">
|
||||||
<value>[bold][slateblue1]Condiciones:[/][/]</value>
|
<value>[bold][slateblue1]Condiciones:[/][/]</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Base_version_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Versión base:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Certificate_date_of_generation_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Fecha de generación del certificado:[/][/] [aqua]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Certificate_owner_console_ID_0_1_2_3_4" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]ID de consola dueña del certificado:[/][/] [teal]{0:X2}{1:X2}{2:X2}{3:X2}{4:X2}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Certificate_owner_console_part_number_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Número de parte de consola dueña del certificado:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Certificate_owner_console_type_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Tipo de consola dueña del certificado:[/][/] [green]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Console_ID_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]ID de consola:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Console_package" xml:space="preserve">
|
||||||
|
<value>[bold][blue]Paquete de consola:[/][/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Content_size_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Tamaño del contenido:[/][/] [lime]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Content_type_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Tipo del contenido:[/][/] [green]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Descriptor_type_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Tipo del descriptor:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Device_ID_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]ID del dispositivo:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Display_description_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Descripción:[/][/] [green]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Display_name_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Nombre:[/][/] [green]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Header_size_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Tamaño de cabecera:[/][/] [lime]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Live_package" xml:space="preserve">
|
||||||
|
<value>[bold][blue]Paquete Live!:[/][/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Media_ID_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]ID del medio:[/][/] [teal]{0:X8}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Metadata_version_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Versión de los metadatos:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Microsoft_package" xml:space="preserve">
|
||||||
|
<value>[bold][blue]Paquete de Microsoft:[/][/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Profile_ID_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]ID del perfil:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Publisher_name_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Nombre del publicador:[/][/] [green]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Signatures_SHA1_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]SHA1 de la firma:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Title_name_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Título:[/][/] [green]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Title_ID_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]ID del título:[/][/] [teal]{0:X8}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Version_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Versión:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -254,4 +254,76 @@
|
|||||||
<data name="Conditions" xml:space="preserve">
|
<data name="Conditions" xml:space="preserve">
|
||||||
<value>[bold][slateblue1]Conditions:[/][/]</value>
|
<value>[bold][slateblue1]Conditions:[/][/]</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Console_package" xml:space="preserve">
|
||||||
|
<value>[bold][blue]Console package:[/][/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Live_package" xml:space="preserve">
|
||||||
|
<value>[bold][blue]Live! package:[/][/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Microsoft_package" xml:space="preserve">
|
||||||
|
<value>[bold][blue]Microsoft package:[/][/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Certificate_owner_console_ID_0_1_2_3_4" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Certificate owner console ID:[/][/] [teal]{0:X2}{1:X2}{2:X2}{3:X2}{4:X2}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Certificate_owner_console_part_number_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Certificate owner console part number:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Certificate_owner_console_type_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Certificate owner console type:[/][/] [green]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Certificate_date_of_generation_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Certificate date of generation:[/][/] [aqua]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Signatures_SHA1_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Signature's SHA1:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Header_size_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Header size:[/][/] [lime]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Content_type_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Content type:[/][/] [green]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Content_size_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Content size:[/][/] [lime]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Title_ID_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Title ID:[/][/] [teal]{0:X8}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Media_ID_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Media ID:[/][/] [teal]{0:X8}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Publisher_name_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Publisher name:[/][/] [green]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Title_name_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Title name:[/][/] [green]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Metadata_version_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Metadata version:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Version_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Version:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Base_version_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Base version:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Descriptor_type_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Descriptor type:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Display_name_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Display name:[/][/] [green]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Display_description_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Display description:[/][/] [green]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Device_ID_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Device ID:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Console_ID_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Console ID:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Profile_ID_0" xml:space="preserve">
|
||||||
|
<value>[bold][slateblue1]Profile ID:[/][/] [teal]{0}[/]</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -1,12 +1,19 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Text;
|
||||||
using Aaru.CommonTypes.Interfaces;
|
using Aaru.CommonTypes.Interfaces;
|
||||||
using Aaru.Helpers;
|
using Aaru.Helpers;
|
||||||
|
using Humanizer;
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
namespace Aaru.Archives;
|
namespace Aaru.Archives;
|
||||||
|
|
||||||
public sealed partial class Stfs
|
public sealed partial class Stfs
|
||||||
{
|
{
|
||||||
|
#region IArchive Members
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public bool Identify(IFilter filter)
|
public bool Identify(IFilter filter)
|
||||||
{
|
{
|
||||||
@@ -21,6 +28,140 @@ public sealed partial class Stfs
|
|||||||
|
|
||||||
RemotePackage header = Marshal.ByteArrayToStructureBigEndian<RemotePackage>(hdr);
|
RemotePackage header = Marshal.ByteArrayToStructureBigEndian<RemotePackage>(hdr);
|
||||||
|
|
||||||
return header.Magic is PackageMagic.Console or PackageMagic.Live or PackageMagic.Microsoft;
|
if(header.Magic is not (PackageMagic.Console or PackageMagic.Live or PackageMagic.Microsoft)) return false;
|
||||||
|
|
||||||
|
// SVOD is managed as a media image
|
||||||
|
return header.Metadata.DescriptorType == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public void GetInformation(IFilter filter, Encoding encoding, out string information)
|
||||||
|
{
|
||||||
|
information = "";
|
||||||
|
|
||||||
|
if(filter.DataForkLength < Marshal.SizeOf<RemotePackage>()) return;
|
||||||
|
|
||||||
|
Stream stream = filter.GetDataForkStream();
|
||||||
|
stream.Position = 0;
|
||||||
|
|
||||||
|
byte[] hdr = new byte[Marshal.SizeOf<RemotePackage>()];
|
||||||
|
|
||||||
|
stream.ReadExactly(hdr, 0, hdr.Length);
|
||||||
|
|
||||||
|
// Reverse positions that hold UTF16-BE strings
|
||||||
|
ReverseShorts(hdr, 0x0411, 0x1300);
|
||||||
|
|
||||||
|
RemotePackage header = Marshal.ByteArrayToStructureBigEndian<RemotePackage>(hdr);
|
||||||
|
|
||||||
|
if(header.Magic is not (PackageMagic.Console or PackageMagic.Live or PackageMagic.Microsoft)) return;
|
||||||
|
|
||||||
|
// SVOD is managed as a media image
|
||||||
|
if(header.Metadata.DescriptorType != 0) return;
|
||||||
|
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
|
||||||
|
switch(header.Magic)
|
||||||
|
{
|
||||||
|
case PackageMagic.Console:
|
||||||
|
sb.AppendLine(Localization.Console_package);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case PackageMagic.Live:
|
||||||
|
sb.AppendLine(Localization.Live_package);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case PackageMagic.Microsoft:
|
||||||
|
sb.AppendLine(Localization.Microsoft_package);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(header.Magic == PackageMagic.Console)
|
||||||
|
{
|
||||||
|
ConsolePackage consolePackage = Marshal.ByteArrayToStructureBigEndian<ConsolePackage>(hdr);
|
||||||
|
|
||||||
|
sb.AppendFormat(Localization.Certificate_owner_console_ID_0_1_2_3_4,
|
||||||
|
consolePackage.CertificateOwnerConsoleId[0],
|
||||||
|
consolePackage.CertificateOwnerConsoleId[1],
|
||||||
|
consolePackage.CertificateOwnerConsoleId[2],
|
||||||
|
consolePackage.CertificateOwnerConsoleId[3],
|
||||||
|
consolePackage.CertificateOwnerConsoleId[4])
|
||||||
|
.AppendLine();
|
||||||
|
|
||||||
|
sb.AppendFormat(Localization.Certificate_owner_console_part_number_0,
|
||||||
|
Markup.Escape(consolePackage.CertificateOwnerConsolePartNumber))
|
||||||
|
.AppendLine();
|
||||||
|
|
||||||
|
sb.AppendFormat(Localization.Certificate_owner_console_type_0, consolePackage.CertificateOwnerConsoleType)
|
||||||
|
.AppendLine();
|
||||||
|
|
||||||
|
sb.AppendFormat(Localization.Certificate_date_of_generation_0,
|
||||||
|
Markup.Escape(consolePackage.CertificateDateOfGeneration))
|
||||||
|
.AppendLine();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Calculate signature's SHA1
|
||||||
|
using var sha1 = SHA1.Create();
|
||||||
|
byte[] signatureSha1 = sha1.ComputeHash(header.Signature);
|
||||||
|
|
||||||
|
sb.AppendFormat(Localization.Signatures_SHA1_0, BitConverter.ToString(signatureSha1).Replace("-", ""))
|
||||||
|
.AppendLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.AppendFormat(Localization.Header_size_0, header.Metadata.HeaderSize).AppendLine();
|
||||||
|
sb.AppendFormat(Localization.Content_type_0, header.Metadata.ContentType.Humanize()).AppendLine();
|
||||||
|
|
||||||
|
if(header.Metadata.ContentSize > 0)
|
||||||
|
sb.AppendFormat(Localization.Content_size_0, header.Metadata.ContentSize).AppendLine();
|
||||||
|
|
||||||
|
if(header.Metadata.TitleId > 0) sb.AppendFormat(Localization.Title_ID_0, header.Metadata.TitleId).AppendLine();
|
||||||
|
if(header.Metadata.MediaId > 0) sb.AppendFormat(Localization.Media_ID_0, header.Metadata.MediaId).AppendLine();
|
||||||
|
|
||||||
|
if(header.Metadata.PublisherName != "")
|
||||||
|
sb.AppendFormat(Localization.Publisher_name_0, header.Metadata.PublisherName).AppendLine();
|
||||||
|
|
||||||
|
if(header.Metadata.TitleName != "")
|
||||||
|
sb.AppendFormat(Localization.Title_name_0, header.Metadata.TitleName).AppendLine();
|
||||||
|
|
||||||
|
sb.AppendFormat(Localization.Metadata_version_0, header.Metadata.MetadataVersion).AppendLine();
|
||||||
|
if(header.Metadata.Version > 0) sb.AppendFormat(Localization.Version_0, header.Metadata.Version).AppendLine();
|
||||||
|
|
||||||
|
if(header.Metadata.BaseVersion > 0)
|
||||||
|
sb.AppendFormat(Localization.Base_version_0, header.Metadata.BaseVersion).AppendLine();
|
||||||
|
|
||||||
|
sb.AppendFormat(Localization.Descriptor_type_0, header.Metadata.DescriptorType).AppendLine();
|
||||||
|
|
||||||
|
foreach(LocalizedString displayName in
|
||||||
|
header.Metadata.DisplayName.Where(displayName => displayName.Name is not ""))
|
||||||
|
sb.AppendFormat(Localization.Display_name_0, displayName.Name).AppendLine();
|
||||||
|
|
||||||
|
foreach(LocalizedString description in
|
||||||
|
header.Metadata.DisplayDescription.Where(description => description.Name is not ""))
|
||||||
|
sb.AppendFormat(Localization.Display_description_0, description.Name).AppendLine();
|
||||||
|
|
||||||
|
if(header.Metadata.DeviceId.Any(c => c != 0x00))
|
||||||
|
sb.AppendFormat(Localization.Device_ID_0,
|
||||||
|
StringHandlers.CToString(header.Metadata.DeviceId, Encoding.ASCII).Trim())
|
||||||
|
.AppendLine();
|
||||||
|
|
||||||
|
if(header.Metadata.ConsoleId.Any(c => c != 0x00))
|
||||||
|
sb.AppendFormat(Localization.Console_ID_0,
|
||||||
|
BitConverter.ToString(header.Metadata.ConsoleId).Replace("-", ""))
|
||||||
|
.AppendLine();
|
||||||
|
|
||||||
|
if(header.Metadata.ProfileId.Any(c => c != 0x00))
|
||||||
|
sb.AppendFormat(Localization.Profile_ID_0,
|
||||||
|
BitConverter.ToString(header.Metadata.ProfileId).Replace("-", ""))
|
||||||
|
.AppendLine();
|
||||||
|
|
||||||
|
information = sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
static void ReverseShorts(byte[] shorts, int start, int count)
|
||||||
|
{
|
||||||
|
for(int i = start; i < start + count; i += 2) (shorts[i], shorts[i + 1]) = (shorts[i + 1], shorts[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,7 @@ public sealed partial class Stfs
|
|||||||
{
|
{
|
||||||
#region Nested type: ConsolePackage
|
#region Nested type: ConsolePackage
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
|
||||||
struct ConsolePackage
|
struct ConsolePackage
|
||||||
{
|
{
|
||||||
public PackageMagic Magic;
|
public PackageMagic Magic;
|
||||||
@@ -48,7 +48,7 @@ public sealed partial class Stfs
|
|||||||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
|
||||||
struct LocalizedString
|
struct LocalizedString
|
||||||
{
|
{
|
||||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
|
||||||
public string Name;
|
public string Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,9 +96,9 @@ public sealed partial class Stfs
|
|||||||
public byte[] Padding;
|
public byte[] Padding;
|
||||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
|
||||||
public byte[] DeviceId;
|
public byte[] DeviceId;
|
||||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 18)]
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)]
|
||||||
public LocalizedString[] DisplayName;
|
public LocalizedString[] DisplayName;
|
||||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 18)]
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)]
|
||||||
public LocalizedString[] DisplayDescription;
|
public LocalizedString[] DisplayDescription;
|
||||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
|
||||||
public string PublisherName;
|
public string PublisherName;
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ public sealed partial class Stfs
|
|||||||
{
|
{
|
||||||
#region IArchive Members
|
#region IArchive Members
|
||||||
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public ErrorNumber Open(IFilter filter, Encoding encoding) => throw new NotImplementedException();
|
public ErrorNumber Open(IFilter filter, Encoding encoding) => throw new NotImplementedException();
|
||||||
|
|
||||||
@@ -52,11 +51,5 @@ public sealed partial class Stfs
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public ErrorNumber GetEntry(int entryNumber, out IFilter filter) => throw new NotImplementedException();
|
public ErrorNumber GetEntry(int entryNumber, out IFilter filter) => throw new NotImplementedException();
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public void GetInformation(IFilter filter, Encoding encoding, out string information)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user