mirror of
https://github.com/chylex/Backup-Essentials.git
synced 2024-09-14 09:42:50 +02:00
148 lines
6.5 KiB
C#
148 lines
6.5 KiB
C#
using BackupEssentials.Backup;
|
|
using BackupEssentials.Backup.Data;
|
|
using BackupEssentials.Pages;
|
|
using BackupEssentials.Utils;
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
using System.Windows;
|
|
using System.Windows.Media.Animation;
|
|
using System.Windows.Threading;
|
|
|
|
namespace BackupEssentials{
|
|
public partial class App : Application{
|
|
public static Window Window { get { return Application.Current.MainWindow; } }
|
|
|
|
/// <summary>
|
|
/// List of arguments
|
|
/// =================
|
|
/// -runshell = switch to backup runner
|
|
/// [ required -src and either -dest or -locid ]
|
|
/// -src = backup source (folder or file, supports multiple entries)
|
|
/// -dest = backup destination (folder)
|
|
/// -locid = backup location id
|
|
/// </summary>
|
|
private void StartApp(object sender, StartupEventArgs args){
|
|
Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
|
|
Sys.Settings.Default.Load();
|
|
|
|
Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline),new FrameworkPropertyMetadata(){ DefaultValue = 30 });
|
|
|
|
ProgramArgsParser parser = new ProgramArgsParser(args.Args);
|
|
|
|
if (parser.HasFlag("runshell"))RunShell(parser);
|
|
else if (parser.HasFlag("runcompat"))RunCompatWindow(parser);
|
|
else RunMainWindow();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Runs backup executed from Windows Explorer, tasks or command line.
|
|
/// </summary>
|
|
private void RunShell(ProgramArgsParser parser){
|
|
int locid = -1;
|
|
string dest = parser.GetValue("dest",""), name = "(Manual)";
|
|
|
|
if (int.TryParse(parser.GetValue("locid","-1"),out locid) && locid >= 0){
|
|
DataStorage.Load(DataStorage.Type.Locations);
|
|
|
|
if (locid < DataStorage.BackupLocationList.Count){
|
|
name = DataStorage.BackupLocationList[locid].Name;
|
|
dest = DataStorage.BackupLocationList[locid].Directory;
|
|
}
|
|
}
|
|
|
|
if (dest.Length > 0){
|
|
BackupRunInfo info = new BackupRunInfo(parser.GetMultiValue("src"),name,dest,parser.HasFlag("noreport"));
|
|
|
|
BackupWindow window = new BackupWindow(new BackupRunner(info));
|
|
if (parser.HasFlag("nohide"))window.WindowState = WindowState.Normal;
|
|
window.Show();
|
|
}
|
|
else throw new ArgumentException(Sys.Settings.Default.Language["General.App.DestinationMissing",string.Join(" ",parser.ToString())]);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Runs a Windows XP/Vista compatibility window that do not have cascaded Explorer entries.
|
|
/// </summary>
|
|
private void RunCompatWindow(ProgramArgsParser parser){
|
|
object[] data = new object[]{ parser.GetMultiValue("src"), null, true };
|
|
|
|
SplashScreen splash = new SplashScreen("Resources/SplashScreen.png");
|
|
splash.Show(false,false);
|
|
new MainWindow(splash,(window) => { window.ShowPage(typeof(BackupDrop),data); }).Show();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Runs the program without any special settings. Checks for already running process of the program, if there is one it moves it to foreground, if not it shows a new window.
|
|
/// </summary>
|
|
private void RunMainWindow(){
|
|
Process[] running;
|
|
|
|
try{
|
|
running = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(Assembly.GetEntryAssembly().Location));
|
|
}catch(InvalidOperationException){
|
|
running = new Process[0];
|
|
}
|
|
|
|
if (running.Length > 1){
|
|
int myId = Process.GetCurrentProcess().Id;
|
|
|
|
foreach(Process process in running){
|
|
if (process.Id != myId && process.MainWindowHandle != IntPtr.Zero){
|
|
if (process.Responding){
|
|
NativeMethods.SetForegroundWindow(process.MainWindowHandle);
|
|
Application.Current.Shutdown();
|
|
return;
|
|
}
|
|
else{
|
|
if (MessageBox.Show(MainWindow,Sys.Settings.Default.Language["General.App.AlreadyRunning"],Sys.Settings.Default.Language["General.App.AlreadyRunning.Title"],MessageBoxButton.YesNo,MessageBoxImage.Question) == MessageBoxResult.Yes){
|
|
try{
|
|
process.Kill();
|
|
}catch(Exception e){
|
|
MessageBox.Show(MainWindow,Sys.Settings.Default.Language["General.App.CannotClose",e.Message],Sys.Settings.Default.Language["General.App.CannotClose.Title"],MessageBoxButton.OK,MessageBoxImage.Error);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
SplashScreen splash = new SplashScreen("Resources/SplashScreen.png");
|
|
splash.Show(false,false);
|
|
new MainWindow(splash,(window) => { window.ShowPage(typeof(Home)); }).Show();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Logs thrown exceptions into exceptions.log file and displays the message to the user.
|
|
/// </summary>
|
|
private void HandleException(object sender, DispatcherUnhandledExceptionEventArgs e){
|
|
LogException(e.Exception);
|
|
MessageBox.Show("Exception caught: "+e.Exception);
|
|
// TODO
|
|
}
|
|
|
|
public static void LogException(Exception e){
|
|
using(FileStream fileStream = new FileStream("exceptions.log",FileMode.Append,FileAccess.Write,FileShare.ReadWrite)){
|
|
using(StreamWriter writer = new StreamWriter(fileStream)){
|
|
writer.WriteLine(e.ToString());
|
|
writer.WriteLine();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void LogInfo(string data){
|
|
using(FileStream fileStream = new FileStream("run.log",FileMode.Append,FileAccess.Write,FileShare.ReadWrite)){
|
|
using(StreamWriter writer = new StreamWriter(fileStream)){
|
|
writer.Write("[");
|
|
writer.Write(Sys.Settings.Default.DateFormat.ParseDate(DateTime.Now));
|
|
writer.Write("][");
|
|
writer.Write(Process.GetCurrentProcess().Id);
|
|
writer.Write("] ");
|
|
writer.WriteLine(data);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|