part of '../neon_files.dart'; sealed class FilesTask { FilesTask({ required this.path, }); final List path; @protected final streamController = StreamController(); /// Task progress in percent [0, 1]. late final progress = streamController.stream.asBroadcastStream(); } abstract class FilesDownloadTask extends FilesTask { FilesDownloadTask({required super.path}); } class FilesDownloadFileTask extends FilesDownloadTask { FilesDownloadFileTask({ required super.path, required this.file, }); final File file; Future execute(final NextcloudClient client) async { await client.webdav.getFile( Uri(pathSegments: path), file, onProgress: streamController.add, ); await streamController.close(); } } abstract class FilesUploadTask extends FilesTask { FilesUploadTask({required super.path}); int get size; DateTime? get modified; } class FilesUploadFileTask extends FilesUploadTask { FilesUploadFileTask({ required super.path, required this.file, }); final File file; FileStat? _stat; FileStat get stat => _stat ??= file.statSync(); @override int get size => stat.size; @override DateTime? get modified => stat.modified; Future execute(final NextcloudClient client) async { await client.webdav.putFile( file, stat, Uri(pathSegments: path), lastModified: stat.modified, onProgress: streamController.add, ); await streamController.close(); } } class FilesUploadBytesTask extends FilesUploadTask { FilesUploadBytesTask({ required super.path, required this.bytes, this.modified, }); final Uint8List bytes; @override int get size => bytes.lengthInBytes; @override DateTime? modified; Future execute(final NextcloudClient client) async { await client.webdav.putStream( Stream.value(bytes), Uri(pathSegments: path), lastModified: modified, contentLength: bytes.lengthInBytes, onProgress: (final progress) { streamController.add(progress); }, ); } }