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
}
}