Database files are added to the mru instead of the fal

Simplify opening database workflow
Corrected opening from recent bug
This commit is contained in:
Geoffroy BONNEVILLE
2020-04-24 13:58:30 +02:00
parent d211453553
commit eacb3b182e
9 changed files with 25 additions and 58 deletions

View File

@@ -7,9 +7,8 @@ namespace ModernKeePass.Application.Common.Interfaces
public interface IRecentProxy public interface IRecentProxy
{ {
int EntryCount { get; } int EntryCount { get; }
Task<FileInfo> Get(string token, bool updateAccessTime = false); Task<byte[]> Get(string token, bool updateAccessTime = true);
IEnumerable<FileInfo> GetAll(); IEnumerable<FileInfo> GetAll();
Task Add(FileInfo recentItem);
void ClearAll(); void ClearAll();
} }
} }

View File

@@ -9,18 +9,15 @@ namespace ModernKeePass.Application.Database.Commands.CloseDatabase
public class CloseDatabaseCommandHandler : IRequestHandler<CloseDatabaseCommand> public class CloseDatabaseCommandHandler : IRequestHandler<CloseDatabaseCommand>
{ {
private readonly IDatabaseProxy _database; private readonly IDatabaseProxy _database;
private readonly IFileProxy _file;
public CloseDatabaseCommandHandler(IDatabaseProxy database, IFileProxy file) public CloseDatabaseCommandHandler(IDatabaseProxy database)
{ {
_database = database; _database = database;
_file = file;
} }
public void Handle(CloseDatabaseCommand message) public void Handle(CloseDatabaseCommand message)
{ {
if (!_database.IsOpen) throw new DatabaseClosedException(); if (!_database.IsOpen) throw new DatabaseClosedException();
_database.CloseDatabase(); _database.CloseDatabase();
_file.ReleaseFile(_database.FileAccessToken);
// Cleanup // Cleanup
_database.FileAccessToken = null; _database.FileAccessToken = null;

View File

@@ -16,18 +16,20 @@ namespace ModernKeePass.Application.Database.Queries.OpenDatabase
{ {
private readonly IDatabaseProxy _database; private readonly IDatabaseProxy _database;
private readonly IFileProxy _file; private readonly IFileProxy _file;
private readonly IRecentProxy _recent;
public OpenDatabaseQueryHandler(IDatabaseProxy database, IFileProxy file) public OpenDatabaseQueryHandler(IDatabaseProxy database, IFileProxy file, IRecentProxy recent)
{ {
_database = database; _database = database;
_file = file; _file = file;
_recent = recent;
} }
public async Task Handle(OpenDatabaseQuery message) public async Task Handle(OpenDatabaseQuery message)
{ {
if (_database.IsDirty) throw new DatabaseOpenException(); if (_database.IsDirty) throw new DatabaseOpenException();
var file = await _file.OpenBinaryFile(message.FilePath); var file = await _recent.Get(message.FilePath);
var hasKeyFile = !string.IsNullOrEmpty(message.KeyFilePath); var hasKeyFile = !string.IsNullOrEmpty(message.KeyFilePath);
await _database.Open(file, new Credentials await _database.Open(file, new Credentials
{ {

View File

@@ -1,33 +1,30 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks; using System.Threading.Tasks;
using Windows.Storage.AccessCache; using Windows.Storage.AccessCache;
using ModernKeePass.Application.Common.Interfaces; using ModernKeePass.Application.Common.Interfaces;
using ModernKeePass.Domain.Dtos; using ModernKeePass.Domain.Dtos;
using Windows.Storage;
namespace ModernKeePass.Infrastructure.UWP namespace ModernKeePass.Infrastructure.UWP
{ {
public class UwpRecentFilesClient: IRecentProxy public class UwpRecentFilesClient: IRecentProxy
{ {
private readonly StorageItemMostRecentlyUsedList _mru = StorageApplicationPermissions.MostRecentlyUsedList; private readonly StorageItemMostRecentlyUsedList _mru = StorageApplicationPermissions.MostRecentlyUsedList;
private readonly StorageItemAccessList _fal = StorageApplicationPermissions.FutureAccessList;
public int EntryCount => _mru.Entries.Count; public int EntryCount => _mru.Entries.Count;
public async Task<FileInfo> Get(string token, bool updateAccessTime = false) public async Task<byte[]> Get(string token, bool updateAccessTime = true)
{ {
try try
{ {
var file = await _mru.GetFileAsync(token, var file = await _mru.GetFileAsync(token,
updateAccessTime ? AccessCacheOptions.None : AccessCacheOptions.SuppressAccessTimeUpdate).AsTask().ConfigureAwait(false); updateAccessTime ? AccessCacheOptions.None : AccessCacheOptions.SuppressAccessTimeUpdate).AsTask().ConfigureAwait(false);
_fal.AddOrReplace(token, file, file.Name);
return new FileInfo var result = await FileIO.ReadBufferAsync(file).AsTask();
{ return result.ToArray();
Id = token,
Name = file.DisplayName,
Path = file.Path
};
} }
catch (Exception) catch (Exception)
{ {
@@ -45,18 +42,11 @@ namespace ModernKeePass.Infrastructure.UWP
Path = e.Metadata Path = e.Metadata
}); });
} }
public async Task Add(FileInfo recentItem)
{
var file = await _fal.GetFileAsync(recentItem.Id).AsTask();
_mru.Add(file, file.Path);
}
public void ClearAll() public void ClearAll()
{ {
foreach (var entry in _mru.Entries) foreach (var entry in _mru.Entries)
{ {
if (_fal.ContainsItem(entry.Token)) _fal.Remove(entry.Token);
_mru.Remove(entry.Token); _mru.Remove(entry.Token);
} }
} }

View File

@@ -48,7 +48,7 @@ namespace ModernKeePass.Views
Path = file.Path, Path = file.Path,
Name = file.DisplayName Name = file.DisplayName
}; };
await Model.OpenFile(fileInfo); Model.OpenFile(fileInfo);
} }
private void ImportFormatComboBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e) private void ImportFormatComboBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)

View File

@@ -22,13 +22,13 @@ namespace ModernKeePass.Views
InitializeComponent(); InitializeComponent();
} }
protected override async void OnNavigatedTo(NavigationEventArgs e) protected override void OnNavigatedTo(NavigationEventArgs e)
{ {
base.OnNavigatedTo(e); base.OnNavigatedTo(e);
var file = e.Parameter as FileInfo; var file = e.Parameter as FileInfo;
if (file != null) if (file != null)
{ {
await Model.OpenFile(file); Model.OpenFile(file);
} }
} }
@@ -45,14 +45,16 @@ namespace ModernKeePass.Views
var file = await picker.PickSingleFileAsync().AsTask(); var file = await picker.PickSingleFileAsync().AsTask();
if (file == null) return; if (file == null) return;
var token = StorageApplicationPermissions.FutureAccessList.Add(file, file.Name); //var token = StorageApplicationPermissions.FutureAccessList.Add(file, file.Name);
// TODO: use service
var token = StorageApplicationPermissions.MostRecentlyUsedList.Add(file, file.Name);
var fileInfo = new FileInfo var fileInfo = new FileInfo
{ {
Path = file.Path, Path = file.Path,
Name = file.DisplayName, Name = file.DisplayName,
Id = token Id = token
}; };
await Model.OpenFile(fileInfo); Model.OpenFile(fileInfo);
} }
} }
} }

View File

@@ -36,7 +36,7 @@ namespace ModernKeePass.ViewModels
} }
} }
public NewVm(IMediator mediator, IRecentProxy recent, ISettingsProxy settings, INavigationService navigation) : base(recent) public NewVm(IMediator mediator, IRecentProxy recent, ISettingsProxy settings, INavigationService navigation)
{ {
_mediator = mediator; _mediator = mediator;
_settings = settings; _settings = settings;

View File

@@ -1,13 +1,10 @@
using System.Threading.Tasks; using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight;
using ModernKeePass.Application.Common.Interfaces;
using ModernKeePass.Domain.Dtos; using ModernKeePass.Domain.Dtos;
namespace ModernKeePass.ViewModels namespace ModernKeePass.ViewModels
{ {
public class OpenVm: ViewModelBase public class OpenVm: ViewModelBase
{ {
private readonly IRecentProxy _recent;
private string _name; private string _name;
private string _path; private string _path;
private string _token; private string _token;
@@ -31,23 +28,12 @@ namespace ModernKeePass.ViewModels
private set { Set(() => Path, ref _path, value); } private set { Set(() => Path, ref _path, value); }
} }
public OpenVm(IRecentProxy recent) public void OpenFile(FileInfo file)
{
_recent = recent;
}
public async Task OpenFile(FileInfo file)
{ {
Token = file.Id; Token = file.Id;
Name = file.Name; Name = file.Name;
Path = file.Path; Path = file.Path;
RaisePropertyChanged(nameof(IsFileSelected)); RaisePropertyChanged(nameof(IsFileSelected));
await AddToRecentList(file);
}
private async Task AddToRecentList(FileInfo file)
{
await _recent.Add(file);
} }
} }
} }

View File

@@ -1,17 +1,15 @@
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using System.Windows.Input; using System.Windows.Input;
using GalaSoft.MvvmLight; using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command; using GalaSoft.MvvmLight.Command;
using Messages;
using ModernKeePass.Application.Common.Interfaces; using ModernKeePass.Application.Common.Interfaces;
using ModernKeePass.Domain.Interfaces; using ModernKeePass.Domain.Interfaces;
using ModernKeePass.ViewModels.ListItems; using ModernKeePass.ViewModels.ListItems;
namespace ModernKeePass.ViewModels namespace ModernKeePass.ViewModels
{ {
public class RecentVm : ViewModelBase, IHasSelectableObject public class RecentVm : ObservableObject, IHasSelectableObject
{ {
private readonly IRecentProxy _recent; private readonly IRecentProxy _recent;
private ISelectableModel _selectedItem; private ISelectableModel _selectedItem;
@@ -52,15 +50,8 @@ namespace ModernKeePass.ViewModels
RecentItems = new ObservableCollection<RecentItemVm>(recentItems); RecentItems = new ObservableCollection<RecentItemVm>(recentItems);
if (RecentItems.Count > 0) if (RecentItems.Count > 0)
SelectedItem = RecentItems[0]; SelectedItem = RecentItems[0];
MessengerInstance.Register<DatabaseOpeningMessage>(this, async action => await UpdateAccessTime(action.Token));
} }
private async Task UpdateAccessTime(string token)
{
await _recent.Get(token, true);
}
private void ClearAll() private void ClearAll()
{ {
_recent.ClearAll(); _recent.ClearAll();