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 : }
|