// -------------------------------------------------------------------------------------------------------------------- // // 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.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Threading; using System.Windows; using System.Windows.Controls; using Caliburn.Micro; using HandBrake.Interop.Interop; using HandBrakeWPF.Instance; using HandBrakeWPF.Model; using HandBrakeWPF.Services.Interfaces; using HandBrakeWPF.Startup; using HandBrakeWPF.Utilities; using HandBrakeWPF.ViewModels; using HandBrakeWPF.ViewModels.Interfaces; using GeneralApplicationException = Exceptions.GeneralApplicationException; /// /// 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; AppDomain.CurrentDomain.ProcessExit += this.CurrentDomain_ProcessExit; ToolTipService.ShowDurationProperty.OverrideMetadata(typeof(DependencyObject), new FrameworkPropertyMetadata(15000)); } /// /// Override the startup behavior to handle files dropped on the app icon. /// /// /// The StartupEventArgs. /// protected override void OnStartup(StartupEventArgs e) { // We don't support Windows XP / 2003 / 2003 R2 / Vista / 2008 OperatingSystem os = Environment.OSVersion; if (((os.Platform == PlatformID.Win32NT) && (os.Version.Major == 5)) || ((os.Platform == PlatformID.Win32NT) && (os.Version.Major == 6 && os.Version.Minor < 1))) { MessageBox.Show(HandBrakeWPF.Properties.Resources.OsVersionWarning, HandBrakeWPF.Properties.Resources.Warning, MessageBoxButton.OK, MessageBoxImage.Warning); Application.Current.Shutdown(); return; } if (!Environment.Is64BitOperatingSystem) { MessageBox.Show(HandBrakeWPF.Properties.Resources.OsBitnessWarning, HandBrakeWPF.Properties.Resources.Warning, MessageBoxButton.OK, MessageBoxImage.Warning); Application.Current.Shutdown(); return; } if (e.Args.Any(f => f.Equals("--reset"))) { HandBrakeApp.ResetToDefaults(); Application.Current.Shutdown(); return; } if (e.Args.Any(f => f.StartsWith("--recover-queue-ids"))) { string command = e.Args.FirstOrDefault(f => f.StartsWith("--recover-queue-ids")); if (!string.IsNullOrEmpty(command)) { command = command.Replace("--recover-queue-ids=", string.Empty); List processIds = command.Split(',').ToList(); StartupOptions.QueueRecoveryIds = processIds; } } if (e.Args.Any(f => f.Equals("--auto-start-queue"))) { StartupOptions.AutoRestartQueue = true; } // Portable Mode if (Portable.IsPortable()) { if (!Portable.Initialise()) { Application.Current.Shutdown(); return; } } // Setup the UI Language IUserSettingService userSettingService = IoC.Get(); string culture = userSettingService.GetUserSetting(UserSettingConstants.UiLanguage); if (!string.IsNullOrEmpty(culture)) { InterfaceLanguage language = InterfaceLanguageUtilities.FindInterfaceLanguage(culture); if (language != null) { CultureInfo ci = new CultureInfo(language.Culture); Thread.CurrentThread.CurrentUICulture = ci; } } DarkThemeMode useDarkTheme = (DarkThemeMode)userSettingService.GetUserSetting(UserSettingConstants.DarkThemeMode); if (SystemInfo.IsWindows10()) { ResourceDictionary theme = new ResourceDictionary(); switch (useDarkTheme) { case DarkThemeMode.System: if (SystemInfo.IsAppsUsingDarkTheme()) { theme.Source = new Uri("Themes/Dark.xaml", UriKind.Relative); Application.Current.Resources.MergedDictionaries.Add(theme); } else if (!SystemParameters.HighContrast) { theme.Source = new Uri("Themes/Light.xaml", UriKind.Relative); Application.Current.Resources.MergedDictionaries.Add(theme); } break; case DarkThemeMode.Dark: theme.Source = new Uri("Themes/Dark.xaml", UriKind.Relative); Application.Current.Resources.MergedDictionaries.Add(theme); break; case DarkThemeMode.Light: if (!SystemParameters.HighContrast) { theme.Source = new Uri("Themes/Light.xaml", UriKind.Relative); Application.Current.Resources.MergedDictionaries.Add(theme); } break; default: break; } } // NO-Hardware Mode bool noHardware = e.Args.Any(f => f.Equals("--no-hardware")) || (Portable.IsPortable() && !Portable.IsHardwareEnabled()); // Initialise the Engine HandBrakeWPF.Helpers.LogManager.Init(); try { HandBrakeInstanceManager.Init(noHardware); } catch (Exception) { if (!noHardware) { MessageBox.Show(HandBrakeWPF.Properties.Resources.Startup_InitFailed, HandBrakeWPF.Properties.Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); } throw; } // Initialise the GUI 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); } } private void CurrentDomain_ProcessExit(object sender, System.EventArgs e) { HandBrakeUtils.DisposeGlobal(); } /// /// Non-UI Thread exception handler. /// /// /// The sender. /// /// /// The UnhandledExceptionEventArgs. /// private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { Caliburn.Micro.Execute.OnUIThreadAsync(() => { if (e.ExceptionObject.GetType() == typeof(FileNotFoundException)) { GeneralApplicationException exception = new GeneralApplicationException("A file appears to be missing.", "Try re-installing Microsoft .NET Framework 4.8", (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.7.1", 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 { 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(); IErrorService errorService = IoC.Get(); if (windowManager != null) { ErrorViewModel errorView = new ErrorViewModel(errorService); 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 occurred. \n\n Exception:" + exception, "Unhandled Exception", MessageBoxButton.OK, MessageBoxImage.Error); } } } }