From 1e7662def791147645f1e6667523feda9b438761 Mon Sep 17 00:00:00 2001 From: Geoffroy BONNEVILLE Date: Mon, 4 May 2020 12:48:27 +0200 Subject: [PATCH] Save error is now handled via Messenger instead of unhandled exception handler (which didn't work) Save as actually works now WIP Styles Code cleanup --- .../Common/Interfaces/IDatabaseProxy.cs | 1 - .../Common/Interfaces/IFileProxy.cs | 7 +- .../CreateDatabase/CreateDatabaseCommand.cs | 8 +-- .../SaveDatabase/SaveDatabaseCommand.cs | 27 +++----- .../UpdateCredentialsCommand.cs | 2 +- .../Queries/OpenDatabase/OpenDatabaseQuery.cs | 4 +- .../ReOpenDatabase/ReOpenDatabaseQuery.cs | 2 +- ModernKeePass.Domain/Common/Constants.cs | 6 ++ .../KeePass/KeePassDatabaseClient.cs | 9 --- .../UWP/StorageFileClient.cs | 53 ++++++++++++++- ModernKeePass/App.xaml.cs | 66 ++++++------------- ModernKeePass/DependencyInjection.cs | 2 + .../ResourceDictionaries/Styles.xaml | 3 + ModernKeePass/ViewModels/EntryDetailVm.cs | 13 +++- ModernKeePass/ViewModels/GroupDetailVm.cs | 13 +++- ModernKeePass/ViewModels/MainVm.cs | 1 + .../Views/MainPageFrames/NewDatabasePage.xaml | 2 +- .../MainPageFrames/NewDatabasePage.xaml.cs | 28 +------- .../MainPageFrames/OpenDatabasePage.xaml | 2 +- .../MainPageFrames/OpenDatabasePage.xaml.cs | 32 +-------- .../RecentDatabasesPage.xaml.cs | 2 - .../MainPageFrames/SaveDatabasePage.xaml | 2 +- .../MainPageFrames/SaveDatabasePage.xaml.cs | 23 +------ .../UserControls/OpenDatabaseUserControl.xaml | 2 +- .../OpenDatabaseUserControl.xaml.cs | 24 +------ .../SetCredentialsUserControl.xaml | 8 +-- .../SetCredentialsUserControl.xaml.cs | 44 +------------ WinAppCommon/ViewModels/NewVm.cs | 20 +++++- WinAppCommon/ViewModels/OpenVm.cs | 30 ++++++++- WinAppCommon/ViewModels/SaveVm.cs | 45 ++++++++----- .../UserControls/OpenDatabaseControlVm.cs | 16 ++++- .../UserControls/SetCredentialsVm.cs | 38 +++++++++-- .../ViewModels/ViewModelLocatorCommon.cs | 1 + 33 files changed, 268 insertions(+), 268 deletions(-) diff --git a/ModernKeePass.Application/Common/Interfaces/IDatabaseProxy.cs b/ModernKeePass.Application/Common/Interfaces/IDatabaseProxy.cs index 0c211d2..c7a7ce2 100644 --- a/ModernKeePass.Application/Common/Interfaces/IDatabaseProxy.cs +++ b/ModernKeePass.Application/Common/Interfaces/IDatabaseProxy.cs @@ -27,7 +27,6 @@ namespace ModernKeePass.Application.Common.Interfaces Task ReOpen(byte[] file); Task Create(Credentials credentials, string name, DatabaseVersion version = DatabaseVersion.V4); Task SaveDatabase(); - Task SaveDatabase(byte[] newFileContents); void UpdateCredentials(Credentials credentials); void CloseDatabase(); diff --git a/ModernKeePass.Application/Common/Interfaces/IFileProxy.cs b/ModernKeePass.Application/Common/Interfaces/IFileProxy.cs index e9870e2..7fe7820 100644 --- a/ModernKeePass.Application/Common/Interfaces/IFileProxy.cs +++ b/ModernKeePass.Application/Common/Interfaces/IFileProxy.cs @@ -1,12 +1,15 @@ using System.Collections.Generic; using System.Threading.Tasks; +using ModernKeePass.Domain.Dtos; namespace ModernKeePass.Application.Common.Interfaces { public interface IFileProxy { - Task OpenBinaryFile(string path); - Task> OpenTextFile(string path); + Task OpenFile(string name, string extension, bool addToRecent); + Task CreateFile(string name, string extension, string description, bool addToRecent); + Task ReadBinaryFile(string path); + Task> ReadTextFile(string path); Task WriteBinaryContentsToFile(string path, byte[] contents); void ReleaseFile(string path); } diff --git a/ModernKeePass.Application/Database/Commands/CreateDatabase/CreateDatabaseCommand.cs b/ModernKeePass.Application/Database/Commands/CreateDatabase/CreateDatabaseCommand.cs index b74e42d..7888154 100644 --- a/ModernKeePass.Application/Database/Commands/CreateDatabase/CreateDatabaseCommand.cs +++ b/ModernKeePass.Application/Database/Commands/CreateDatabase/CreateDatabaseCommand.cs @@ -43,10 +43,10 @@ namespace ModernKeePass.Application.Database.Commands.CreateDatabase } await _database.Create(new Credentials - { - KeyFileContents = !string.IsNullOrEmpty(message.KeyFilePath) ? await _file.OpenBinaryFile(message.KeyFilePath) : null, - Password = message.Password - }, message.Name, version); + { + KeyFileContents = !string.IsNullOrEmpty(message.KeyFilePath) ? await _file.ReadBinaryFile(message.KeyFilePath) : null, + Password = message.Password + }, message.Name, version); _database.FileAccessToken = message.FilePath; if (message.CreateSampleData) diff --git a/ModernKeePass.Application/Database/Commands/SaveDatabase/SaveDatabaseCommand.cs b/ModernKeePass.Application/Database/Commands/SaveDatabase/SaveDatabaseCommand.cs index 6b57a1d..4e5ef28 100644 --- a/ModernKeePass.Application/Database/Commands/SaveDatabase/SaveDatabaseCommand.cs +++ b/ModernKeePass.Application/Database/Commands/SaveDatabase/SaveDatabaseCommand.cs @@ -27,26 +27,19 @@ namespace ModernKeePass.Application.Database.Commands.SaveDatabase try { - byte[] contents; - if (string.IsNullOrEmpty(message.FilePath)) + if (!string.IsNullOrEmpty(message.FilePath)) { - contents = await _database.SaveDatabase(); - - // Test DB integrity before writing changes to file - _database.CloseDatabase(); - await _database.ReOpen(contents); - - await _file.WriteBinaryContentsToFile(_database.FileAccessToken, contents); - } - else - { - var newFileContents = await _file.OpenBinaryFile(message.FilePath); - contents = await _database.SaveDatabase(newFileContents); - await _file.WriteBinaryContentsToFile(message.FilePath, contents); - - _file.ReleaseFile(_database.FileAccessToken); _database.FileAccessToken = message.FilePath; } + + var contents = await _database.SaveDatabase(); + + // Test DB integrity + _database.CloseDatabase(); + await _database.ReOpen(contents); + + // Transactional write to file + await _file.WriteBinaryContentsToFile(_database.FileAccessToken, contents); } catch (Exception exception) { diff --git a/ModernKeePass.Application/Database/Commands/UpdateCredentials/UpdateCredentialsCommand.cs b/ModernKeePass.Application/Database/Commands/UpdateCredentials/UpdateCredentialsCommand.cs index 80c6499..1ad8522 100644 --- a/ModernKeePass.Application/Database/Commands/UpdateCredentials/UpdateCredentialsCommand.cs +++ b/ModernKeePass.Application/Database/Commands/UpdateCredentials/UpdateCredentialsCommand.cs @@ -27,7 +27,7 @@ namespace ModernKeePass.Application.Database.Commands.UpdateCredentials if (!_database.IsOpen) throw new DatabaseClosedException(); _database.UpdateCredentials(new Credentials { - KeyFileContents = !string.IsNullOrEmpty(message.KeyFilePath) ? await _file.OpenBinaryFile(message.KeyFilePath) : null, + KeyFileContents = !string.IsNullOrEmpty(message.KeyFilePath) ? await _file.ReadBinaryFile(message.KeyFilePath) : null, Password = message.Password }); } diff --git a/ModernKeePass.Application/Database/Queries/OpenDatabase/OpenDatabaseQuery.cs b/ModernKeePass.Application/Database/Queries/OpenDatabase/OpenDatabaseQuery.cs index 64f035c..50e16f4 100644 --- a/ModernKeePass.Application/Database/Queries/OpenDatabase/OpenDatabaseQuery.cs +++ b/ModernKeePass.Application/Database/Queries/OpenDatabase/OpenDatabaseQuery.cs @@ -27,11 +27,11 @@ namespace ModernKeePass.Application.Database.Queries.OpenDatabase { if (_database.IsDirty) throw new DatabaseOpenException(); - var file = await _file.OpenBinaryFile(message.FilePath); + var file = await _file.ReadBinaryFile(message.FilePath); var hasKeyFile = !string.IsNullOrEmpty(message.KeyFilePath); await _database.Open(file, new Credentials { - KeyFileContents = hasKeyFile ? await _file.OpenBinaryFile(message.KeyFilePath): null, + KeyFileContents = hasKeyFile ? await _file.ReadBinaryFile(message.KeyFilePath): null, Password = message.Password }); if (hasKeyFile) _file.ReleaseFile(message.KeyFilePath); diff --git a/ModernKeePass.Application/Database/Queries/ReOpenDatabase/ReOpenDatabaseQuery.cs b/ModernKeePass.Application/Database/Queries/ReOpenDatabase/ReOpenDatabaseQuery.cs index 1472133..5df905d 100644 --- a/ModernKeePass.Application/Database/Queries/ReOpenDatabase/ReOpenDatabaseQuery.cs +++ b/ModernKeePass.Application/Database/Queries/ReOpenDatabase/ReOpenDatabaseQuery.cs @@ -23,7 +23,7 @@ namespace ModernKeePass.Application.Database.Queries.ReOpenDatabase if (_database.IsOpen) throw new DatabaseOpenException(); if (string.IsNullOrEmpty(_database.FileAccessToken)) throw new DatabaseClosedException(); - var file = await _file.OpenBinaryFile(_database.FileAccessToken); + var file = await _file.ReadBinaryFile(_database.FileAccessToken); await _database.ReOpen(file); } } diff --git a/ModernKeePass.Domain/Common/Constants.cs b/ModernKeePass.Domain/Common/Constants.cs index 6cbe1ee..d06e1b3 100644 --- a/ModernKeePass.Domain/Common/Constants.cs +++ b/ModernKeePass.Domain/Common/Constants.cs @@ -3,5 +3,11 @@ public static class Constants { public static string EmptyId => "00000000000000000000000000000000"; + + public static class Extensions + { + public static string Any => "*"; + public static string Kdbx => ".kdbx"; + } } } \ No newline at end of file diff --git a/ModernKeePass.Infrastructure/KeePass/KeePassDatabaseClient.cs b/ModernKeePass.Infrastructure/KeePass/KeePassDatabaseClient.cs index e03e413..7eac76b 100644 --- a/ModernKeePass.Infrastructure/KeePass/KeePassDatabaseClient.cs +++ b/ModernKeePass.Infrastructure/KeePass/KeePassDatabaseClient.cs @@ -152,15 +152,6 @@ namespace ModernKeePass.Infrastructure.KeePass }); } - public async Task SaveDatabase(byte[] newFileContents) - { - return await Task.Run(() => - { - _pwDatabase.SaveAs(IOConnectionInfo.FromByteArray(newFileContents), true, new NullStatusLogger()); - return _pwDatabase.IOConnectionInfo.Bytes; - }); - } - public void CloseDatabase() { _pwDatabase?.Close(); diff --git a/ModernKeePass.Infrastructure/UWP/StorageFileClient.cs b/ModernKeePass.Infrastructure/UWP/StorageFileClient.cs index e1115df..bb21870 100644 --- a/ModernKeePass.Infrastructure/UWP/StorageFileClient.cs +++ b/ModernKeePass.Infrastructure/UWP/StorageFileClient.cs @@ -5,20 +5,69 @@ using System.Runtime.InteropServices.WindowsRuntime; using System.Threading.Tasks; using Windows.Storage; using Windows.Storage.AccessCache; +using Windows.Storage.Pickers; using ModernKeePass.Application.Common.Interfaces; +using ModernKeePass.Domain.Dtos; namespace ModernKeePass.Infrastructure.UWP { public class StorageFileClient: IFileProxy { - public async Task OpenBinaryFile(string path) + public async Task OpenFile(string name, string extension, bool addToRecent) + { + var picker = new FileOpenPicker + { + ViewMode = PickerViewMode.List, + SuggestedStartLocation = PickerLocationId.DocumentsLibrary + }; + picker.FileTypeFilter.Add(extension); + + // Application now has read/write access to the picked file + var file = await picker.PickSingleFileAsync().AsTask(); + if (file == null) return null; + + var token = addToRecent + ? StorageApplicationPermissions.MostRecentlyUsedList.Add(file, file.Path) + : StorageApplicationPermissions.FutureAccessList.Add(file, file.Name); + return new FileInfo + { + Id = token, + Name = file.Name, + Path = file.Path + }; + } + + public async Task CreateFile(string name, string extension, string description, bool addToRecent) + { + var savePicker = new FileSavePicker + { + SuggestedStartLocation = PickerLocationId.DocumentsLibrary, + SuggestedFileName = name + }; + savePicker.FileTypeChoices.Add(description, new List { extension }); + + var file = await savePicker.PickSaveFileAsync().AsTask(); + if (file == null) return null; + + var token = addToRecent + ? StorageApplicationPermissions.MostRecentlyUsedList.Add(file, file.Path) + : StorageApplicationPermissions.FutureAccessList.Add(file, file.Name); + return new FileInfo + { + Id = token, + Name = file.Name, + Path = file.Path + }; + } + + public async Task ReadBinaryFile(string path) { var file = await GetFile(path); var result = await FileIO.ReadBufferAsync(file).AsTask(); return result.ToArray(); } - public async Task> OpenTextFile(string path) + public async Task> ReadTextFile(string path) { var file = await GetFile(path); var result = await FileIO.ReadLinesAsync(file).AsTask(); diff --git a/ModernKeePass/App.xaml.cs b/ModernKeePass/App.xaml.cs index 269d02f..0439b0d 100644 --- a/ModernKeePass/App.xaml.cs +++ b/ModernKeePass/App.xaml.cs @@ -1,17 +1,16 @@ using System; -using System.Collections.Generic; -using System.Reflection; using System.Threading.Tasks; using Windows.ApplicationModel; using Windows.ApplicationModel.Activation; using Windows.Storage; using Windows.Storage.AccessCache; -using Windows.Storage.Pickers; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; +using GalaSoft.MvvmLight.Messaging; using GalaSoft.MvvmLight.Views; using MediatR; +using Messages; using Microsoft.Extensions.DependencyInjection; using Microsoft.HockeyApp; using ModernKeePass.Application; @@ -41,6 +40,7 @@ namespace ModernKeePass private readonly IHockeyClient _hockey; private readonly IDialogService _dialog; private readonly INotificationService _notification; + private readonly IFileProxy _file; public static IServiceProvider Services { get; private set; } @@ -66,57 +66,33 @@ namespace ModernKeePass _dialog = Services.GetService(); _notification = Services.GetService(); _hockey = Services.GetService(); + _file = Services.GetService(); + var messenger = Services.GetService(); InitializeComponent(); Suspending += OnSuspending; Resuming += OnResuming; UnhandledException += OnUnhandledException; + + messenger.Register(this, async message => await HandelSaveError(message.Message)); } - + + private async Task HandelSaveError(string message) + { + _notification.Show(_resource.GetResourceValue("MessageDialogSaveErrorTitle"), message); + var database = await _mediator.Send(new GetDatabaseQuery()); + var file = await _file.CreateFile($"{database.Name} - copy", + Domain.Common.Constants.Extensions.Kdbx, + _resource.GetResourceValue("MessageDialogSaveErrorFileTypeDesc"), true); + if (file != null) await _mediator.Send(new SaveDatabaseCommand { FilePath = file.Id }); + } + #region Event Handlers - private async void OnUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs) + private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e) { - // Save the argument exception because it's cleared on first access - var exception = unhandledExceptionEventArgs.Exception; - var realException = - exception is TargetInvocationException && - exception.InnerException != null - ? exception.InnerException - : exception; - - _hockey.TrackException(realException); - if (realException is SaveException) - { - // TODO: this is not working - unhandledExceptionEventArgs.Handled = true; - await _dialog.ShowMessage(realException.Message, - _resource.GetResourceValue("MessageDialogSaveErrorTitle"), - _resource.GetResourceValue("MessageDialogSaveErrorButtonSaveAs"), - _resource.GetResourceValue("MessageDialogSaveErrorButtonDiscard"), - async isOk => - { - if (isOk) - { - var database = await _mediator.Send(new GetDatabaseQuery()); - var savePicker = new FileSavePicker - { - SuggestedStartLocation = PickerLocationId.DocumentsLibrary, - SuggestedFileName = $"{database.Name} - copy" - }; - savePicker.FileTypeChoices.Add( - _resource.GetResourceValue("MessageDialogSaveErrorFileTypeDesc"), - new List {".kdbx"}); - - var file = await savePicker.PickSaveFileAsync(); - if (file != null) - { - var token = StorageApplicationPermissions.FutureAccessList.Add(file, file.Name); - await _mediator.Send(new SaveDatabaseCommand {FilePath = token}); - } - } - }); - } + _hockey.TrackException(e.Exception); + _hockey.Flush(); } /// diff --git a/ModernKeePass/DependencyInjection.cs b/ModernKeePass/DependencyInjection.cs index 0854bfc..7420f02 100644 --- a/ModernKeePass/DependencyInjection.cs +++ b/ModernKeePass/DependencyInjection.cs @@ -1,5 +1,6 @@ using System.Reflection; using AutoMapper; +using GalaSoft.MvvmLight.Messaging; using GalaSoft.MvvmLight.Views; using Microsoft.Extensions.DependencyInjection; using Microsoft.HockeyApp; @@ -24,6 +25,7 @@ namespace ModernKeePass nav.Configure(Constants.Navigation.GroupPage, typeof(GroupDetailPage)); return nav; }); + services.AddSingleton(provider => Messenger.Default); services.AddTransient(typeof(IDialogService), typeof(DialogService)); services.AddSingleton(provider => diff --git a/ModernKeePass/ResourceDictionaries/Styles.xaml b/ModernKeePass/ResourceDictionaries/Styles.xaml index 9ec5fd1..d9ce7a1 100644 --- a/ModernKeePass/ResourceDictionaries/Styles.xaml +++ b/ModernKeePass/ResourceDictionaries/Styles.xaml @@ -83,4 +83,7 @@ + + 0 + 0 diff --git a/ModernKeePass/ViewModels/EntryDetailVm.cs b/ModernKeePass/ViewModels/EntryDetailVm.cs index 6664dca..836c576 100644 --- a/ModernKeePass/ViewModels/EntryDetailVm.cs +++ b/ModernKeePass/ViewModels/EntryDetailVm.cs @@ -9,6 +9,7 @@ using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Command; using GalaSoft.MvvmLight.Views; using MediatR; +using Messages; using ModernKeePass.Application.Common.Interfaces; using ModernKeePass.Application.Database.Commands.SaveDatabase; using ModernKeePass.Application.Database.Models; @@ -28,12 +29,13 @@ using ModernKeePass.Application.Security.Queries.EstimatePasswordComplexity; using ModernKeePass.Domain.Enums; using ModernKeePass.Application.Group.Models; using ModernKeePass.Common; +using ModernKeePass.Domain.Exceptions; using ModernKeePass.Extensions; using ModernKeePass.Models; namespace ModernKeePass.ViewModels { - public class EntryDetailVm : ObservableObject + public class EntryDetailVm : ViewModelBase { public bool IsRevealPasswordEnabled => !string.IsNullOrEmpty(Password); public bool HasExpired => HasExpirationDate && ExpiryDate < DateTime.Now; @@ -362,7 +364,14 @@ namespace ModernKeePass.ViewModels private async Task SaveChanges() { await AddHistory(); - await _mediator.Send(new SaveDatabaseCommand()); + try + { + await _mediator.Send(new SaveDatabaseCommand()); + } + catch (SaveException e) + { + MessengerInstance.Send(new SaveErrorMessage { Message = e.Message }); + } SaveCommand.RaiseCanExecuteChanged(); _isDirty = false; } diff --git a/ModernKeePass/ViewModels/GroupDetailVm.cs b/ModernKeePass/ViewModels/GroupDetailVm.cs index 230b2db..914ea0e 100644 --- a/ModernKeePass/ViewModels/GroupDetailVm.cs +++ b/ModernKeePass/ViewModels/GroupDetailVm.cs @@ -9,6 +9,7 @@ using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Command; using GalaSoft.MvvmLight.Views; using MediatR; +using Messages; using ModernKeePass.Application.Common.Interfaces; using ModernKeePass.Application.Database.Commands.SaveDatabase; using ModernKeePass.Application.Database.Models; @@ -29,11 +30,12 @@ using ModernKeePass.Application.Group.Queries.GetGroup; using ModernKeePass.Application.Group.Queries.SearchEntries; using ModernKeePass.Common; using ModernKeePass.Domain.Enums; +using ModernKeePass.Domain.Exceptions; using ModernKeePass.Models; namespace ModernKeePass.ViewModels { - public class GroupDetailVm : ObservableObject + public class GroupDetailVm : ViewModelBase { public ObservableCollection Entries { get; private set; } @@ -182,7 +184,14 @@ namespace ModernKeePass.ViewModels private async Task SaveChanges() { - await _mediator.Send(new SaveDatabaseCommand()); + try + { + await _mediator.Send(new SaveDatabaseCommand()); + } + catch (SaveException e) + { + MessengerInstance.Send(new SaveErrorMessage { Message = e.Message }); + } SaveCommand.RaiseCanExecuteChanged(); } diff --git a/ModernKeePass/ViewModels/MainVm.cs b/ModernKeePass/ViewModels/MainVm.cs index 6ce27ce..0c0bd7c 100644 --- a/ModernKeePass/ViewModels/MainVm.cs +++ b/ModernKeePass/ViewModels/MainVm.cs @@ -183,6 +183,7 @@ namespace ModernKeePass.ViewModels } catch (SaveException exception) { + // TODO: Implement save as _notification.Show(exception.Source, exception.Message); return; } diff --git a/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml b/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml index 0b94592..98c4d01 100644 --- a/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml +++ b/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml @@ -13,7 +13,7 @@ - + diff --git a/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml.cs b/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml.cs index ca190f0..3147689 100644 --- a/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml.cs +++ b/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml.cs @@ -1,11 +1,4 @@ -using System; -using System.Collections.Generic; -using Windows.Storage.AccessCache; -using Windows.Storage.Pickers; -using Windows.UI.Xaml; -using ModernKeePass.ViewModels; - -// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 +// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 namespace ModernKeePass.Views { @@ -14,28 +7,9 @@ namespace ModernKeePass.Views /// public sealed partial class NewDatabasePage { - private NewVm Model => (NewVm)DataContext; - public NewDatabasePage() { InitializeComponent(); } - - private async void CreateDatabaseButton_OnClick(object sender, RoutedEventArgs e) - { - var savePicker = new FileSavePicker - { - SuggestedStartLocation = PickerLocationId.DocumentsLibrary, - SuggestedFileName = "New Database" - }; - savePicker.FileTypeChoices.Add("KeePass 2.x database", new List {".kdbx"}); - - var file = await savePicker.PickSaveFileAsync().AsTask(); - if (file == null) return; - - Model.Token = StorageApplicationPermissions.FutureAccessList.Add(file, file.Name); - Model.Name = file.Name; - Model.Path = file.Path; - } } } diff --git a/ModernKeePass/Views/MainPageFrames/OpenDatabasePage.xaml b/ModernKeePass/Views/MainPageFrames/OpenDatabasePage.xaml index 0e595c2..b962406 100644 --- a/ModernKeePass/Views/MainPageFrames/OpenDatabasePage.xaml +++ b/ModernKeePass/Views/MainPageFrames/OpenDatabasePage.xaml @@ -13,7 +13,7 @@ - + diff --git a/ModernKeePass/Views/MainPageFrames/OpenDatabasePage.xaml.cs b/ModernKeePass/Views/MainPageFrames/OpenDatabasePage.xaml.cs index 292fea9..2aadc70 100644 --- a/ModernKeePass/Views/MainPageFrames/OpenDatabasePage.xaml.cs +++ b/ModernKeePass/Views/MainPageFrames/OpenDatabasePage.xaml.cs @@ -1,8 +1,4 @@ -using System; -using Windows.Storage.AccessCache; -using Windows.Storage.Pickers; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Navigation; +using Windows.UI.Xaml.Navigation; using ModernKeePass.Domain.Dtos; using ModernKeePass.ViewModels; @@ -26,31 +22,7 @@ namespace ModernKeePass.Views { base.OnNavigatedTo(e); var file = e.Parameter as FileInfo; - if (file != null) - { - Model.Path = file.Path; - Model.Name = file.Name; - Model.Token = file.Id; - } - } - - private async void ButtonBase_OnClick(object sender, RoutedEventArgs e) - { - var picker = new FileOpenPicker - { - ViewMode = PickerViewMode.List, - SuggestedStartLocation = PickerLocationId.DocumentsLibrary - }; - picker.FileTypeFilter.Add(".kdbx"); - - // Application now has read/write access to the picked file - var file = await picker.PickSingleFileAsync().AsTask(); - if (file == null) return; - - // TODO: use service - Model.Token = StorageApplicationPermissions.MostRecentlyUsedList.Add(file, file.Path); - Model.Path = file.Path; - Model.Name = file.Name; + Model.SetFileInformation(file); } } } diff --git a/ModernKeePass/Views/MainPageFrames/RecentDatabasesPage.xaml.cs b/ModernKeePass/Views/MainPageFrames/RecentDatabasesPage.xaml.cs index fd1c864..485806b 100644 --- a/ModernKeePass/Views/MainPageFrames/RecentDatabasesPage.xaml.cs +++ b/ModernKeePass/Views/MainPageFrames/RecentDatabasesPage.xaml.cs @@ -1,7 +1,5 @@ // Pour en savoir plus sur le modèle d'élément Page vierge, consultez la page http://go.microsoft.com/fwlink/?LinkId=234238 -using ModernKeePass.ViewModels; - namespace ModernKeePass.Views { /// diff --git a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml index 362ed6f..9434dcd 100644 --- a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml +++ b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml @@ -10,7 +10,7 @@ - + diff --git a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs index da4091f..cddcbd2 100644 --- a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs +++ b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using Windows.Storage.Pickers; -using Windows.UI.Xaml; -using ModernKeePass.ViewModels; - -// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 +// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 namespace ModernKeePass.Views { @@ -13,24 +7,9 @@ namespace ModernKeePass.Views /// public sealed partial class SaveDatabasePage { - public SaveVm Model => (SaveVm)DataContext; public SaveDatabasePage() { InitializeComponent(); } - - private async void SaveAsButton_OnClick(object sender, RoutedEventArgs e) - { - var savePicker = new FileSavePicker - { - SuggestedStartLocation = PickerLocationId.DocumentsLibrary, - SuggestedFileName = "New Database" - }; - savePicker.FileTypeChoices.Add("KeePass 2.x database", new List { ".kdbx" }); - - var file = await savePicker.PickSaveFileAsync().AsTask(); - if (file == null) return; - await Model.Save(file); - } } } diff --git a/ModernKeePass/Views/UserControls/OpenDatabaseUserControl.xaml b/ModernKeePass/Views/UserControls/OpenDatabaseUserControl.xaml index 3f3c655..e271939 100644 --- a/ModernKeePass/Views/UserControls/OpenDatabaseUserControl.xaml +++ b/ModernKeePass/Views/UserControls/OpenDatabaseUserControl.xaml @@ -40,7 +40,7 @@ + Command="{Binding OpenKeyFileCommand}" />