From 551e081624c1708b5c82b48afc33f27fbdde5745 Mon Sep 17 00:00:00 2001 From: Jan Heinrich Reimer Date: Sat, 7 Nov 2020 15:15:00 +0100 Subject: [PATCH] Add draft Nextcloud sync service --- lib/sync/nextcloud/nextcloud_sync.dart | 72 ++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 lib/sync/nextcloud/nextcloud_sync.dart diff --git a/lib/sync/nextcloud/nextcloud_sync.dart b/lib/sync/nextcloud/nextcloud_sync.dart new file mode 100644 index 0000000..7ef3313 --- /dev/null +++ b/lib/sync/nextcloud/nextcloud_sync.dart @@ -0,0 +1,72 @@ +import 'dart:io'; + +import 'package:flutter/widgets.dart'; +import 'package:http/http.dart'; +import 'package:nextcloud/nextcloud.dart'; +import 'package:nextcloud/nextcloud.dart' as nc; +import 'package:txt/sync/file.dart'; +import 'package:txt/sync/sync.dart'; + +class NextcloudSyncService implements SyncService { + NextCloudClient client; + + @override + Future authorize(BuildContext context) async { + // TODO Show login GUI. + client = NextCloudClient( + "cloud.reimer.family", "test", "jx@Wf*FfLknD+F=,MpUXHi&~veKtKq:="); + // TODO Test connection e.g. via user backend. + } + + @override + Future getAccountName() async { + nc.MetaData metadata = await client.users.getMetaData(client.username); + return "${metadata.fullName} (${client.username})"; + } + + @override + Future> listFolder(String path) async { + List files = await client.webDav.ls(path); + return files + .map((file) => NextcloudRemoteFile(file)) + .toList(growable: false); + } + + @override + Future download(String remotePath, String localPath) async { + ByteStream downloadStream = await client.webDav.downloadStream(remotePath); + File localFile = File(localPath); + if (localFile.existsSync()) localFile.deleteSync(); + IOSink localSink = localFile.openWrite(); + await localSink.addStream(downloadStream); + await localSink.close(); + } + + @override + Future upload(String localPath, String remotePath) async { + File localFile = File(localPath); + var localData = await localFile.readAsBytes(); + await client.webDav.upload(localData, remotePath); + } +} + +class NextcloudRemoteFile extends RemoteFile { + final WebDavFile file; + + NextcloudRemoteFile(this.file); + + @override + DateTime get createdDate => file.createdDate; + + @override + bool get isDirectory => file.isDirectory; + + @override + DateTime get lastModified => file.lastModified; + + @override + String get path => file.path; + + @override + int get size => file.size; +}