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); } } }