|
|
|
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);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|