This commit is contained in:
Luke Pulverenti 2013-04-15 17:38:24 -04:00
commit b4c06b76c1
43 changed files with 12 additions and 3102 deletions

View File

@ -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" />

View File

@ -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);

View File

@ -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>

View File

@ -1,11 +0,0 @@
using System.Windows;
namespace MediaBrowser.Installer
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}
}

View File

@ -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>

View File

@ -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

View File

@ -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;
}
}
}

View File

@ -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; }
}
}

View File

@ -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
}
}

View File

@ -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
}
}

View File

@ -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; }
}
}

View File

@ -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
{
}
}

View File

@ -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

View File

@ -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>

View File

@ -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);
}
}
}
}

View File

@ -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>

View File

@ -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
//

View File

@ -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;
}
}
}
}

View File

@ -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>

View File

@ -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;
}
}
}
}

View File

@ -1,7 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>

View File

@ -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>

View File

@ -1,11 +0,0 @@
using System.Windows;
namespace MediaBrowser.Uninstaller
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}
}

View File

@ -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>

View File

@ -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();
}
}
}

View File

@ -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>

View File

@ -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")]

View File

@ -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;
}
}
}
}

View File

@ -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>

View File

@ -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;
}
}
}
}

View File

@ -1,7 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@ -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