ContentReader for Compressed (+read content for provider)

This commit is contained in:
2023-09-05 22:24:25 +02:00
parent e6fd8d4ab5
commit def5ece688
15 changed files with 195 additions and 57 deletions

View File

@@ -1,22 +1,42 @@
using System.Text;
using FileTime.Core.ContentAccess;
using FileTime.Core.ContentAccess;
using FileTime.Core.Models;
using FileTime.Core.Timeline;
using SharpCompress.Archives;
namespace FileTime.Tools.Compression.ContentProvider;
public class CompressedContentProvider : SubContentProviderBase, ICompressedContentProvider
public sealed class CompressedContentProvider : SubContentProviderBase, ICompressedContentProvider
{
public CompressedContentProvider(
IContentProvider parentContentProvider,
ITimelessContentProvider timelessContentProvider
ITimelessContentProvider timelessContentProvider,
IContentAccessorFactory contentAccessorFactory,
IContentProvider parentContentProvider
)
: base(parentContentProvider, "compression", timelessContentProvider)
: base(
timelessContentProvider,
contentAccessorFactory,
parentContentProvider,
"compression")
{
}
public override Task<byte[]?> GetContentAsync(IElement element, int? maxLength = null, CancellationToken cancellationToken = default)
=> Task.FromResult((byte[]?)"Not implemented..."u8.ToArray());
public override async Task<byte[]?> GetContentAsync(IElement element, int? maxLength = null, CancellationToken cancellationToken = default)
{
var parentElementContext = await GetParentElementReaderAsync(element);
var reader = parentElementContext.ContentReader;
var subPath = parentElementContext.SubNativePath.Path;
await using var readerStream = reader.AsStream();
using var archive = ArchiveFactory.Open(readerStream);
var entry = archive.Entries.First(e => e.Key == subPath);
await using var contentReader= entry.OpenEntryStream();
var data = new byte[1024 * 1024];
var readAsync = await contentReader.ReadAsync(data, cancellationToken);
return data[..readAsync].ToArray();
}
public override VolumeSizeInfo? GetVolumeSizeInfo(FullName path) => throw new NotImplementedException();
}