Statistics
| Branch: | Revision:

root / trunk / Pithos.Client.WPF / App.xaml.cs @ 29a6b387

History | View | Annotate | Download (4.7 kB)

1
using System;
2
using System.Collections.Generic;
3
using System.Configuration;
4
using System.Data;
5
using System.Diagnostics;
6
using System.Linq;
7
using System.Net.Mail;
8
using System.Reflection;
9
using System.Text;
10
using System.Threading.Tasks;
11
using System.Windows;
12
using Caliburn.Micro;
13
using Microsoft.Win32;
14
using Caliburn.Micro.Logging;
15
using Pithos.Client.WPF.Properties;
16

    
17

    
18
namespace Pithos.Client.WPF
19
{
20
    /// <summary>
21
    /// Interaction logic for App.xaml
22
    /// </summary>
23
    public partial class App : Application
24
    {
25
        private readonly log4net.ILog _log = log4net.LogManager.GetLogger(typeof (App));
26

    
27
        public App()
28
        {
29
            log4net.Config.XmlConfigurator.Configure();            
30
            
31
            this.DispatcherUnhandledException += OnUnhandledException;
32
            AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
33
            TaskScheduler.UnobservedTaskException += OnUnobservedException;
34

    
35
            InitializeComponent();            
36
        }
37

    
38
        protected override void OnStartup(StartupEventArgs e)
39
        {            
40
            if (!Settings.Default.StartOnSystemStartup && e.Args.Contains("startup"))
41
            {
42
                this.Shutdown();
43
            }
44
            base.OnStartup(e);
45
        }
46

    
47
        private void OnUnobservedException(object sender, UnobservedTaskExceptionEventArgs e)
48
        {            
49
            var messages=new List<UserMessage>();
50
            e.Exception.Handle(exc=>{
51
                messages.Add(new UserMessage
52
                {
53
                    Message = "Unexpected Exception",
54
                    Details = exc.ToString(),
55
                    Severity = Severity.Error
56
                });
57
                return true;
58
            });
59

    
60
            ShowMessages("Oops!","Where did that come from? \r\nErm, an exception occured.\r\nWe apologize for the inconvenience", messages);
61
            e.SetObserved();
62
        }
63

    
64
        private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
65
        {
66
            var message = e.IsTerminating
67
                              ? "Unexpected Exception. The application must terminate"
68
                              : "Unexpected Exception";
69

    
70

    
71
            var messages = new[]{
72
                                   new UserMessage
73
                                       {
74
                                           Message = (e.ExceptionObject as Exception).Message,
75
                                           Details = e.ExceptionObject.ToString(),
76
                                           Severity = Severity.Error
77
                                       }
78
                               };
79
            ShowMessages("Oops!", message,messages);
80
        }
81

    
82
        void OnUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
83
        {                        
84
            var messages = new[]{
85
                                   new UserMessage
86
                                       {
87
                                           Message = e.Exception.Message, 
88
                                           Details = e.Exception.ToString(),
89
                                           Severity = Severity.Error
90
                                       }
91
                               };
92
            ShowMessages("Oops!", "Unexcpected Exception", messages);
93
            e.Handled=true;
94
        }
95

    
96
        void ShowMessages(string title,string message,IEnumerable<UserMessage> messages )
97
        {
98
            LogMessages(messages);
99
            Execute.OnUIThread(()=>{
100
                var messageView = new MessageView(messages);
101
                messageView.Title = title;
102
                messageView.Message = message;
103
                messageView.ShowDialog();
104
            });
105
        }
106

    
107
        private void LogMessages(IEnumerable<UserMessage> messages)
108
        {
109
            var logMessage = CreateMessage(messages);
110

    
111
            _log.Error(logMessage);
112
        }
113

    
114
        private static string CreateMessage(IEnumerable<UserMessage> messages)
115
        {
116
            var messageBuilder = messages.Aggregate(new StringBuilder("Unexpected Error\r\n"),
117
                                                    (builder, message) =>
118
                                                        {
119
                                                            builder.AppendFormat("\r\n[{0}] {1}\r\n{2}\r\n", message.Severity,
120
                                                                                 message.Message, message.Details);
121
                                                            return builder;
122
                                                        });
123
            var logMessage = messageBuilder.ToString();
124
            return logMessage;
125
        }
126
    }
127

    
128
}