diff --git a/Aaru.Archives/Localization/Localization.Designer.cs b/Aaru.Archives/Localization/Localization.Designer.cs index de81d82a8..dbef50944 100644 --- a/Aaru.Archives/Localization/Localization.Designer.cs +++ b/Aaru.Archives/Localization/Localization.Designer.cs @@ -149,6 +149,42 @@ namespace Aaru.Archives { } } + /// + /// Looks up a localized string similar to Required UID {0} version {1}.{2}. + /// + internal static string Required_UID_0_version_1_2 { + get { + return ResourceManager.GetString("Required_UID_0_version_1_2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Required variant: {0}. + /// + internal static string Required_variant_0 { + get { + return ResourceManager.GetString("Required_variant_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Requisite #{0}:. + /// + internal static string Requisite_0 { + get { + return ResourceManager.GetString("Requisite_0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Requisite for language {0}: {1}. + /// + internal static string Requisite_for_language_0_1 { + get { + return ResourceManager.GetString("Requisite_for_language_0_1", resourceCulture); + } + } + /// /// Looks up a localized string similar to SIS contains an application. /// diff --git a/Aaru.Archives/Localization/Localization.es.resx b/Aaru.Archives/Localization/Localization.es.resx index 06aec622d..a36a71a97 100644 --- a/Aaru.Archives/Localization/Localization.es.resx +++ b/Aaru.Archives/Localization/Localization.es.resx @@ -69,4 +69,16 @@ Ficheros para todos los idiomas: + + Requerida UID {0} versión {1}.{2} + + + Variante requerida: {0} + + + Requisito nº {0}: + + + Requisito para el idioma {0}: {1} + \ No newline at end of file diff --git a/Aaru.Archives/Localization/Localization.resx b/Aaru.Archives/Localization/Localization.resx index 68278de4a..16b1a9047 100644 --- a/Aaru.Archives/Localization/Localization.resx +++ b/Aaru.Archives/Localization/Localization.resx @@ -77,4 +77,16 @@ Files for `{0}` language: + + Requisite #{0}: + + + Required UID {0} version {1}.{2} + + + Required variant: {0} + + + Requisite for language {0}: {1} + \ No newline at end of file diff --git a/Aaru.Archives/Symbian/Consts.cs b/Aaru.Archives/Symbian/Consts.cs index 9b478a89a..a51f5dc12 100644 --- a/Aaru.Archives/Symbian/Consts.cs +++ b/Aaru.Archives/Symbian/Consts.cs @@ -36,7 +36,7 @@ namespace Aaru.Archives; [SuppressMessage("ReSharper", "UnusedType.Global")] [SuppressMessage("ReSharper", "UnusedMember.Local")] -public partial class Symbian +public sealed partial class Symbian { // Magics const uint SYMBIAN_MAGIC = 0x10000419; diff --git a/Aaru.Archives/Symbian/Enums.cs b/Aaru.Archives/Symbian/Enums.cs index b922c68bf..603eceb13 100644 --- a/Aaru.Archives/Symbian/Enums.cs +++ b/Aaru.Archives/Symbian/Enums.cs @@ -39,7 +39,7 @@ namespace Aaru.Archives; [SuppressMessage("ReSharper", "UnusedType.Local")] [SuppressMessage("ReSharper", "UnusedType.Global")] [SuppressMessage("ReSharper", "InconsistentNaming")] -public partial class Symbian +public sealed partial class Symbian { #region Nested type: Attribute diff --git a/Aaru.Archives/Symbian/Info.cs b/Aaru.Archives/Symbian/Info.cs index a5ea525ba..8ca280df5 100644 --- a/Aaru.Archives/Symbian/Info.cs +++ b/Aaru.Archives/Symbian/Info.cs @@ -43,7 +43,7 @@ using Marshal = Aaru.Helpers.Marshal; namespace Aaru.Archives; -public partial class Symbian +public sealed partial class Symbian { #region IArchive Members @@ -72,14 +72,12 @@ public partial class Symbian public void GetInformation(IFilter filter, Encoding encoding, out string information) { - _encoding= encoding ?? Encoding.GetEncoding("windows-1252"); - information = ""; - var description = new StringBuilder(); - var languages = new List(); - var capabilities = new Dictionary(); - var en_Pos = 0; - var componentName = ""; - Stream stream = filter.GetDataForkStream(); + _encoding = encoding ?? Encoding.GetEncoding("windows-1252"); + information = ""; + var description = new StringBuilder(); + var languages = new List(); + var capabilities = new Dictionary(); + Stream stream = filter.GetDataForkStream(); if(stream.Length < Marshal.SizeOf()) return; @@ -237,15 +235,59 @@ public partial class Symbian description.AppendFormat(Localization.File_contains_0_files_pointer_1, sh.files, sh.files_ptr).AppendLine(); description.AppendFormat(Localization.File_contains_0_requisites, sh.requisites).AppendLine(); + uint offset = sh.reqs_ptr; + + if(sh.requisites > 0) + { + for(var r = 0; r < sh.requisites; r++) + { + br.BaseStream.Seek(offset, SeekOrigin.Begin); + var requisiteRecord = new RequisiteRecord + { + uid = br.ReadUInt32(), + majorVersion = br.ReadUInt16(), + minorVersion = br.ReadUInt16(), + variant = br.ReadUInt32() + }; + + buffer = br.ReadBytes(sizeof(uint) * languages.Count); + span = buffer; + requisiteRecord.namesLengths = MemoryMarshal.Cast(span)[..languages.Count].ToArray(); + + buffer = br.ReadBytes(sizeof(uint) * languages.Count); + span = buffer; + requisiteRecord.namesPointers = MemoryMarshal.Cast(span)[..languages.Count].ToArray(); + + description.AppendFormat(Localization.Requisite_0, r).AppendLine(); + description.AppendFormat("\t" + Localization.Required_UID_0_version_1_2, requisiteRecord.uid, + requisiteRecord.majorVersion, requisiteRecord.minorVersion). + AppendLine(); + description.AppendFormat("\t" + Localization.Required_variant_0, requisiteRecord.variant).AppendLine(); + + offset = (uint)br.BaseStream.Position; + + for(var i = 0; i < languages.Count; i++) + { + br.BaseStream.Seek(requisiteRecord.namesPointers[i], SeekOrigin.Begin); + buffer = br.ReadBytes((int)requisiteRecord.namesLengths[i]); + description.AppendFormat("\t" + Localization.Requisite_for_language_0_1, languages[i], + _encoding.GetString(buffer)). + AppendLine(); + } + + description.AppendLine(); + } + } + // description.AppendLine(Localization.Capabilities); // foreach(KeyValuePair kvp in capabilities) // description.AppendFormat("{0} = {1}", kvp.Key, kvp.Value).AppendLine(); // Set instance values - _files = new List(); + _files = new List(); uint currentFile = 0; - uint offset = sh.files_ptr; + offset = sh.files_ptr; do { diff --git a/Aaru.Archives/Symbian/Parser.cs b/Aaru.Archives/Symbian/Parser.cs index b60554245..614e5fd26 100644 --- a/Aaru.Archives/Symbian/Parser.cs +++ b/Aaru.Archives/Symbian/Parser.cs @@ -39,7 +39,7 @@ using Marshal = Aaru.Helpers.Marshal; namespace Aaru.Archives; -public partial class Symbian +public sealed partial class Symbian { void Parse(BinaryReader br, ref uint offset, ref uint currentFile, uint maxFiles, List languages) { @@ -58,8 +58,7 @@ public partial class Symbian br.BaseStream.Seek(-sizeof(FileRecordType), SeekOrigin.Current); - byte[] buffer; - ReadOnlySpan span; + byte[] buffer; switch(recordType) { @@ -112,8 +111,8 @@ public partial class Symbian buffer = br.ReadBytes(Marshal.SizeOf()); multipleFileRecord.record = Marshal.ByteArrayToStructureLittleEndian(buffer); - buffer = br.ReadBytes(sizeof(uint) * languages.Count); - span = buffer; + buffer = br.ReadBytes(sizeof(uint) * languages.Count); + ReadOnlySpan span = buffer; multipleFileRecord.lengths = MemoryMarshal.Cast(span)[..languages.Count].ToArray(); buffer = br.ReadBytes(sizeof(uint) * languages.Count); diff --git a/Aaru.Archives/Symbian/Structs.cs b/Aaru.Archives/Symbian/Structs.cs index d1661dabb..921e64217 100644 --- a/Aaru.Archives/Symbian/Structs.cs +++ b/Aaru.Archives/Symbian/Structs.cs @@ -43,7 +43,8 @@ namespace Aaru.Archives; [SuppressMessage("ReSharper", "UnusedType.Local")] [SuppressMessage("ReSharper", "InconsistentNaming")] [SuppressMessage("ReSharper", "InheritdocConsiderUsage")] -public partial class Symbian +[SuppressMessage("ReSharper", "NotAccessedField.Local")] +public sealed partial class Symbian { #region Nested type: AttributeConditionalExpression diff --git a/Aaru.Archives/Symbian/Symbian.cs b/Aaru.Archives/Symbian/Symbian.cs index 0d8f713e7..5d4a59f29 100644 --- a/Aaru.Archives/Symbian/Symbian.cs +++ b/Aaru.Archives/Symbian/Symbian.cs @@ -38,7 +38,7 @@ using Aaru.CommonTypes.Interfaces; namespace Aaru.Archives; // Information from https://thoukydides.github.io/riscos-psifs/sis.html -public partial class Symbian : IArchive +public sealed partial class Symbian : IArchive { const string MODULE_NAME = "Symbian Installation File Plugin"; Encoding _encoding; diff --git a/Aaru.Archives/Symbian/Unsupported.cs b/Aaru.Archives/Symbian/Unsupported.cs index bb0abf214..674d99d1f 100644 --- a/Aaru.Archives/Symbian/Unsupported.cs +++ b/Aaru.Archives/Symbian/Unsupported.cs @@ -41,7 +41,7 @@ namespace Aaru.Archives; [SuppressMessage("ReSharper", "UnusedType.Global")] [SuppressMessage("ReSharper", "UnusedMember.Local")] -public partial class Symbian +public sealed partial class Symbian { #region IArchive Members diff --git a/Aaru.sln.DotSettings b/Aaru.sln.DotSettings index 9fc05226b..8f035c32e 100644 --- a/Aaru.sln.DotSettings +++ b/Aaru.sln.DotSettings @@ -1029,9 +1029,11 @@ True True + True True True True + True True True True @@ -1103,6 +1105,7 @@ True True True + True True True True