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

@@ -4,37 +4,28 @@ using FileTime.Core.Models;
namespace FileTime.Tools.VirtualDiskSources;
public class VirtualDiskContentReaderFactory : IContentReaderFactory<VirtualDiskContentProvider>
public sealed class VirtualDiskContentReaderFactory : SubContentReaderBase<VirtualDiskContentProvider>
{
private readonly IContentAccessorFactory _contentAccessorFactory;
public VirtualDiskContentReaderFactory(IContentAccessorFactory contentAccessorFactory)
public VirtualDiskContentReaderFactory(IContentAccessorFactory contentAccessorFactory)
: base(contentAccessorFactory)
{
_contentAccessorFactory = contentAccessorFactory;
}
public async Task<IContentReader> CreateContentReaderAsync(IElement element)
public override async Task<IContentReader> CreateContentReaderAsync(IElement element)
{
if (element.Provider is not VirtualDiskContentProvider provider)
throw new ArgumentException(
"Provider must be VirtualDiskContentProvider, but it is " + element.Provider.GetType(),
$"Provider must be {nameof(VirtualDiskContentProvider)}, but it is " + element.Provider.GetType(),
nameof(element));
var elementNativePath = element.NativePath!;
var supportedPath = (await provider.ParentContentProvider.GetSupportedPathPart(elementNativePath))!;
var parentElement = (IElement) await provider.ParentContentProvider.GetItemByNativePathAsync(supportedPath, element.PointInTime);
var contentReaderFactory = _contentAccessorFactory.GetContentReaderFactory(parentElement.Provider);
var reader = await contentReaderFactory.CreateContentReaderAsync(parentElement);
var parentElementReaderContext = await GetParentElementReaderAsync(element, provider);
var reader = parentElementReaderContext.ContentReader;
var subPath = parentElementReaderContext.SubNativePath;
var readerStream = reader.AsStream();
var discReader = new UdfReader(readerStream);
var subPath = elementNativePath.Path.Substring(supportedPath.Path.Length + 2 + Constants.SubContentProviderRootContainer.Length);
var fileInfo = discReader.GetFileInfo(subPath);
var fileInfo = discReader.GetFileInfo(subPath.Path);
var contentReader = fileInfo.Open(FileMode.Open, FileAccess.Read);