You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.1 KiB
102 lines
2.1 KiB
part of '../neon_files.dart'; |
|
|
|
sealed class FilesTask { |
|
FilesTask({ |
|
required this.path, |
|
}); |
|
|
|
final List<String> path; |
|
|
|
@protected |
|
final streamController = StreamController<double>(); |
|
|
|
/// 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<void> 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<void> 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<void> 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); |
|
}, |
|
); |
|
} |
|
}
|
|
|