Line data Source code
1 : // Copyright 2023 The terCAD team. All rights reserved. 2 : // Use of this source code is governed by a CC BY-NC-ND 4.0 license that can be found in the LICENSE file. 3 : 4 : import 'package:app_finance/_classes/herald/app_locale.dart'; 5 : import 'package:app_finance/_classes/storage/transaction_log/abstract_protocol.dart'; 6 : import 'package:app_finance/_classes/storage/transaction_log/interface_protocol.dart'; 7 : import 'package:app_finance/_classes/storage/transaction_log/web_dav_data.dart'; 8 : import 'package:flutter/foundation.dart'; 9 : import 'package:webdav_client/webdav_client.dart'; 10 : 11 : class WebDavProtocol extends AbstractProtocol implements InterfaceProtocol { 12 : @override 13 : final Function callbackMessage; 14 : @override 15 : final Function callbackProgress; 16 : String message = ''; 17 : bool inProgress = false; 18 : 19 0 : WebDavProtocol({ 20 : required this.callbackMessage, 21 : required this.callbackProgress, 22 : }); 23 : 24 0 : Future<Client?> _connect(WebDavData data) async { 25 0 : if (data.isEmpty()) { 26 0 : callbackMessage(message = AppLocale.labels.isRequired); 27 : return null; 28 : } 29 0 : callbackProgress(inProgress = true); 30 0 : Client? client = newClient(data.link, user: data.username, password: data.password); 31 0 : client = await client.ping().then((_) => client).onError((error, _) { 32 0 : callbackMessage(message = AppLocale.labels.error(error.toString())); 33 0 : callbackProgress(inProgress = false); 34 : return null; 35 : }); 36 : return client; 37 : } 38 : 39 0 : @override 40 : Future<void> save(data) async { 41 0 : final client = await _connect(data); 42 : if (client == null) { 43 : return; 44 : } 45 0 : final codeUnits = await exportTransactions(); 46 0 : final Uint8List unit8List = Uint8List.fromList(codeUnits); 47 0 : callbackMessage(message = ''); 48 0 : await client.write(data.path, unit8List).catchError((err) { 49 0 : callbackMessage(message = AppLocale.labels.error(err.toString())); 50 0 : callbackProgress(inProgress = false); 51 : }); 52 0 : callbackProgress(inProgress = false); 53 0 : if (message == '') { 54 0 : callbackMessage(message = AppLocale.labels.success); 55 : } 56 : } 57 : 58 0 : @override 59 : Future<void> load(data, [bool isEncrypted = true, bool isCleaned = false]) async { 60 0 : final client = await _connect(data); 61 : if (client == null) { 62 : return; 63 : } 64 0 : final content = await client.read(data.path).catchError((err) { 65 0 : callbackMessage(message = AppLocale.labels.error(err.toString())); 66 0 : callbackProgress(inProgress = false); 67 0 : return Future<List<int>>.value([]); 68 : }); 69 : if (isCleaned) { 70 0 : clearTransactions(); 71 : } 72 0 : importTransactions(content, isEncrypted); 73 0 : callbackProgress(inProgress = false); 74 0 : if (message == '') { 75 0 : callbackMessage(message = AppLocale.labels.success); 76 : } 77 : } 78 : }