From 9fe8399d6a4416d30ac960ea7298f477eff2aca1 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Wed, 7 Jun 2017 18:36:06 +0100 Subject: [PATCH] Added support for LZIP compressed files (.lz). --- .../DiscImageChef.Filters.csproj | 1 + DiscImageChef.Filters/LZip.cs | 169 +++++++++++++++++- README.md | 1 + 3 files changed, 167 insertions(+), 4 deletions(-) diff --git a/DiscImageChef.Filters/DiscImageChef.Filters.csproj b/DiscImageChef.Filters/DiscImageChef.Filters.csproj index 815665ee..242472c1 100644 --- a/DiscImageChef.Filters/DiscImageChef.Filters.csproj +++ b/DiscImageChef.Filters/DiscImageChef.Filters.csproj @@ -48,6 +48,7 @@ + diff --git a/DiscImageChef.Filters/LZip.cs b/DiscImageChef.Filters/LZip.cs index 57304dbf..4cafcf55 100644 --- a/DiscImageChef.Filters/LZip.cs +++ b/DiscImageChef.Filters/LZip.cs @@ -5,11 +5,11 @@ // Filename : LZip.cs // Author(s) : Natalia Portillo // -// Component : Component +// Component : Filters. // // --[ Description ] ---------------------------------------------------------- // -// Description +// Allow to open files that are compressed using lzip. // // --[ License ] -------------------------------------------------------------- // @@ -29,13 +29,174 @@ // ---------------------------------------------------------------------------- // Copyright © 2011-2017 Natalia Portillo // ****************************************************************************/ + using System; +using System.IO; +using DiscImageChef.Console; +using SharpCompress.Compressors; +using SharpCompress.Compressors.LZMA; + namespace DiscImageChef.Filters { - public class LZip + public class LZip : Filter { + Stream dataStream; + string basePath; + DateTime lastWriteTime; + DateTime creationTime; + bool opened; + long decompressedSize; + Stream innerStream; + public LZip() { + Name = "LZip"; + UUID = new Guid("FCCFB0C3-32EF-40D8-9714-2333F6AC72A9"); + } + + public override void Close() + { + if(dataStream != null) + dataStream.Close(); + dataStream = null; + basePath = null; + opened = false; + } + + public override string GetBasePath() + { + return basePath; + } + + public override Stream GetDataForkStream() + { + return innerStream; + } + + public override string GetPath() + { + return basePath; + } + + public override Stream GetResourceForkStream() + { + return null; + } + + public override bool HasResourceFork() + { + return false; + } + + public override bool Identify(byte[] buffer) + { + return buffer[0] == 0x4C && buffer[1] == 0x5A && buffer[2] == 0x49 && buffer[3] == 0x50 && buffer[4] == 0x01; + } + + public override bool Identify(Stream stream) + { + byte[] buffer = new byte[5]; + + stream.Seek(0, SeekOrigin.Begin); + stream.Read(buffer, 0, 5); + stream.Seek(0, SeekOrigin.Begin); + + return buffer[0] == 0x4C && buffer[1] == 0x5A && buffer[2] == 0x49 && buffer[3] == 0x50 && buffer[4] == 0x01; + } + + public override bool Identify(string path) + { + if(File.Exists(path)) + { + FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read); + byte[] buffer = new byte[5]; + + stream.Seek(0, SeekOrigin.Begin); + stream.Read(buffer, 0, 5); + stream.Seek(0, SeekOrigin.Begin); + + return buffer[0] == 0x4C && buffer[1] == 0x5A && buffer[2] == 0x49 && buffer[3] == 0x50 && buffer[4] == 0x01; + } + + return false; + } + + public override void Open(byte[] buffer) + { + dataStream = new MemoryStream(buffer); + basePath = null; + creationTime = DateTime.UtcNow; + lastWriteTime = creationTime; + innerStream = new ForcedSeekStream(dataStream, CompressionMode.Decompress, false); + decompressedSize = innerStream.Length; + opened = true; + } + + public override void Open(Stream stream) + { + dataStream = stream; + basePath = null; + creationTime = DateTime.UtcNow; + lastWriteTime = creationTime; + innerStream = new ForcedSeekStream(dataStream, CompressionMode.Decompress, false); + decompressedSize = innerStream.Length; + opened = true; + } + + public override void Open(string path) + { + dataStream = new FileStream(path, FileMode.Open, FileAccess.Read); + basePath = Path.GetFullPath(path); + + DateTime start = DateTime.UtcNow; + DateTime end = DateTime.UtcNow; + + FileInfo fi = new FileInfo(path); + creationTime = fi.CreationTimeUtc; + lastWriteTime = fi.LastWriteTimeUtc; + innerStream = new ForcedSeekStream(dataStream, CompressionMode.Decompress, false); + decompressedSize = innerStream.Length; + opened = true; + } + + public override DateTime GetCreationTime() + { + return creationTime; + } + + public override long GetDataForkLength() + { + return decompressedSize; + } + + public override DateTime GetLastWriteTime() + { + return lastWriteTime; + } + + public override long GetLength() + { + return decompressedSize; + } + + public override long GetResourceForkLength() + { + return 0; + } + + public override string GetFilename() + { + return basePath != null ? Path.GetFileName(basePath) : null; + } + + public override string GetParentFolder() + { + return Path.GetDirectoryName(basePath); + } + + public override bool IsOpened() + { + return opened; } } -} +} \ No newline at end of file diff --git a/README.md b/README.md index dfa4caa3..0168d494 100644 --- a/README.md +++ b/README.md @@ -170,6 +170,7 @@ Supported filters * AppleSingle * BZip2 * GZip +* LZip * MacBinary I, II, III Changelog