A framework for building convergent cross-platform Nextcloud clients using Flutter.
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.

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