Skip to content

Commit bfdb87b

Browse files
author
mahoshojoHCG
committed
gui: add compress and decompress for lz4 and zst, decompress for xz
1 parent 59a16db commit bfdb87b

14 files changed

+204
-35
lines changed

WinPartFlash.Gui/Compression/CompressionStreamCopierExtension.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ public static IServiceCollection AddCompressionStreamCopier(this IServiceCollect
88
{
99
services.AddSingleton<RawStreamCopier>();
1010
services.AddSingleton<GzipCompressionStreamCopier>();
11-
services.AddSingleton<GzipDeCompressionStreamCopier>();
11+
services.AddSingleton<GzipDecompressionStreamCopier>();
12+
services.AddSingleton<XzDecompressionStreamCopier>();
13+
services.AddSingleton<ZstandardCompressionStreamCopier>();
14+
services.AddSingleton<ZstandardDecompressionStreamCopier>();
15+
services.AddSingleton<Lz4CompressionStreamCopier>();
16+
services.AddSingleton<Lz4DecompressionStreamCopier>();
1217
services.AddSingleton<ICompressionStreamCopierFactory, CompressionStreamCopierFactory>();
1318
return services;
1419
}

WinPartFlash.Gui/Compression/CompressionStreamCopierFactory.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@ public ICompressionStreamCopier GetCopier(CompressionType compressionType)
1111
{
1212
CompressionType.Raw => serviceProvider.GetRequiredService<RawStreamCopier>(),
1313
CompressionType.GzipCompress => serviceProvider.GetRequiredService<GzipCompressionStreamCopier>(),
14-
CompressionType.GzipDecompress => serviceProvider.GetRequiredService<GzipDeCompressionStreamCopier>(),
15-
// TODO: Support following methods
16-
CompressionType.Lz4Compress => throw new NotSupportedException(),
17-
CompressionType.Lz4Decompress => throw new NotSupportedException(),
14+
CompressionType.GzipDecompress => serviceProvider.GetRequiredService<GzipDecompressionStreamCopier>(),
15+
CompressionType.Lz4Compress => serviceProvider.GetRequiredService<Lz4CompressionStreamCopier>(),
16+
CompressionType.Lz4Decompress => serviceProvider.GetRequiredService<Lz4DecompressionStreamCopier>(),
17+
CompressionType.XzDecompress => serviceProvider.GetRequiredService<XzDecompressionStreamCopier>(),
18+
CompressionType.ZstandardCompress => serviceProvider.GetRequiredService<ZstandardCompressionStreamCopier>(),
19+
CompressionType.ZstandardDecompress => serviceProvider
20+
.GetRequiredService<ZstandardDecompressionStreamCopier>(),
1821
_ => throw new ArgumentOutOfRangeException(nameof(compressionType), compressionType, null)
1922
};
2023
}

WinPartFlash.Gui/Compression/CompressionType.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,8 @@ public enum CompressionType
66
GzipCompress,
77
GzipDecompress,
88
Lz4Compress,
9-
Lz4Decompress
9+
Lz4Decompress,
10+
ZstandardCompress,
11+
ZstandardDecompress,
12+
XzDecompress
1013
}

WinPartFlash.Gui/Compression/GzipDecompressionStreamCopier.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44

55
namespace WinPartFlash.Gui.Compression;
66

7-
public class GzipDeCompressionStreamCopier : ICompressionStreamCopier
7+
public class GzipDecompressionStreamCopier : ICompressionStreamCopier
88
{
99
public async ValueTask CopyToStreamAsync(Stream sourceStream, Stream outputStream)
1010
{
11-
await using var compressionStream = new GZipStream(outputStream, CompressionMode.Decompress);
12-
await compressionStream.CopyToAsync(sourceStream);
11+
await using var decompressionStream = new GZipStream(sourceStream, CompressionMode.Decompress);
12+
await decompressionStream.CopyToAsync(outputStream);
1313
}
1414
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System.IO;
2+
using System.Threading.Tasks;
3+
using K4os.Compression.LZ4.Streams;
4+
5+
namespace WinPartFlash.Gui.Compression;
6+
7+
public class Lz4CompressionStreamCopier : ICompressionStreamCopier
8+
{
9+
public async ValueTask CopyToStreamAsync(Stream sourceStream, Stream outputStream)
10+
{
11+
await using var compressionStream = LZ4Stream.Encode(outputStream);
12+
await sourceStream.CopyToAsync(compressionStream);
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System.IO;
2+
using System.Threading.Tasks;
3+
using K4os.Compression.LZ4.Streams;
4+
5+
namespace WinPartFlash.Gui.Compression;
6+
7+
public class Lz4DecompressionStreamCopier : ICompressionStreamCopier
8+
{
9+
public async ValueTask CopyToStreamAsync(Stream sourceStream, Stream outputStream)
10+
{
11+
await using var decompressionStream = LZ4Stream.Decode(sourceStream);
12+
await decompressionStream.CopyToAsync(outputStream);
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System.IO;
2+
using System.Threading.Tasks;
3+
using SharpCompress.Compressors.Xz;
4+
5+
namespace WinPartFlash.Gui.Compression;
6+
7+
public class XzDecompressionStreamCopier : ICompressionStreamCopier
8+
{
9+
public async ValueTask CopyToStreamAsync(Stream sourceStream, Stream outputStream)
10+
{
11+
await using var decompressionStream = new XZStream(sourceStream);
12+
await decompressionStream.CopyToAsync(outputStream);
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System.IO;
2+
using System.Threading.Tasks;
3+
using ZstdSharp;
4+
5+
namespace WinPartFlash.Gui.Compression;
6+
7+
public class ZstandardCompressionStreamCopier : ICompressionStreamCopier
8+
{
9+
public async ValueTask CopyToStreamAsync(Stream sourceStream, Stream outputStream)
10+
{
11+
await using var compressionStream = new CompressionStream(outputStream);
12+
await sourceStream.CopyToAsync(compressionStream);
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System.IO;
2+
using System.Threading.Tasks;
3+
using ZstdSharp;
4+
5+
namespace WinPartFlash.Gui.Compression;
6+
7+
public class ZstandardDecompressionStreamCopier : ICompressionStreamCopier
8+
{
9+
public async ValueTask CopyToStreamAsync(Stream sourceStream, Stream outputStream)
10+
{
11+
await using var decompressionStream = new DecompressionStream(sourceStream);
12+
await decompressionStream.CopyToAsync(outputStream);
13+
}
14+
}

WinPartFlash.Gui/FileOpenHelper/FileOpenHelper.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Net.Http;
66
using System.Threading.Tasks;
77
using WinPartFlash.Gui.Compression;
8+
using WinPartFlash.Gui.Utils;
89

910
namespace WinPartFlash.Gui.FileOpenHelper;
1011

@@ -13,8 +14,11 @@ public class FileOpenHelper(IHttpClientFactory clientFactory) : IFileOpenHelper
1314
private static readonly Dictionary<string, CompressionType> ContentTypeMapping =
1415
new()
1516
{
16-
{ "application/gzip", CompressionType.GzipDecompress },
17-
{ "application/x-gzip", CompressionType.GzipDecompress }
17+
{ FileNameHelpers.ContentTypeGzip, CompressionType.GzipDecompress },
18+
{ FileNameHelpers.ContentTypeGzipDeprecated, CompressionType.GzipDecompress },
19+
{ FileNameHelpers.ContentTypeXz, CompressionType.XzDecompress },
20+
{ FileNameHelpers.ContentTypeLz4, CompressionType.Lz4Compress },
21+
{ FileNameHelpers.ContentTypeZstandard, CompressionType.ZstandardDecompress }
1822
};
1923

2024
private readonly IReadOnlyList<IFileOpenHelper> _helpers =
@@ -26,10 +30,16 @@ public class FileOpenHelper(IHttpClientFactory clientFactory) : IFileOpenHelper
2630
private static CompressionType DetectFromFileName(string fileName)
2731
{
2832
fileName = fileName.Trim('\"');
29-
if (fileName.EndsWith(".gz"))
33+
if (fileName.EndsWith(FileNameHelpers.FileExtensionGzip))
3034
return CompressionType.GzipDecompress;
31-
if (fileName.EndsWith(".lz4"))
35+
if (fileName.EndsWith(FileNameHelpers.FileExtensionLz4))
3236
return CompressionType.Lz4Decompress;
37+
if (fileName.EndsWith(FileNameHelpers.FileExtensionXz))
38+
return CompressionType.XzDecompress;
39+
if (fileName.EndsWith(FileNameHelpers.FileExtensionLz4))
40+
return CompressionType.Lz4Decompress;
41+
if (fileName.EndsWith(FileNameHelpers.FileExtensionZstandard))
42+
return CompressionType.ZstandardDecompress;
3343

3444
return CompressionType.Raw;
3545
}

0 commit comments

Comments
 (0)