Files
FileTime2/src/Tools/FileTime.Tools.VirtualDiskSources/VirtualDiskContentProvider.cs
2023-09-15 21:46:17 +02:00

51 lines
1.9 KiB
C#

using DiscUtils.Udf;
using FileTime.Core.ContentAccess;
using FileTime.Core.Models;
using FileTime.Core.Timeline;
namespace FileTime.Tools.VirtualDiskSources;
public sealed class VirtualDiskContentProvider : SubContentProviderBase, IVirtualDiskContentProvider
{
private readonly ITimelessContentProvider _timelessContentProvider;
public VirtualDiskContentProvider(
ITimelessContentProvider timelessContentProvider,
IContentAccessorFactory contentAccessorFactory,
IContentProvider parentContentProvider)
: base(
timelessContentProvider,
contentAccessorFactory,
parentContentProvider,
"virtual-disk"
)
{
_timelessContentProvider = timelessContentProvider;
}
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.GetStream();
using var discReader = new UdfReader(readerStream);
var fileInfo = discReader.GetFileInfo(subPath);
await using var contentReader = fileInfo.Open(FileMode.Open, FileAccess.Read);
var data = new byte[1024 * 1024];
var readAsync = await contentReader.ReadAsync(data, cancellationToken);
return data[..readAsync].ToArray();
}
public override async ValueTask<VolumeSizeInfo?> GetVolumeSizeInfoAsync(FullName path)
{
var item = await GetItemByFullNameAsync(path, _timelessContentProvider.CurrentPointInTime.Value!);
var parentElement = await GetParentElementAsync(item);
return new VolumeSizeInfo(parentElement.Size, 0);
}
}