Browse Source

More installer work

committing so I can move to my laptop for travel
Eric Reed 12 năm trước cách đây
mục cha
commit
4019b9260b

BIN
MediaBrowser.Installer/Code/Images/mb3logo800.png


+ 11 - 7
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>

+ 155 - 10
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);
+            }
+        }
     }
 }

+ 14 - 0
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.