From 0389696163a7e0d209c0fe8a717b21c7e63ab372 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 8 Oct 2023 16:49:43 +0100 Subject: [PATCH] [Symbian Installation File] Add support for Symbian OS >= 6 compressed files. --- Aaru.Archives/Symbian/Files.cs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/Aaru.Archives/Symbian/Files.cs b/Aaru.Archives/Symbian/Files.cs index ccb5f38b2..d9149f2d2 100644 --- a/Aaru.Archives/Symbian/Files.cs +++ b/Aaru.Archives/Symbian/Files.cs @@ -31,6 +31,8 @@ // ****************************************************************************/ using System; +using System.IO; +using System.IO.Compression; using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Structs; @@ -159,19 +161,28 @@ public sealed partial class Symbian if(entryNumber < 0 || entryNumber >= _files.Count) return ErrorNumber.OutOfRange; - // TODO: Implement - if(_compressed) - return ErrorNumber.NotSupported; + Stream stream = new OffsetStream(new NonClosableStream(_stream), _files[entryNumber].pointer, + _files[entryNumber].pointer + _files[entryNumber].length); + + ErrorNumber errno; + if(_compressed) + { + if(_files[entryNumber].originalLength == 0) + stream = new MemoryStream(Array.Empty()); + else + { + stream = new ForcedSeekStream(_files[entryNumber].originalLength, stream, + CompressionMode.Decompress); + } + } - var offsetStream = new OffsetStream(new NonClosableStream(_stream), _files[entryNumber].pointer, - _files[entryNumber].pointer + _files[entryNumber].length); filter = new ZZZNoFilter(); - ErrorNumber errno = filter.Open(offsetStream); + errno = filter.Open(stream); if(errno == ErrorNumber.NoError) return ErrorNumber.NoError; - offsetStream.Close(); + stream.Close(); return errno; }