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.PPC.Updater { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { private String _sourceFolder = AppDomain.CurrentDomain.BaseDirectory; private String _msProcessName = "Tango.PPC.UI"; private String _appPath; public MainWindow() { //Launch debugger.. //#if DEBUG // if (!Debugger.IsAttached) // { // Debugger.Launch(); // } //#endif InitializeComponent(); WindowStyle = WindowStyle.None; ResizeMode = ResizeMode.NoResize; WindowStartupLocation = WindowStartupLocation.Manual; Topmost = true; // sure? var screens = System.Windows.Forms.Screen.AllScreens; //Search for the vertical touch monitor. var touch_screen = screens.Where(x => x.Bounds.Height > x.Bounds.Width).LastOrDefault(); if (touch_screen != null) { Left = touch_screen.Bounds.Left; Top = touch_screen.Bounds.Top; Width = touch_screen.Bounds.Width; Height = touch_screen.Bounds.Height; } ContentRendered += MainWindow_ContentRendered; } private void MainWindow_ContentRendered(object sender, EventArgs e) { Update(); } private void Update() { try { Init(); EnsureTangoIsDown(); RemoveOldDLLFiles(); ReplaceFiles(); txtStatus.Text = "Update completed. Starting application..."; DoEvents(); Thread.Sleep(1000); StartTango(true); } catch (Exception ex) { ShowError($"Update failed.\n{ex.Message}"); StartTango(false); } finally { Environment.Exit(0); } } private void Init() { try { _appPath = String.Join(" ", App.StartupArgs); } catch { throw new ArgumentException("Error parsing startup arguments."); } if (!Directory.Exists(_appPath)) { throw new InvalidOperationException("This update utility can only be executed by the main Tango application."); } } private void StartTango(bool success) { Process p = new Process(); p.StartInfo.FileName = _appPath + "\\" + _msProcessName + ".exe"; p.StartInfo.LoadUserProfile = true; p.StartInfo.UseShellExecute = true; if (success) { p.StartInfo.Arguments = "-update_ok"; } 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(10); } catch (Exception ex) { if (!newPath.ToLower().Contains("updater.exe")) { ShowError("Could not create file " + Path.GetFileName(newPath) + Environment.NewLine + ex.Message); } } } } private void RemoveOldDLLFiles() { foreach (string dll in Directory.GetFiles(_appPath, "*.dll")) { try { File.Delete(dll); } catch { ShowError($"The file '{Path.GetFileName(dll)}' could not be removed. Please close all instances of Tango and press OK."); RemoveOldDLLFiles(); return; } } } private void EnsureTangoIsDown() { Process appProcess = null; int tries = 0; do { appProcess = Process.GetProcessesByName(_msProcessName).FirstOrDefault(); Process p = new Process(); p.StartInfo.CreateNoWindow = true; p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; p.StartInfo.FileName = "wmic"; p.StartInfo.Arguments = String.Format("process where name='{0}' delete", _msProcessName); if (appProcess != null) { tries++; appProcess.Kill(); try { p.Start(); } catch { } Thread.Sleep(1000); } if (tries > 10) { throw new IOException("The main Tango process seems to in a frozen state. Please restart your computer and try again."); } } 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, "Tango Update", MessageBoxButton.OK, MessageBoxImage.Error); } } }