Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser
This commit is contained in:
commit
b4c06b76c1
|
@ -2,7 +2,7 @@
|
||||||
<configuration>
|
<configuration>
|
||||||
<appSettings>
|
<appSettings>
|
||||||
<add key="product" value="server" />
|
<add key="product" value="server" />
|
||||||
<add key="class" value="Dev" />
|
<add key="class" value="Beta" />
|
||||||
</appSettings>
|
</appSettings>
|
||||||
<startup>
|
<startup>
|
||||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
|
|
@ -15,15 +15,19 @@ namespace MediaBrowser.Common.Implementations.Updates
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ApplicationUpdater
|
public class ApplicationUpdater
|
||||||
{
|
{
|
||||||
private const string UpdaterExe = "Mediabrowser.Installer.exe";
|
private const string UpdaterExe = "Mediabrowser.Updater.exe";
|
||||||
|
private const string UpdaterDll = "Mediabrowser.InstallUtil.dll";
|
||||||
public void UpdateApplication(MBApplication app, IApplicationPaths appPaths, string archive)
|
public void UpdateApplication(MBApplication app, IApplicationPaths appPaths, string archive)
|
||||||
{
|
{
|
||||||
// Use our installer passing it the specific archive
|
// Use our installer passing it the specific archive
|
||||||
// We need to copy to a temp directory and execute it there
|
// We need to copy to a temp directory and execute it there
|
||||||
var source = Path.Combine(appPaths.ProgramSystemPath, UpdaterExe);
|
var source = Path.Combine(appPaths.ProgramSystemPath, UpdaterExe);
|
||||||
var tempUpdater = Path.Combine(Path.GetTempPath(), UpdaterExe);
|
var tempUpdater = Path.Combine(Path.GetTempPath(), UpdaterExe);
|
||||||
var product = app == MBApplication.MBTheater ? "mbt" : "server";
|
|
||||||
File.Copy(source, tempUpdater, true);
|
File.Copy(source, tempUpdater, true);
|
||||||
|
source = Path.Combine(appPaths.ProgramSystemPath, UpdaterDll);
|
||||||
|
var tempUpdaterDll = Path.Combine(Path.GetTempPath(), UpdaterDll);
|
||||||
|
File.Copy(source, tempUpdaterDll, true);
|
||||||
|
var product = app == MBApplication.MBTheater ? "mbt" : "server";
|
||||||
// Our updater needs SS and ionic
|
// Our updater needs SS and ionic
|
||||||
source = Path.Combine(appPaths.ProgramSystemPath, "ServiceStack.Text.dll");
|
source = Path.Combine(appPaths.ProgramSystemPath, "ServiceStack.Text.dll");
|
||||||
File.Copy(source, Path.Combine(Path.GetTempPath(), "ServiceStack.Text.dll"), true);
|
File.Copy(source, Path.Combine(Path.GetTempPath(), "ServiceStack.Text.dll"), true);
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
<Application x:Class="MediaBrowser.Installer.App"
|
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
StartupUri="MainWindow.xaml">
|
|
||||||
<Application.Resources>
|
|
||||||
|
|
||||||
</Application.Resources>
|
|
||||||
</Application>
|
|
|
@ -1,11 +0,0 @@
|
||||||
using System.Windows;
|
|
||||||
|
|
||||||
namespace MediaBrowser.Installer
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Interaction logic for App.xaml
|
|
||||||
/// </summary>
|
|
||||||
public partial class App : Application
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
<UserControl x:Class="MediaBrowser.Installer.Code.DownloadAnimation"
|
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
||||||
mc:Ignorable="d" Height="129.167" Width="421.27">
|
|
||||||
<UserControl.Resources>
|
|
||||||
<Style TargetType="Ellipse">
|
|
||||||
<Setter Property="Fill" Value="LightGray" />
|
|
||||||
<Setter Property="Width" Value="8" />
|
|
||||||
<Setter Property="Height" Value="8" />
|
|
||||||
</Style>
|
|
||||||
</UserControl.Resources>
|
|
||||||
<Canvas Height="58" Width="275">
|
|
||||||
<Ellipse Canvas.Left="63" Canvas.Top="23" />
|
|
||||||
<Ellipse Canvas.Left="77" Canvas.Top="23" />
|
|
||||||
<Ellipse Canvas.Left="91" Canvas.Top="23" />
|
|
||||||
<Ellipse Canvas.Left="105" Canvas.Top="23" />
|
|
||||||
<Ellipse Canvas.Left="119" Canvas.Top="23" />
|
|
||||||
<Ellipse Canvas.Left="133" Canvas.Top="23" />
|
|
||||||
<Ellipse Canvas.Left="147" Canvas.Top="23" />
|
|
||||||
<Ellipse Canvas.Left="161" Canvas.Top="23" />
|
|
||||||
<Ellipse Canvas.Left="175" Canvas.Top="23" />
|
|
||||||
<Ellipse Canvas.Left="189" Canvas.Top="23" />
|
|
||||||
<Ellipse Canvas.Left="203" Canvas.Top="23" />
|
|
||||||
<Ellipse Canvas.Left="217" Canvas.Top="23" />
|
|
||||||
<Canvas Canvas.Left="17" Canvas.Top="19"
|
|
||||||
Name="SlidingCanvas" Height="17" Width="46">
|
|
||||||
<Ellipse Canvas.Left="4" Canvas.Top="4" Fill="Orange" />
|
|
||||||
<Ellipse Canvas.Left="18" Canvas.Top="4" Fill="Orange" />
|
|
||||||
<Ellipse Canvas.Left="32" Canvas.Top="4" Fill="Orange" />
|
|
||||||
</Canvas>
|
|
||||||
<Image Canvas.Left="-42" Canvas.Top="-19"
|
|
||||||
Source="Images\internet-globe.jpg" Stretch="None" Height="94" Width="100" RenderTransformOrigin="0.341,0.403" />
|
|
||||||
<Image Canvas.Left="231" Canvas.Top="-25"
|
|
||||||
Source="Images\computer_256.png" Height="100" Width="100" Stretch="None" />
|
|
||||||
</Canvas>
|
|
||||||
|
|
||||||
</UserControl>
|
|
|
@ -1,68 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
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.Shapes;
|
|
||||||
using System.Windows.Threading;
|
|
||||||
|
|
||||||
namespace MediaBrowser.Installer.Code
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Interaction logic for DownloadAnimation.xaml
|
|
||||||
/// </summary>
|
|
||||||
public partial class DownloadAnimation : UserControl
|
|
||||||
{
|
|
||||||
private int _i;
|
|
||||||
private readonly double _startPos;
|
|
||||||
private readonly DispatcherTimer _timer;
|
|
||||||
|
|
||||||
public DownloadAnimation()
|
|
||||||
{
|
|
||||||
_i = 0;
|
|
||||||
InitializeComponent();
|
|
||||||
|
|
||||||
// Store start position of sliding canvas
|
|
||||||
_startPos = Canvas.GetLeft(SlidingCanvas);
|
|
||||||
|
|
||||||
// Create animation timer
|
|
||||||
_timer = new DispatcherTimer {Interval = TimeSpan.FromMilliseconds(100)};
|
|
||||||
_timer.Tick += TimerTick;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void StartAnimation()
|
|
||||||
{
|
|
||||||
_timer.Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void StopAnimation()
|
|
||||||
{
|
|
||||||
_timer.Stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void TimerTick(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
_i++;
|
|
||||||
|
|
||||||
if (_i < 16)
|
|
||||||
{
|
|
||||||
// Move SlidingCanvas containing the three colored dots 14 units to the right
|
|
||||||
Canvas.SetLeft(SlidingCanvas, Canvas.GetLeft(SlidingCanvas) + 14);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Move SlidingCanvas back to its starting position and reset counter
|
|
||||||
_i = 0;
|
|
||||||
Canvas.SetLeft(SlidingCanvas, _startPos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
Before Width: | Height: | Size: 15 KiB |
Binary file not shown.
Before Width: | Height: | Size: 8.9 KiB |
Binary file not shown.
Before Width: | Height: | Size: 35 KiB |
|
@ -1,43 +0,0 @@
|
||||||
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace MediaBrowser.Installer.Code
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Class ModelExtensions
|
|
||||||
/// </summary>
|
|
||||||
static class ModelExtensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Values the or default.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="str">The STR.</param>
|
|
||||||
/// <param name="def">The def.</param>
|
|
||||||
/// <returns>System.String.</returns>
|
|
||||||
public static string ValueOrDefault(this string str, string def = "")
|
|
||||||
{
|
|
||||||
return string.IsNullOrEmpty(str) ? def : str;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Helper method for Dictionaries since they throw on not-found keys
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="T"></typeparam>
|
|
||||||
/// <typeparam name="U"></typeparam>
|
|
||||||
/// <param name="dictionary">The dictionary.</param>
|
|
||||||
/// <param name="key">The key.</param>
|
|
||||||
/// <param name="defaultValue">The default value.</param>
|
|
||||||
/// <returns>``1.</returns>
|
|
||||||
public static U GetValueOrDefault<T, U>(this Dictionary<T, U> dictionary, T key, U defaultValue)
|
|
||||||
{
|
|
||||||
U val;
|
|
||||||
if (!dictionary.TryGetValue(key, out val))
|
|
||||||
{
|
|
||||||
val = defaultValue;
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,119 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace MediaBrowser.Installer.Code
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Class PackageInfo
|
|
||||||
/// </summary>
|
|
||||||
public class PackageInfo
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the name.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The name.</value>
|
|
||||||
public string name { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the short description.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The short description.</value>
|
|
||||||
public string shortDescription { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the overview.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The overview.</value>
|
|
||||||
public string overview { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets a value indicating whether this instance is premium.
|
|
||||||
/// </summary>
|
|
||||||
/// <value><c>true</c> if this instance is premium; otherwise, <c>false</c>.</value>
|
|
||||||
public bool isPremium { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the rich desc URL.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The rich desc URL.</value>
|
|
||||||
public string richDescUrl { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the thumb image.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The thumb image.</value>
|
|
||||||
public string thumbImage { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the preview image.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The preview image.</value>
|
|
||||||
public string previewImage { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the type.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The type.</value>
|
|
||||||
public PackageType type { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the target filename.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The target filename.</value>
|
|
||||||
public string targetFilename { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the owner.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The owner.</value>
|
|
||||||
public string owner { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the category.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The category.</value>
|
|
||||||
public string category { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the catalog tile color.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The owner.</value>
|
|
||||||
public string tileColor { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the feature id of this package (if premium).
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The feature id.</value>
|
|
||||||
public string featureId { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the registration info for this package (if premium).
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The registration info.</value>
|
|
||||||
public string regInfo { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the price for this package (if premium).
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The price.</value>
|
|
||||||
public float price { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets whether or not this package is registered.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>True if registered.</value>
|
|
||||||
public bool isRegistered { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the expiration date for this package.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>Expiration Date.</value>
|
|
||||||
public DateTime expDate { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the versions.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The versions.</value>
|
|
||||||
public List<PackageVersionInfo> versions { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
namespace MediaBrowser.Installer.Code
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Enum PackageType
|
|
||||||
/// </summary>
|
|
||||||
public enum PackageType
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// All
|
|
||||||
/// </summary>
|
|
||||||
All,
|
|
||||||
/// <summary>
|
|
||||||
/// The system
|
|
||||||
/// </summary>
|
|
||||||
System,
|
|
||||||
/// <summary>
|
|
||||||
/// The user installed
|
|
||||||
/// </summary>
|
|
||||||
UserInstalled
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
namespace MediaBrowser.Installer.Code
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Enum PackageVersionClass
|
|
||||||
/// </summary>
|
|
||||||
public enum PackageVersionClass
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The release
|
|
||||||
/// </summary>
|
|
||||||
Release = 0,
|
|
||||||
/// <summary>
|
|
||||||
/// The beta
|
|
||||||
/// </summary>
|
|
||||||
Beta = 1,
|
|
||||||
/// <summary>
|
|
||||||
/// The dev
|
|
||||||
/// </summary>
|
|
||||||
Dev = 2
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,73 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Runtime.Serialization;
|
|
||||||
|
|
||||||
namespace MediaBrowser.Installer.Code
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Class PackageVersionInfo
|
|
||||||
/// </summary>
|
|
||||||
public class PackageVersionInfo
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the name.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The name.</value>
|
|
||||||
public string name { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the version STR.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The version STR.</value>
|
|
||||||
public string versionStr { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The _version
|
|
||||||
/// </summary>
|
|
||||||
private Version _version;
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the version.
|
|
||||||
/// Had to make this an interpreted property since Protobuf can't handle Version
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The version.</value>
|
|
||||||
public Version version
|
|
||||||
{
|
|
||||||
get { return _version ?? (_version = new Version(versionStr.ValueOrDefault("0.0.0.1"))); }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the classification.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The classification.</value>
|
|
||||||
public PackageVersionClass classification { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the description.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The description.</value>
|
|
||||||
public string description { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the required version STR.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The required version STR.</value>
|
|
||||||
public string requiredVersionStr { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the source URL.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The source URL.</value>
|
|
||||||
public string sourceUrl { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the source URL.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The source URL.</value>
|
|
||||||
public Guid checksum { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the target filename.
|
|
||||||
/// </summary>
|
|
||||||
/// <value>The target filename.</value>
|
|
||||||
public string targetFilename { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,277 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
*
|
|
||||||
* Filename: ShellLinkNative.cs
|
|
||||||
* Author: Mattias Sjögren (mattias@mvps.org)
|
|
||||||
* http://www.msjogren.net/dotnet/
|
|
||||||
*
|
|
||||||
* Description: Defines the native types used to manipulate shell shortcuts.
|
|
||||||
*
|
|
||||||
* Public types: enum SLR_FLAGS
|
|
||||||
* enum SLGP_FLAGS
|
|
||||||
* struct WIN32_FIND_DATA[A|W]
|
|
||||||
* interface IPersistFile
|
|
||||||
* interface IShellLink[A|W]
|
|
||||||
* class ShellLink
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Copyright ©2001-2002, Mattias Sjögren
|
|
||||||
*
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Text;
|
|
||||||
using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME;
|
|
||||||
|
|
||||||
namespace MediaBrowser.Installer.Code
|
|
||||||
{
|
|
||||||
// IShellLink.Resolve fFlags
|
|
||||||
[Flags()]
|
|
||||||
public enum SLR_FLAGS
|
|
||||||
{
|
|
||||||
SLR_NO_UI = 0x1,
|
|
||||||
SLR_ANY_MATCH = 0x2,
|
|
||||||
SLR_UPDATE = 0x4,
|
|
||||||
SLR_NOUPDATE = 0x8,
|
|
||||||
SLR_NOSEARCH = 0x10,
|
|
||||||
SLR_NOTRACK = 0x20,
|
|
||||||
SLR_NOLINKINFO = 0x40,
|
|
||||||
SLR_INVOKE_MSI = 0x80
|
|
||||||
}
|
|
||||||
|
|
||||||
// IShellLink.GetPath fFlags
|
|
||||||
[Flags()]
|
|
||||||
public enum SLGP_FLAGS
|
|
||||||
{
|
|
||||||
SLGP_SHORTPATH = 0x1,
|
|
||||||
SLGP_UNCPRIORITY = 0x2,
|
|
||||||
SLGP_RAWPATH = 0x4
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
|
|
||||||
public struct WIN32_FIND_DATAA
|
|
||||||
{
|
|
||||||
public int dwFileAttributes;
|
|
||||||
public FILETIME ftCreationTime;
|
|
||||||
public FILETIME ftLastAccessTime;
|
|
||||||
public FILETIME ftLastWriteTime;
|
|
||||||
public int nFileSizeHigh;
|
|
||||||
public int nFileSizeLow;
|
|
||||||
public int dwReserved0;
|
|
||||||
public int dwReserved1;
|
|
||||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=MAX_PATH)]
|
|
||||||
public string cFileName;
|
|
||||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=14)]
|
|
||||||
public string cAlternateFileName;
|
|
||||||
private const int MAX_PATH = 260;
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayoutAttribute(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
|
|
||||||
public struct WIN32_FIND_DATAW
|
|
||||||
{
|
|
||||||
public int dwFileAttributes;
|
|
||||||
public FILETIME ftCreationTime;
|
|
||||||
public FILETIME ftLastAccessTime;
|
|
||||||
public FILETIME ftLastWriteTime;
|
|
||||||
public int nFileSizeHigh;
|
|
||||||
public int nFileSizeLow;
|
|
||||||
public int dwReserved0;
|
|
||||||
public int dwReserved1;
|
|
||||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=MAX_PATH)]
|
|
||||||
public string cFileName;
|
|
||||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=14)]
|
|
||||||
public string cAlternateFileName;
|
|
||||||
private const int MAX_PATH = 260;
|
|
||||||
}
|
|
||||||
|
|
||||||
[
|
|
||||||
ComImport(),
|
|
||||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
|
|
||||||
Guid("0000010B-0000-0000-C000-000000000046")
|
|
||||||
]
|
|
||||||
public interface IPersistFile
|
|
||||||
{
|
|
||||||
#region Methods inherited from IPersist
|
|
||||||
|
|
||||||
void GetClassID(
|
|
||||||
out Guid pClassID);
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
[PreserveSig()]
|
|
||||||
int IsDirty();
|
|
||||||
|
|
||||||
void Load(
|
|
||||||
[MarshalAs(UnmanagedType.LPWStr)] string pszFileName,
|
|
||||||
int dwMode);
|
|
||||||
|
|
||||||
void Save(
|
|
||||||
[MarshalAs(UnmanagedType.LPWStr)] string pszFileName,
|
|
||||||
[MarshalAs(UnmanagedType.Bool)] bool fRemember);
|
|
||||||
|
|
||||||
void SaveCompleted(
|
|
||||||
[MarshalAs(UnmanagedType.LPWStr)] string pszFileName);
|
|
||||||
|
|
||||||
void GetCurFile(
|
|
||||||
out IntPtr ppszFileName);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
[
|
|
||||||
ComImport(),
|
|
||||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
|
|
||||||
Guid("000214EE-0000-0000-C000-000000000046")
|
|
||||||
]
|
|
||||||
public interface IShellLinkA
|
|
||||||
{
|
|
||||||
void GetPath(
|
|
||||||
[Out(), MarshalAs(UnmanagedType.LPStr)] StringBuilder pszFile,
|
|
||||||
int cchMaxPath,
|
|
||||||
out WIN32_FIND_DATAA pfd,
|
|
||||||
SLGP_FLAGS fFlags);
|
|
||||||
|
|
||||||
void GetIDList(
|
|
||||||
out IntPtr ppidl);
|
|
||||||
|
|
||||||
void SetIDList(
|
|
||||||
IntPtr pidl);
|
|
||||||
|
|
||||||
void GetDescription(
|
|
||||||
[Out(), MarshalAs(UnmanagedType.LPStr)] StringBuilder pszName,
|
|
||||||
int cchMaxName);
|
|
||||||
|
|
||||||
void SetDescription(
|
|
||||||
[MarshalAs(UnmanagedType.LPStr)] string pszName);
|
|
||||||
|
|
||||||
void GetWorkingDirectory(
|
|
||||||
[Out(), MarshalAs(UnmanagedType.LPStr)] StringBuilder pszDir,
|
|
||||||
int cchMaxPath);
|
|
||||||
|
|
||||||
void SetWorkingDirectory(
|
|
||||||
[MarshalAs(UnmanagedType.LPStr)] string pszDir);
|
|
||||||
|
|
||||||
void GetArguments(
|
|
||||||
[Out(), MarshalAs(UnmanagedType.LPStr)] StringBuilder pszArgs,
|
|
||||||
int cchMaxPath);
|
|
||||||
|
|
||||||
void SetArguments(
|
|
||||||
[MarshalAs(UnmanagedType.LPStr)] string pszArgs);
|
|
||||||
|
|
||||||
void GetHotkey(
|
|
||||||
out short pwHotkey);
|
|
||||||
|
|
||||||
void SetHotkey(
|
|
||||||
short wHotkey);
|
|
||||||
|
|
||||||
void GetShowCmd(
|
|
||||||
out int piShowCmd);
|
|
||||||
|
|
||||||
void SetShowCmd(
|
|
||||||
int iShowCmd);
|
|
||||||
|
|
||||||
void GetIconLocation(
|
|
||||||
[Out(), MarshalAs(UnmanagedType.LPStr)] StringBuilder pszIconPath,
|
|
||||||
int cchIconPath,
|
|
||||||
out int piIcon);
|
|
||||||
|
|
||||||
void SetIconLocation(
|
|
||||||
[MarshalAs(UnmanagedType.LPStr)] string pszIconPath,
|
|
||||||
int iIcon);
|
|
||||||
|
|
||||||
void SetRelativePath(
|
|
||||||
[MarshalAs(UnmanagedType.LPStr)] string pszPathRel,
|
|
||||||
int dwReserved);
|
|
||||||
|
|
||||||
void Resolve(
|
|
||||||
IntPtr hwnd,
|
|
||||||
SLR_FLAGS fFlags);
|
|
||||||
|
|
||||||
void SetPath(
|
|
||||||
[MarshalAs(UnmanagedType.LPStr)] string pszFile);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
[
|
|
||||||
ComImport(),
|
|
||||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
|
|
||||||
Guid("000214F9-0000-0000-C000-000000000046")
|
|
||||||
]
|
|
||||||
public interface IShellLinkW
|
|
||||||
{
|
|
||||||
void GetPath(
|
|
||||||
[Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile,
|
|
||||||
int cchMaxPath,
|
|
||||||
out WIN32_FIND_DATAW pfd,
|
|
||||||
SLGP_FLAGS fFlags);
|
|
||||||
|
|
||||||
void GetIDList(
|
|
||||||
out IntPtr ppidl);
|
|
||||||
|
|
||||||
void SetIDList(
|
|
||||||
IntPtr pidl);
|
|
||||||
|
|
||||||
void GetDescription(
|
|
||||||
[Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName,
|
|
||||||
int cchMaxName);
|
|
||||||
|
|
||||||
void SetDescription(
|
|
||||||
[MarshalAs(UnmanagedType.LPWStr)] string pszName);
|
|
||||||
|
|
||||||
void GetWorkingDirectory(
|
|
||||||
[Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir,
|
|
||||||
int cchMaxPath);
|
|
||||||
|
|
||||||
void SetWorkingDirectory(
|
|
||||||
[MarshalAs(UnmanagedType.LPWStr)] string pszDir);
|
|
||||||
|
|
||||||
void GetArguments(
|
|
||||||
[Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs,
|
|
||||||
int cchMaxPath);
|
|
||||||
|
|
||||||
void SetArguments(
|
|
||||||
[MarshalAs(UnmanagedType.LPWStr)] string pszArgs);
|
|
||||||
|
|
||||||
void GetHotkey(
|
|
||||||
out short pwHotkey);
|
|
||||||
|
|
||||||
void SetHotkey(
|
|
||||||
short wHotkey);
|
|
||||||
|
|
||||||
void GetShowCmd(
|
|
||||||
out int piShowCmd);
|
|
||||||
|
|
||||||
void SetShowCmd(
|
|
||||||
int iShowCmd);
|
|
||||||
|
|
||||||
void GetIconLocation(
|
|
||||||
[Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath,
|
|
||||||
int cchIconPath,
|
|
||||||
out int piIcon);
|
|
||||||
|
|
||||||
void SetIconLocation(
|
|
||||||
[MarshalAs(UnmanagedType.LPWStr)] string pszIconPath,
|
|
||||||
int iIcon);
|
|
||||||
|
|
||||||
void SetRelativePath(
|
|
||||||
[MarshalAs(UnmanagedType.LPWStr)] string pszPathRel,
|
|
||||||
int dwReserved);
|
|
||||||
|
|
||||||
void Resolve(
|
|
||||||
IntPtr hwnd,
|
|
||||||
SLR_FLAGS fFlags);
|
|
||||||
|
|
||||||
void SetPath(
|
|
||||||
[MarshalAs(UnmanagedType.LPWStr)] string pszFile);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[
|
|
||||||
ComImport(),
|
|
||||||
Guid("00021401-0000-0000-C000-000000000046")
|
|
||||||
]
|
|
||||||
public class ShellLink // : IPersistFile, IShellLinkA, IShellLinkW
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,348 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
*
|
|
||||||
* Filename: ShellShortcut.cs
|
|
||||||
* Author: Mattias Sjögren (mattias@mvps.org)
|
|
||||||
* http://www.msjogren.net/dotnet/
|
|
||||||
*
|
|
||||||
* Description: Defines a .NET friendly class, ShellShortcut, for reading
|
|
||||||
* and writing shortcuts.
|
|
||||||
* Define the conditional compilation symbol UNICODE to use
|
|
||||||
* IShellLinkW internally.
|
|
||||||
*
|
|
||||||
* Public types: class ShellShortcut
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Dependencies: ShellLinkNative.cs
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Copyright ©2001-2002, Mattias Sjögren
|
|
||||||
*
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.IO;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Text;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
|
|
||||||
|
|
||||||
namespace MediaBrowser.Installer.Code
|
|
||||||
{
|
|
||||||
/// <remarks>
|
|
||||||
/// .NET friendly wrapper for the ShellLink class
|
|
||||||
/// </remarks>
|
|
||||||
public class ShellShortcut : IDisposable
|
|
||||||
{
|
|
||||||
private const int INFOTIPSIZE = 1024;
|
|
||||||
private const int MAX_PATH = 260;
|
|
||||||
|
|
||||||
private const int SW_SHOWNORMAL = 1;
|
|
||||||
private const int SW_SHOWMINIMIZED = 2;
|
|
||||||
private const int SW_SHOWMAXIMIZED = 3;
|
|
||||||
private const int SW_SHOWMINNOACTIVE = 7;
|
|
||||||
|
|
||||||
|
|
||||||
#if UNICODE
|
|
||||||
private IShellLinkW m_Link;
|
|
||||||
#else
|
|
||||||
private IShellLinkA m_Link;
|
|
||||||
#endif
|
|
||||||
private string m_sPath;
|
|
||||||
|
|
||||||
///
|
|
||||||
/// <param name='linkPath'>
|
|
||||||
/// Path to new or existing shortcut file (.lnk).
|
|
||||||
/// </param>
|
|
||||||
///
|
|
||||||
public ShellShortcut(string linkPath)
|
|
||||||
{
|
|
||||||
IPersistFile pf;
|
|
||||||
|
|
||||||
m_sPath = linkPath;
|
|
||||||
|
|
||||||
#if UNICODE
|
|
||||||
m_Link = (IShellLinkW) new ShellLink();
|
|
||||||
#else
|
|
||||||
m_Link = (IShellLinkA) new ShellLink();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ( File.Exists( linkPath ) ) {
|
|
||||||
pf = (IPersistFile)m_Link;
|
|
||||||
pf.Load( linkPath, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// IDisplosable implementation
|
|
||||||
//
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
if ( m_Link != null ) {
|
|
||||||
Marshal.ReleaseComObject( m_Link );
|
|
||||||
m_Link = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <value>
|
|
||||||
/// Gets or sets the argument list of the shortcut.
|
|
||||||
/// </value>
|
|
||||||
public string Arguments
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
StringBuilder sb = new StringBuilder( INFOTIPSIZE );
|
|
||||||
m_Link.GetArguments( sb, sb.Capacity );
|
|
||||||
return sb.ToString();
|
|
||||||
}
|
|
||||||
set { m_Link.SetArguments( value ); }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <value>
|
|
||||||
/// Gets or sets a description of the shortcut.
|
|
||||||
/// </value>
|
|
||||||
public string Description
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
StringBuilder sb = new StringBuilder( INFOTIPSIZE );
|
|
||||||
m_Link.GetDescription( sb, sb.Capacity );
|
|
||||||
return sb.ToString();
|
|
||||||
}
|
|
||||||
set { m_Link.SetDescription( value ); }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <value>
|
|
||||||
/// Gets or sets the working directory (aka start in directory) of the shortcut.
|
|
||||||
/// </value>
|
|
||||||
public string WorkingDirectory
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
StringBuilder sb = new StringBuilder( MAX_PATH );
|
|
||||||
m_Link.GetWorkingDirectory( sb, sb.Capacity );
|
|
||||||
return sb.ToString();
|
|
||||||
}
|
|
||||||
set { m_Link.SetWorkingDirectory( value ); }
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// If Path returns an empty string, the shortcut is associated with
|
|
||||||
// a PIDL instead, which can be retrieved with IShellLink.GetIDList().
|
|
||||||
// This is beyond the scope of this wrapper class.
|
|
||||||
//
|
|
||||||
/// <value>
|
|
||||||
/// Gets or sets the target path of the shortcut.
|
|
||||||
/// </value>
|
|
||||||
public string Path
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
#if UNICODE
|
|
||||||
WIN32_FIND_DATAW wfd = new WIN32_FIND_DATAW();
|
|
||||||
#else
|
|
||||||
WIN32_FIND_DATAA wfd = new WIN32_FIND_DATAA();
|
|
||||||
#endif
|
|
||||||
StringBuilder sb = new StringBuilder( MAX_PATH );
|
|
||||||
|
|
||||||
m_Link.GetPath( sb, sb.Capacity, out wfd, SLGP_FLAGS.SLGP_UNCPRIORITY );
|
|
||||||
return sb.ToString();
|
|
||||||
}
|
|
||||||
set { m_Link.SetPath( value ); }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <value>
|
|
||||||
/// Gets or sets the path of the <see cref="Icon"/> assigned to the shortcut.
|
|
||||||
/// </value>
|
|
||||||
/// <summary>
|
|
||||||
/// <seealso cref="IconIndex"/>
|
|
||||||
/// </summary>
|
|
||||||
public string IconPath
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
StringBuilder sb = new StringBuilder( MAX_PATH );
|
|
||||||
int nIconIdx;
|
|
||||||
m_Link.GetIconLocation( sb, sb.Capacity, out nIconIdx );
|
|
||||||
return sb.ToString();
|
|
||||||
}
|
|
||||||
set { m_Link.SetIconLocation( value, IconIndex ); }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <value>
|
|
||||||
/// Gets or sets the index of the <see cref="Icon"/> assigned to the shortcut.
|
|
||||||
/// Set to zero when the <see cref="IconPath"/> property specifies a .ICO file.
|
|
||||||
/// </value>
|
|
||||||
/// <summary>
|
|
||||||
/// <seealso cref="IconPath"/>
|
|
||||||
/// </summary>
|
|
||||||
public int IconIndex
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
StringBuilder sb = new StringBuilder( MAX_PATH );
|
|
||||||
int nIconIdx;
|
|
||||||
m_Link.GetIconLocation( sb, sb.Capacity, out nIconIdx );
|
|
||||||
return nIconIdx;
|
|
||||||
}
|
|
||||||
set { m_Link.SetIconLocation( IconPath, value ); }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <value>
|
|
||||||
/// Retrieves the Icon of the shortcut as it will appear in Explorer.
|
|
||||||
/// Use the <see cref="IconPath"/> and <see cref="IconIndex"/>
|
|
||||||
/// properties to change it.
|
|
||||||
/// </value>
|
|
||||||
public Icon Icon
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
StringBuilder sb = new StringBuilder( MAX_PATH );
|
|
||||||
int nIconIdx;
|
|
||||||
IntPtr hIcon, hInst;
|
|
||||||
Icon ico, clone;
|
|
||||||
|
|
||||||
|
|
||||||
m_Link.GetIconLocation( sb, sb.Capacity, out nIconIdx );
|
|
||||||
hInst = Marshal.GetHINSTANCE( this.GetType().Module );
|
|
||||||
hIcon = Native.ExtractIcon( hInst, sb.ToString(), nIconIdx );
|
|
||||||
if ( hIcon == IntPtr.Zero )
|
|
||||||
return null;
|
|
||||||
|
|
||||||
// Return a cloned Icon, because we have to free the original ourselves.
|
|
||||||
ico = Icon.FromHandle( hIcon );
|
|
||||||
clone = (Icon)ico.Clone();
|
|
||||||
ico.Dispose();
|
|
||||||
Native.DestroyIcon( hIcon );
|
|
||||||
return clone;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <value>
|
|
||||||
/// Gets or sets the System.Diagnostics.ProcessWindowStyle value
|
|
||||||
/// that decides the initial show state of the shortcut target. Note that
|
|
||||||
/// ProcessWindowStyle.Hidden is not a valid property value.
|
|
||||||
/// </value>
|
|
||||||
public ProcessWindowStyle WindowStyle
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
int nWS;
|
|
||||||
m_Link.GetShowCmd( out nWS );
|
|
||||||
|
|
||||||
switch ( nWS ) {
|
|
||||||
case SW_SHOWMINIMIZED:
|
|
||||||
case SW_SHOWMINNOACTIVE:
|
|
||||||
return ProcessWindowStyle.Minimized;
|
|
||||||
|
|
||||||
case SW_SHOWMAXIMIZED:
|
|
||||||
return ProcessWindowStyle.Maximized;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return ProcessWindowStyle.Normal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
int nWS;
|
|
||||||
|
|
||||||
switch ( value ) {
|
|
||||||
case ProcessWindowStyle.Normal:
|
|
||||||
nWS = SW_SHOWNORMAL;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ProcessWindowStyle.Minimized:
|
|
||||||
nWS = SW_SHOWMINNOACTIVE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ProcessWindowStyle.Maximized:
|
|
||||||
nWS = SW_SHOWMAXIMIZED;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: // ProcessWindowStyle.Hidden
|
|
||||||
throw new ArgumentException("Unsupported ProcessWindowStyle value.");
|
|
||||||
}
|
|
||||||
|
|
||||||
m_Link.SetShowCmd( nWS );
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <value>
|
|
||||||
/// Gets or sets the hotkey for the shortcut.
|
|
||||||
/// </value>
|
|
||||||
public Keys Hotkey
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
short wHotkey;
|
|
||||||
int dwHotkey;
|
|
||||||
|
|
||||||
m_Link.GetHotkey( out wHotkey );
|
|
||||||
|
|
||||||
//
|
|
||||||
// Convert from IShellLink 16-bit format to Keys enumeration 32-bit value
|
|
||||||
// IShellLink: 0xMMVK
|
|
||||||
// Keys: 0x00MM00VK
|
|
||||||
// MM = Modifier (Alt, Control, Shift)
|
|
||||||
// VK = Virtual key code
|
|
||||||
//
|
|
||||||
dwHotkey = ((wHotkey & 0xFF00) << 8) | (wHotkey & 0xFF);
|
|
||||||
return (Keys) dwHotkey;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
short wHotkey;
|
|
||||||
|
|
||||||
if ( (value & Keys.Modifiers) == 0 )
|
|
||||||
throw new ArgumentException("Hotkey must include a modifier key.");
|
|
||||||
|
|
||||||
//
|
|
||||||
// Convert from Keys enumeration 32-bit value to IShellLink 16-bit format
|
|
||||||
// IShellLink: 0xMMVK
|
|
||||||
// Keys: 0x00MM00VK
|
|
||||||
// MM = Modifier (Alt, Control, Shift)
|
|
||||||
// VK = Virtual key code
|
|
||||||
//
|
|
||||||
wHotkey = unchecked((short) ( ((int) (value & Keys.Modifiers) >> 8) | (int) (value & Keys.KeyCode) ));
|
|
||||||
m_Link.SetHotkey( wHotkey );
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Saves the shortcut to disk.
|
|
||||||
/// </summary>
|
|
||||||
public void Save()
|
|
||||||
{
|
|
||||||
IPersistFile pf = (IPersistFile) m_Link;
|
|
||||||
pf.Save( m_sPath, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns a reference to the internal ShellLink object,
|
|
||||||
/// which can be used to perform more advanced operations
|
|
||||||
/// not supported by this wrapper class, by using the
|
|
||||||
/// IShellLink interface directly.
|
|
||||||
/// </summary>
|
|
||||||
public object ShellLink
|
|
||||||
{
|
|
||||||
get { return m_Link; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#region Native Win32 API functions
|
|
||||||
private class Native
|
|
||||||
{
|
|
||||||
[DllImport("shell32.dll", CharSet=CharSet.Auto)]
|
|
||||||
public static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);
|
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
|
||||||
public static extern bool DestroyIcon(IntPtr hIcon);
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
Before Width: | Height: | Size: 138 KiB |
|
@ -1,58 +0,0 @@
|
||||||
<Window
|
|
||||||
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="383.481" Width="663.057" ResizeMode="NoResize" WindowStyle="None">
|
|
||||||
<Border BorderBrush="DarkGray" BorderThickness="2" Margin="0,0,0,0">
|
|
||||||
<Grid Margin="-2,0,0,0">
|
|
||||||
<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"/>
|
|
||||||
<Grid HorizontalAlignment="Left" Height="153" Margin="0,173,0,0" VerticalAlignment="Top" Width="662" Background="Gray">
|
|
||||||
<TextBlock x:Name="lblStatus" HorizontalAlignment="Left" Margin="12,14,0,18" Width="637" FontSize="36" Foreground="#FFE6D7D7" Text="Status" TextWrapping="WrapWithOverflow"/>
|
|
||||||
<Rectangle Fill="#FF49494B" HorizontalAlignment="Left" Height="13" Stroke="Black" VerticalAlignment="Bottom" Width="662"/>
|
|
||||||
<Rectangle x:Name="rectProgress" Fill="#FF0A0ABF" HorizontalAlignment="Left" Height="13" Stroke="Black" VerticalAlignment="Bottom" Width="0"/>
|
|
||||||
</Grid>
|
|
||||||
<Button x:Name="btnCancel" Content="Cancel" HorizontalAlignment="Left" Margin="552,336,0,0" Width="97" FontSize="14" Click="btnCancel_Click" Height="31" VerticalAlignment="Top"/>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
</Border>
|
|
||||||
<Window.Resources>
|
|
||||||
<!--Metro Button-->
|
|
||||||
<Style TargetType="{x:Type Button}" BasedOn="{x:Null}">
|
|
||||||
<Setter Property="Background" Value="Transparent"/>
|
|
||||||
<Setter Property="Foreground" Value="#222222"/>
|
|
||||||
<Setter Property="FontSize" Value="16"/>
|
|
||||||
<Setter Property="Padding" Value="10,5,10,5"/>
|
|
||||||
<Setter Property="BorderBrush" Value="#222222"/>
|
|
||||||
<Setter Property="BorderThickness" Value="2"/>
|
|
||||||
<Setter Property="Template">
|
|
||||||
<Setter.Value>
|
|
||||||
<ControlTemplate TargetType="{x:Type Button}">
|
|
||||||
<!-- We use Grid as a root because it is easy to add more elements to customize the button -->
|
|
||||||
<Grid x:Name="Grid">
|
|
||||||
<Border x:Name="Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"/>
|
|
||||||
|
|
||||||
<!-- Content Presenter is where the text content etc is placed by the control -->
|
|
||||||
<!-- The bindings are useful so that the control can be parameterized without editing the template -->
|
|
||||||
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RecognizesAccessKey="True"/>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<!--Each state sets a brush on the Border in the template -->
|
|
||||||
<ControlTemplate.Triggers>
|
|
||||||
<Trigger Property="IsPressed" Value="true">
|
|
||||||
<Setter Property="Background" Value="#222222" TargetName="Border"/>
|
|
||||||
<Setter Property="BorderBrush" Value="#222222" TargetName="Border"/>
|
|
||||||
<Setter Property="Foreground" Value="White"/>
|
|
||||||
<Setter Property="FontSize" Value="16"/>
|
|
||||||
</Trigger>
|
|
||||||
<Trigger Property="IsEnabled" Value="true"/>
|
|
||||||
<Trigger Property="IsEnabled" Value="false">
|
|
||||||
<Setter Property="BorderBrush" Value="#7f222222" TargetName="Border"/>
|
|
||||||
<Setter Property="Foreground" Value="#7f222222"/>
|
|
||||||
</Trigger>
|
|
||||||
</ControlTemplate.Triggers>
|
|
||||||
</ControlTemplate>
|
|
||||||
</Setter.Value>
|
|
||||||
</Setter>
|
|
||||||
</Style>
|
|
||||||
</Window.Resources>
|
|
||||||
</Window>
|
|
|
@ -1,642 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Configuration;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
|
||||||
using System.Net;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows;
|
|
||||||
using System.Linq;
|
|
||||||
using Ionic.Zip;
|
|
||||||
using MediaBrowser.Installer.Code;
|
|
||||||
using Microsoft.Win32;
|
|
||||||
using ServiceStack.Text;
|
|
||||||
|
|
||||||
namespace MediaBrowser.Installer
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Interaction logic for MainWindow.xaml
|
|
||||||
/// </summary>
|
|
||||||
public partial class MainWindow : Window
|
|
||||||
{
|
|
||||||
protected PackageVersionClass PackageClass = PackageVersionClass.Release;
|
|
||||||
protected Version RequestedVersion = new Version(4,0,0,0);
|
|
||||||
protected Version ActualVersion;
|
|
||||||
protected string PackageName = "MBServer";
|
|
||||||
protected string RootSuffix = "-Server";
|
|
||||||
protected string TargetExe = "MediaBrowser.ServerApplication.exe";
|
|
||||||
protected string TargetArgs = "";
|
|
||||||
protected string FriendlyName = "Media Browser Server";
|
|
||||||
protected string Archive = null;
|
|
||||||
protected bool InstallPismo = true;
|
|
||||||
protected string RootPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MediaBrowser-Server");
|
|
||||||
protected string EndInstallPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MediaBrowser-Server");
|
|
||||||
|
|
||||||
protected bool IsUpdate = false;
|
|
||||||
|
|
||||||
protected bool SystemClosing = false;
|
|
||||||
|
|
||||||
protected string TempLocation = Path.Combine(Path.GetTempPath(), "MediaBrowser");
|
|
||||||
|
|
||||||
protected WebClient MainClient = new WebClient();
|
|
||||||
|
|
||||||
public MainWindow()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
GetArgs();
|
|
||||||
InitializeComponent();
|
|
||||||
DoInstall(Archive);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
MessageBox.Show("Error: " + e.Message + " \n\n" + e.StackTrace);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void btnCancel_Click(object sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
this.Close();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
|
|
||||||
{
|
|
||||||
if (!SystemClosing && MessageBox.Show("Cancel Installation - Are you sure?", "Cancel", MessageBoxButton.YesNo) == MessageBoxResult.No)
|
|
||||||
{
|
|
||||||
e.Cancel = true;
|
|
||||||
}
|
|
||||||
if (MainClient.IsBusy)
|
|
||||||
{
|
|
||||||
MainClient.CancelAsync();
|
|
||||||
while (MainClient.IsBusy)
|
|
||||||
{
|
|
||||||
// wait to finish
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MainClient.Dispose();
|
|
||||||
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()
|
|
||||||
{
|
|
||||||
//cmd line args should be name/value pairs like: product=server archive="c:\.." caller=34552
|
|
||||||
var cmdArgs = Environment.GetCommandLineArgs();
|
|
||||||
var args = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
|
||||||
foreach (var pair in cmdArgs)
|
|
||||||
{
|
|
||||||
var nameValue = pair.Split('=');
|
|
||||||
if (nameValue.Length == 2)
|
|
||||||
{
|
|
||||||
args[nameValue[0]] = nameValue[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Archive = args.GetValueOrDefault("archive", null);
|
|
||||||
if (args.GetValueOrDefault("pismo","true") == "false") InstallPismo = false;
|
|
||||||
|
|
||||||
var product = args.GetValueOrDefault("product", null) ?? ConfigurationManager.AppSettings["product"] ?? "server";
|
|
||||||
PackageClass = (PackageVersionClass) Enum.Parse(typeof (PackageVersionClass), args.GetValueOrDefault("class", null) ?? ConfigurationManager.AppSettings["class"] ?? "Release");
|
|
||||||
RequestedVersion = new Version(args.GetValueOrDefault("version", "4.0"));
|
|
||||||
|
|
||||||
var callerId = args.GetValueOrDefault("caller", 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
|
|
||||||
}
|
|
||||||
|
|
||||||
IsUpdate = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//MessageBox.Show(string.Format("Called with args: product: {0} archive: {1} caller: {2}", product, Archive, callerId));
|
|
||||||
|
|
||||||
switch (product.ToLower())
|
|
||||||
{
|
|
||||||
case "mbt":
|
|
||||||
PackageName = "MBTheater";
|
|
||||||
RootSuffix = "-Theater";
|
|
||||||
TargetExe = "MediaBrowser.UI.exe";
|
|
||||||
FriendlyName = "Media Browser Theater";
|
|
||||||
RootPath = EndInstallPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MediaBrowser" + RootSuffix);
|
|
||||||
EndInstallPath = Path.Combine(RootPath, "system");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "mbc":
|
|
||||||
PackageName = "MBClassic";
|
|
||||||
RootSuffix = "-WMC";
|
|
||||||
TargetExe = "ehshell.exe";
|
|
||||||
TargetArgs = @"/nostartupanimation /entrypoint:{CE32C570-4BEC-4aeb-AD1D-CF47B91DE0B2}\{FC9ABCCC-36CB-47ac-8BAB-03E8EF5F6F22}";
|
|
||||||
FriendlyName = "Media Browser Classic";
|
|
||||||
RootPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MediaBrowser" + RootSuffix);
|
|
||||||
EndInstallPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "ehome");
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
PackageName = "MBServer";
|
|
||||||
RootSuffix = "-Server";
|
|
||||||
TargetExe = "MediaBrowser.ServerApplication.exe";
|
|
||||||
FriendlyName = "Media Browser Server";
|
|
||||||
RootPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MediaBrowser" + RootSuffix);
|
|
||||||
EndInstallPath = Path.Combine(RootPath, "system");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Execute the install process
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
protected async Task DoInstall(string archive)
|
|
||||||
{
|
|
||||||
lblStatus.Text = string.Format("Installing {0}...", FriendlyName);
|
|
||||||
|
|
||||||
// Determine Package version
|
|
||||||
var version = archive == null ? await GetPackageVersion() : null;
|
|
||||||
ActualVersion = version != null ? version.version : new Version(3,0);
|
|
||||||
|
|
||||||
// Now try and shut down the server if that is what we are installing and it is running
|
|
||||||
var procs = Process.GetProcessesByName("mediabrowser.serverapplication");
|
|
||||||
var server = procs.Length > 0 ? procs[0] : null;
|
|
||||||
if (!IsUpdate && PackageName == "MBServer" && server != null)
|
|
||||||
{
|
|
||||||
lblStatus.Text = "Shutting Down Media Browser Server...";
|
|
||||||
using (var client = new WebClient())
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
client.UploadString("http://localhost:8096/mediabrowser/System/Shutdown", "");
|
|
||||||
try
|
|
||||||
{
|
|
||||||
server.WaitForExit(30000); //don't hang indefinitely
|
|
||||||
}
|
|
||||||
catch (ArgumentException)
|
|
||||||
{
|
|
||||||
// already gone
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (WebException e)
|
|
||||||
{
|
|
||||||
if (e.Status == WebExceptionStatus.Timeout || e.Message.StartsWith("Unable to connect",StringComparison.OrdinalIgnoreCase)) return; // just wasn't running
|
|
||||||
|
|
||||||
MessageBox.Show("Error shutting down server. Please be sure it is not running before hitting OK.\n\n" + e.Status + "\n\n" + e.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!IsUpdate && PackageName == "MBTheater")
|
|
||||||
{
|
|
||||||
// Uninstalling MBT - shut it down if it is running
|
|
||||||
var processes = Process.GetProcessesByName("mediabrowser.ui");
|
|
||||||
if (processes.Length > 0)
|
|
||||||
{
|
|
||||||
lblStatus.Text = "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");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Download if we don't already have it
|
|
||||||
if (archive == null)
|
|
||||||
{
|
|
||||||
lblStatus.Text = string.Format("Downloading {0} (version {1})...", FriendlyName, version.versionStr);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
archive = await DownloadPackage(version);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
SystemClose("Error Downloading Package - " + e.GetType().FullName + "\n\n" + e.Message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (archive == null) return; //we canceled or had an error that was already reported
|
|
||||||
|
|
||||||
if (Path.GetExtension(archive) == ".msi")
|
|
||||||
{
|
|
||||||
|
|
||||||
// Create directory for our installer log
|
|
||||||
if (!Directory.Exists(RootPath)) Directory.CreateDirectory(RootPath);
|
|
||||||
var logPath = Path.Combine(RootPath, "Logs");
|
|
||||||
if (!Directory.Exists(logPath)) Directory.CreateDirectory(logPath);
|
|
||||||
|
|
||||||
// Run in silent mode and wait for it to finish
|
|
||||||
// First uninstall any previous version
|
|
||||||
lblStatus.Text = "Uninstalling any previous version...";
|
|
||||||
var logfile = Path.Combine(RootPath, "logs", "UnInstall.log");
|
|
||||||
var uninstaller = Process.Start("msiexec", "/x \"" + archive + "\" /quiet /le \"" + logfile + "\"");
|
|
||||||
if (uninstaller != null) uninstaller.WaitForExit();
|
|
||||||
// And now installer
|
|
||||||
lblStatus.Text = "Installing " + FriendlyName;
|
|
||||||
logfile = Path.Combine(RootPath, "logs", "Install.log");
|
|
||||||
var installer = Process.Start(archive, "/quiet /le \""+logfile+"\"");
|
|
||||||
installer.WaitForExit(); // let this throw if there is a problem
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Extract
|
|
||||||
lblStatus.Text = "Extracting Package...";
|
|
||||||
var retryCount = 0;
|
|
||||||
var success = false;
|
|
||||||
while (!success && retryCount < 3)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ExtractPackage(archive);
|
|
||||||
success = true;
|
|
||||||
// We're done with it so delete it (this is necessary for update operations)
|
|
||||||
TryDelete(archive);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
if (retryCount < 3)
|
|
||||||
{
|
|
||||||
retryCount++;
|
|
||||||
Thread.Sleep(500);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Delete archive even if failed so we don't try again with this one
|
|
||||||
TryDelete(archive);
|
|
||||||
SystemClose("Error Extracting - " + e.GetType().FullName + "\n\n" + e.Message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create shortcut
|
|
||||||
lblStatus.Text = "Creating Shortcuts...";
|
|
||||||
var fullPath = Path.Combine(RootPath, "System", TargetExe);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
CreateShortcuts(fullPath);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
SystemClose("Error Creating Shortcut - "+e.GetType().FullName+"\n\n"+e.Message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Install Pismo
|
|
||||||
if (InstallPismo)
|
|
||||||
{
|
|
||||||
lblStatus.Text = "Installing ISO Support...";
|
|
||||||
try
|
|
||||||
{
|
|
||||||
PismoInstall();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
SystemClose("Error Installing ISO support - "+e.GetType().FullName+"\n\n"+e.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now delete the pismo install files
|
|
||||||
Directory.Delete(Path.Combine(RootPath, "Pismo"), true);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// And run
|
|
||||||
lblStatus.Text = string.Format("Starting {0}...", FriendlyName);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Process.Start(Path.Combine(EndInstallPath, TargetExe), TargetArgs);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
SystemClose("Error Executing - "+Path.Combine(EndInstallPath, TargetExe) + " " + TargetArgs + "\n\n" +e.GetType().FullName+"\n\n"+e.Message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SystemClose();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool TryDelete(string file)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
File.Delete(file);
|
|
||||||
}
|
|
||||||
catch (FileNotFoundException)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void PismoInstall()
|
|
||||||
{
|
|
||||||
// Kick off the Pismo installer and wait for it to end
|
|
||||||
var pismo = new Process();
|
|
||||||
pismo.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
|
|
||||||
pismo.StartInfo.FileName = Path.Combine(RootPath, "Pismo", "pfminst.exe");
|
|
||||||
pismo.StartInfo.Arguments = "install";
|
|
||||||
pismo.Start();
|
|
||||||
pismo.WaitForExit();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
protected async Task<PackageVersionInfo> GetPackageVersion()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// get the package information for the server
|
|
||||||
var json = await MainClient.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(v => v.version <= RequestedVersion);
|
|
||||||
if (version == null)
|
|
||||||
{
|
|
||||||
SystemClose("Could not locate download package. Aborting.");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return version;
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
SystemClose(e.GetType().FullName + "\n\n" + e.Message);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <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(PackageVersionInfo version)
|
|
||||||
{
|
|
||||||
var success = false;
|
|
||||||
var retryCount = 0;
|
|
||||||
var archiveFile = Path.Combine(PrepareTempLocation(), version.targetFilename);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
while (!success && retryCount < 3)
|
|
||||||
{
|
|
||||||
|
|
||||||
// setup download progress and download the package
|
|
||||||
MainClient.DownloadProgressChanged += DownloadProgressChanged;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await MainClient.DownloadFileTaskAsync(version.sourceUrl, archiveFile);
|
|
||||||
success = true;
|
|
||||||
}
|
|
||||||
catch (WebException e)
|
|
||||||
{
|
|
||||||
if (e.Status == WebExceptionStatus.RequestCanceled)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (retryCount < 3 && (e.Status == WebExceptionStatus.Timeout || e.Status == WebExceptionStatus.ConnectFailure || e.Status == WebExceptionStatus.ProtocolError))
|
|
||||||
{
|
|
||||||
Thread.Sleep(500); //wait just a sec
|
|
||||||
PrepareTempLocation(); //clear this out
|
|
||||||
retryCount++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return archiveFile;
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
SystemClose(e.GetType().FullName + "\n\n" + e.Message);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
|
|
||||||
{
|
|
||||||
rectProgress.Width = (this.Width * e.ProgressPercentage)/100f;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <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)
|
|
||||||
{
|
|
||||||
// Delete old content of system
|
|
||||||
var systemDir = Path.Combine(RootPath, "System");
|
|
||||||
var backupDir = Path.Combine(RootPath, "System.old");
|
|
||||||
if (Directory.Exists(systemDir))
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (Directory.Exists(backupDir)) Directory.Delete(backupDir,true);
|
|
||||||
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
throw new ApplicationException("Could not delete previous backup directory.\n\n"+e.Message);
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Directory.Move(systemDir, backupDir);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
throw new ApplicationException("Could not move system directory to backup.\n\n"+e.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// And extract
|
|
||||||
var retryCount = 0;
|
|
||||||
var success = false;
|
|
||||||
while (!success && retryCount < 3)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
using (var fileStream = File.OpenRead(archive))
|
|
||||||
{
|
|
||||||
using (var zipFile = ZipFile.Read(fileStream))
|
|
||||||
{
|
|
||||||
zipFile.ExtractAll(RootPath, ExtractExistingFileAction.OverwriteSilently);
|
|
||||||
success = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
if (retryCount < 3)
|
|
||||||
{
|
|
||||||
Thread.Sleep(250);
|
|
||||||
retryCount++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//Rollback
|
|
||||||
RollBack(systemDir, backupDir);
|
|
||||||
throw new ApplicationException(string.Format("Could not extract {0} to {1} after {2} attempts.\n\n{3}", archive, RootPath, retryCount, e.Message));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void RollBack(string systemDir, string backupDir)
|
|
||||||
{
|
|
||||||
if (Directory.Exists(backupDir))
|
|
||||||
{
|
|
||||||
if (Directory.Exists(systemDir)) Directory.Delete(systemDir);
|
|
||||||
Directory.Move(backupDir, systemDir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <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 CreateShortcuts(string targetExe)
|
|
||||||
{
|
|
||||||
// get path to all users start menu
|
|
||||||
var startMenu = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu),"Media Browser 3");
|
|
||||||
if (!Directory.Exists(startMenu)) Directory.CreateDirectory(startMenu);
|
|
||||||
var product = new ShellShortcut(Path.Combine(startMenu, FriendlyName+".lnk")) {Path = targetExe, Description = "Run " + FriendlyName};
|
|
||||||
product.Save();
|
|
||||||
|
|
||||||
if (PackageName == "MBServer")
|
|
||||||
{
|
|
||||||
var path = Path.Combine(startMenu, "MB Dashboard.lnk");
|
|
||||||
var dashboard = new ShellShortcut(path)
|
|
||||||
{Path = @"http://localhost:8096/mediabrowser/dashboard/dashboard.html", Description = "Open the Media Browser Server Dashboard (configuration)"};
|
|
||||||
dashboard.Save();
|
|
||||||
|
|
||||||
}
|
|
||||||
CreateUninstaller(Path.Combine(Path.GetDirectoryName(targetExe) ?? "", "MediaBrowser.Uninstaller.exe")+ " "+ (PackageName == "MBServer" ? "server" : "mbt"), targetExe);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Create uninstall entry in add/remove
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="uninstallPath"></param>
|
|
||||||
/// <param name="targetExe"></param>
|
|
||||||
private void CreateUninstaller(string uninstallPath, string targetExe)
|
|
||||||
{
|
|
||||||
var parent = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", true);
|
|
||||||
{
|
|
||||||
if (parent == null)
|
|
||||||
{
|
|
||||||
var rootParent = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion", true);
|
|
||||||
{
|
|
||||||
if (rootParent != null)
|
|
||||||
{
|
|
||||||
parent = rootParent.CreateSubKey("Uninstall");
|
|
||||||
if (parent == null)
|
|
||||||
{
|
|
||||||
MessageBox.Show("Unable to create Uninstall registry key. Program is still installed sucessfully.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
RegistryKey key = null;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
const string guidText = "{4E76DB4E-1BB9-4A7B-860C-7940779CF7A0}";
|
|
||||||
key = parent.OpenSubKey(guidText, true) ??
|
|
||||||
parent.CreateSubKey(guidText);
|
|
||||||
|
|
||||||
if (key == null)
|
|
||||||
{
|
|
||||||
MessageBox.Show(String.Format("Unable to create uninstaller entry'{0}\\{1}'. Program is still installed successfully.", @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", guidText));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
key.SetValue("DisplayName", FriendlyName);
|
|
||||||
key.SetValue("ApplicationVersion", ActualVersion);
|
|
||||||
key.SetValue("Publisher", "Media Browser Team");
|
|
||||||
key.SetValue("DisplayIcon", targetExe);
|
|
||||||
key.SetValue("DisplayVersion", ActualVersion.ToString(2));
|
|
||||||
key.SetValue("URLInfoAbout", "http://www.mediabrowser3.com");
|
|
||||||
key.SetValue("Contact", "http://community.mediabrowser.tv");
|
|
||||||
key.SetValue("InstallDate", DateTime.Now.ToString("yyyyMMdd"));
|
|
||||||
key.SetValue("UninstallString", uninstallPath);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (key != null)
|
|
||||||
{
|
|
||||||
key.Close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
MessageBox.Show("An error occurred writing uninstall information to the registry.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,214 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
|
||||||
<ProjectGuid>{3879F78A-D6F6-45E5-B2A8-D8DCF2DABB74}</ProjectGuid>
|
|
||||||
<OutputType>WinExe</OutputType>
|
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
|
||||||
<RootNamespace>MediaBrowser.Installer</RootNamespace>
|
|
||||||
<AssemblyName>MediaBrowser.Installer</AssemblyName>
|
|
||||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
|
||||||
<FileAlignment>512</FileAlignment>
|
|
||||||
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
<IsWebBootstrapper>true</IsWebBootstrapper>
|
|
||||||
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
|
|
||||||
<RestorePackages>true</RestorePackages>
|
|
||||||
<PublishUrl>http://www.mb3admin.com/downloads/dev/server/</PublishUrl>
|
|
||||||
<Install>false</Install>
|
|
||||||
<InstallFrom>Web</InstallFrom>
|
|
||||||
<UpdateEnabled>false</UpdateEnabled>
|
|
||||||
<UpdateMode>Foreground</UpdateMode>
|
|
||||||
<UpdateInterval>7</UpdateInterval>
|
|
||||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
|
||||||
<UpdatePeriodically>false</UpdatePeriodically>
|
|
||||||
<UpdateRequired>false</UpdateRequired>
|
|
||||||
<MapFileExtensions>true</MapFileExtensions>
|
|
||||||
<SupportUrl>http://community.mediabrowser.tv</SupportUrl>
|
|
||||||
<ProductName>Media Browser Installer</ProductName>
|
|
||||||
<PublisherName>Media Browser Team</PublisherName>
|
|
||||||
<SuiteName>Media Browser</SuiteName>
|
|
||||||
<OpenBrowserOnPublish>false</OpenBrowserOnPublish>
|
|
||||||
<ApplicationRevision>64</ApplicationRevision>
|
|
||||||
<ApplicationVersion>0.1.1.%2a</ApplicationVersion>
|
|
||||||
<UseApplicationTrust>false</UseApplicationTrust>
|
|
||||||
<PublishWizardCompleted>true</PublishWizardCompleted>
|
|
||||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<Optimize>false</Optimize>
|
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
|
||||||
<PlatformTarget>x86</PlatformTarget>
|
|
||||||
<DebugType>pdbonly</DebugType>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<ManifestCertificateThumbprint>45143DAA4FF6F1512702FCBADCB0D7C1AB7E39FB</ManifestCertificateThumbprint>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<ManifestKeyFile>MediaBrowser.Installer_1_TemporaryKey.pfx</ManifestKeyFile>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<GenerateManifests>true</GenerateManifests>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<SignManifests>true</SignManifests>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetZone>LocalIntranet</TargetZone>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<ApplicationManifest>Properties\app.manifest</ApplicationManifest>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<ApplicationIcon>Icon.ico</ApplicationIcon>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="Ionic.Zip, Version=1.9.1.8, Culture=neutral, PublicKeyToken=edbe51ad942a3f5c, processorArchitecture=MSIL">
|
|
||||||
<SpecificVersion>False</SpecificVersion>
|
|
||||||
<HintPath>..\packages\DotNetZip.1.9.1.8\lib\net20\Ionic.Zip.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="ServiceStack.Text, Version=3.9.43.0, Culture=neutral, processorArchitecture=MSIL">
|
|
||||||
<SpecificVersion>False</SpecificVersion>
|
|
||||||
<HintPath>..\packages\ServiceStack.Text.3.9.43\lib\net35\ServiceStack.Text.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Configuration" />
|
|
||||||
<Reference Include="System.Drawing" />
|
|
||||||
<Reference Include="System.Windows.Forms" />
|
|
||||||
<Reference Include="System.Xml" />
|
|
||||||
<Reference Include="Microsoft.CSharp" />
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Xaml">
|
|
||||||
<RequiredTargetFramework>4.0</RequiredTargetFramework>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="WindowsBase" />
|
|
||||||
<Reference Include="PresentationCore" />
|
|
||||||
<Reference Include="PresentationFramework" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ApplicationDefinition Include="App.xaml">
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
</ApplicationDefinition>
|
|
||||||
<Page Include="Code\DownloadAnimation.xaml">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
</Page>
|
|
||||||
<Page Include="MainWindow.xaml">
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
</Page>
|
|
||||||
<Compile Include="..\SharedVersion.cs">
|
|
||||||
<Link>Properties\SharedVersion.cs</Link>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="App.xaml.cs">
|
|
||||||
<DependentUpon>App.xaml</DependentUpon>
|
|
||||||
<SubType>Code</SubType>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="Code\DownloadAnimation.xaml.cs">
|
|
||||||
<DependentUpon>DownloadAnimation.xaml</DependentUpon>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="Code\ModelExtensions.cs" />
|
|
||||||
<Compile Include="Code\PackageInfo.cs" />
|
|
||||||
<Compile Include="Code\PackageType.cs" />
|
|
||||||
<Compile Include="Code\PackageVersionClass.cs" />
|
|
||||||
<Compile Include="Code\PackageVersionInfo.cs" />
|
|
||||||
<Compile Include="Code\ShellLinkNative.cs" />
|
|
||||||
<Compile Include="Code\ShellShortcut.cs" />
|
|
||||||
<Compile Include="MainWindow.xaml.cs">
|
|
||||||
<DependentUpon>MainWindow.xaml</DependentUpon>
|
|
||||||
<SubType>Code</SubType>
|
|
||||||
</Compile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs">
|
|
||||||
<SubType>Code</SubType>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="Properties\Resources.Designer.cs">
|
|
||||||
<AutoGen>True</AutoGen>
|
|
||||||
<DesignTime>True</DesignTime>
|
|
||||||
<DependentUpon>Resources.resx</DependentUpon>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="Properties\Settings.Designer.cs">
|
|
||||||
<AutoGen>True</AutoGen>
|
|
||||||
<DependentUpon>Settings.settings</DependentUpon>
|
|
||||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
|
||||||
</Compile>
|
|
||||||
<EmbeddedResource Include="Properties\Resources.resx">
|
|
||||||
<Generator>ResXFileCodeGenerator</Generator>
|
|
||||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
|
||||||
</EmbeddedResource>
|
|
||||||
<None Include="mbt.config">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
</None>
|
|
||||||
<None Include="MediaBrowser.Installer_1_TemporaryKey.pfx" />
|
|
||||||
<None Include="packages.config" />
|
|
||||||
<None Include="Properties\app.manifest" />
|
|
||||||
<None Include="Properties\Settings.settings">
|
|
||||||
<Generator>SettingsSingleFileGenerator</Generator>
|
|
||||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
|
||||||
</None>
|
|
||||||
<AppDesigner Include="Properties\" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="App.config">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<BootstrapperPackage Include=".NETFramework,Version=v4.5">
|
|
||||||
<Visible>False</Visible>
|
|
||||||
<ProductName>Microsoft .NET Framework 4.5 %28x86 and x64%29</ProductName>
|
|
||||||
<Install>true</Install>
|
|
||||||
</BootstrapperPackage>
|
|
||||||
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
|
|
||||||
<Visible>False</Visible>
|
|
||||||
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
|
|
||||||
<Install>false</Install>
|
|
||||||
</BootstrapperPackage>
|
|
||||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
|
||||||
<Visible>False</Visible>
|
|
||||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
|
||||||
<Install>false</Install>
|
|
||||||
</BootstrapperPackage>
|
|
||||||
<BootstrapperPackage Include="Microsoft.Visual.C++.10.0.x86">
|
|
||||||
<Visible>False</Visible>
|
|
||||||
<ProductName>Visual C++ 2010 Runtime Libraries %28x86%29</ProductName>
|
|
||||||
<Install>true</Install>
|
|
||||||
</BootstrapperPackage>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Resource Include="Code\Images\computer_256.png" />
|
|
||||||
<Resource Include="Code\Images\internet-globe.jpg" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Resource Include="Code\Images\mb3logo800.png" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Resource Include="Icon.ico" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
||||||
<Import Project="$(SolutionDir)\.nuget\nuget.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.
|
|
||||||
<Target Name="BeforeBuild">
|
|
||||||
</Target>
|
|
||||||
<Target Name="AfterBuild">
|
|
||||||
</Target>
|
|
||||||
-->
|
|
||||||
</Project>
|
|
Binary file not shown.
Binary file not shown.
|
@ -1,50 +0,0 @@
|
||||||
using System.Reflection;
|
|
||||||
using System.Resources;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Windows;
|
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
|
||||||
// set of attributes. Change these attribute values to modify the information
|
|
||||||
// associated with an assembly.
|
|
||||||
[assembly: AssemblyTitle("MediaBrowser.Server.Installer")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("Microsoft")]
|
|
||||||
[assembly: AssemblyProduct("MediaBrowser.Server.Installer")]
|
|
||||||
[assembly: AssemblyCopyright("Copyright © Microsoft 2013")]
|
|
||||||
[assembly: AssemblyTrademark("")]
|
|
||||||
[assembly: AssemblyCulture("")]
|
|
||||||
|
|
||||||
// Setting ComVisible to false makes the types in this assembly not visible
|
|
||||||
// to COM components. If you need to access a type in this assembly from
|
|
||||||
// COM, set the ComVisible attribute to true on that type.
|
|
||||||
[assembly: ComVisible(false)]
|
|
||||||
|
|
||||||
//In order to begin building localizable applications, set
|
|
||||||
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
|
|
||||||
//inside a <PropertyGroup>. For example, if you are using US english
|
|
||||||
//in your source files, set the <UICulture> to en-US. Then uncomment
|
|
||||||
//the NeutralResourceLanguage attribute below. Update the "en-US" in
|
|
||||||
//the line below to match the UICulture setting in the project file.
|
|
||||||
|
|
||||||
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
|
|
||||||
|
|
||||||
|
|
||||||
[assembly: ThemeInfo(
|
|
||||||
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
|
|
||||||
//(used if a resource is not found in the page,
|
|
||||||
// or application resource dictionaries)
|
|
||||||
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
|
|
||||||
//(used if a resource is not found in the page,
|
|
||||||
// app, or any theme specific resource dictionaries)
|
|
||||||
)]
|
|
||||||
|
|
||||||
|
|
||||||
// Version information for an assembly consists of the following four values:
|
|
||||||
//
|
|
||||||
// Major Version
|
|
||||||
// Minor Version
|
|
||||||
// Build Number
|
|
||||||
// Revision
|
|
||||||
//
|
|
|
@ -1,71 +0,0 @@
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
// Runtime Version:4.0.30319.17929
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace MediaBrowser.Installer.Properties
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
|
||||||
/// </summary>
|
|
||||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
|
||||||
// class via a tool like ResGen or Visual Studio.
|
|
||||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
|
||||||
// with the /str option, or rebuild your VS project.
|
|
||||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
|
||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
|
||||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
|
||||||
internal class Resources
|
|
||||||
{
|
|
||||||
|
|
||||||
private static global::System.Resources.ResourceManager resourceMan;
|
|
||||||
|
|
||||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
|
||||||
|
|
||||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
|
||||||
internal Resources()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns the cached ResourceManager instance used by this class.
|
|
||||||
/// </summary>
|
|
||||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
|
||||||
internal static global::System.Resources.ResourceManager ResourceManager
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if ((resourceMan == null))
|
|
||||||
{
|
|
||||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MediaBrowser.Server.Installer.Properties.Resources", typeof(Resources).Assembly);
|
|
||||||
resourceMan = temp;
|
|
||||||
}
|
|
||||||
return resourceMan;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Overrides the current thread's CurrentUICulture property for all
|
|
||||||
/// resource lookups using this strongly typed resource class.
|
|
||||||
/// </summary>
|
|
||||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
|
||||||
internal static global::System.Globalization.CultureInfo Culture
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return resourceCulture;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
resourceCulture = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,117 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
</root>
|
|
|
@ -1,30 +0,0 @@
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
// Runtime Version:4.0.30319.17929
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace MediaBrowser.Installer.Properties
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
|
||||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
|
||||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
|
|
||||||
{
|
|
||||||
|
|
||||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
|
||||||
|
|
||||||
public static Settings Default
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return defaultInstance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
<?xml version='1.0' encoding='utf-8'?>
|
|
||||||
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
|
|
||||||
<Profiles>
|
|
||||||
<Profile Name="(Default)" />
|
|
||||||
</Profiles>
|
|
||||||
<Settings />
|
|
||||||
</SettingsFile>
|
|
|
@ -1,52 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
|
|
||||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
|
||||||
<security>
|
|
||||||
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
|
||||||
<!-- UAC Manifest Options
|
|
||||||
If you want to change the Windows User Account Control level replace the
|
|
||||||
requestedExecutionLevel node with one of the following.
|
|
||||||
|
|
||||||
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
|
||||||
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
|
|
||||||
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
|
|
||||||
|
|
||||||
Specifying requestedExecutionLevel node will disable file and registry virtualization.
|
|
||||||
If you want to utilize File and Registry Virtualization for backward
|
|
||||||
compatibility then delete the requestedExecutionLevel node.
|
|
||||||
-->
|
|
||||||
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
|
||||||
</requestedPrivileges>
|
|
||||||
<applicationRequestMinimum>
|
|
||||||
<defaultAssemblyRequest permissionSetReference="Custom" />
|
|
||||||
<PermissionSet class="System.Security.PermissionSet" version="1" ID="Custom" SameSite="site" Unrestricted="true" />
|
|
||||||
</applicationRequestMinimum>
|
|
||||||
</security>
|
|
||||||
</trustInfo>
|
|
||||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
|
||||||
<application>
|
|
||||||
<!-- A list of all Windows versions that this application is designed to work with.
|
|
||||||
Windows will automatically select the most compatible environment.-->
|
|
||||||
<!-- If your application is designed to work with Windows Vista, uncomment the following supportedOS node-->
|
|
||||||
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"></supportedOS>-->
|
|
||||||
<!-- If your application is designed to work with Windows 7, uncomment the following supportedOS node-->
|
|
||||||
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>-->
|
|
||||||
<!-- If your application is designed to work with Windows 8, uncomment the following supportedOS node-->
|
|
||||||
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"></supportedOS>-->
|
|
||||||
</application>
|
|
||||||
</compatibility>
|
|
||||||
<!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
|
|
||||||
<!-- <dependency>
|
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity
|
|
||||||
type="win32"
|
|
||||||
name="Microsoft.Windows.Common-Controls"
|
|
||||||
version="6.0.0.0"
|
|
||||||
processorArchitecture="*"
|
|
||||||
publicKeyToken="6595b64144ccf1df"
|
|
||||||
language="*"
|
|
||||||
/>
|
|
||||||
</dependentAssembly>
|
|
||||||
</dependency>-->
|
|
||||||
</asmv1:assembly>
|
|
|
@ -1,10 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<configuration>
|
|
||||||
<appSettings>
|
|
||||||
<add key="product" value="mbt" />
|
|
||||||
<add key="class" value="Release" />
|
|
||||||
</appSettings>
|
|
||||||
<startup>
|
|
||||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
|
|
||||||
</startup>
|
|
||||||
</configuration>
|
|
|
@ -1,5 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<packages>
|
|
||||||
<package id="DotNetZip" version="1.9.1.8" targetFramework="net45" />
|
|
||||||
<package id="ServiceStack.Text" version="3.9.43" targetFramework="net45" />
|
|
||||||
</packages>
|
|
|
@ -387,11 +387,10 @@ mkdir "$(SolutionDir)..\Deploy\Server\System"
|
||||||
rmdir "$(SolutionDir)..\Deploy\Server\Pismo" /s /q
|
rmdir "$(SolutionDir)..\Deploy\Server\Pismo" /s /q
|
||||||
mkdir "$(SolutionDir)..\Deploy\Server\Pismo"
|
mkdir "$(SolutionDir)..\Deploy\Server\Pismo"
|
||||||
xcopy "$(TargetDir)$(TargetFileName)" "$(SolutionDir)..\Deploy\Server\System\" /y
|
xcopy "$(TargetDir)$(TargetFileName)" "$(SolutionDir)..\Deploy\Server\System\" /y
|
||||||
xcopy "$(SolutionDir)Mediabrowser.Uninstaller\bin\Release\MediaBrowser.Uninstaller.exe.config" "$(SolutionDir)..\Deploy\Server\System\" /y
|
xcopy "$(SolutionDir)Installation\MediaBrowser.Uninstaller.exe.config" "$(SolutionDir)..\Deploy\Server\System\" /y
|
||||||
xcopy "$(SolutionDir)Mediabrowser.Uninstaller.Execute\bin\Release\MediaBrowser.Uninstaller.Execute.exe.config" "$(SolutionDir)..\Deploy\Server\System\" /y
|
xcopy "$(SolutionDir)Installation\MediaBrowser.Uninstaller.exe" "$(SolutionDir)..\Deploy\Server\System\" /y
|
||||||
xcopy "$(SolutionDir)Mediabrowser.Uninstaller\bin\Release\MediaBrowser.Uninstaller.exe" "$(SolutionDir)..\Deploy\Server\System\" /y
|
xcopy "$(SolutionDir)Installation\MediaBrowser.InstallUtil.dll" "$(SolutionDir)..\Deploy\Server\System\" /y
|
||||||
xcopy "$(SolutionDir)Mediabrowser.Uninstaller.Execute\bin\Release\MediaBrowser.Uninstaller.Execute.exe" "$(SolutionDir)..\Deploy\Server\System\" /y
|
xcopy "$(SolutionDir)Installation\MediaBrowser.Updater.exe" "$(SolutionDir)..\Deploy\Server\System\" /y
|
||||||
xcopy "$(SolutionDir)Mediabrowser.Installer\bin\Release\MediaBrowser.Installer.exe" "$(SolutionDir)..\Deploy\Server\System\" /y
|
|
||||||
|
|
||||||
//Pismo
|
//Pismo
|
||||||
"$(SolutionDir)ThirdParty\7zip\7za" x "$(SolutionDir)ThirdParty\Pismo-Install\pfm-168-mediabrowser-win.zip" -o"$(SolutionDir)..\Deploy\Server\Pismo\" -y
|
"$(SolutionDir)ThirdParty\7zip\7za" x "$(SolutionDir)ThirdParty\Pismo-Install\pfm-168-mediabrowser-win.zip" -o"$(SolutionDir)..\Deploy\Server\Pismo\" -y
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<configuration>
|
|
||||||
<startup>
|
|
||||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
|
|
||||||
</startup>
|
|
||||||
</configuration>
|
|
|
@ -1,8 +0,0 @@
|
||||||
<Application x:Class="MediaBrowser.Uninstaller.Execute.App"
|
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
StartupUri="MainWindow.xaml">
|
|
||||||
<Application.Resources>
|
|
||||||
|
|
||||||
</Application.Resources>
|
|
||||||
</Application>
|
|
|
@ -1,11 +0,0 @@
|
||||||
using System.Windows;
|
|
||||||
|
|
||||||
namespace MediaBrowser.Uninstaller
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Interaction logic for App.xaml
|
|
||||||
/// </summary>
|
|
||||||
public partial class App : Application
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,59 +0,0 @@
|
||||||
<Window x:Class="MediaBrowser.Uninstaller.MainWindow"
|
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
Title="Uninstall Media Browser" Height="412.686" Width="633.955" WindowStyle="None">
|
|
||||||
<Grid>
|
|
||||||
<Image HorizontalAlignment="Center" Height="154" Margin="35,15,35,0" VerticalAlignment="Top" Width="541" Source="/MediaBrowser.Uninstaller;component/Code/Images/mb3logo800.png" Opacity="0.5"/>
|
|
||||||
<Label x:Name="lblHeading" Content="Uninstall " HorizontalAlignment="Left" Margin="51,169,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.478,-2.753" Height="44" Width="533" FontSize="24"/>
|
|
||||||
<Button x:Name="btnUninstall" Content="Uninstall" HorizontalAlignment="Left" Margin="505,356,0,0" VerticalAlignment="Top" Width="91" IsDefault="True" RenderTransformOrigin="0.991,-1.041" Click="btnUninstall_Click"/>
|
|
||||||
<Button x:Name="btnCancel" Content="Cancel" HorizontalAlignment="Left" Margin="412,356,0,0" VerticalAlignment="Top" Width="75" IsCancel="True" Click="btnCancel_Click"/>
|
|
||||||
<Grid x:Name="grdOptions" HorizontalAlignment="Left" Height="108" Margin="86,231,0,0" VerticalAlignment="Top" Width="353">
|
|
||||||
<CheckBox x:Name="cbxRemoveAll" Content="Remove All Traces" HorizontalAlignment="Left" Margin="0,3,0,0" VerticalAlignment="Top" Checked="cbxRemoveAll_Checked" Unchecked="cbxRemoveAll_Checked" FontSize="18"/>
|
|
||||||
<CheckBox x:Name="cbxRemoveCache" Content="Delete Cache Files" HorizontalAlignment="Left" Margin="16,32,0,0" VerticalAlignment="Top" FontSize="18"/>
|
|
||||||
<CheckBox x:Name="cbxRemoveConfig" Content="Delete Configuration and Log Files" HorizontalAlignment="Left" Margin="16,56,0,0" VerticalAlignment="Top" FontSize="18"/>
|
|
||||||
<CheckBox x:Name="cbxRemovePlugins" Content="Delete Plug-ins" HorizontalAlignment="Left" Margin="16,82,0,0" VerticalAlignment="Top" FontSize="18"/>
|
|
||||||
|
|
||||||
</Grid>
|
|
||||||
<Button x:Name="btnFinished" Content="Finish" HorizontalAlignment="Left" Margin="505,356,0,0" VerticalAlignment="Top" Width="91" IsDefault="True" RenderTransformOrigin="0.991,-1.041" Click="BtnFinished_OnClick" Visibility="Hidden"/>
|
|
||||||
|
|
||||||
</Grid>
|
|
||||||
<Window.Resources>
|
|
||||||
<!--Metro Button-->
|
|
||||||
<Style TargetType="{x:Type Button}" BasedOn="{x:Null}">
|
|
||||||
<Setter Property="Background" Value="Transparent"/>
|
|
||||||
<Setter Property="Foreground" Value="#222222"/>
|
|
||||||
<Setter Property="FontSize" Value="16"/>
|
|
||||||
<Setter Property="Padding" Value="10,5,10,5"/>
|
|
||||||
<Setter Property="BorderBrush" Value="#222222"/>
|
|
||||||
<Setter Property="BorderThickness" Value="2"/>
|
|
||||||
<Setter Property="Template">
|
|
||||||
<Setter.Value>
|
|
||||||
<ControlTemplate TargetType="{x:Type Button}">
|
|
||||||
<!-- We use Grid as a root because it is easy to add more elements to customize the button -->
|
|
||||||
<Grid x:Name="Grid">
|
|
||||||
<Border x:Name="Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"/>
|
|
||||||
|
|
||||||
<!-- Content Presenter is where the text content etc is placed by the control -->
|
|
||||||
<!-- The bindings are useful so that the control can be parameterized without editing the template -->
|
|
||||||
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RecognizesAccessKey="True"/>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
<!--Each state sets a brush on the Border in the template -->
|
|
||||||
<ControlTemplate.Triggers>
|
|
||||||
<Trigger Property="IsPressed" Value="true">
|
|
||||||
<Setter Property="Background" Value="#222222" TargetName="Border"/>
|
|
||||||
<Setter Property="BorderBrush" Value="#222222" TargetName="Border"/>
|
|
||||||
<Setter Property="Foreground" Value="White"/>
|
|
||||||
<Setter Property="FontSize" Value="16"/>
|
|
||||||
</Trigger>
|
|
||||||
<Trigger Property="IsEnabled" Value="true"/>
|
|
||||||
<Trigger Property="IsEnabled" Value="false">
|
|
||||||
<Setter Property="BorderBrush" Value="#7f222222" TargetName="Border"/>
|
|
||||||
<Setter Property="Foreground" Value="#7f222222"/>
|
|
||||||
</Trigger>
|
|
||||||
</ControlTemplate.Triggers>
|
|
||||||
</ControlTemplate>
|
|
||||||
</Setter.Value>
|
|
||||||
</Setter>
|
|
||||||
</Style>
|
|
||||||
</Window.Resources></Window>
|
|
|
@ -1,312 +0,0 @@
|
||||||
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
|
|
||||||
{
|
|
||||||
/// <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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,110 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
|
||||||
<ProjectGuid>{FACAF749-3E28-46DD-B613-654FCD434959}</ProjectGuid>
|
|
||||||
<OutputType>WinExe</OutputType>
|
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
|
||||||
<RootNamespace>MediaBrowser.Uninstaller</RootNamespace>
|
|
||||||
<AssemblyName>MediaBrowser.Uninstaller</AssemblyName>
|
|
||||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
|
||||||
<FileAlignment>512</FileAlignment>
|
|
||||||
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<Optimize>false</Optimize>
|
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<DebugType>pdbonly</DebugType>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Data" />
|
|
||||||
<Reference Include="System.Xml" />
|
|
||||||
<Reference Include="Microsoft.CSharp" />
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Xml.Linq" />
|
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
|
||||||
<Reference Include="System.Xaml">
|
|
||||||
<RequiredTargetFramework>4.0</RequiredTargetFramework>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="WindowsBase" />
|
|
||||||
<Reference Include="PresentationCore" />
|
|
||||||
<Reference Include="PresentationFramework" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ApplicationDefinition Include="App.xaml">
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
</ApplicationDefinition>
|
|
||||||
<Page Include="MainWindow.xaml">
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
</Page>
|
|
||||||
<Compile Include="App.xaml.cs">
|
|
||||||
<DependentUpon>App.xaml</DependentUpon>
|
|
||||||
<SubType>Code</SubType>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="MainWindow.xaml.cs">
|
|
||||||
<DependentUpon>MainWindow.xaml</DependentUpon>
|
|
||||||
<SubType>Code</SubType>
|
|
||||||
</Compile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs">
|
|
||||||
<SubType>Code</SubType>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="Properties\Resources.Designer.cs">
|
|
||||||
<AutoGen>True</AutoGen>
|
|
||||||
<DesignTime>True</DesignTime>
|
|
||||||
<DependentUpon>Resources.resx</DependentUpon>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="Properties\Settings.Designer.cs">
|
|
||||||
<AutoGen>True</AutoGen>
|
|
||||||
<DependentUpon>Settings.settings</DependentUpon>
|
|
||||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
|
||||||
</Compile>
|
|
||||||
<EmbeddedResource Include="Properties\Resources.resx">
|
|
||||||
<Generator>ResXFileCodeGenerator</Generator>
|
|
||||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
|
||||||
</EmbeddedResource>
|
|
||||||
<None Include="Properties\Settings.settings">
|
|
||||||
<Generator>SettingsSingleFileGenerator</Generator>
|
|
||||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
|
||||||
</None>
|
|
||||||
<AppDesigner Include="Properties\" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="App.config" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup />
|
|
||||||
<ItemGroup>
|
|
||||||
<Resource Include="..\MediaBrowser.Installer\Code\Images\mb3logo800.png">
|
|
||||||
<Link>Code\Images\mb3logo800.png</Link>
|
|
||||||
</Resource>
|
|
||||||
</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.
|
|
||||||
<Target Name="BeforeBuild">
|
|
||||||
</Target>
|
|
||||||
<Target Name="AfterBuild">
|
|
||||||
</Target>
|
|
||||||
-->
|
|
||||||
</Project>
|
|
|
@ -1,55 +0,0 @@
|
||||||
using System.Reflection;
|
|
||||||
using System.Resources;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Windows;
|
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
|
||||||
// set of attributes. Change these attribute values to modify the information
|
|
||||||
// associated with an assembly.
|
|
||||||
[assembly: AssemblyTitle("MediaBrowser.Uninstaller")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("Media Browser Team")]
|
|
||||||
[assembly: AssemblyProduct("MediaBrowser.Uninstaller")]
|
|
||||||
[assembly: AssemblyCopyright("Copyright © Media Browser Team 2013")]
|
|
||||||
[assembly: AssemblyTrademark("")]
|
|
||||||
[assembly: AssemblyCulture("")]
|
|
||||||
|
|
||||||
// Setting ComVisible to false makes the types in this assembly not visible
|
|
||||||
// to COM components. If you need to access a type in this assembly from
|
|
||||||
// COM, set the ComVisible attribute to true on that type.
|
|
||||||
[assembly: ComVisible(false)]
|
|
||||||
|
|
||||||
//In order to begin building localizable applications, set
|
|
||||||
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
|
|
||||||
//inside a <PropertyGroup>. For example, if you are using US english
|
|
||||||
//in your source files, set the <UICulture> to en-US. Then uncomment
|
|
||||||
//the NeutralResourceLanguage attribute below. Update the "en-US" in
|
|
||||||
//the line below to match the UICulture setting in the project file.
|
|
||||||
|
|
||||||
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
|
|
||||||
|
|
||||||
|
|
||||||
[assembly: ThemeInfo(
|
|
||||||
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
|
|
||||||
//(used if a resource is not found in the page,
|
|
||||||
// or application resource dictionaries)
|
|
||||||
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
|
|
||||||
//(used if a resource is not found in the page,
|
|
||||||
// app, or any theme specific resource dictionaries)
|
|
||||||
)]
|
|
||||||
|
|
||||||
|
|
||||||
// Version information for an assembly consists of the following four values:
|
|
||||||
//
|
|
||||||
// Major Version
|
|
||||||
// Minor Version
|
|
||||||
// Build Number
|
|
||||||
// Revision
|
|
||||||
//
|
|
||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
|
||||||
// by using the '*' as shown below:
|
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
|
||||||
[assembly: AssemblyVersion("1.0.0.0")]
|
|
||||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
|
@ -1,63 +0,0 @@
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
// Runtime Version:4.0.30319.17929
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace MediaBrowser.Uninstaller.Properties {
|
|
||||||
using System;
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
|
||||||
/// </summary>
|
|
||||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
|
||||||
// class via a tool like ResGen or Visual Studio.
|
|
||||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
|
||||||
// with the /str option, or rebuild your VS project.
|
|
||||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
|
||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
|
||||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
|
||||||
internal class Resources {
|
|
||||||
|
|
||||||
private static global::System.Resources.ResourceManager resourceMan;
|
|
||||||
|
|
||||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
|
||||||
|
|
||||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
|
||||||
internal Resources() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns the cached ResourceManager instance used by this class.
|
|
||||||
/// </summary>
|
|
||||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
|
||||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
|
||||||
get {
|
|
||||||
if (object.ReferenceEquals(resourceMan, null)) {
|
|
||||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MediaBrowser.Uninstaller.Properties.Resources", typeof(Resources).Assembly);
|
|
||||||
resourceMan = temp;
|
|
||||||
}
|
|
||||||
return resourceMan;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Overrides the current thread's CurrentUICulture property for all
|
|
||||||
/// resource lookups using this strongly typed resource class.
|
|
||||||
/// </summary>
|
|
||||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
|
||||||
internal static global::System.Globalization.CultureInfo Culture {
|
|
||||||
get {
|
|
||||||
return resourceCulture;
|
|
||||||
}
|
|
||||||
set {
|
|
||||||
resourceCulture = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,117 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
</root>
|
|
|
@ -1,26 +0,0 @@
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
// Runtime Version:4.0.30319.17929
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace MediaBrowser.Uninstaller.Properties {
|
|
||||||
|
|
||||||
|
|
||||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
|
||||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
|
||||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
|
||||||
|
|
||||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
|
||||||
|
|
||||||
public static Settings Default {
|
|
||||||
get {
|
|
||||||
return defaultInstance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
<?xml version='1.0' encoding='utf-8'?>
|
|
||||||
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
|
|
||||||
<Profiles>
|
|
||||||
<Profile Name="(Default)" />
|
|
||||||
</Profiles>
|
|
||||||
<Settings />
|
|
||||||
</SettingsFile>
|
|
|
@ -27,14 +27,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget (2)", ".nuget (2)",
|
||||||
.nuget\NuGet.targets = .nuget\NuGet.targets
|
.nuget\NuGet.targets = .nuget\NuGet.targets
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Installer", "MediaBrowser.Installer\MediaBrowser.Installer.csproj", "{3879F78A-D6F6-45E5-B2A8-D8DCF2DABB74}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Common.Implementations", "MediaBrowser.Common.Implementations\MediaBrowser.Common.Implementations.csproj", "{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Common.Implementations", "MediaBrowser.Common.Implementations\MediaBrowser.Common.Implementations.csproj", "{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Server.Implementations", "MediaBrowser.Server.Implementations\MediaBrowser.Server.Implementations.csproj", "{2E781478-814D-4A48-9D80-BFF206441A65}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Server.Implementations", "MediaBrowser.Server.Implementations\MediaBrowser.Server.Implementations.csproj", "{2E781478-814D-4A48-9D80-BFF206441A65}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Uninstaller", "MediaBrowser.Uninstaller\MediaBrowser.Uninstaller.csproj", "{FACAF749-3E28-46DD-B613-654FCD434959}"
|
|
||||||
EndProject
|
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
@ -145,20 +141,6 @@ Global
|
||||||
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|x64.ActiveCfg = Release|Any CPU
|
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|x86.ActiveCfg = Release|Any CPU
|
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|x86.Build.0 = Release|Any CPU
|
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{3879F78A-D6F6-45E5-B2A8-D8DCF2DABB74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{3879F78A-D6F6-45E5-B2A8-D8DCF2DABB74}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{3879F78A-D6F6-45E5-B2A8-D8DCF2DABB74}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
||||||
{3879F78A-D6F6-45E5-B2A8-D8DCF2DABB74}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
||||||
{3879F78A-D6F6-45E5-B2A8-D8DCF2DABB74}.Debug|Win32.ActiveCfg = Debug|Any CPU
|
|
||||||
{3879F78A-D6F6-45E5-B2A8-D8DCF2DABB74}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{3879F78A-D6F6-45E5-B2A8-D8DCF2DABB74}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{3879F78A-D6F6-45E5-B2A8-D8DCF2DABB74}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{3879F78A-D6F6-45E5-B2A8-D8DCF2DABB74}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{3879F78A-D6F6-45E5-B2A8-D8DCF2DABB74}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
||||||
{3879F78A-D6F6-45E5-B2A8-D8DCF2DABB74}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
||||||
{3879F78A-D6F6-45E5-B2A8-D8DCF2DABB74}.Release|Win32.ActiveCfg = Release|Any CPU
|
|
||||||
{3879F78A-D6F6-45E5-B2A8-D8DCF2DABB74}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{3879F78A-D6F6-45E5-B2A8-D8DCF2DABB74}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
@ -187,25 +169,8 @@ Global
|
||||||
{2E781478-814D-4A48-9D80-BFF206441A65}.Release|Win32.ActiveCfg = Release|Any CPU
|
{2E781478-814D-4A48-9D80-BFF206441A65}.Release|Win32.ActiveCfg = Release|Any CPU
|
||||||
{2E781478-814D-4A48-9D80-BFF206441A65}.Release|x64.ActiveCfg = Release|Any CPU
|
{2E781478-814D-4A48-9D80-BFF206441A65}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{2E781478-814D-4A48-9D80-BFF206441A65}.Release|x86.ActiveCfg = Release|Any CPU
|
{2E781478-814D-4A48-9D80-BFF206441A65}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{FACAF749-3E28-46DD-B613-654FCD434959}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{FACAF749-3E28-46DD-B613-654FCD434959}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{FACAF749-3E28-46DD-B613-654FCD434959}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
||||||
{FACAF749-3E28-46DD-B613-654FCD434959}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
||||||
{FACAF749-3E28-46DD-B613-654FCD434959}.Debug|Win32.ActiveCfg = Debug|Any CPU
|
|
||||||
{FACAF749-3E28-46DD-B613-654FCD434959}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{FACAF749-3E28-46DD-B613-654FCD434959}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{FACAF749-3E28-46DD-B613-654FCD434959}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{FACAF749-3E28-46DD-B613-654FCD434959}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{FACAF749-3E28-46DD-B613-654FCD434959}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
||||||
{FACAF749-3E28-46DD-B613-654FCD434959}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
||||||
{FACAF749-3E28-46DD-B613-654FCD434959}.Release|Win32.ActiveCfg = Release|Any CPU
|
|
||||||
{FACAF749-3E28-46DD-B613-654FCD434959}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{FACAF749-3E28-46DD-B613-654FCD434959}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(Performance) = preSolution
|
|
||||||
HasPerformanceSessions = true
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|
Loading…
Reference in New Issue
Block a user