WIP: local conflict detection - not working, because most platforms have no direct access to local file system.

This commit is contained in:
Herbert Poul
2021-07-30 15:44:02 +02:00
parent 8f874e1f76
commit 6c9040e0ed
2 changed files with 60 additions and 1 deletions

View File

@ -8,11 +8,14 @@ import 'package:authpass/utils/path_utils.dart';
import 'package:authpass/utils/platform.dart';
import 'package:authpass/utils/uuid_util.dart';
import 'package:file_picker_writable/file_picker_writable.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:logging/logging.dart';
import 'package:macos_secure_bookmarks/macos_secure_bookmarks.dart';
import 'package:path/path.dart' as path;
import 'package:pedantic/pedantic.dart';
part 'file_source_local.g.dart';
final _logger = Logger('file_source_local');
class FileSourceLocal extends FileSource {
@ -67,7 +70,27 @@ class FileSourceLocal extends FileSource {
@override
Stream<FileContent> load() async* {
yield await _accessFile((f) async => FileContent(await f.readAsBytes()));
yield await _accessFile((f) async {
final lastModified = f.lastModifiedSync();
final fileSize = f.lengthSync();
final bytes = await f.readAsBytes();
if (bytes.lengthInBytes != fileSize) {
throw StateError('length in filesystem different from read bytes. '
'filesystem Size: $fileSize, read: ${bytes.lengthInBytes}');
}
final newLastModified = f.lastModifiedSync();
if (lastModified != newLastModified) {
throw StateError('File changed while reading file. '
'old: $lastModified / new: $newLastModified');
}
return FileContent(
bytes,
FileSourceLocalMetadata(
lastModifiedAt: lastModified,
length: fileSize,
).toJson(),
);
});
}
Future<T> _accessFile<T>(Future<T> Function(File file) cb) async {
@ -205,3 +228,17 @@ class FileSourceLocal extends FileSource {
macOsSecureBookmark != null ? 'macOsSecureBookmark' : 'internal',
};
}
@JsonSerializable()
class FileSourceLocalMetadata {
FileSourceLocalMetadata({
required this.lastModifiedAt,
required this.length,
});
factory FileSourceLocalMetadata.fromJson(Map<String, dynamic> json) =>
_$FileSourceLocalMetadataFromJson(json);
Map<String, dynamic> toJson() => _$FileSourceLocalMetadataToJson(this);
final DateTime lastModifiedAt;
final int length;
}

View File

@ -0,0 +1,22 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'file_source_local.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
FileSourceLocalMetadata _$FileSourceLocalMetadataFromJson(
Map<String, dynamic> json) {
return FileSourceLocalMetadata(
lastModifiedAt: DateTime.parse(json['lastModifiedAt'] as String),
length: json['length'] as int,
);
}
Map<String, dynamic> _$FileSourceLocalMetadataToJson(
FileSourceLocalMetadata instance) =>
<String, dynamic>{
'lastModifiedAt': instance.lastModifiedAt.toIso8601String(),
'length': instance.length,
};