Files
duplicati/proprietary/GoogleWorkspace/SourceItems/StreamResourceEntryFunction.cs
T
Kenneth Skovhede da246874ec Initial implementation of Google Workspace backup.
This is a WIP and still needs the restore part implemented.

Not all resources are fully tested but basic elements work.
2026-02-04 15:44:23 +01:00

41 lines
1.6 KiB
C#

// Copyright (c) 2026 Duplicati Inc. All rights reserved.
namespace Duplicati.Proprietary.GoogleWorkspace.SourceItems;
internal class StreamResourceEntryFunction(string path, DateTime createdUtc, DateTime lastModificationUtc, long size, Func<CancellationToken, Task<Stream>> streamFactory, Func<CancellationToken, Task<Dictionary<string, string?>>>? minorMetadataFactory = null)
: StreamResourceEntryBase(path, createdUtc, lastModificationUtc)
{
public override long Size => _stream == null ? size : _stream.Length;
private Stream? _stream;
public async Task<bool> ProbeIfExistsAsync(CancellationToken cancellationToken)
{
if (_stream != null)
return true;
try
{
_stream = await streamFactory(cancellationToken).ConfigureAwait(false);
return _stream != null;
}
catch (FileNotFoundException)
{
return false;
}
catch (HttpRequestException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
{
return false;
}
}
public override async Task<Stream> OpenRead(CancellationToken cancellationToken)
=> _stream != null
? _stream
: (await streamFactory(cancellationToken).ConfigureAwait(false) ?? throw new FileNotFoundException($"Resource not found: {Path}"));
public override Task<Dictionary<string, string?>> GetMinorMetadata(CancellationToken cancellationToken)
=> minorMetadataFactory != null
? minorMetadataFactory(cancellationToken)
: base.GetMinorMetadata(cancellationToken);
}