More installer work

committing so I can move to my laptop for travel
pull/702/head
Eric Reed 12 years ago
parent 0f67adb53d
commit 4019b9260b

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

@ -2,11 +2,15 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Code="clr-namespace:MediaBrowser.Installer.Code" x:Class="MediaBrowser.Installer.MainWindow" 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"> Title="Install Media Browser Server" Height="383.481" Width="663.057" ResizeMode="NoResize" WindowStyle="None">
<Grid Margin="0,0,0,2"> <Border BorderBrush="DarkGray" BorderThickness="2">
<ProgressBar x:Name="prgProgress" HorizontalAlignment="Left" Height="11" Margin="52,266,0,0" VerticalAlignment="Top" Width="460"/> <Grid Margin="0,0,0,2">
<Code:DownloadAnimation x:Name="dlAnimation" HorizontalAlignment="Left" Margin="26,10,0,0" VerticalAlignment="Top" Height="196" Width="574" RenderTransformOrigin="0.5,0.5"/> <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"/>
<Button x:Name="btnCancel" Content="Cancel" HorizontalAlignment="Left" Margin="547,255,0,0" VerticalAlignment="Top" Width="79" FontSize="14" Click="btnCancel_Click"/> <ProgressBar x:Name="prgProgress" HorizontalAlignment="Left" Height="11" Margin="52,320,0,0" VerticalAlignment="Top" Width="460"/>
<Label x:Name="lblStatus" Content="Status" HorizontalAlignment="Left" Margin="52,210,0,0" VerticalAlignment="Top" Width="574" FontSize="14" FontWeight="Bold"/> <Code:DownloadAnimation x:Name="dlAnimation" HorizontalAlignment="Left" Margin="26,97,0,0" VerticalAlignment="Top" Height="196" Width="574" RenderTransformOrigin="0.5,0.5"/>
</Grid> <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> </Window>

@ -1,13 +1,16 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Net; using System.Net;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Web; using System.Web;
using System.Linq; using System.Linq;
using Ionic.Zip;
using MediaBrowser.Installer.Code; using MediaBrowser.Installer.Code;
using ServiceStack.Text; using ServiceStack.Text;
using ServiceStack.Text.Json; using IWshRuntimeLibrary;
namespace MediaBrowser.Installer namespace MediaBrowser.Installer
{ {
@ -16,15 +19,23 @@ namespace MediaBrowser.Installer
/// </summary> /// </summary>
public partial class MainWindow : Window public partial class MainWindow : Window
{ {
protected PackageVersionClass PackageClass; protected PackageVersionClass PackageClass = PackageVersionClass.Release;
protected Version PackageVersion; protected Version PackageVersion = new Version(10,0,0,0);
protected string PackageName = "MBServer"; 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() public MainWindow()
{ {
GetArgs(); GetArgs();
InitializeComponent(); InitializeComponent();
StartInstall(); DoInstall();
} }
private void btnCancel_Click(object sender, RoutedEventArgs e) private void btnCancel_Click(object sender, RoutedEventArgs e)
@ -34,13 +45,24 @@ namespace MediaBrowser.Installer
protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 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; e.Cancel = true;
} }
ClearTempLocation(TempLocation);
base.OnClosing(e); base.OnClosing(e);
} }
protected void SystemClose(string message = null)
{
if (message != null)
{
MessageBox.Show(message, "Error");
}
SystemClosing = true;
this.Close();
}
protected void GetArgs() protected void GetArgs()
{ {
var args = AppDomain.CurrentDomain.SetupInformation.ActivationArguments; var args = AppDomain.CurrentDomain.SetupInformation.ActivationArguments;
@ -53,21 +75,70 @@ namespace MediaBrowser.Installer
// fill in our arguments if there // fill in our arguments if there
PackageName = parameters["package"] ?? "MBServer"; PackageName = parameters["package"] ?? "MBServer";
PackageClass = (PackageVersionClass)Enum.Parse(typeof(PackageVersionClass), parameters["class"] ?? "Release"); 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(); dlAnimation.StartAnimation();
prgProgress.Value = 0; prgProgress.Value = 0;
prgProgress.Visibility = Visibility.Visible; prgProgress.Visibility = Visibility.Visible;
// Download
var archive = await DownloadPackage(); 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() protected async Task<string> DownloadPackage()
{ {
using (var client = new WebClient()) 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 json = await client.DownloadStringTaskAsync("http://www.mb3admin.com/admin/service/package/retrieveAll?name="+PackageName);
var packages = JsonSerializer.DeserializeFromString<List<PackageInfo>>(json); 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) catch (Exception e)
{ {
MessageBox.Show(e.Message); SystemClose(e.GetType().FullName + "\n\n" + e.Message);
} }
} }
return ""; 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);
}
}
} }
} }

@ -172,6 +172,20 @@
<Resource Include="Code\Images\computer_256.png" /> <Resource Include="Code\Images\computer_256.png" />
<Resource Include="Code\Images\internet-globe.jpg" /> <Resource Include="Code\Images\internet-globe.jpg" />
</ItemGroup> </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" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- 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. Other similar extension points exist, see Microsoft.Common.targets.

Loading…
Cancel
Save