using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using Tango.Core.Helpers;
using Tango.BL.Entities;
using Tango.Logging;
using Tango.MachineStudio.UI.Windows;
using Tango.Settings;
using Tango.MachineStudio.Common.EventLogging;
using Tango.BL.Enumerations;
using Tango.Core.DI;
using Tango.MachineStudio.UI.TFS;
using Tango.TFS;
using Tango.MachineStudio.Common.Notifications;
using Tango.MachineStudio.UI.ViewModels;
using Tango.MachineStudio.UI.Views;
using Tango.MachineStudio.Common;
using Tango.Core;
using Tango.BL;
using Tango.Integration.Operation;
using System.Net;
using System.Globalization;
using System.Windows.Markup;
namespace Tango.MachineStudio.UI
{
///
/// Interaction logic for App.xaml
///
public partial class App : Application
{
private WpfGlobalExceptionTrapper exceptionTrapper;
private LogManager LogManager = LogManager.Default;
public static String[] StartupArgs { get; set; } = Environment.GetCommandLineArgs().Skip(1).ToArray();
protected override void OnStartup(StartupEventArgs e)
{
//Set culture info.
var enUSCulture = new CultureInfo("en-US");
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)));
StartupArgs = e.Args;
#if DEBUG
CoreSettings.DefaultDataSource = new DataSource()
{
Address = "localhost\\SQLEXPRESS",
Catalog = "Tango",
IntegratedSecurity = true,
};
#else
CoreSettings.DefaultDataSource = new DataSource()
{
Address = "twine01\\SQLTWINE",
Catalog = "Tango",
IntegratedSecurity = true,
};
#endif
#if DEBUG
LogManager.RegisterLogger(new VSOutputLogger());
#endif
LogManager.RegisterLogger(new FileLogger() { EnableAutoLogRemoval = true, EnableMaxFileSizeLimit = true });
var operatorLogger = MachineOperator.EmbeddedLogManager.RegisteredLoggers.SingleOrDefault(x => x is FileLogger) as FileLogger;
if (operatorLogger != null)
{
operatorLogger.EnableAutoLogRemoval = true;
operatorLogger.EnableMaxFileSizeLimit = true;
}
LogManager.Log("Application Started...");
LogManager.LogReferencedAssemblies();
var settings = SettingsManager.Default.GetOrCreate();
//add current theme
MachineStudioTheme wTheme = settings.Theme;
try
{
Z.EntityFramework.Extensions.LicenseManager.AddLicense("4578;101-twine-s.com", "9d23b66f-1101-b253-7f8a-59ae011b2ee8");
string licenseErrorMessage;
if (!Z.EntityFramework.Extensions.LicenseManager.ValidateLicense(out licenseErrorMessage))
{
throw new Exception(licenseErrorMessage);
}
}
catch (Exception ex)
{
LogManager.Log(ex, "Error performing EF extensions license setup.");
}
base.OnStartup(e);
exceptionTrapper = new WpfGlobalExceptionTrapper();
exceptionTrapper.Initialize(this);
exceptionTrapper.ApplicationCrashed += ExceptionTrapper_ApplicationCrashed;
ApplyEFCacheSettings();
WebRequest.DefaultWebProxy = null;
GetLastApplicationCrashFromWindows();
}
private async void GetLastApplicationCrashFromWindows()
{
var logItem = await exceptionTrapper.GetLastApplicationCrashEventLog();
if (logItem != null)
{
LogManager.Log(logItem);
}
}
private void ApplyEFCacheSettings()
{
var settings = SettingsManager.Default.GetOrCreate();
if (settings.CachingMode != ObservablesContextInMemoryCachingMode.None)
{
LogManager.Log("EF Caching is enabled.");
LogManager.Log($"EF Caching mode is: {settings.CachingMode}.");
LogManager.Log($"EF Caching timeout: {settings.MaximumCacheTime.ToString()}");
try
{
ObservablesContext.EnableInMemoryCache(settings.MaximumCacheTime, settings.CachingMode);
}
catch (Exception ex)
{
LogManager.Log(ex, "Error while trying to activate EF caching.");
}
}
else
{
LogManager.Log("EF Caching is disabled");
}
}
#region Global Exception Trapping
///
/// 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)
{
try
{
try
{
if (Application.Current == null)
{
new Application { ShutdownMode = ShutdownMode.OnExplicitShutdown };
}
}
catch { }
if (e.Exception.ToString().Contains("A Task's exception(s) were not observed"))
{
e.TryRecover = true;
LogManager.Log("Task not observed exception. Ignoring...");
return;
}
Application.Current.Dispatcher.Invoke(() =>
{
WorkItem bug = null;
TeamFoundationServiceExtendedClient tfsClient = null;
INotificationProvider notification = null;
try
{
tfsClient = TangoIOC.Default.GetInstance();
notification = TangoIOC.Default.GetInstance();
if (tfsClient != null && tfsClient.IsInitialized)
{
bug = tfsClient.CreateBug();
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
}
ExceptionWindow exWin = new ExceptionWindow(e.Exception, bug != null);
exWin.ShowDialog();
switch (exWin.Resolution)
{
case ExceptionResolutions.Ignore:
e.TryRecover = true;
break;
case ExceptionResolutions.Restart:
e.TryRecover = false;
LogManager.Log("User selection was to restart the application. Restarting...");
Process.Start(Application.ResourceAssembly.Location);
Environment.Exit(0);
break;
case ExceptionResolutions.Shutdown:
e.TryRecover = false;
LogManager.Log("User selection was to shutdown the application. Restarting...");
Environment.Exit(0);
break;
case ExceptionResolutions.Report:
e.TryRecover = true;
LogManager.Log("User selection was to report the issue.");
if (bug != null)
{
notification.ShowModalDialog(new ReportIssueViewVM(tfsClient.Project, bug), async (vm) =>
{
using (notification.PushTaskItem("Uploading bug report..."))
{
try
{
tfsClient.FinalizeBug(vm.WorkItem);
await tfsClient.UploadWorkItem(vm.WorkItem);
}
catch (Exception ex)
{
notification.ShowError("An error occurred while trying to create the issue." + Environment.NewLine + ex.Message);
}
}
}, null);
}
break;
}
});
}
catch (Exception ex)
{
LogManager.Log(ex, "Error in global exception trapper!");
MessageBox.Show(ex.ToStringSafe());
}
}
#endregion
}
}