// 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> streamFactory, Func>>? minorMetadataFactory = null) : StreamResourceEntryBase(path, createdUtc, lastModificationUtc) { public override long Size => _stream == null ? size : _stream.Length; private Stream? _stream; public async Task 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 OpenRead(CancellationToken cancellationToken) => _stream != null ? _stream : (await streamFactory(cancellationToken).ConfigureAwait(false) ?? throw new FileNotFoundException($"Resource not found: {Path}")); public override Task> GetMinorMetadata(CancellationToken cancellationToken) => minorMetadataFactory != null ? minorMetadataFactory(cancellationToken) : base.GetMinorMetadata(cancellationToken); }