ContentReader for Compressed (+read content for provider)
This commit is contained in:
@@ -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();
|
||||
}
|
||||
Reference in New Issue
Block a user