using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Net; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Markup; using Tango.BL; using Tango.Core; using Tango.Core.DI; using Tango.Core.Helpers; using Tango.Insights; using Tango.Integration.Operation; using Tango.Logging; using Tango.PPC.Common; using Tango.PPC.Common.EventLogging; using Tango.PPC.Common.Helpers; using Tango.PPC.Common.Notifications; using Tango.PPC.Common.WatchDog; using Tango.Settings; namespace Tango.PPC.UI { /// /// Interaction logic for App.xaml /// public partial class App : Application { public static WpfGlobalExceptionTrapper ExceptionTrapper; public static String[] StartupArgs { get; private set; } private LogManager LogManager = LogManager.Default; /// /// Raises the event. /// /// A that contains the event data. protected override void OnStartup(StartupEventArgs e) { //throw new InvalidOperationException("This is a fake exception!!!"); //removed due to possibly causing this issue: //https://stackoverflow.com/questions/41543956/how-to-debug-not-enough-storage-is-available-to-process-this-command //ThreadPool.SetMaxThreads(1000, 1000); //If no debugger is attached and the argument -debug was passed launch the debugger. if (e.Args.Contains("-debug") && !Debugger.IsAttached) { Debugger.Launch(); } StartupArgs = e.Args; //Set culture info. /* var enUSCulture = new CultureInfo("en-US") { NumberFormat = { NumberDecimalSeparator = "." } }; Thread.CurrentThread.CurrentCulture = enUSCulture; Thread.CurrentThread.CurrentUICulture = enUSCulture; CultureInfo.DefaultThreadCurrentCulture = enUSCulture; CultureInfo.DefaultThreadCurrentUICulture = enUSCulture; FrameworkElement.LanguageProperty.OverrideMetadata( typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));*/ //LogManager.RegisterLogger(new ConsoleLogger("Tango PPC Debug")); LogManager.RegisterLogger(new FileLogger() { EnableAutoLogRemoval = true, EnableMaxFileSizeLimit = true, AutoLogRemovalPeriod = TimeSpan.FromDays(30) }); #if DEBUG LogManager.RegisterLogger(new VSOutputLogger()); #endif //Configure machine operator logger. var operatorLogger = MachineOperator.EmbeddedLogManager.RegisteredLoggers.SingleOrDefault(x => x is FileLogger) as FileLogger; if (operatorLogger != null) { operatorLogger.EnableAutoLogRemoval = true; operatorLogger.EnableMaxFileSizeLimit = true; operatorLogger.AutoLogRemovalPeriod = TimeSpan.FromDays(30); } LogsHelper.SetLogSafe(LogManager.CreateLogSafe()); LogManager.Log($"Application Started... Version: '{AssemblyHelper.GetCurrentAssemblyVersion()}'."); base.OnStartup(e); ExceptionTrapper = new WpfGlobalExceptionTrapper(); ExceptionTrapper.Initialize(this); ExceptionTrapper.ApplicationCrashed += ExceptionTrapper_ApplicationCrashed; CoreSettings.DefaultDataSource = new DataSource() { Address = "localhost\\SQLEXPRESS", Catalog = "Tango", IntegratedSecurity = true, }; WebRequest.DefaultWebProxy = null; GetLastApplicationCrashFromWindows(); } #region Global Exception Trapping private async void GetLastApplicationCrashFromWindows() { var logItem = await ExceptionTrapper.GetLastApplicationCrashEventLog(60); if (logItem != null) { LogManager.Log(logItem); try { InsightsManager.Default.InsertApplicationException(new InsightsApplicationException() { Time = DateTime.UtcNow, Exception = logItem.Message, IsApplicationCrash = true }); } catch { } } } /// /// Handles the ApplicationCrashed event of the ExceptionTrapper. /// /// The source of the event. /// The instance containing the event data. private void ExceptionTrapper_ApplicationCrashed(object sender, ApplicationCrashedEventArgs e) { List ignoredExceptions = new List() { "FocusVisualStyle", "ThreadAbortException", "A Task's exception(s) were not observed" }; String exceptionString = e.Exception.ToStringSafe(); if (ignoredExceptions.Exists(x => exceptionString.Contains(x))) { return; } try { LogManager.Log(e.Exception, "Application Crashed!"); LogManager.Log("Trying to recover from application crash..."); try { InsightsManager.Default.InsertApplicationException(new InsightsApplicationException() { Time = DateTime.UtcNow, Exception = e.Exception.ToString() }); } catch { } try { if (Application.Current == null) { new Application { ShutdownMode = ShutdownMode.OnExplicitShutdown }; } } catch { } try { var eventLogger = TangoIOC.Default.GetInstance(); if (eventLogger != null) { eventLogger.Log(e.Exception, "Application Crashed!"); } } catch { } Application.Current.Dispatcher.Invoke(async () => { try { LogManager.Log("Trying to notify the user about the crash..."); INotificationProvider notificationProvider = TangoIOC.Default.GetInstance(); if (notificationProvider != null) { await notificationProvider.ShowError("An unexpected error has occurred. Use the application logs to diagnose and report the problem."); } } catch (Exception ex) { LogManager.Log(ex, "Error using the notification provider."); } }); } catch (Exception ex) { LogManager.Log(ex, "Error in global exception trapper!"); } } #endregion } }