X-Git-Url: https://code.grnet.gr/git/pithos-ms-client/blobdiff_plain/b5ddf130380eb4956707d3fbfa15fd46f4bae3f9..859a9ec58a43d7bf3530217622a912734939f032:/trunk/Pithos.Client.WPF/App.xaml.cs
diff --git a/trunk/Pithos.Client.WPF/App.xaml.cs b/trunk/Pithos.Client.WPF/App.xaml.cs
index 2acb681..f18643c 100644
--- a/trunk/Pithos.Client.WPF/App.xaml.cs
+++ b/trunk/Pithos.Client.WPF/App.xaml.cs
@@ -1,17 +1,61 @@
-using System;
+#region
+/* -----------------------------------------------------------------------
+ *
+ *
+ * Copyright 2011-2012 GRNET S.A. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ *
+ * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and
+ * documentation are those of the authors and should not be
+ * interpreted as representing official policies, either expressed
+ * or implied, of GRNET S.A.
+ *
+ * -----------------------------------------------------------------------
+ */
+#endregion
+using System;
using System.Collections.Generic;
-using System.Configuration;
-using System.Data;
-using System.Diagnostics;
+using System.IO;
using System.Linq;
-using System.Net.Mail;
+using System.Net;
using System.Reflection;
using System.Text;
+using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using Caliburn.Micro;
-using Microsoft.Win32;
-using Pithos.Client.WPF.Caliburn.Micro.Logging;
+using Pithos.Client.WPF.Configuration;
+using Pithos.Client.WPF.Properties;
+using log4net.Appender;
+using log4net.Core;
+using log4net.Repository.Hierarchy;
+using System.Runtime.InteropServices;
namespace Pithos.Client.WPF
@@ -21,26 +65,140 @@ namespace Pithos.Client.WPF
///
public partial class App : Application
{
- private log4net.ILog Log = log4net.LogManager.GetLogger(typeof (App));
+ private static readonly log4net.ILog Log = log4net.LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType );
+
+ ///DLL Import to add restart manager support
+ [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
+ static extern uint RegisterApplicationRestart(string pwzCommandLine, RestartFlags dwFlags);
+
public App()
{
- //var extensionController = new ShellExtensionController();
- //extensionController.RegisterExtensions();
- log4net.Config.XmlConfigurator.Configure();
- this.DispatcherUnhandledException += OnUnhandledException;
+ //var instanceMutex=new Mutex()
+
+ InitializeLogging();
+
+ ///Register Application in the Restartmanager service
+ RegisterApplicationRestart("Upgrade", RestartFlags.NONE);
+
+
+ DispatcherUnhandledException += OnDispatcherUnhandledException;
AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
TaskScheduler.UnobservedTaskException += OnUnobservedException;
- var appPatth = Assembly.GetExecutingAssembly().Location;
- Registry.LocalMachine.SetValue(@"Software\Pithos\AppPath",appPatth );
+
+ //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;
+ }
+
+ if (Settings.Default.IgnoreCertificateErrors)
+ ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;
+
+
InitializeComponent();
- //Application.Current.ApplyTheme("BureauBlue");
+ }
+
+
+/*
+ private void OnUpdateDetected(object sender, UpdateDetectedEventArgs e)
+ {
+ Log.InfoFormat("Update Detected {0}",e.LatestVersion.Version);
+ }
+*/
+
+ private static void InitializeLogging()
+ {
+ log4net.Config.XmlConfigurator.Configure();
+
+ try
+ {
+ var pithosDataPath = PithosSettings.PithosDataPath;
+ if (!Directory.Exists(pithosDataPath))
+ Directory.CreateDirectory(pithosDataPath);
+
+ var loggerRepository = (Hierarchy)log4net.LogManager.GetRepository();
+
+ var appenders = loggerRepository.GetAppenders();
+
+
+ var lossyAppender = appenders.OfType()
+ .FirstOrDefault(appender => appender.Name == "LossyFileAppender");
+ if (lossyAppender!=null)
+ {
+ var dumpAppender = lossyAppender.Appenders.OfType().First();
+ dumpAppender.File = Path.Combine(pithosDataPath, "errorlog.xml");
+ dumpAppender.ActivateOptions();
+ }
+
+ var debugAppender =appenders.OfType()
+ .FirstOrDefault(a => a.Name == "DebugFileAppender");
+ if (debugAppender != null)
+ {
+ debugAppender.File = Path.Combine(pithosDataPath, "debuglog.xml");
+ if (!Settings.Default.DebugLoggingEnabled)
+ debugAppender.Threshold = Level.Off;
+ debugAppender.ActivateOptions();
+ }
+ }
+ catch (Exception exc)
+ {
+ Log.Error("Dumpl appender initialization failed",exc);
+ }
+ }
+
+ private Mutex _singleInstanceMutex;
+
+ protected override void OnStartup(StartupEventArgs e)
+ {
+ if (!Settings.Default.StartOnSystemStartup && e.Args.Contains("startup"))
+ {
+ Shutdown();
+ return;
+ }
+
+ bool firstInstance;
+ _singleInstanceMutex = new Mutex(false, "PITHOSMUTEX", out firstInstance);
+ if (!firstInstance)
+ {
+ _singleInstanceMutex.Dispose();
+ _singleInstanceMutex = null;
+ Shutdown();
+ return;
+ }
+
+ //Delay during startup
+ if (e.Args.Contains("startup"))
+ {
+ if (Settings.Default.StartupDelay>TimeSpan.Zero)
+ Thread.Sleep(Settings.Default.StartupDelay);
+ }
+
+ var splashScreen = new SplashScreen("images/pithos_logo-title-margin-splash-600-whitebg.png");
+ splashScreen.Show(true);
+
+ base.OnStartup(e);
+ }
+
+ protected override void OnExit(ExitEventArgs e)
+ {
+ try
+ {
+ if (_singleInstanceMutex!=null)
+ _singleInstanceMutex.Dispose();
+ _singleInstanceMutex = null;
+ }
+ catch { }
+ base.OnExit(e);
}
private void OnUnobservedException(object sender, UnobservedTaskExceptionEventArgs e)
- {
- var messages=new List();
+ {
+ Log.Error("Unobserved Task Exception", e.Exception);
+
+ var messages = new List();
e.Exception.Handle(exc=>{
messages.Add(new UserMessage
{
@@ -51,30 +209,46 @@ namespace Pithos.Client.WPF
return true;
});
- ShowMessages("Oops!","Where did that come from? \r\nErm, an exception occured.\r\nWe apologize for the inconvenience", messages);
- e.SetObserved();
+
+ var message = String.Format(@"{0}" + Environment.NewLine + "{1}" + Environment.NewLine + "{2}",
+ WPF.Properties.Resources.Unexpected_Error,
+ WPF.Properties.Resources.We_Apologize,
+ WPF.Properties.Resources.Please_Submit_Error);
+ ShowMessages("Oops!",message, messages);
+ e.SetObserved();
}
private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
- var message = e.IsTerminating
- ? "Unexpected Exception. The application must terminate"
- : "Unexpected Exception";
+ Log.Error("Unhandled exception", (Exception)e.ExceptionObject);
+
+ var description = e.IsTerminating
+ ? WPF.Properties.Resources.Unexpected_Error_Terminating
+ : WPF.Properties.Resources.Unexpected_Error;
+ var message = String.Format(@"{0}{1}{2}",
+ description,
+ WPF.Properties.Resources.We_Apologize,
+ WPF.Properties.Resources.Please_Submit_Error);
+ var exc = ((Exception) e.ExceptionObject);
var messages = new[]{
new UserMessage
{
- Message = (e.ExceptionObject as Exception).Message,
- Details = e.ExceptionObject.ToString(),
+ Message = exc.Message,
+ Details = exc.ToString(),
Severity = Severity.Error
}
};
+
+
ShowMessages("Oops!", message,messages);
}
- void OnUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
- {
+ void OnDispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
+ {
+ Log.Error("Unhandled Dispatcher exception", e.Exception);
+
var messages = new[]{
new UserMessage
{
@@ -83,18 +257,23 @@ namespace Pithos.Client.WPF
Severity = Severity.Error
}
};
- ShowMessages("Oops!", "Unexcpected Exception", messages);
+ ShowMessages(WPF.Properties.Resources.Error_Title,
+ WPF.Properties.Resources.Unexpected_Error,
+ messages);
e.Handled=true;
}
void ShowMessages(string title,string message,IEnumerable messages )
{
- LogMessages(messages);
+ var messageList = messages.ToList();
+ LogMessages(messageList);
Execute.OnUIThread(()=>{
- var messageView = new MessageView(messages);
- messageView.Title = title;
- messageView.Message = message;
- messageView.ShowDialog();
+ var messageView = new MessageView(messageList)
+ {
+ Title = title,
+ Message = message
+ };
+ messageView.ShowDialog();
});
}
@@ -105,14 +284,6 @@ namespace Pithos.Client.WPF
Log.Error(logMessage);
}
- private async void SendMessages(IEnumerable messages )
- {
- var logMessage = CreateMessage(messages);
-
- var mailer = new SmtpClient();
- await mailer.SendTaskAsync("pithos@grnet.gr", "support@pithos.grnet.gr", "Errors", logMessage);
- }
-
private static string CreateMessage(IEnumerable messages)
{
var messageBuilder = messages.Aggregate(new StringBuilder("Unexpected Error\r\n"),
@@ -128,3 +299,15 @@ namespace Pithos.Client.WPF
}
}
+
+ enum RestartFlags
+ {
+ NONE = 0,
+ RESTART_CYCLICAL = 1,
+ RESTART_NOTIFY_SOLUTION = 2,
+ RESTART_NOTIFY_FAULT = 4,
+ RESTART_NO_CRASH = 8,
+ RESTART_NO_HANG = 16,
+ RESTART_NO_PATCH = 32,
+ RESTART_NO_REBOOT = 64
+ }
\ No newline at end of file