aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Uninstaller/MainWindow.xaml.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Uninstaller/MainWindow.xaml.cs')
-rw-r--r--MediaBrowser.Uninstaller/MainWindow.xaml.cs312
1 files changed, 312 insertions, 0 deletions
diff --git a/MediaBrowser.Uninstaller/MainWindow.xaml.cs b/MediaBrowser.Uninstaller/MainWindow.xaml.cs
new file mode 100644
index 000000000..c3a0133ee
--- /dev/null
+++ b/MediaBrowser.Uninstaller/MainWindow.xaml.cs
@@ -0,0 +1,312 @@
+using System;
+using System.Diagnostics;
+using System.Net;
+using System.Reflection;
+using Microsoft.Win32;
+using System.IO;
+using System.Threading;
+using System.Windows;
+
+namespace MediaBrowser.Uninstaller.Execute
+{
+ /// <summary>
+ /// Interaction logic for MainWindow.xaml
+ /// </summary>
+ public partial class MainWindow : Window
+ {
+ protected string Product = "Server";
+ protected string RootSuffix = "-Server";
+
+ public MainWindow()
+ {
+
+ var args = Environment.GetCommandLineArgs();
+ var product = args.Length > 1 ? args[1] : null;
+ if (product == null)
+ {
+ MessageBox.Show("Please use 'Programs and Features' to uninstall.");
+ Close();
+ }
+ else
+ {
+ var callerId = args.Length > 2 ? args[2] : null;
+ if (callerId != null)
+ {
+ // Wait for our caller to exit
+ try
+ {
+ var process = Process.GetProcessById(Convert.ToInt32(callerId));
+ process.WaitForExit();
+ }
+ catch (ArgumentException)
+ {
+ // wasn't running
+ }
+ }
+ else
+ {
+ // No caller - means we were called directly and need to move to temp file and execute there
+ //copy the real program to a temp location so we can delete everything here (including us)
+ var us = Assembly.GetExecutingAssembly().Location;
+ var tempExe = Path.Combine(Path.GetTempPath(), Path.GetFileName(us) ?? "Mediabrowser.Uninstaller.exe");
+ File.Copy(us,tempExe,true);
+ //get our pid to pass to the uninstaller so it can wait for us to exit
+ var pid = Process.GetCurrentProcess().Id;
+ //kick off the copy
+ Process.Start(tempExe, product + " " + pid);
+ //and shut down
+ Close();
+ }
+
+ InitializeComponent();
+
+
+ switch (product)
+ {
+ case "server":
+ Product = "Server";
+ RootSuffix = "-Server";
+ break;
+
+ case "mbt":
+ Product = "Theater";
+ RootSuffix = "-Theater";
+ break;
+
+ default:
+ MessageBox.Show("Please Use 'Programs and Features' to uninstall.");
+ Close();
+ break;
+
+ }
+
+ lblHeading.Content = this.Title = "Uninstall Media Browser " + Product;
+
+ }
+
+ }
+
+ private void btnCancel_Click(object sender, RoutedEventArgs e)
+ {
+ Close();
+ }
+
+ private void cbxRemoveAll_Checked(object sender, RoutedEventArgs e)
+ {
+ if (cbxRemoveAll.IsChecked == true)
+ {
+ cbxRemoveCache.IsChecked = cbxRemoveConfig.IsChecked = cbxRemovePlugins.IsChecked = true;
+ }
+
+ cbxRemoveCache.IsEnabled = cbxRemoveConfig.IsEnabled = cbxRemovePlugins.IsEnabled = !cbxRemoveAll.IsChecked.Value;
+ }
+
+ private void btnUninstall_Click(object sender, RoutedEventArgs e)
+ {
+ // First remove our shortcuts
+ lblHeading.Content = "Removing Shortcuts...";
+ btnCancel.IsEnabled = btnUninstall.IsEnabled = false;
+ grdOptions.Visibility = Visibility.Hidden;
+
+ var startMenu = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu), "Media Browser 3");
+ var linkName = "Media Browser " + Product + ".lnk";
+ RemoveShortcut(Path.Combine(startMenu, linkName));
+ RemoveShortcut(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup),linkName));
+ linkName = "Uninstall " + linkName;
+ RemoveShortcut(Path.Combine(startMenu, linkName));
+ if (Product == "Server")
+ {
+ RemoveShortcut(Path.Combine(startMenu, "MB Dashboard.lnk"));
+ var procs = Process.GetProcessesByName("mediabrowser.serverapplication");
+ var server = procs.Length > 0 ? procs[0] : null;
+ if (server != null)
+ {
+ using (var client = new WebClient())
+ {
+ lblHeading.Content = "Shutting Down Media Browser Server...";
+ try
+ {
+ client.UploadString("http://localhost:8096/mediabrowser/system/shutdown", "");
+ try
+ {
+ server.WaitForExit();
+ }
+ catch (ArgumentException)
+ {
+ // already gone
+ }
+ }
+ catch (WebException ex)
+ {
+ if (ex.Status != WebExceptionStatus.ConnectFailure && !ex.Message.StartsWith("Unable to connect", StringComparison.OrdinalIgnoreCase))
+ {
+ MessageBox.Show("Error shutting down server. Please be sure it is not running before hitting OK.\n\n" + ex.Status + "\n\n" + ex.Message);
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ // Installing MBT - shut it down if it is running
+ var processes = Process.GetProcessesByName("mediabrowser.ui");
+ if (processes.Length > 0)
+ {
+ lblHeading.Content = "Shutting Down Media Browser Theater...";
+ try
+ {
+ processes[0].Kill();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show("Unable to shutdown Media Browser Theater. Please ensure it is not running before hitting OK.\n\n" + ex.Message, "Error");
+ }
+ }
+ }
+ // if the startmenu item is empty now - delete it too
+ if (Directory.GetFiles(startMenu).Length == 0)
+ {
+ try
+ {
+ Directory.Delete(startMenu);
+ }
+ catch (DirectoryNotFoundException)
+ {
+ }
+ catch (Exception ex)
+ {
+ {
+ MessageBox.Show(string.Format("Error attempting to remove shortcut folder {0}\n\n {1}", startMenu, ex.Message), "Error");
+ }
+ }
+ }
+
+ var rootPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MediaBrowser" + RootSuffix);
+
+ lblHeading.Content = "Removing System Files...";
+ if (cbxRemoveAll.IsChecked == true)
+ {
+ // Just remove our whole directory
+ RemovePath(rootPath);
+ }
+ else
+ {
+ // First remove the system
+ RemovePath(Path.Combine(rootPath, "System"));
+ RemovePath(Path.Combine(rootPath, "MediaTools"));
+
+ // And then the others specified
+ if (cbxRemoveCache.IsChecked == true)
+ {
+ lblHeading.Content = "Removing Cache and Data Files...";
+ RemovePath(Path.Combine(rootPath, "cache"));
+ RemovePath(Path.Combine(rootPath, "data"));
+ }
+ if (cbxRemoveConfig.IsChecked == true)
+ {
+ lblHeading.Content = "Removing Config Files...";
+ RemovePath(Path.Combine(rootPath, "config"));
+ RemovePath(Path.Combine(rootPath, "logs"));
+ }
+ if (cbxRemovePlugins.IsChecked == true)
+ {
+ lblHeading.Content = "Removing Plugin Files...";
+ RemovePath(Path.Combine(rootPath, "plugins"));
+ }
+ }
+
+ // Remove reference to us
+ RemoveUninstall();
+
+ // Remove pismo
+ try
+ {
+ UnInstallPismo();
+ }
+ catch
+ {
+ // No biggie - maybe they uninstalled it themselves
+ }
+
+ // and done
+ lblHeading.Content = string.Format("Media Browser {0} Uninstalled.", Product);
+ btnUninstall.Visibility = Visibility.Hidden;
+ btnFinished.Visibility = Visibility.Visible;
+ }
+
+ private void UnInstallPismo()
+ {
+ // Kick off the Pismo uninstaller and wait for it to end
+ var pismo = new Process();
+ pismo.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
+ pismo.StartInfo.FileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "pfm.exe");
+ pismo.StartInfo.Arguments = "uninstall pfm-license-mediabrowser.txt";
+ pismo.Start();
+ pismo.WaitForExit();
+ }
+
+ private void RemoveUninstall()
+ {
+
+ using (var parent = Registry.CurrentUser.OpenSubKey(
+ @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", true))
+ {
+ if (parent == null)
+ {
+ MessageBox.Show("Uninstall registry key not found.");
+ return;
+ }
+ try
+ {
+ const string guidText = "{4E76DB4E-1BB9-4A7B-860C-7940779CF7A0}";
+ parent.DeleteSubKey(guidText,false);
+
+ }
+ catch (Exception ex)
+ {
+ throw new Exception(
+ "An error occurred removing uninstall information from the registry.",
+ ex);
+ }
+ }
+ }
+
+ private static
+ void RemoveShortcut(string path)
+ {
+ try
+ {
+ File.Delete(path);
+ }
+ catch (FileNotFoundException)
+ {
+ } // we're trying to get rid of it anyway
+ catch (Exception ex)
+ {
+ MessageBox.Show(string.Format("Error attempting to remove shortcut {0}\n\n {1}", path, ex.Message), "Error");
+ }
+
+ }
+
+ private static void RemovePath(string path)
+ {
+ try
+ {
+ Directory.Delete(path, true);
+ }
+ catch (DirectoryNotFoundException)
+ {
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(string.Format("Error attempting to remove progam folder {0}\n\n {1}", path, ex.Message), "Error");
+ }
+
+ }
+
+ private void BtnFinished_OnClick(object sender, RoutedEventArgs e)
+ {
+ Close();
+ }
+ }
+}