using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Diagnostics; using System.Linq; using System.Net; using System.Net.Mail; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows; using Caliburn.Micro; using Microsoft.Win32; using Caliburn.Micro.Logging; using Pithos.Client.WPF.Properties; namespace Pithos.Client.WPF { /// /// Interaction logic for App.xaml /// public partial class App : Application { private readonly log4net.ILog _log = log4net.LogManager.GetLogger(typeof (App)); public App() { log4net.Config.XmlConfigurator.Configure(); this.DispatcherUnhandledException += OnUnhandledException; AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; TaskScheduler.UnobservedTaskException += OnUnobservedException; //Fix incorrect proxy settings by switching to default proxy, if the proxy server settings is empty if (Settings.Default.UseManualProxy && String.IsNullOrWhiteSpace(Settings.Default.ProxyServer)) { Settings.Default.UseManualProxy = false; Settings.Default.UseDefaultProxy = true; } InitializeComponent(); } protected override void OnStartup(StartupEventArgs e) { if (!Settings.Default.StartOnSystemStartup && e.Args.Contains("startup")) { this.Shutdown(); } base.OnStartup(e); } private void OnUnobservedException(object sender, UnobservedTaskExceptionEventArgs e) { var messages=new List(); e.Exception.Handle(exc=>{ messages.Add(new UserMessage { Message = "Unexpected Exception", Details = exc.ToString(), Severity = Severity.Error }); return true; }); ShowMessages("Oops!","Where did that come from? \r\nErm, an exception occured.\r\nWe apologize for the inconvenience", messages); e.SetObserved(); } private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e) { var message = e.IsTerminating ? "Unexpected Exception. The application must terminate" : "Unexpected Exception"; var messages = new[]{ new UserMessage { Message = (e.ExceptionObject as Exception).Message, Details = e.ExceptionObject.ToString(), Severity = Severity.Error } }; ShowMessages("Oops!", message,messages); } void OnUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { var messages = new[]{ new UserMessage { Message = e.Exception.Message, Details = e.Exception.ToString(), Severity = Severity.Error } }; ShowMessages("Oops!", "Unexcpected Exception", messages); e.Handled=true; } void ShowMessages(string title,string message,IEnumerable messages ) { LogMessages(messages); Execute.OnUIThread(()=>{ var messageView = new MessageView(messages); messageView.Title = title; messageView.Message = message; messageView.ShowDialog(); }); } private void LogMessages(IEnumerable messages) { var logMessage = CreateMessage(messages); _log.Error(logMessage); } private static string CreateMessage(IEnumerable messages) { var messageBuilder = messages.Aggregate(new StringBuilder("Unexpected Error\r\n"), (builder, message) => { builder.AppendFormat("\r\n[{0}] {1}\r\n{2}\r\n", message.Severity, message.Message, message.Details); return builder; }); var logMessage = messageBuilder.ToString(); return logMessage; } } }