Statistics
| Branch: | Revision:

root / trunk / Pithos.Client.WPF / App.xaml.cs @ f734ab5b

History | View | Annotate | Download (4.4 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

    
16

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

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

    
34
            InitializeComponent();            
35
        }
36

    
37
        private void OnUnobservedException(object sender, UnobservedTaskExceptionEventArgs e)
38
        {            
39
            var messages=new List<UserMessage>();
40
            e.Exception.Handle(exc=>{
41
                messages.Add(new UserMessage
42
                {
43
                    Message = "Unexpected Exception",
44
                    Details = exc.ToString(),
45
                    Severity = Severity.Error
46
                });
47
                return true;
48
            });
49

    
50
            ShowMessages("Oops!","Where did that come from? \r\nErm, an exception occured.\r\nWe apologize for the inconvenience", messages);
51
            e.SetObserved();
52
        }
53

    
54
        private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
55
        {
56
            var message = e.IsTerminating
57
                              ? "Unexpected Exception. The application must terminate"
58
                              : "Unexpected Exception";
59

    
60

    
61
            var messages = new[]{
62
                                   new UserMessage
63
                                       {
64
                                           Message = (e.ExceptionObject as Exception).Message,
65
                                           Details = e.ExceptionObject.ToString(),
66
                                           Severity = Severity.Error
67
                                       }
68
                               };
69
            ShowMessages("Oops!", message,messages);
70
        }
71

    
72
        void OnUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
73
        {                        
74
            var messages = new[]{
75
                                   new UserMessage
76
                                       {
77
                                           Message = e.Exception.Message, 
78
                                           Details = e.Exception.ToString(),
79
                                           Severity = Severity.Error
80
                                       }
81
                               };
82
            ShowMessages("Oops!", "Unexcpected Exception", messages);
83
            e.Handled=true;
84
        }
85

    
86
        void ShowMessages(string title,string message,IEnumerable<UserMessage> messages )
87
        {
88
            LogMessages(messages);
89
            Execute.OnUIThread(()=>{
90
                var messageView = new MessageView(messages);
91
                messageView.Title = title;
92
                messageView.Message = message;
93
                messageView.ShowDialog();
94
            });
95
        }
96

    
97
        private void LogMessages(IEnumerable<UserMessage> messages)
98
        {
99
            var logMessage = CreateMessage(messages);
100

    
101
            _log.Error(logMessage);
102
        }
103

    
104
        private static string CreateMessage(IEnumerable<UserMessage> messages)
105
        {
106
            var messageBuilder = messages.Aggregate(new StringBuilder("Unexpected Error\r\n"),
107
                                                    (builder, message) =>
108
                                                        {
109
                                                            builder.AppendFormat("\r\n[{0}] {1}\r\n{2}\r\n", message.Severity,
110
                                                                                 message.Message, message.Details);
111
                                                            return builder;
112
                                                        });
113
            var logMessage = messageBuilder.ToString();
114
            return logMessage;
115
        }
116
    }
117

    
118
}