diff options
| -rw-r--r-- | MediaBrowser.Installer/Code/Images/mb3logo800.png | bin | 0 -> 35600 bytes | |||
| -rw-r--r-- | MediaBrowser.Installer/MainWindow.xaml | 18 | ||||
| -rw-r--r-- | MediaBrowser.Installer/MainWindow.xaml.cs | 165 | ||||
| -rw-r--r-- | MediaBrowser.Installer/MediaBrowser.Installer.csproj | 14 |
4 files changed, 180 insertions, 17 deletions
diff --git a/MediaBrowser.Installer/Code/Images/mb3logo800.png b/MediaBrowser.Installer/Code/Images/mb3logo800.png Binary files differnew file mode 100644 index 000000000..fbc769a6f --- /dev/null +++ b/MediaBrowser.Installer/Code/Images/mb3logo800.png diff --git a/MediaBrowser.Installer/MainWindow.xaml b/MediaBrowser.Installer/MainWindow.xaml index edd518825..3e040d3e0 100644 --- a/MediaBrowser.Installer/MainWindow.xaml +++ b/MediaBrowser.Installer/MainWindow.xaml @@ -2,11 +2,15 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Code="clr-namespace:MediaBrowser.Installer.Code" x:Class="MediaBrowser.Installer.MainWindow" - Title="Install Media Browser Server" Height="338.057" Width="667.453" ResizeMode="NoResize"> - <Grid Margin="0,0,0,2"> - <ProgressBar x:Name="prgProgress" HorizontalAlignment="Left" Height="11" Margin="52,266,0,0" VerticalAlignment="Top" Width="460"/> - <Code:DownloadAnimation x:Name="dlAnimation" HorizontalAlignment="Left" Margin="26,10,0,0" VerticalAlignment="Top" Height="196" Width="574" RenderTransformOrigin="0.5,0.5"/> - <Button x:Name="btnCancel" Content="Cancel" HorizontalAlignment="Left" Margin="547,255,0,0" VerticalAlignment="Top" Width="79" FontSize="14" Click="btnCancel_Click"/> - <Label x:Name="lblStatus" Content="Status" HorizontalAlignment="Left" Margin="52,210,0,0" VerticalAlignment="Top" Width="574" FontSize="14" FontWeight="Bold"/> - </Grid> + Title="Install Media Browser Server" Height="383.481" Width="663.057" ResizeMode="NoResize" WindowStyle="None"> + <Border BorderBrush="DarkGray" BorderThickness="2"> + <Grid Margin="0,0,0,2"> + <Image x:Name="imgLogo" HorizontalAlignment="Center" Height="172" Margin="10,10,57,0" VerticalAlignment="Top" Width="590" Source="Code/Images/mb3logo800.png" Opacity="0.5"/> + <ProgressBar x:Name="prgProgress" HorizontalAlignment="Left" Height="11" Margin="52,320,0,0" VerticalAlignment="Top" Width="460"/> + <Code:DownloadAnimation x:Name="dlAnimation" HorizontalAlignment="Left" Margin="26,97,0,0" VerticalAlignment="Top" Height="196" Width="574" RenderTransformOrigin="0.5,0.5"/> + <Button x:Name="btnCancel" Content="Cancel" HorizontalAlignment="Left" Margin="547,309,0,0" VerticalAlignment="Top" Width="79" FontSize="14" Click="btnCancel_Click"/> + <Label x:Name="lblStatus" Content="Status" HorizontalAlignment="Left" Margin="52,264,0,0" VerticalAlignment="Top" Width="574" FontSize="14" FontWeight="Bold"/> + </Grid> + + </Border> </Window> diff --git a/MediaBrowser.Installer/MainWindow.xaml.cs b/MediaBrowser.Installer/MainWindow.xaml.cs index 5990becce..5a96c1afb 100644 --- a/MediaBrowser.Installer/MainWindow.xaml.cs +++ b/MediaBrowser.Installer/MainWindow.xaml.cs @@ -1,13 +1,16 @@ using System; using System.Collections.Generic; +using System.Diagnostics; +using System.IO; using System.Net; using System.Threading.Tasks; using System.Windows; using System.Web; using System.Linq; +using Ionic.Zip; using MediaBrowser.Installer.Code; using ServiceStack.Text; -using ServiceStack.Text.Json; +using IWshRuntimeLibrary; namespace MediaBrowser.Installer { @@ -16,15 +19,23 @@ namespace MediaBrowser.Installer /// </summary> public partial class MainWindow : Window { - protected PackageVersionClass PackageClass; - protected Version PackageVersion; + protected PackageVersionClass PackageClass = PackageVersionClass.Release; + protected Version PackageVersion = new Version(10,0,0,0); protected string PackageName = "MBServer"; + protected string RootSuffix = "-Server"; + protected string TargetExe = "MediaBrowser.ServerApplication.exe"; + protected string FriendlyName = "Media Browser Server"; + protected string RootPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MediaBrowser-Server"); + + protected bool SystemClosing = false; + + protected string TempLocation = Path.Combine(Path.GetTempPath(), "MediaBrowser"); public MainWindow() { GetArgs(); InitializeComponent(); - StartInstall(); + DoInstall(); } private void btnCancel_Click(object sender, RoutedEventArgs e) @@ -34,13 +45,24 @@ namespace MediaBrowser.Installer protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { - if (MessageBox.Show("Cancel Installation - Are you sure?", "Cancel", MessageBoxButton.YesNo) == MessageBoxResult.No) + if (!SystemClosing && MessageBox.Show("Cancel Installation - Are you sure?", "Cancel", MessageBoxButton.YesNo) == MessageBoxResult.No) { e.Cancel = true; } + ClearTempLocation(TempLocation); base.OnClosing(e); } + protected void SystemClose(string message = null) + { + if (message != null) + { + MessageBox.Show(message, "Error"); + } + SystemClosing = true; + this.Close(); + } + protected void GetArgs() { var args = AppDomain.CurrentDomain.SetupInformation.ActivationArguments; @@ -53,21 +75,70 @@ namespace MediaBrowser.Installer // fill in our arguments if there PackageName = parameters["package"] ?? "MBServer"; PackageClass = (PackageVersionClass)Enum.Parse(typeof(PackageVersionClass), parameters["class"] ?? "Release"); - PackageVersion = new Version(parameters["version"].ValueOrDefault("0.0.0.1")); + PackageVersion = new Version(parameters["version"].ValueOrDefault("10.0.0.0")); + RootSuffix = parameters["suffix"] ?? "-Server"; + TargetExe = parameters["target"] ?? "MediaBrowser.ServerApplication.exe"; + FriendlyName = parameters["name"] ?? PackageName; + RootPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MediaBrowser" + RootSuffix); } - protected async Task StartInstall() + /// <summary> + /// Execute the install process + /// </summary> + /// <returns></returns> + protected async Task DoInstall() { - lblStatus.Content = "Downloading Server Package..."; + lblStatus.Content = "Downloading "+FriendlyName+"..."; dlAnimation.StartAnimation(); prgProgress.Value = 0; prgProgress.Visibility = Visibility.Visible; + // Download var archive = await DownloadPackage(); + dlAnimation.StopAnimation(); + prgProgress.Visibility = btnCancel.Visibility = Visibility.Hidden; + + // Extract + lblStatus.Content = "Extracting Package..."; + try + { + ExtractPackage(archive); + } + catch (Exception e) + { + SystemClose("Error Extracting - " + e.GetType().FullName + "\n\n" + e.Message); + } + + // Create shortcut + var fullPath = Path.Combine(RootPath, "System", TargetExe); + try + { + CreateShortcut(fullPath); + } + catch (Exception e) + { + SystemClose("Error Creating Shortcut - "+e.GetType().FullName+"\n\n"+e.Message); + } + + // And run + try + { + Process.Start(fullPath); + } + catch (Exception e) + { + SystemClose("Error Executing - "+fullPath+ " "+e.GetType().FullName+"\n\n"+e.Message); + } + + SystemClose(); } + /// <summary> + /// Download our specified package to an archive in a temp location + /// </summary> + /// <returns>The fully qualified name of the downloaded package</returns> protected async Task<string> DownloadPackage() { using (var client = new WebClient()) @@ -78,15 +149,89 @@ namespace MediaBrowser.Installer var json = await client.DownloadStringTaskAsync("http://www.mb3admin.com/admin/service/package/retrieveAll?name="+PackageName); var packages = JsonSerializer.DeserializeFromString<List<PackageInfo>>(json); - var version = packages[0].versions.Where(v => v.classification == PackageClass).OrderByDescending(v => v.version).FirstOrDefault(); + var version = packages[0].versions.Where(v => v.classification == PackageClass).OrderByDescending(v => v.version).FirstOrDefault(v => v.version <= PackageVersion); + if (version == null) + { + SystemClose("Could not locate download package. Aborting."); + return null; + } + var archiveFile = Path.Combine(PrepareTempLocation(), version.targetFilename); + + // setup download progress and download the package + client.DownloadProgressChanged += DownloadProgressChanged; + await client.DownloadFileTaskAsync(version.sourceUrl, archiveFile); + return archiveFile; } catch (Exception e) { - MessageBox.Show(e.Message); + SystemClose(e.GetType().FullName + "\n\n" + e.Message); } } return ""; } + + void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) + { + prgProgress.Value = e.ProgressPercentage; + } + + /// <summary> + /// Extract the provided archive to our program root + /// It is assumed the archive is a zip file relative to that root (with all necessary sub-folders) + /// </summary> + /// <param name="archive"></param> + protected void ExtractPackage(string archive) + { + using (var fileStream = System.IO.File.OpenRead(archive)) + { + using (var zipFile = ZipFile.Read(fileStream)) + { + zipFile.ExtractAll(RootPath, ExtractExistingFileAction.OverwriteSilently); + } + } + + } + + /// <summary> + /// Create a shortcut in the current user's start menu + /// Only do current user to avoid need for admin elevation + /// </summary> + /// <param name="targetExe"></param> + protected void CreateShortcut(string targetExe) + { + // get path to all users start menu + var shell = new WshShell(); + var startMenu = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu),"Media Browser"); + if (!Directory.Exists(startMenu)) Directory.CreateDirectory(startMenu); + var myShortcut = (IWshShortcut)shell.CreateShortcut(Path.Combine(startMenu, "Media Browser Server.lnk")); + myShortcut.TargetPath = targetExe; + myShortcut.Description = "Run " + FriendlyName; + myShortcut.Save(); + + } + + /// <summary> + /// Prepare a temporary location to download to + /// </summary> + /// <returns>The path to the temporary location</returns> + protected string PrepareTempLocation() + { + ClearTempLocation(TempLocation); + Directory.CreateDirectory(TempLocation); + return TempLocation; + } + + /// <summary> + /// Clear out (delete recursively) the supplied temp location + /// </summary> + /// <param name="location"></param> + protected void ClearTempLocation(string location) + { + if (Directory.Exists(location)) + { + Directory.Delete(location, true); + } + } } } diff --git a/MediaBrowser.Installer/MediaBrowser.Installer.csproj b/MediaBrowser.Installer/MediaBrowser.Installer.csproj index f1a366d49..f84534798 100644 --- a/MediaBrowser.Installer/MediaBrowser.Installer.csproj +++ b/MediaBrowser.Installer/MediaBrowser.Installer.csproj @@ -172,6 +172,20 @@ <Resource Include="Code\Images\computer_256.png" /> <Resource Include="Code\Images\internet-globe.jpg" /> </ItemGroup> + <ItemGroup> + <Resource Include="Code\Images\mb3logo800.png" /> + </ItemGroup> + <ItemGroup> + <COMReference Include="IWshRuntimeLibrary"> + <Guid>{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}</Guid> + <VersionMajor>1</VersionMajor> + <VersionMinor>0</VersionMinor> + <Lcid>0</Lcid> + <WrapperTool>tlbimp</WrapperTool> + <Isolated>False</Isolated> + <EmbedInteropTypes>True</EmbedInteropTypes> + </COMReference> + </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. |
