diff --git a/ModernKeePass/App.xaml.cs b/ModernKeePass/App.xaml.cs
index 07941f2..a44c8cf 100644
--- a/ModernKeePass/App.xaml.cs
+++ b/ModernKeePass/App.xaml.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Reflection;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.Data.Json;
@@ -29,9 +30,23 @@ namespace ModernKeePass
{
InitializeComponent();
Suspending += OnSuspending;
+ UnhandledException += OnUnhandledException;
}
#region Event Handlers
+
+ private void OnUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs)
+ {
+ // TODO: catch only save errors for now, rethrow (do not handle) otherwise
+ var exception = unhandledExceptionEventArgs.Exception;
+ MessageDialogHelper.ShowErrorDialog(
+ exception is TargetInvocationException &&
+ exception.InnerException != null
+ ? exception.InnerException
+ : exception);
+ unhandledExceptionEventArgs.Handled = true;
+ }
+
///
/// Invoked when the application is launched normally by the end user. Other entry points
/// will be used such as when the application is launched to open a specific file.
@@ -126,6 +141,7 @@ namespace ModernKeePass
private void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
+ UnhandledException -= OnUnhandledException;
Database.Save();
deferral.Complete();
}
@@ -143,6 +159,7 @@ namespace ModernKeePass
Window.Current.Content = rootFrame;
Window.Current.Activate();
}
+
#endregion
}
}
diff --git a/ModernKeePass/Common/DatabaseHelper.cs b/ModernKeePass/Common/DatabaseHelper.cs
index 668e728..2ac60bc 100644
--- a/ModernKeePass/Common/DatabaseHelper.cs
+++ b/ModernKeePass/Common/DatabaseHelper.cs
@@ -105,6 +105,7 @@ namespace ModernKeePass.Common
catch (Exception ex)
{
Status = (int)DatabaseStatus.Error;
+ throw;
}
}
@@ -112,38 +113,20 @@ namespace ModernKeePass.Common
/// Save the current database to another file and open it
///
/// The new database file
- public bool Save(StorageFile file)
+ public void Save(StorageFile file)
{
DatabaseFile = file;
- try
- {
- _pwDatabase.SaveAs(IOConnectionInfo.FromFile(DatabaseFile), true, new NullStatusLogger());
- Status = (int)DatabaseStatus.Opened;
- return true;
- }
- catch (Exception ex)
- {
- return false;
- }
+ _pwDatabase.SaveAs(IOConnectionInfo.FromFile(DatabaseFile), true, new NullStatusLogger());
+ Status = (int)DatabaseStatus.Opened;
}
///
/// Commit the changes to the currently opened database to file
///
- public bool Save()
+ public void Save()
{
- if (_pwDatabase == null || !_pwDatabase.IsOpen) return false;
- try
- {
- _pwDatabase.Save(new NullStatusLogger());
- return true;
- }
- catch (Exception ex)
- {
- return false;
- // TODO: put this at a better place (e.g. in views)
- MessageDialogHelper.ShowErrorDialog(ex);
- }
+ if (_pwDatabase == null || !_pwDatabase.IsOpen) return;
+ _pwDatabase.Save(new NullStatusLogger());
}
///
diff --git a/ModernKeePass/Common/MessageDialogHelper.cs b/ModernKeePass/Common/MessageDialogHelper.cs
index 233bc9c..9027486 100644
--- a/ModernKeePass/Common/MessageDialogHelper.cs
+++ b/ModernKeePass/Common/MessageDialogHelper.cs
@@ -26,6 +26,7 @@ namespace ModernKeePass.Common
public static async void ShowErrorDialog(Exception exception)
{
+ if (exception == null) return;
// Create the message dialog and set its content
var messageDialog = new MessageDialog(exception.Message, "Error occured");
diff --git a/ModernKeePass/Controls/CompositeKeyUserControl.xaml b/ModernKeePass/Controls/CompositeKeyUserControl.xaml
index 0ec71a9..124d848 100644
--- a/ModernKeePass/Controls/CompositeKeyUserControl.xaml
+++ b/ModernKeePass/Controls/CompositeKeyUserControl.xaml
@@ -48,7 +48,9 @@
Visibility="{Binding ShowComplexityIndicator, ElementName=UserControl, Converter={StaticResource BooleanToVisibilityConverter}}" />
-
+
+
+
diff --git a/ModernKeePass/Interfaces/IDatabase.cs b/ModernKeePass/Interfaces/IDatabase.cs
index 71e7912..3406fc7 100644
--- a/ModernKeePass/Interfaces/IDatabase.cs
+++ b/ModernKeePass/Interfaces/IDatabase.cs
@@ -20,8 +20,8 @@ namespace ModernKeePass.Interfaces
void Open(CompositeKey key, bool createNew);
void UpdateCompositeKey(CompositeKey key);
- bool Save();
- bool Save(StorageFile file);
+ void Save();
+ void Save(StorageFile file);
void CreateRecycleBin();
void AddDeletedItem(PwUuid id);
void Close();
diff --git a/ModernKeePass/Pages/MainPage.xaml.cs b/ModernKeePass/Pages/MainPage.xaml.cs
index 29573fb..fe2a6ee 100644
--- a/ModernKeePass/Pages/MainPage.xaml.cs
+++ b/ModernKeePass/Pages/MainPage.xaml.cs
@@ -24,14 +24,15 @@ namespace ModernKeePass.Pages
{
ListView_SelectionChanged(sender, e);
var selectedItem = Model.SelectedItem as MainMenuItemVm;
- selectedItem?.Destination.Navigate(selectedItem.PageType, selectedItem.Parameter);
+ if (selectedItem == null) MenuFrame.Navigate(typeof(WelcomePage));
+ else selectedItem.Destination.Navigate(selectedItem.PageType, selectedItem.Parameter);
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
DataContext = new MainVm(Frame, MenuFrame);
- if (Model.SelectedItem == null) MenuFrame.Navigate(typeof(WelcomePage));
+ //if (Model.SelectedItem == null) MenuFrame.Navigate(typeof(WelcomePage));
}
}
}
diff --git a/ModernKeePass/Pages/MainPageFrames/NewDatabasePage.xaml.cs b/ModernKeePass/Pages/MainPageFrames/NewDatabasePage.xaml.cs
index 4389d6c..d62617b 100644
--- a/ModernKeePass/Pages/MainPageFrames/NewDatabasePage.xaml.cs
+++ b/ModernKeePass/Pages/MainPageFrames/NewDatabasePage.xaml.cs
@@ -2,9 +2,6 @@
using System.Collections.Generic;
using Windows.Storage.Pickers;
using Windows.UI.Xaml;
-using Windows.UI.Xaml.Controls;
-using Windows.UI.Xaml.Navigation;
-using ModernKeePass.Events;
using ModernKeePass.ViewModels;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
@@ -16,8 +13,6 @@ namespace ModernKeePass.Pages
///
public sealed partial class NewDatabasePage
{
- private Frame _mainFrame;
-
public NewVm Model => (NewVm)DataContext;
public NewDatabasePage()
@@ -25,12 +20,6 @@ namespace ModernKeePass.Pages
InitializeComponent();
}
- protected override void OnNavigatedTo(NavigationEventArgs e)
- {
- base.OnNavigatedTo(e);
- _mainFrame = e.Parameter as Frame;
- }
-
private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
var savePicker = new FileSavePicker
diff --git a/ModernKeePass/ViewModels/CompositeKeyVm.cs b/ModernKeePass/ViewModels/CompositeKeyVm.cs
index 2a7d91f..23a4479 100644
--- a/ModernKeePass/ViewModels/CompositeKeyVm.cs
+++ b/ModernKeePass/ViewModels/CompositeKeyVm.cs
@@ -1,4 +1,5 @@
-using System.Text;
+using System;
+using System.Text;
using Windows.Storage;
using Windows.UI.Xaml;
using ModernKeePass.Common;
@@ -105,7 +106,15 @@ namespace ModernKeePass.ViewModels
public bool OpenDatabase(bool createNew)
{
- Database.Open(CreateCompositeKey(), createNew);
+ var error = string.Empty;
+ try
+ {
+ Database.Open(CreateCompositeKey(), createNew);
+ }
+ catch (Exception e)
+ {
+ error = $"Error: {e.Message}";
+ }
switch ((DatabaseHelper.DatabaseStatus)Database.Status)
{
case DatabaseHelper.DatabaseStatus.Opened:
@@ -118,6 +127,9 @@ namespace ModernKeePass.ViewModels
if (HasKeyFile) errorMessage.Append("key file");
UpdateStatus(errorMessage.ToString(), StatusTypes.Error);
break;
+ case DatabaseHelper.DatabaseStatus.Error:
+ UpdateStatus(error, StatusTypes.Error);
+ break;
}
return false;
}
diff --git a/ModernKeePass/ViewModels/SaveVm.cs b/ModernKeePass/ViewModels/SaveVm.cs
index 7dd1b48..11dd3be 100644
--- a/ModernKeePass/ViewModels/SaveVm.cs
+++ b/ModernKeePass/ViewModels/SaveVm.cs
@@ -16,10 +16,11 @@ namespace ModernKeePass.ViewModels
public void Save(bool close = true)
{
- if (close && _database.Save()) _database.Close();
+ _database.Save();
+ if (close) _database.Close();
}
- internal void Save(StorageFile file)
+ public void Save(StorageFile file)
{
_database.Save(file);
}
diff --git a/ModernKeePassApp.Test/DatabaseTests.cs b/ModernKeePassApp.Test/DatabaseTests.cs
index d765370..83a959d 100644
--- a/ModernKeePassApp.Test/DatabaseTests.cs
+++ b/ModernKeePassApp.Test/DatabaseTests.cs
@@ -36,7 +36,8 @@ namespace ModernKeePassApp.Test
public void TestSave()
{
TestOpen();
- Assert.IsTrue(_database.Save(ApplicationData.Current.TemporaryFolder.CreateFileAsync("SaveDatabase.kdbx").GetAwaiter().GetResult()));
+ _database.Save(ApplicationData.Current.TemporaryFolder.CreateFileAsync("SaveDatabase.kdbx").GetAwaiter().GetResult());
+ Assert.AreEqual((int)DatabaseHelper.DatabaseStatus.Opened, _database.Status);
_database.Close();
Assert.AreEqual((int)DatabaseHelper.DatabaseStatus.Closed, _database.Status);
TestOpen();
diff --git a/ModernKeePassApp.Test/Mock/DatabaseHelperMock.cs b/ModernKeePassApp.Test/Mock/DatabaseHelperMock.cs
index 82604b6..242d300 100644
--- a/ModernKeePassApp.Test/Mock/DatabaseHelperMock.cs
+++ b/ModernKeePassApp.Test/Mock/DatabaseHelperMock.cs
@@ -48,12 +48,12 @@ namespace ModernKeePassApp.Test.Mock
throw new NotImplementedException();
}
- public bool Save()
+ public void Save()
{
throw new NotImplementedException();
}
- public bool Save(StorageFile file)
+ public void Save(StorageFile file)
{
throw new NotImplementedException();
}