// -------------------------------------------------------------------------------------------------------------------- // // This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. // // // Interaction logic for App.xaml // // -------------------------------------------------------------------------------------------------------------------- namespace HandBrakeWPF { using System; using System.IO; using System.Linq; using System.Windows; using Caliburn.Micro; using HandBrake.ApplicationServices.Exceptions; using HandBrakeWPF.ViewModels; using HandBrakeWPF.ViewModels.Interfaces; /// /// Interaction logic for App.xaml /// public partial class App { /// /// Initializes a new instance of the class. /// public App() { Application.Current.Dispatcher.UnhandledException += this.Dispatcher_UnhandledException; AppDomain.CurrentDomain.UnhandledException += this.CurrentDomain_UnhandledException; } /// /// Override the startup behavior to handle files dropped on the app icon. /// /// /// The StartupEventArgs. /// protected override void OnStartup(StartupEventArgs e) { if (e.Args.Any(f => f.Equals("--instant"))) { AppArguments.IsInstantHandBrake = true; MessageBox.Show("Instant HandBrake is just a prototype for toying with ideas. It may or may not work, or even be included in future builds.", "Warning", MessageBoxButton.OK, MessageBoxImage.Warning); } base.OnStartup(e); // If we have a file dropped on the icon, try scanning it. string[] args = e.Args; if (args.Any() && (File.Exists(args[0]) || Directory.Exists(args[0]))) { IMainViewModel mvm = IoC.Get(); mvm.StartScan(args[0], 0); } } /// /// Non-UI Thread expection handler. /// /// /// The sender. /// /// /// The UnhandledExceptionEventArgs. /// private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { if (e.ExceptionObject.GetType() == typeof(FileNotFoundException)) { GeneralApplicationException exception = new GeneralApplicationException("A file appears to be missing.", "Try re-installing Microsoft .NET Framework 4.0", (Exception)e.ExceptionObject); this.ShowError(exception); } else { this.ShowError(e.ExceptionObject); } } /// /// Handle unhandled exceptions. UI thread only. /// /// /// The sender. /// /// /// The DispatcherUnhandledExceptionEventArgs. /// private void Dispatcher_UnhandledException( object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { if (e.Exception.GetType() == typeof(FileNotFoundException)) { GeneralApplicationException exception = new GeneralApplicationException("A file appears to be missing.", "Try re-installing Microsoft .NET Framework 4.0", e.Exception); this.ShowError(exception); } else if (e.Exception.GetType() == typeof(GeneralApplicationException)) { this.ShowError(e.Exception); } else if (e.Exception.InnerException != null && e.Exception.InnerException.GetType() == typeof(GeneralApplicationException)) { this.ShowError(e.Exception.InnerException); } else if (e.Exception.InnerException != null && e.Exception.InnerException.GetType() == typeof(Castle.MicroKernel.ComponentActivator.ComponentActivatorException)) { // Handle Component Activation Exceptions. Can happen when one of the services throws an execption when being constructed. Exception innerException = e.Exception.InnerException.InnerException; if (innerException != null && innerException.InnerException != null && innerException.InnerException.GetType() == typeof(GeneralApplicationException)) { this.ShowError(innerException.InnerException); } else { this.ShowError(innerException); } } else { this.ShowError(e.Exception); } e.Handled = true; } /// /// Show an error dialog for the user. /// /// /// The exception. /// private void ShowError(object exception) { try { IWindowManager windowManager = IoC.Get(); if (windowManager != null) { ErrorViewModel errorView = new ErrorViewModel(); GeneralApplicationException applicationException = null; if (exception.GetType() == typeof(GeneralApplicationException)) { applicationException = exception as GeneralApplicationException; if (applicationException != null) { string details = string.Format( "{0}{1}{2}{3}{4}", applicationException.Error, Environment.NewLine, applicationException.Solution, Environment.NewLine, applicationException.ActualException != null ? applicationException.ActualException.ToString() : "No additional exception information available."); errorView.ErrorMessage = applicationException.Error; errorView.Solution = applicationException.Solution; errorView.Details = details; } } else { errorView.Details = exception.ToString(); } try { windowManager.ShowDialog(errorView); } catch (Exception) { if (applicationException != null) { MessageBox.Show(applicationException.Error + Environment.NewLine + Environment.NewLine + applicationException.Solution, "Error", MessageBoxButton.OK, MessageBoxImage.Error); } } } } catch (Exception) { MessageBox.Show("An Unknown Error has occured. \n\n Exception:" + exception, "Unhandled Exception", MessageBoxButton.OK, MessageBoxImage.Error); } } } }