Statistics
| Branch: | Revision:

root / trunk / Pithos.Client.WPF / App.xaml.cs @ 0771dfd7

History | View | Annotate | Download (10.7 kB)

1 255f5f86 Panagiotis Kanavos
#region
2 255f5f86 Panagiotis Kanavos
/* -----------------------------------------------------------------------
3 255f5f86 Panagiotis Kanavos
 * <copyright file="App.xaml.cs" company="GRNet">
4 255f5f86 Panagiotis Kanavos
 * 
5 255f5f86 Panagiotis Kanavos
 * Copyright 2011-2012 GRNET S.A. All rights reserved.
6 255f5f86 Panagiotis Kanavos
 *
7 255f5f86 Panagiotis Kanavos
 * Redistribution and use in source and binary forms, with or
8 255f5f86 Panagiotis Kanavos
 * without modification, are permitted provided that the following
9 255f5f86 Panagiotis Kanavos
 * conditions are met:
10 255f5f86 Panagiotis Kanavos
 *
11 255f5f86 Panagiotis Kanavos
 *   1. Redistributions of source code must retain the above
12 255f5f86 Panagiotis Kanavos
 *      copyright notice, this list of conditions and the following
13 255f5f86 Panagiotis Kanavos
 *      disclaimer.
14 255f5f86 Panagiotis Kanavos
 *
15 255f5f86 Panagiotis Kanavos
 *   2. Redistributions in binary form must reproduce the above
16 255f5f86 Panagiotis Kanavos
 *      copyright notice, this list of conditions and the following
17 255f5f86 Panagiotis Kanavos
 *      disclaimer in the documentation and/or other materials
18 255f5f86 Panagiotis Kanavos
 *      provided with the distribution.
19 255f5f86 Panagiotis Kanavos
 *
20 255f5f86 Panagiotis Kanavos
 *
21 255f5f86 Panagiotis Kanavos
 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
22 255f5f86 Panagiotis Kanavos
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 255f5f86 Panagiotis Kanavos
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 255f5f86 Panagiotis Kanavos
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
25 255f5f86 Panagiotis Kanavos
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 255f5f86 Panagiotis Kanavos
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 255f5f86 Panagiotis Kanavos
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28 255f5f86 Panagiotis Kanavos
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 255f5f86 Panagiotis Kanavos
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 255f5f86 Panagiotis Kanavos
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 255f5f86 Panagiotis Kanavos
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 255f5f86 Panagiotis Kanavos
 * POSSIBILITY OF SUCH DAMAGE.
33 255f5f86 Panagiotis Kanavos
 *
34 255f5f86 Panagiotis Kanavos
 * The views and conclusions contained in the software and
35 255f5f86 Panagiotis Kanavos
 * documentation are those of the authors and should not be
36 255f5f86 Panagiotis Kanavos
 * interpreted as representing official policies, either expressed
37 255f5f86 Panagiotis Kanavos
 * or implied, of GRNET S.A.
38 255f5f86 Panagiotis Kanavos
 * </copyright>
39 255f5f86 Panagiotis Kanavos
 * -----------------------------------------------------------------------
40 255f5f86 Panagiotis Kanavos
 */
41 255f5f86 Panagiotis Kanavos
#endregion
42 255f5f86 Panagiotis Kanavos
using System;
43 9bae55d1 Panagiotis Kanavos
using System.Collections.Generic;
44 db8a9589 Panagiotis Kanavos
using System.IO;
45 9bae55d1 Panagiotis Kanavos
using System.Linq;
46 5bcf6d70 Panagiotis Kanavos
using System.Reflection;
47 ff26eb71 Panagiotis Kanavos
using System.Text;
48 759bd3c4 Panagiotis Kanavos
using System.Threading;
49 ff26eb71 Panagiotis Kanavos
using System.Threading.Tasks;
50 9bae55d1 Panagiotis Kanavos
using System.Windows;
51 ff26eb71 Panagiotis Kanavos
using Caliburn.Micro;
52 adfa4645 Panagiotis Kanavos
using Pithos.Client.WPF.Configuration;
53 29a6b387 Panagiotis Kanavos
using Pithos.Client.WPF.Properties;
54 db8a9589 Panagiotis Kanavos
using log4net.Appender;
55 6f03d6e1 Panagiotis Kanavos
using log4net.Core;
56 db8a9589 Panagiotis Kanavos
using log4net.Repository.Hierarchy;
57 20e9a378 Panagiotis Kanavos
58 9bae55d1 Panagiotis Kanavos
59 9bae55d1 Panagiotis Kanavos
namespace Pithos.Client.WPF
60 9bae55d1 Panagiotis Kanavos
{
61 9bae55d1 Panagiotis Kanavos
    /// <summary>
62 9bae55d1 Panagiotis Kanavos
    /// Interaction logic for App.xaml
63 9bae55d1 Panagiotis Kanavos
    /// </summary>
64 9bae55d1 Panagiotis Kanavos
    public partial class App : Application
65 9bae55d1 Panagiotis Kanavos
    {
66 db8a9589 Panagiotis Kanavos
        private static readonly log4net.ILog Log = log4net.LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType );
67 8d2b4fa3 Panagiotis Kanavos
        
68 46426dbd Panagiotis Kanavos
69 9bae55d1 Panagiotis Kanavos
        public App()
70 9bae55d1 Panagiotis Kanavos
        {
71 46426dbd Panagiotis Kanavos
72 8d2b4fa3 Panagiotis Kanavos
            //var instanceMutex=new Mutex()
73 8d2b4fa3 Panagiotis Kanavos
74 db8a9589 Panagiotis Kanavos
            InitializeLogging();
75 db8a9589 Panagiotis Kanavos
76 db8a9589 Panagiotis Kanavos
77 db8a9589 Panagiotis Kanavos
            DispatcherUnhandledException += OnDispatcherUnhandledException;
78 ff26eb71 Panagiotis Kanavos
            AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
79 ff26eb71 Panagiotis Kanavos
            TaskScheduler.UnobservedTaskException += OnUnobservedException;
80 5bcf6d70 Panagiotis Kanavos
81 46426dbd Panagiotis Kanavos
82 8a84d039 Panagiotis Kanavos
            //Fix incorrect proxy settings by switching to default proxy, if the proxy server settings is empty
83 8a84d039 Panagiotis Kanavos
            if (Settings.Default.UseManualProxy && String.IsNullOrWhiteSpace(Settings.Default.ProxyServer))
84 8a84d039 Panagiotis Kanavos
            {
85 8a84d039 Panagiotis Kanavos
                Settings.Default.UseManualProxy = false;
86 8a84d039 Panagiotis Kanavos
                Settings.Default.UseDefaultProxy = true;
87 8a84d039 Panagiotis Kanavos
            }
88 8a84d039 Panagiotis Kanavos
89 8d2b4fa3 Panagiotis Kanavos
90 5bcf6d70 Panagiotis Kanavos
            InitializeComponent();            
91 8d2b4fa3 Panagiotis Kanavos
        }       
92 8d2b4fa3 Panagiotis Kanavos
93 ff26eb71 Panagiotis Kanavos
94 79f92570 Panagiotis Kanavos
/*
95 46426dbd Panagiotis Kanavos
        private void OnUpdateDetected(object sender, UpdateDetectedEventArgs e)
96 46426dbd Panagiotis Kanavos
        {
97 46426dbd Panagiotis Kanavos
            Log.InfoFormat("Update Detected {0}",e.LatestVersion.Version);    
98 46426dbd Panagiotis Kanavos
        }
99 79f92570 Panagiotis Kanavos
*/
100 46426dbd Panagiotis Kanavos
101 db8a9589 Panagiotis Kanavos
        private static void InitializeLogging()
102 db8a9589 Panagiotis Kanavos
        {
103 db8a9589 Panagiotis Kanavos
            log4net.Config.XmlConfigurator.Configure();
104 db8a9589 Panagiotis Kanavos
105 db8a9589 Panagiotis Kanavos
            try
106 db8a9589 Panagiotis Kanavos
            {
107 adfa4645 Panagiotis Kanavos
                var pithosDataPath = PithosSettings.PithosDataPath;
108 db8a9589 Panagiotis Kanavos
                if (!Directory.Exists(pithosDataPath))
109 db8a9589 Panagiotis Kanavos
                    Directory.CreateDirectory(pithosDataPath);
110 db8a9589 Panagiotis Kanavos
111 db8a9589 Panagiotis Kanavos
                var loggerRepository = (Hierarchy)log4net.LogManager.GetRepository();
112 6f03d6e1 Panagiotis Kanavos
113 db8a9589 Panagiotis Kanavos
                var appenders = loggerRepository.GetAppenders();
114 6f03d6e1 Panagiotis Kanavos
                
115 81c5c310 pkanavos
116 db8a9589 Panagiotis Kanavos
                var lossyAppender = appenders.OfType<BufferingForwardingAppender>()
117 6f03d6e1 Panagiotis Kanavos
                    .FirstOrDefault(appender => appender.Name == "LossyFileAppender");
118 6f03d6e1 Panagiotis Kanavos
                if (lossyAppender!=null)
119 6f03d6e1 Panagiotis Kanavos
                {
120 6f03d6e1 Panagiotis Kanavos
                    var dumpAppender = lossyAppender.Appenders.OfType<RollingFileAppender>().First();
121 6f03d6e1 Panagiotis Kanavos
                    dumpAppender.File = Path.Combine(pithosDataPath, "errorlog.xml");
122 6f03d6e1 Panagiotis Kanavos
                    dumpAppender.ActivateOptions();
123 6f03d6e1 Panagiotis Kanavos
                }
124 6f03d6e1 Panagiotis Kanavos
                
125 6f03d6e1 Panagiotis Kanavos
                var debugAppender =appenders.OfType<RollingFileAppender>()
126 6f03d6e1 Panagiotis Kanavos
                    .FirstOrDefault(a => a.Name == "DebugFileAppender");
127 6f03d6e1 Panagiotis Kanavos
                if (debugAppender != null)
128 6f03d6e1 Panagiotis Kanavos
                {
129 6f03d6e1 Panagiotis Kanavos
                    debugAppender.File = Path.Combine(pithosDataPath, "debuglog.xml");
130 6f03d6e1 Panagiotis Kanavos
                    if (!Settings.Default.DebugLoggingEnabled)
131 6f03d6e1 Panagiotis Kanavos
                        debugAppender.Threshold = Level.Off;
132 6f03d6e1 Panagiotis Kanavos
                    debugAppender.ActivateOptions();
133 6f03d6e1 Panagiotis Kanavos
                }
134 db8a9589 Panagiotis Kanavos
            }
135 db8a9589 Panagiotis Kanavos
            catch (Exception exc)
136 db8a9589 Panagiotis Kanavos
            {
137 db8a9589 Panagiotis Kanavos
                Log.Error("Dumpl appender initialization failed",exc);                
138 db8a9589 Panagiotis Kanavos
            }
139 db8a9589 Panagiotis Kanavos
        }
140 db8a9589 Panagiotis Kanavos
141 8d2b4fa3 Panagiotis Kanavos
        private Mutex _singleInstanceMutex;
142 8d2b4fa3 Panagiotis Kanavos
143 29a6b387 Panagiotis Kanavos
        protected override void OnStartup(StartupEventArgs e)
144 ca79acb7 Panagiotis Kanavos
        {
145 29a6b387 Panagiotis Kanavos
            if (!Settings.Default.StartOnSystemStartup && e.Args.Contains("startup"))
146 29a6b387 Panagiotis Kanavos
            {
147 db8a9589 Panagiotis Kanavos
                Shutdown();
148 ca79acb7 Panagiotis Kanavos
                return;
149 29a6b387 Panagiotis Kanavos
            }
150 db8a9589 Panagiotis Kanavos
151 8d2b4fa3 Panagiotis Kanavos
            bool firstInstance;
152 8d2b4fa3 Panagiotis Kanavos
            _singleInstanceMutex = new Mutex(false, "PITHOSMUTEX", out firstInstance);
153 8d2b4fa3 Panagiotis Kanavos
            if (!firstInstance)
154 8d2b4fa3 Panagiotis Kanavos
            {
155 8d2b4fa3 Panagiotis Kanavos
                _singleInstanceMutex.Dispose();
156 8d2b4fa3 Panagiotis Kanavos
                _singleInstanceMutex = null;
157 8d2b4fa3 Panagiotis Kanavos
                Shutdown();
158 8d2b4fa3 Panagiotis Kanavos
                return;
159 8d2b4fa3 Panagiotis Kanavos
            }
160 8d2b4fa3 Panagiotis Kanavos
161 db8a9589 Panagiotis Kanavos
            //Delay during startup
162 759bd3c4 Panagiotis Kanavos
            if (e.Args.Contains("startup"))
163 759bd3c4 Panagiotis Kanavos
            {
164 759bd3c4 Panagiotis Kanavos
                if (Settings.Default.StartupDelay>TimeSpan.Zero)
165 759bd3c4 Panagiotis Kanavos
                    Thread.Sleep(Settings.Default.StartupDelay);
166 759bd3c4 Panagiotis Kanavos
            }
167 759bd3c4 Panagiotis Kanavos
168 ca79acb7 Panagiotis Kanavos
            var splashScreen = new SplashScreen("images/logo.png");
169 ca79acb7 Panagiotis Kanavos
            splashScreen.Show(true);
170 ca79acb7 Panagiotis Kanavos
            
171 29a6b387 Panagiotis Kanavos
            base.OnStartup(e);
172 29a6b387 Panagiotis Kanavos
        }
173 29a6b387 Panagiotis Kanavos
174 8d2b4fa3 Panagiotis Kanavos
        protected override void OnExit(ExitEventArgs e)
175 8d2b4fa3 Panagiotis Kanavos
        {
176 8d2b4fa3 Panagiotis Kanavos
            try
177 8d2b4fa3 Panagiotis Kanavos
            {
178 8d2b4fa3 Panagiotis Kanavos
                if (_singleInstanceMutex!=null)
179 8d2b4fa3 Panagiotis Kanavos
                    _singleInstanceMutex.Dispose();
180 8d2b4fa3 Panagiotis Kanavos
                _singleInstanceMutex = null;
181 8d2b4fa3 Panagiotis Kanavos
            }
182 8d2b4fa3 Panagiotis Kanavos
            catch { }
183 8d2b4fa3 Panagiotis Kanavos
            base.OnExit(e);
184 8d2b4fa3 Panagiotis Kanavos
        }
185 8d2b4fa3 Panagiotis Kanavos
186 ff26eb71 Panagiotis Kanavos
        private void OnUnobservedException(object sender, UnobservedTaskExceptionEventArgs e)
187 81c5c310 pkanavos
        {
188 81c5c310 pkanavos
            Log.Error("Unobserved Task Exception", e.Exception); 
189 81c5c310 pkanavos
            
190 81c5c310 pkanavos
            var messages = new List<UserMessage>();
191 ff26eb71 Panagiotis Kanavos
            e.Exception.Handle(exc=>{
192 ff26eb71 Panagiotis Kanavos
                messages.Add(new UserMessage
193 ff26eb71 Panagiotis Kanavos
                {
194 ff26eb71 Panagiotis Kanavos
                    Message = "Unexpected Exception",
195 ff26eb71 Panagiotis Kanavos
                    Details = exc.ToString(),
196 ff26eb71 Panagiotis Kanavos
                    Severity = Severity.Error
197 ff26eb71 Panagiotis Kanavos
                });
198 ff26eb71 Panagiotis Kanavos
                return true;
199 ff26eb71 Panagiotis Kanavos
            });
200 ff26eb71 Panagiotis Kanavos
201 81c5c310 pkanavos
202 81c5c310 pkanavos
            var message = String.Format(@"{0}<LineBreak/>{1}<LineBreak/><LineBreak/>{2}", 
203 db8a9589 Panagiotis Kanavos
                WPF.Properties.Resources.Unexpected_Error,
204 db8a9589 Panagiotis Kanavos
                WPF.Properties.Resources.We_Apologize, 
205 db8a9589 Panagiotis Kanavos
                WPF.Properties.Resources.Please_Submit_Error);
206 db8a9589 Panagiotis Kanavos
            ShowMessages("Oops!",message, messages);
207 ff26eb71 Panagiotis Kanavos
            e.SetObserved();
208 ff26eb71 Panagiotis Kanavos
        }
209 ff26eb71 Panagiotis Kanavos
210 ff26eb71 Panagiotis Kanavos
        private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
211 ff26eb71 Panagiotis Kanavos
        {
212 db8a9589 Panagiotis Kanavos
            Log.Error("Unhandled exception", (Exception)e.ExceptionObject);
213 db8a9589 Panagiotis Kanavos
214 db8a9589 Panagiotis Kanavos
            var description = e.IsTerminating
215 db8a9589 Panagiotis Kanavos
                              ? WPF.Properties.Resources.Unexpected_Error_Terminating
216 db8a9589 Panagiotis Kanavos
                              : WPF.Properties.Resources.Unexpected_Error;
217 0771dfd7 pkanavos
            var message = String.Format(@"{0}<LineBreak/>{1}<LineBreak/><LineBreak/>{2}",
218 db8a9589 Panagiotis Kanavos
                description,
219 db8a9589 Panagiotis Kanavos
                WPF.Properties.Resources.We_Apologize,
220 db8a9589 Panagiotis Kanavos
                WPF.Properties.Resources.Please_Submit_Error);
221 ff26eb71 Panagiotis Kanavos
222 ff26eb71 Panagiotis Kanavos
223 db8a9589 Panagiotis Kanavos
            var exc = ((Exception) e.ExceptionObject);
224 ff26eb71 Panagiotis Kanavos
            var messages = new[]{
225 ff26eb71 Panagiotis Kanavos
                                   new UserMessage
226 ff26eb71 Panagiotis Kanavos
                                       {
227 db8a9589 Panagiotis Kanavos
                                           Message = exc.Message,
228 db8a9589 Panagiotis Kanavos
                                           Details = exc.ToString(),
229 ff26eb71 Panagiotis Kanavos
                                           Severity = Severity.Error
230 ff26eb71 Panagiotis Kanavos
                                       }
231 ff26eb71 Panagiotis Kanavos
                               };
232 db8a9589 Panagiotis Kanavos
233 db8a9589 Panagiotis Kanavos
234 ff26eb71 Panagiotis Kanavos
            ShowMessages("Oops!", message,messages);
235 ff26eb71 Panagiotis Kanavos
        }
236 ff26eb71 Panagiotis Kanavos
237 db8a9589 Panagiotis Kanavos
        void OnDispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
238 db8a9589 Panagiotis Kanavos
        {
239 db8a9589 Panagiotis Kanavos
            Log.Error("Unhandled Dispatcher exception", e.Exception);
240 db8a9589 Panagiotis Kanavos
            
241 ff26eb71 Panagiotis Kanavos
            var messages = new[]{
242 ff26eb71 Panagiotis Kanavos
                                   new UserMessage
243 ff26eb71 Panagiotis Kanavos
                                       {
244 ff26eb71 Panagiotis Kanavos
                                           Message = e.Exception.Message, 
245 ff26eb71 Panagiotis Kanavos
                                           Details = e.Exception.ToString(),
246 ff26eb71 Panagiotis Kanavos
                                           Severity = Severity.Error
247 ff26eb71 Panagiotis Kanavos
                                       }
248 ff26eb71 Panagiotis Kanavos
                               };
249 db8a9589 Panagiotis Kanavos
            ShowMessages(WPF.Properties.Resources.Error_Title, 
250 db8a9589 Panagiotis Kanavos
                WPF.Properties.Resources.Unexpected_Error,
251 db8a9589 Panagiotis Kanavos
                messages);
252 ff26eb71 Panagiotis Kanavos
            e.Handled=true;
253 ff26eb71 Panagiotis Kanavos
        }
254 ff26eb71 Panagiotis Kanavos
255 ff26eb71 Panagiotis Kanavos
        void ShowMessages(string title,string message,IEnumerable<UserMessage> messages )
256 ff26eb71 Panagiotis Kanavos
        {
257 db8a9589 Panagiotis Kanavos
            var messageList = messages.ToList();
258 db8a9589 Panagiotis Kanavos
            LogMessages(messageList);
259 ff26eb71 Panagiotis Kanavos
            Execute.OnUIThread(()=>{
260 db8a9589 Panagiotis Kanavos
                                       var messageView = new MessageView(messageList)
261 db8a9589 Panagiotis Kanavos
                                                        {
262 db8a9589 Panagiotis Kanavos
                                                            Title = title, 
263 db8a9589 Panagiotis Kanavos
                                                            Message = message
264 db8a9589 Panagiotis Kanavos
                                                        };
265 db8a9589 Panagiotis Kanavos
                                       messageView.ShowDialog();
266 ff26eb71 Panagiotis Kanavos
            });
267 ff26eb71 Panagiotis Kanavos
        }
268 ff26eb71 Panagiotis Kanavos
269 ff26eb71 Panagiotis Kanavos
        private void LogMessages(IEnumerable<UserMessage> messages)
270 ff26eb71 Panagiotis Kanavos
        {
271 ff26eb71 Panagiotis Kanavos
            var logMessage = CreateMessage(messages);
272 ff26eb71 Panagiotis Kanavos
273 db8a9589 Panagiotis Kanavos
            Log.Error(logMessage);
274 ff26eb71 Panagiotis Kanavos
        }
275 ff26eb71 Panagiotis Kanavos
276 ff26eb71 Panagiotis Kanavos
        private static string CreateMessage(IEnumerable<UserMessage> messages)
277 ff26eb71 Panagiotis Kanavos
        {
278 ff26eb71 Panagiotis Kanavos
            var messageBuilder = messages.Aggregate(new StringBuilder("Unexpected Error\r\n"),
279 ff26eb71 Panagiotis Kanavos
                                                    (builder, message) =>
280 ff26eb71 Panagiotis Kanavos
                                                        {
281 ff26eb71 Panagiotis Kanavos
                                                            builder.AppendFormat("\r\n[{0}] {1}\r\n{2}\r\n", message.Severity,
282 ff26eb71 Panagiotis Kanavos
                                                                                 message.Message, message.Details);
283 ff26eb71 Panagiotis Kanavos
                                                            return builder;
284 ff26eb71 Panagiotis Kanavos
                                                        });
285 ff26eb71 Panagiotis Kanavos
            var logMessage = messageBuilder.ToString();
286 ff26eb71 Panagiotis Kanavos
            return logMessage;
287 ff26eb71 Panagiotis Kanavos
        }
288 9bae55d1 Panagiotis Kanavos
    }
289 9bae55d1 Panagiotis Kanavos
290 9bae55d1 Panagiotis Kanavos
}