using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Threading;
namespace Tango.MachineStudio.Updater
{
///
/// Interaction logic for MainWindow.xaml
///
public partial class MainWindow : Window
{
private String _appPath = AppDomain.CurrentDomain.BaseDirectory;
private String _msProcessName = "Tango.MachineStudio.UI";
private String _sourceFolder = App.StartupArgs.FirstOrDefault();
public MainWindow()
{
if (!Directory.Exists(_sourceFolder))
{
ShowError("This update utility can only be executed by Machine Studio.");
Environment.Exit(0);
}
InitializeComponent();
ContentRendered += MainWindow_ContentRendered;
}
private void MainWindow_ContentRendered(object sender, EventArgs e)
{
Update();
}
private void Update()
{
EnsureMachineStudioIsDown();
ReplaceFiles();
StartMachineStudio();
Environment.Exit(0);
}
private void StartMachineStudio()
{
txtStatus.Text = "Update completed. Starting Machine Studio...";
DoEvents();
Thread.Sleep(1000);
Process p = new Process();
p.StartInfo.FileName = _appPath + "\\" + _msProcessName + ".exe";
p.StartInfo.LoadUserProfile = true;
p.StartInfo.UseShellExecute = true;
p.Start();
}
private void ReplaceFiles()
{
int maxProgress = Directory.GetFiles(_sourceFolder, "*.*", SearchOption.AllDirectories).Length;
int progress = 0;
foreach (string dirPath in Directory.GetDirectories(_sourceFolder, "*", SearchOption.AllDirectories))
{
try
{
Directory.CreateDirectory(dirPath.Replace(_sourceFolder, _appPath));
}
catch (Exception ex)
{
ShowError("Could not create directory " + Path.GetFileName(dirPath) + Environment.NewLine + ex.Message);
}
}
foreach (string newPath in Directory.GetFiles(_sourceFolder, "*.*", SearchOption.AllDirectories))
{
try
{
txtStatus.Text = "Copying file " + Path.GetFileName(newPath);
DoEvents();
File.Copy(newPath, newPath.Replace(_sourceFolder, _appPath), true);
prog.Maximum = maxProgress;
prog.Value = progress++;
DoEvents();
Thread.Sleep(30);
}
catch (Exception ex)
{
if (!newPath.ToLower().Contains("updater.exe"))
{
ShowError("Could not create file " + Path.GetFileName(newPath) + Environment.NewLine + ex.Message);
}
}
}
}
private void EnsureMachineStudioIsDown()
{
Process appProcess = null;
int tries = 0;
do
{
appProcess = Process.GetProcessesByName(_msProcessName).FirstOrDefault();
if (appProcess != null)
{
tries++;
appProcess.Kill();
Thread.Sleep(1000);
}
if (tries > 10)
{
ShowError("The main Machine Studio process seems to in a frozen state. Please restart your computer and try again.");
Environment.Exit(0);
}
} while (appProcess != null);
}
///
/// Forces UI rendering.
///
private void DoEvents()
{
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { }));
}
private void ShowError(String error)
{
MessageBox.Show(error, "Machine Studio Update", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}