Statistics
| Branch: | Revision:

root / trunk / Pithos.Client.WPF / App.xaml.cs @ 8e2af005

History | View | Annotate | Download (14.5 kB)

1 2dad27a3 pkanavos
#region
2 2dad27a3 pkanavos
/* -----------------------------------------------------------------------
3 2dad27a3 pkanavos
 * <copyright file="App.xaml.cs" company="GRNet">
4 2dad27a3 pkanavos
 * 
5 2dad27a3 pkanavos
 * Copyright 2011-2012 GRNET S.A. All rights reserved.
6 2dad27a3 pkanavos
 *
7 2dad27a3 pkanavos
 * Redistribution and use in source and binary forms, with or
8 2dad27a3 pkanavos
 * without modification, are permitted provided that the following
9 2dad27a3 pkanavos
 * conditions are met:
10 2dad27a3 pkanavos
 *
11 2dad27a3 pkanavos
 *   1. Redistributions of source code must retain the above
12 2dad27a3 pkanavos
 *      copyright notice, this list of conditions and the following
13 2dad27a3 pkanavos
 *      disclaimer.
14 2dad27a3 pkanavos
 *
15 2dad27a3 pkanavos
 *   2. Redistributions in binary form must reproduce the above
16 2dad27a3 pkanavos
 *      copyright notice, this list of conditions and the following
17 2dad27a3 pkanavos
 *      disclaimer in the documentation and/or other materials
18 2dad27a3 pkanavos
 *      provided with the distribution.
19 2dad27a3 pkanavos
 *
20 2dad27a3 pkanavos
 *
21 2dad27a3 pkanavos
 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
22 2dad27a3 pkanavos
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 2dad27a3 pkanavos
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 2dad27a3 pkanavos
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
25 2dad27a3 pkanavos
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 2dad27a3 pkanavos
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 2dad27a3 pkanavos
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28 2dad27a3 pkanavos
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 2dad27a3 pkanavos
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 2dad27a3 pkanavos
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 2dad27a3 pkanavos
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 2dad27a3 pkanavos
 * POSSIBILITY OF SUCH DAMAGE.
33 2dad27a3 pkanavos
 *
34 2dad27a3 pkanavos
 * The views and conclusions contained in the software and
35 2dad27a3 pkanavos
 * documentation are those of the authors and should not be
36 2dad27a3 pkanavos
 * interpreted as representing official policies, either expressed
37 2dad27a3 pkanavos
 * or implied, of GRNET S.A.
38 2dad27a3 pkanavos
 * </copyright>
39 2dad27a3 pkanavos
 * -----------------------------------------------------------------------
40 2dad27a3 pkanavos
 */
41 2dad27a3 pkanavos
#endregion
42 2dad27a3 pkanavos
using System;
43 2dad27a3 pkanavos
using System.Collections.Generic;
44 2dad27a3 pkanavos
using System.IO;
45 2dad27a3 pkanavos
using System.Linq;
46 2dad27a3 pkanavos
using System.Net;
47 2dad27a3 pkanavos
using System.Reflection;
48 2dad27a3 pkanavos
using System.Text;
49 2dad27a3 pkanavos
using System.Threading;
50 2dad27a3 pkanavos
using System.Threading.Tasks;
51 2dad27a3 pkanavos
using System.Windows;
52 2dad27a3 pkanavos
using Caliburn.Micro;
53 2dad27a3 pkanavos
using Pithos.Client.WPF.Configuration;
54 2dad27a3 pkanavos
using Pithos.Client.WPF.Properties;
55 2dad27a3 pkanavos
using Pithos.Interfaces;
56 2dad27a3 pkanavos
using log4net.Appender;
57 2dad27a3 pkanavos
using log4net.Core;
58 2dad27a3 pkanavos
using log4net.Repository.Hierarchy;
59 2dad27a3 pkanavos
using System.Runtime.InteropServices;
60 2dad27a3 pkanavos
61 2dad27a3 pkanavos
62 2dad27a3 pkanavos
namespace Pithos.Client.WPF
63 2dad27a3 pkanavos
{
64 2dad27a3 pkanavos
    /// <summary>
65 2dad27a3 pkanavos
    /// Interaction logic for App.xaml
66 2dad27a3 pkanavos
    /// </summary>
67 2dad27a3 pkanavos
    public partial class App : Application
68 2dad27a3 pkanavos
    {
69 2dad27a3 pkanavos
        private static readonly log4net.ILog Log = log4net.LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType );
70 2dad27a3 pkanavos
        
71 2dad27a3 pkanavos
            //DLL Import to add restart manager support
72 2dad27a3 pkanavos
            [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
73 2dad27a3 pkanavos
            public static extern Int32 RegisterApplicationRestart(String commandLineArgs, UInt32 flags);
74 2dad27a3 pkanavos
		
75 2dad27a3 pkanavos
        public App()
76 2dad27a3 pkanavos
        {
77 2dad27a3 pkanavos
78 2dad27a3 pkanavos
            //var instanceMutex=new Mutex()
79 2dad27a3 pkanavos
            InitializeLogging();
80 2dad27a3 pkanavos
81 2dad27a3 pkanavos
82 2dad27a3 pkanavos
            //Detect OS, if Major Version is 6+ use RestartManager
83 2dad27a3 pkanavos
            OperatingSystem os = Environment.OSVersion;
84 2dad27a3 pkanavos
            Version vs = os.Version;
85 2dad27a3 pkanavos
86 2dad27a3 pkanavos
            //Register Application in the Restartmanager service
87 2dad27a3 pkanavos
            Log.ErrorFormat("OS: [{0}]", vs.Major);
88 2dad27a3 pkanavos
            if (vs.Major > 5)
89 2dad27a3 pkanavos
            {
90 2dad27a3 pkanavos
                Int32 result = RegisterApplicationRestart(null, 0);
91 2dad27a3 pkanavos
                Log.ErrorFormat("RM Result: [{0}]", result);
92 2dad27a3 pkanavos
            }
93 2dad27a3 pkanavos
94 2dad27a3 pkanavos
            DispatcherUnhandledException += OnDispatcherUnhandledException;
95 2dad27a3 pkanavos
            AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
96 2dad27a3 pkanavos
            TaskScheduler.UnobservedTaskException += OnUnobservedException;
97 2dad27a3 pkanavos
98 2dad27a3 pkanavos
99 2dad27a3 pkanavos
            //Fix incorrect proxy settings by switching to default proxy, if the proxy server settings is empty
100 2dad27a3 pkanavos
            if (Settings.Default.UseManualProxy && String.IsNullOrWhiteSpace(Settings.Default.ProxyServer))
101 2dad27a3 pkanavos
            {
102 2dad27a3 pkanavos
                Settings.Default.UseManualProxy = false;
103 2dad27a3 pkanavos
                Settings.Default.UseDefaultProxy = true;
104 2dad27a3 pkanavos
            }
105 2dad27a3 pkanavos
106 2dad27a3 pkanavos
            if (Settings.Default.IgnoreCertificateErrors)
107 2dad27a3 pkanavos
                ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;
108 2dad27a3 pkanavos
            ServicePointManager.Expect100Continue = false;
109 2dad27a3 pkanavos
            InitializeComponent();            
110 2dad27a3 pkanavos
        }       
111 2dad27a3 pkanavos
112 2dad27a3 pkanavos
113 2dad27a3 pkanavos
/*
114 2dad27a3 pkanavos
        private void OnUpdateDetected(object sender, UpdateDetectedEventArgs e)
115 2dad27a3 pkanavos
        {
116 2dad27a3 pkanavos
            Log.InfoFormat("Update Detected {0}",e.LatestVersion.Version);    
117 2dad27a3 pkanavos
        }
118 2dad27a3 pkanavos
*/
119 2dad27a3 pkanavos
120 2dad27a3 pkanavos
        private static void InitializeLogging()
121 2dad27a3 pkanavos
        {
122 2dad27a3 pkanavos
            log4net.Config.XmlConfigurator.Configure();
123 2dad27a3 pkanavos
124 2dad27a3 pkanavos
            try
125 2dad27a3 pkanavos
            {
126 2dad27a3 pkanavos
                var pithosDataPath = PithosSettings.PithosDataPath;
127 2dad27a3 pkanavos
                if (!Directory.Exists(pithosDataPath))
128 2dad27a3 pkanavos
                    Directory.CreateDirectory(pithosDataPath);
129 2dad27a3 pkanavos
130 2dad27a3 pkanavos
                var loggerRepository = (Hierarchy)log4net.LogManager.GetRepository();
131 2dad27a3 pkanavos
132 2dad27a3 pkanavos
                var appenders = loggerRepository.GetAppenders();
133 2dad27a3 pkanavos
                
134 2dad27a3 pkanavos
135 2dad27a3 pkanavos
                var lossyAppender = appenders.OfType<BufferingForwardingAppender>()
136 2dad27a3 pkanavos
                    .FirstOrDefault(appender => appender.Name == "LossyFileAppender");
137 2dad27a3 pkanavos
                if (lossyAppender!=null)
138 2dad27a3 pkanavos
                {
139 2dad27a3 pkanavos
                    var dumpAppender = lossyAppender.Appenders.OfType<RollingFileAppender>().First();
140 2dad27a3 pkanavos
                    dumpAppender.File = Path.Combine(pithosDataPath, "errorlog.xml");
141 2dad27a3 pkanavos
                    dumpAppender.ActivateOptions();
142 2dad27a3 pkanavos
                }
143 2dad27a3 pkanavos
                
144 2dad27a3 pkanavos
                var debugAppender =appenders.OfType<RollingFileAppender>()
145 2dad27a3 pkanavos
                    .FirstOrDefault(a => a.Name == "DebugFileAppender");
146 2dad27a3 pkanavos
                if (debugAppender != null)
147 2dad27a3 pkanavos
                {
148 2dad27a3 pkanavos
                    debugAppender.File = Path.Combine(pithosDataPath, "debuglog.xml");
149 2dad27a3 pkanavos
                    if (!Settings.Default.DebugLoggingEnabled)
150 2dad27a3 pkanavos
                        debugAppender.Threshold = Level.Off;
151 2dad27a3 pkanavos
                    debugAppender.ActivateOptions();
152 2dad27a3 pkanavos
                }
153 2dad27a3 pkanavos
            }
154 2dad27a3 pkanavos
            catch (Exception exc)
155 2dad27a3 pkanavos
            {
156 2dad27a3 pkanavos
                Log.Error("Dumpl appender initialization failed",exc);                
157 2dad27a3 pkanavos
            }
158 2dad27a3 pkanavos
        }
159 2dad27a3 pkanavos
160 2dad27a3 pkanavos
        private Mutex _singleInstanceMutex;
161 2dad27a3 pkanavos
162 2dad27a3 pkanavos
        protected override void OnStartup(StartupEventArgs e)
163 2dad27a3 pkanavos
        {
164 2dad27a3 pkanavos
            if (!Settings.Default.StartOnSystemStartup && e.Args.Contains("startup"))
165 2dad27a3 pkanavos
            {
166 2dad27a3 pkanavos
                Shutdown();
167 2dad27a3 pkanavos
                return;
168 2dad27a3 pkanavos
            }
169 2dad27a3 pkanavos
170 2dad27a3 pkanavos
            bool firstInstance;
171 2dad27a3 pkanavos
            _singleInstanceMutex = new Mutex(false, "PITHOSMUTEX", out firstInstance);
172 2dad27a3 pkanavos
            if (!firstInstance)
173 2dad27a3 pkanavos
            {
174 2dad27a3 pkanavos
                _singleInstanceMutex.Dispose();
175 2dad27a3 pkanavos
                _singleInstanceMutex = null;
176 397b9100 pkanavos
                Log.Warn("An instance of Pithos+ is already running. Terminating.");
177 2dad27a3 pkanavos
                Shutdown();
178 2dad27a3 pkanavos
                return;
179 2dad27a3 pkanavos
            }
180 2dad27a3 pkanavos
181 2dad27a3 pkanavos
            //Delay during startup
182 2dad27a3 pkanavos
            if (e.Args.Contains("startup"))
183 2dad27a3 pkanavos
            {
184 2dad27a3 pkanavos
                if (Settings.Default.StartupDelay>TimeSpan.Zero)
185 2dad27a3 pkanavos
                    Thread.Sleep(Settings.Default.StartupDelay);
186 2dad27a3 pkanavos
            }
187 2dad27a3 pkanavos
188 2dad27a3 pkanavos
            var splashScreen = new SplashScreen("images/pithos_logo-title-margin-splash-600-whitebg.png");
189 2dad27a3 pkanavos
            splashScreen.Show(true);
190 2dad27a3 pkanavos
            
191 2dad27a3 pkanavos
            base.OnStartup(e);
192 2dad27a3 pkanavos
        }
193 2dad27a3 pkanavos
194 2dad27a3 pkanavos
        protected override void OnExit(ExitEventArgs e)
195 2dad27a3 pkanavos
        {
196 2dad27a3 pkanavos
            try
197 2dad27a3 pkanavos
            {
198 2dad27a3 pkanavos
                if (_singleInstanceMutex!=null)
199 2dad27a3 pkanavos
                    _singleInstanceMutex.Dispose();
200 2dad27a3 pkanavos
                _singleInstanceMutex = null;
201 2dad27a3 pkanavos
            }
202 2dad27a3 pkanavos
            catch { }
203 2dad27a3 pkanavos
            base.OnExit(e);
204 2dad27a3 pkanavos
        }
205 2dad27a3 pkanavos
206 2dad27a3 pkanavos
        private void OnUnobservedException(object sender, UnobservedTaskExceptionEventArgs e)
207 2dad27a3 pkanavos
        {
208 2dad27a3 pkanavos
            Log.Error("Unobserved Task Exception", e.Exception); 
209 2dad27a3 pkanavos
            
210 2dad27a3 pkanavos
            var messages = new List<UserMessage>();
211 2dad27a3 pkanavos
            e.Exception.Handle(exc=>{
212 2dad27a3 pkanavos
                messages.Add(new UserMessage
213 2dad27a3 pkanavos
                {
214 2dad27a3 pkanavos
                    Message = "Unexpected Exception",
215 2dad27a3 pkanavos
                    Details = exc.ToString(),
216 2dad27a3 pkanavos
                    Severity = Severity.Error
217 2dad27a3 pkanavos
                });
218 2dad27a3 pkanavos
                return true;
219 2dad27a3 pkanavos
            });
220 2dad27a3 pkanavos
221 2dad27a3 pkanavos
222 2dad27a3 pkanavos
            //Do not display any messages if this is a 304 code
223 2dad27a3 pkanavos
            var ignoreExceptions = from exc in e.Exception.InnerExceptions.OfType<WebException>()
224 2dad27a3 pkanavos
                                   where IsAllowedException(exc)
225 2dad27a3 pkanavos
                                   select exc;
226 2dad27a3 pkanavos
227 2dad27a3 pkanavos
            if (ignoreExceptions.Any())
228 2dad27a3 pkanavos
            {
229 2dad27a3 pkanavos
                e.SetObserved();
230 2dad27a3 pkanavos
                return;
231 2dad27a3 pkanavos
            }
232 2dad27a3 pkanavos
233 2dad27a3 pkanavos
234 2dad27a3 pkanavos
           /* var message = String.Format(@"{0}" + Environment.NewLine + "{1}" + Environment.NewLine + "{2}", 
235 2dad27a3 pkanavos
                WPF.Properties.Resources.Unexpected_Error,
236 2dad27a3 pkanavos
                WPF.Properties.Resources.We_Apologize, 
237 2dad27a3 pkanavos
                WPF.Properties.Resources.Please_Submit_Error);
238 2dad27a3 pkanavos
            ShowMessages("Oops!",message, messages);*/
239 2dad27a3 pkanavos
            e.SetObserved();            
240 2dad27a3 pkanavos
        }
241 2dad27a3 pkanavos
242 2dad27a3 pkanavos
        private bool IsAllowedException(Exception exc)
243 2dad27a3 pkanavos
        {
244 2dad27a3 pkanavos
            var we = exc as WebException;
245 2dad27a3 pkanavos
            if (we==null)
246 2dad27a3 pkanavos
            {
247 2dad27a3 pkanavos
                return false;
248 2dad27a3 pkanavos
            }
249 2dad27a3 pkanavos
            var response = we.Response as HttpWebResponse;
250 2dad27a3 pkanavos
            return (response != null && response.StatusCode == HttpStatusCode.NotModified);
251 2dad27a3 pkanavos
        }
252 2dad27a3 pkanavos
253 2dad27a3 pkanavos
        private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
254 2dad27a3 pkanavos
        {
255 2dad27a3 pkanavos
256 2dad27a3 pkanavos
            //Do not display any messages if this is a 304 code
257 2dad27a3 pkanavos
            if (IsAllowedException(e.ExceptionObject as Exception))
258 2dad27a3 pkanavos
            {
259 2dad27a3 pkanavos
                return;
260 2dad27a3 pkanavos
            }
261 2dad27a3 pkanavos
262 2dad27a3 pkanavos
            if (e.ExceptionObject is ReflectionTypeLoadException)
263 2dad27a3 pkanavos
            {
264 2dad27a3 pkanavos
                var les=(ReflectionTypeLoadException) e.ExceptionObject;
265 2dad27a3 pkanavos
                Log.Error("Unhandled exception", les);
266 2dad27a3 pkanavos
                foreach (var le in les.LoaderExceptions)
267 2dad27a3 pkanavos
                {
268 2dad27a3 pkanavos
                    Log.Error("Dll load error", le);    
269 2dad27a3 pkanavos
                }
270 2dad27a3 pkanavos
            }
271 2dad27a3 pkanavos
            else
272 2dad27a3 pkanavos
                Log.Error("Unhandled exception", (Exception)e.ExceptionObject);
273 2dad27a3 pkanavos
274 2dad27a3 pkanavos
            if (!e.IsTerminating)
275 2dad27a3 pkanavos
                //Do not display a message unless the application is terminating
276 2dad27a3 pkanavos
                return;
277 2dad27a3 pkanavos
278 2dad27a3 pkanavos
            var description = e.IsTerminating
279 2dad27a3 pkanavos
                              ? WPF.Properties.Resources.Unexpected_Error_Terminating
280 2dad27a3 pkanavos
                              : WPF.Properties.Resources.Unexpected_Error;
281 2dad27a3 pkanavos
            var message = String.Format(@"{0}<LineBreak/>{1}<LineBreak/><LineBreak/>{2}",
282 2dad27a3 pkanavos
                description,
283 2dad27a3 pkanavos
                WPF.Properties.Resources.We_Apologize,
284 2dad27a3 pkanavos
                WPF.Properties.Resources.Please_Submit_Error);
285 2dad27a3 pkanavos
286 2dad27a3 pkanavos
            var exc = ((Exception) e.ExceptionObject);
287 2dad27a3 pkanavos
            var messages = new[]{
288 2dad27a3 pkanavos
                                   new UserMessage
289 2dad27a3 pkanavos
                                       {
290 2dad27a3 pkanavos
                                           Message = exc.Message,
291 2dad27a3 pkanavos
                                           Details = exc.ToString(),
292 2dad27a3 pkanavos
                                           Severity = Severity.Error
293 2dad27a3 pkanavos
                                       }
294 2dad27a3 pkanavos
                               };
295 2dad27a3 pkanavos
296 2dad27a3 pkanavos
297 2dad27a3 pkanavos
            ShowMessages("Oops!", message,messages);
298 2dad27a3 pkanavos
        }
299 2dad27a3 pkanavos
300 2dad27a3 pkanavos
301 2dad27a3 pkanavos
302 2dad27a3 pkanavos
        void OnDispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
303 2dad27a3 pkanavos
        {
304 2dad27a3 pkanavos
            //Do not display any messages if this is a 304 code
305 2dad27a3 pkanavos
            if (IsAllowedException(e.Exception))
306 2dad27a3 pkanavos
            {
307 2dad27a3 pkanavos
                return;
308 2dad27a3 pkanavos
            }
309 2dad27a3 pkanavos
310 2dad27a3 pkanavos
            if (e.Exception is ReflectionTypeLoadException)
311 2dad27a3 pkanavos
            {
312 2dad27a3 pkanavos
                var les = (ReflectionTypeLoadException)e.Exception;
313 2dad27a3 pkanavos
                Log.Error("Unhandled exception", les);
314 2dad27a3 pkanavos
                foreach (var le in les.LoaderExceptions)
315 2dad27a3 pkanavos
                {
316 2dad27a3 pkanavos
                    Log.Error("Dll load error", le);
317 2dad27a3 pkanavos
                }
318 2dad27a3 pkanavos
            }
319 2dad27a3 pkanavos
            else
320 a463ebae pkanavos
                Log.Error("Unhandled Dispatcher exception", e.Exception);
321 2dad27a3 pkanavos
            
322 2dad27a3 pkanavos
           /* var messages = new[]{
323 2dad27a3 pkanavos
                                   new UserMessage
324 2dad27a3 pkanavos
                                       {
325 2dad27a3 pkanavos
                                           Message = e.Exception.Message, 
326 2dad27a3 pkanavos
                                           Details = e.Exception.ToString(),
327 2dad27a3 pkanavos
                                           Severity = Severity.Error
328 2dad27a3 pkanavos
                                       }
329 2dad27a3 pkanavos
                               };
330 2dad27a3 pkanavos
            ShowMessages(WPF.Properties.Resources.Error_Title, 
331 2dad27a3 pkanavos
                WPF.Properties.Resources.Unexpected_Error,
332 2dad27a3 pkanavos
                messages);*/
333 2dad27a3 pkanavos
            e.Handled=true;
334 2dad27a3 pkanavos
        }
335 2dad27a3 pkanavos
336 2dad27a3 pkanavos
        void ShowMessages(string title,string message,IEnumerable<UserMessage> messages )
337 2dad27a3 pkanavos
        {
338 2dad27a3 pkanavos
            var messageList = messages.ToList();
339 2dad27a3 pkanavos
            LogMessages(messageList);
340 2dad27a3 pkanavos
            Execute.OnUIThread(()=>{
341 2dad27a3 pkanavos
                                       var messageView = new MessageView(messageList)
342 2dad27a3 pkanavos
                                                        {
343 2dad27a3 pkanavos
                                                            Title = title, 
344 2dad27a3 pkanavos
                                                            Message = message
345 2dad27a3 pkanavos
                                                        };
346 2dad27a3 pkanavos
                                       messageView.ShowDialog();
347 2dad27a3 pkanavos
            });
348 2dad27a3 pkanavos
        }
349 2dad27a3 pkanavos
350 2dad27a3 pkanavos
        private void LogMessages(IEnumerable<UserMessage> messages)
351 2dad27a3 pkanavos
        {
352 2dad27a3 pkanavos
            var logMessage = CreateMessage(messages);
353 2dad27a3 pkanavos
354 2dad27a3 pkanavos
            Log.Error(logMessage);
355 2dad27a3 pkanavos
        }
356 2dad27a3 pkanavos
357 2dad27a3 pkanavos
        private static string CreateMessage(IEnumerable<UserMessage> messages)
358 2dad27a3 pkanavos
        {
359 2dad27a3 pkanavos
            var messageBuilder = messages.Aggregate(new StringBuilder("Unexpected Error\r\n"),
360 2dad27a3 pkanavos
                                                    (builder, message) =>
361 2dad27a3 pkanavos
                                                        {
362 2dad27a3 pkanavos
                                                            builder.AppendFormat("\r\n[{0}] {1}\r\n{2}\r\n", message.Severity,
363 2dad27a3 pkanavos
                                                                                 message.Message, message.Details);
364 2dad27a3 pkanavos
                                                            return builder;
365 2dad27a3 pkanavos
                                                        });
366 2dad27a3 pkanavos
            var logMessage = messageBuilder.ToString();
367 2dad27a3 pkanavos
            return logMessage;
368 2dad27a3 pkanavos
        }
369 2dad27a3 pkanavos
    }
370 2dad27a3 pkanavos
371 2dad27a3 pkanavos
}
372 2dad27a3 pkanavos
373 2dad27a3 pkanavos
    enum RestartFlags
374 2dad27a3 pkanavos
    {
375 2dad27a3 pkanavos
        NONE = 0,
376 2dad27a3 pkanavos
        RESTART_CYCLICAL = 1,
377 2dad27a3 pkanavos
        RESTART_NOTIFY_SOLUTION = 2,
378 2dad27a3 pkanavos
        RESTART_NOTIFY_FAULT = 4,
379 2dad27a3 pkanavos
        RESTART_NO_CRASH = 8,
380 2dad27a3 pkanavos
        RESTART_NO_HANG = 16,
381 2dad27a3 pkanavos
        RESTART_NO_PATCH = 32,
382 2dad27a3 pkanavos
        RESTART_NO_REBOOT = 64
383 100379b3 George Pantazis
    }