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