Explorar el Código

Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser

LukePulverenti hace 12 años
padre
commit
cbb2f00da5

+ 1 - 1
MediaBrowser.Installer/App.config

@@ -2,7 +2,7 @@
 <configuration>
   <appSettings>
     <add key="product" value="server" />
-    <add key="class" value="Release" />
+    <add key="class" value="Dev" />
   </appSettings>
     <startup> 
         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />

+ 276 - 0
MediaBrowser.Installer/Code/ShellLinkNative.cs

@@ -0,0 +1,276 @@
+/**************************************************************************
+*
+* 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.Text;
+using System.Runtime.InteropServices;
+
+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
+  }
+
+  [StructLayoutAttribute(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 
+  {
+  }
+
+}

+ 348 - 0
MediaBrowser.Installer/Code/ShellShortcut.cs

@@ -0,0 +1,348 @@
+/**************************************************************************
+*
+* 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
+
+	}
+}

+ 15 - 13
MediaBrowser.Installer/MainWindow.xaml.cs

@@ -10,7 +10,6 @@ using System.Linq;
 using Ionic.Zip;
 using MediaBrowser.Installer.Code;
 using ServiceStack.Text;
-using IWshRuntimeLibrary;
 
 namespace MediaBrowser.Installer
 {
@@ -124,7 +123,7 @@ namespace MediaBrowser.Installer
             var fullPath = Path.Combine(RootPath, "System", TargetExe);
             try
             {
-                CreateShortcut(fullPath);
+                CreateShortcuts(fullPath);
             }
             catch (Exception e)
             {
@@ -155,7 +154,7 @@ namespace MediaBrowser.Installer
                     var json = await client.DownloadStringTaskAsync("http://www.mb3admin.com/admin/service/package/retrieveAll?name=" + PackageName);
                     var packages = JsonSerializer.DeserializeFromString<List<PackageInfo>>(json);
 
-                    var version = packages[0].versions.Where(v => v.classification == PackageClass).OrderByDescending(v => v.version).FirstOrDefault(v => v.version <= PackageVersion);
+                    var version = packages[0].versions.Where(v => v.classification <= PackageClass).OrderByDescending(v => v.version).FirstOrDefault(v => v.version <= PackageVersion);
                     if (version == null)
                     {
                         SystemClose("Could not locate download package.  Aborting.");
@@ -225,21 +224,24 @@ namespace MediaBrowser.Installer
         ///  Only do current user to avoid need for admin elevation
         /// </summary>
         /// <param name="targetExe"></param>
-        protected void CreateShortcut(string targetExe)
+        protected void CreateShortcuts(string targetExe)
         {
             // get path to all users start menu
-            var shell = new WshShell();
-            var startMenu = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu),"Media Browser");
+            var startMenu = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu),"Media Browser 3");
             if (!Directory.Exists(startMenu)) Directory.CreateDirectory(startMenu);
-            var product = (IWshShortcut)shell.CreateShortcut(Path.Combine(startMenu, FriendlyName+".lnk"));
-            product.TargetPath = targetExe;
-            product.Description = "Run " + FriendlyName;
+            var product = new ShellShortcut(Path.Combine(startMenu, FriendlyName+".lnk")) {Path = targetExe, Description = "Run " + FriendlyName};
             product.Save();
 
-            var uninstall = (IWshShortcut)shell.CreateShortcut(Path.Combine(startMenu, "Uninstall " + FriendlyName + ".lnk"));
-            uninstall.TargetPath = Path.Combine(Path.GetDirectoryName(targetExe),"MediaBrowser.Uninstaller.exe");
-            uninstall.Arguments = (PackageName == "MBServer" ? "server" : "mbt");
-            uninstall.Description = "Uninstall " + FriendlyName;
+            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();
+                
+            }
+            var uninstall = new ShellShortcut(Path.Combine(startMenu, "Uninstall " + FriendlyName + ".lnk")) 
+            {Path = Path.Combine(Path.GetDirectoryName(targetExe), "MediaBrowser.Uninstaller.exe"), Arguments = (PackageName == "MBServer" ? "server" : "mbt"), Description = "Uninstall " + FriendlyName};
             uninstall.Save();
 
         }

+ 12 - 15
MediaBrowser.Installer/MediaBrowser.Installer.csproj

@@ -14,7 +14,7 @@
     <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <WarningLevel>4</WarningLevel>
     <IsWebBootstrapper>true</IsWebBootstrapper>
-    <PublishUrl>http://www.mb3admin.com/downloads/beta/server/</PublishUrl>
+    <PublishUrl>http://www.mb3admin.com/downloads/dev/server/</PublishUrl>
     <Install>false</Install>
     <InstallFrom>Web</InstallFrom>
     <UpdateEnabled>false</UpdateEnabled>
@@ -29,7 +29,7 @@
     <PublisherName>Media Browser Team</PublisherName>
     <SuiteName>Media Browser</SuiteName>
     <OpenBrowserOnPublish>false</OpenBrowserOnPublish>
-    <ApplicationRevision>14</ApplicationRevision>
+    <ApplicationRevision>16</ApplicationRevision>
     <ApplicationVersion>0.1.1.%2a</ApplicationVersion>
     <UseApplicationTrust>false</UseApplicationTrust>
     <PublishWizardCompleted>true</PublishWizardCompleted>
@@ -85,7 +85,9 @@
     <Reference Include="System" />
     <Reference Include="System.Configuration" />
     <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
     <Reference Include="System.Web" />
+    <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Xml" />
     <Reference Include="Microsoft.CSharp" />
     <Reference Include="System.Core" />
@@ -126,6 +128,8 @@
     <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>
@@ -149,7 +153,9 @@
       <Generator>ResXFileCodeGenerator</Generator>
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>
     </EmbeddedResource>
-    <None Include="mbt.config" />
+    <None Include="mbt.config">
+      <SubType>Designer</SubType>
+    </None>
     <None Include="MediaBrowser.Installer_1_TemporaryKey.pfx" />
     <None Include="Properties\app.manifest" />
     <None Include="Properties\Settings.settings">
@@ -159,7 +165,9 @@
     <AppDesigner Include="Properties\" />
   </ItemGroup>
   <ItemGroup>
-    <None Include="App.config" />
+    <None Include="App.config">
+      <SubType>Designer</SubType>
+    </None>
   </ItemGroup>
   <ItemGroup>
     <BootstrapperPackage Include=".NETFramework,Version=v4.5">
@@ -190,17 +198,6 @@
   <ItemGroup>
     <Resource Include="Code\Images\mb3logo800.png" />
   </ItemGroup>
-  <ItemGroup>
-    <COMReference Include="IWshRuntimeLibrary">
-      <Guid>{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}</Guid>
-      <VersionMajor>1</VersionMajor>
-      <VersionMinor>0</VersionMinor>
-      <Lcid>0</Lcid>
-      <WrapperTool>tlbimp</WrapperTool>
-      <Isolated>False</Isolated>
-      <EmbedInteropTypes>True</EmbedInteropTypes>
-    </COMReference>
-  </ItemGroup>
   <ItemGroup>
     <Resource Include="Icon.ico" />
   </ItemGroup>

+ 8 - 1
MediaBrowser.Model/Configuration/BaseApplicationConfiguration.cs

@@ -1,4 +1,5 @@
-using ProtoBuf;
+using MediaBrowser.Model.Updates;
+using ProtoBuf;
 
 namespace MediaBrowser.Model.Configuration
 {
@@ -38,6 +39,12 @@ namespace MediaBrowser.Model.Configuration
         [ProtoMember(3)]
         public bool EnableAutoUpdate { get; set; }
 
+        /// <summary>
+        /// Gets of sets a value indicating the level of system updates (Release, Beta, Dev)
+        /// </summary>
+        [ProtoMember(60)]
+        public PackageVersionClass SystemUpdateLevel { get; set; }
+
         /// <summary>
         /// The number of days we should retain log files
         /// </summary>

+ 4 - 3
MediaBrowser.Model/Configuration/ServerConfiguration.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Model.Weather;
+using MediaBrowser.Model.Updates;
+using MediaBrowser.Model.Weather;
 using ProtoBuf;
 using System;
 
@@ -298,8 +299,8 @@ namespace MediaBrowser.Model.Configuration
         /// <value><c>true</c> if [enable developer tools]; otherwise, <c>false</c>.</value>
         [ProtoMember(57)]
         public bool EnableDeveloperTools { get; set; }
-        
-        // Next Proto number ====> 59
+
+        // Next Proto number ====> 61
 
         /// <summary>
         /// Initializes a new instance of the <see cref="ServerConfiguration" /> class.

+ 8 - 4
MediaBrowser.Uninstaller.Execute/MainWindow.xaml

@@ -7,10 +7,14 @@
         <Label x:Name="lblHeading" Content="Uninstall " HorizontalAlignment="Left" Margin="51,169,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.478,-2.753" Height="29" Width="423" FontSize="14" FontWeight="Bold"/>
         <Button x:Name="btnUninstall" Content="Uninstall" HorizontalAlignment="Left" Margin="505,341,0,0" VerticalAlignment="Top" Width="75" IsDefault="True" RenderTransformOrigin="0.991,-1.041" Click="btnUninstall_Click"/>
         <Button x:Name="btnCancel" Content="Cancel" HorizontalAlignment="Left" Margin="412,341,0,0" VerticalAlignment="Top" Width="75" IsCancel="True" Click="btnCancel_Click"/>
-        <CheckBox x:Name="cbxRemoveAll" Content="Remove All Traces" HorizontalAlignment="Left" Margin="137,234,0,0" VerticalAlignment="Top" Checked="cbxRemoveAll_Checked" Unchecked="cbxRemoveAll_Checked"/>
-        <CheckBox x:Name="cbxRemoveCache" Content="Delete Cache Files" HorizontalAlignment="Left" Margin="152,255,0,0" VerticalAlignment="Top"/>
-        <CheckBox x:Name="cbxRemoveConfig" Content="Delete Configuration and Log Files" HorizontalAlignment="Left" Margin="152,276,0,0" VerticalAlignment="Top"/>
-        <CheckBox x:Name="cbxRemovePlugins" Content="Delete Plug-ins" HorizontalAlignment="Left" Margin="152,297,0,0" VerticalAlignment="Top"/>
+        <Grid x:Name="grdOptions" HorizontalAlignment="Left" Height="108" Margin="134,213,0,0" VerticalAlignment="Top" Width="261">
+            <CheckBox x:Name="cbxRemoveAll" Content="Remove All Traces" HorizontalAlignment="Left" Margin="0,3,0,0" VerticalAlignment="Top" Checked="cbxRemoveAll_Checked" Unchecked="cbxRemoveAll_Checked"/>
+            <CheckBox x:Name="cbxRemoveCache" Content="Delete Cache Files" HorizontalAlignment="Left" Margin="16,25,0,0" VerticalAlignment="Top"/>
+            <CheckBox x:Name="cbxRemoveConfig" Content="Delete Configuration and Log Files" HorizontalAlignment="Left" Margin="16,47,0,0" VerticalAlignment="Top"/>
+            <CheckBox x:Name="cbxRemovePlugins" Content="Delete Plug-ins" HorizontalAlignment="Left" Margin="16,68,0,0" VerticalAlignment="Top"/>
+            
+        </Grid>
+        <Button x:Name="btnFinished" Content="Finish" HorizontalAlignment="Left" Margin="505,341,0,0" VerticalAlignment="Top" Width="75" IsDefault="True" RenderTransformOrigin="0.991,-1.041" Click="BtnFinished_OnClick"  Visibility="Hidden"/>
 
     </Grid>
 </Window>

+ 103 - 8
MediaBrowser.Uninstaller.Execute/MainWindow.xaml.cs

@@ -13,6 +13,7 @@ namespace MediaBrowser.Uninstaller.Execute
     public partial class MainWindow : Window
     {
         protected string Product = "Server";
+        protected string RootSuffix = "-Server";
 
         public MainWindow()
         {
@@ -27,10 +28,12 @@ namespace MediaBrowser.Uninstaller.Execute
             {
                 case "server":
                     Product = "Server";
+                    RootSuffix = "-Server";
                     break;
 
                 case "mbt":
                     Product = "Theater";
+                    RootSuffix = "-UI";
                     break;
 
                 default:
@@ -62,21 +65,113 @@ namespace MediaBrowser.Uninstaller.Execute
         private void btnUninstall_Click(object sender, RoutedEventArgs e)
         {
             // First remove our shortcuts
-            var startMenu = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu), "Media Browser");
+            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";
-            try 
+            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"));
+            }
+            // if the startmenu item is empty now - delete it too
+            if (Directory.GetFiles(startMenu).Length == 0)
             {
-                File.Delete(Path.Combine(startMenu,linkName));
+                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");
+                    }
+                }
             }
-            catch {} // oh well
 
-            linkName = "Uninstall " + linkName;
-            try 
+            var rootPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MediaBrowser" + RootSuffix);
+
+            if (cbxRemoveAll.IsChecked == true)
+            {
+                // Just remove our whole directory
+                RemovePath(rootPath);
+            }
+            else
             {
-                File.Delete(Path.Combine(startMenu,linkName));
+                // First remove the system
+                lblHeading.Content = "Removing System Files...";
+                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"));
+                }
             }
-            catch {} // oh well
 
+            // and done
+            lblHeading.Content = string.Format("Media Browser {0} Uninstalled.", Product);
+            btnUninstall.Visibility = Visibility.Hidden;
+            btnFinished.Visibility = Visibility.Visible;
+        }
+
+        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();
         }
     }
 }

+ 0 - 8
MediaBrowser.Uninstaller/App.xaml

@@ -1,8 +0,0 @@
-<Application x:Class="MediaBrowser.Uninstaller.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>

+ 0 - 17
MediaBrowser.Uninstaller/App.xaml.cs

@@ -1,17 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Configuration;
-using System.Data;
-using System.Linq;
-using System.Threading.Tasks;
-using System.Windows;
-
-namespace MediaBrowser.Uninstaller
-{
-    /// <summary>
-    /// Interaction logic for App.xaml
-    /// </summary>
-    public partial class App : Application
-    {
-    }
-}

+ 0 - 8
MediaBrowser.Uninstaller/MainWindow.xaml

@@ -1,8 +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="MainWindow" Height="350" Width="525">
-    <Grid>
-        
-    </Grid>
-</Window>

+ 0 - 54
MediaBrowser.Uninstaller/MainWindow.xaml.cs

@@ -1,54 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Text;
-using System.Threading;
-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 Path = System.IO.Path;
-
-namespace MediaBrowser.Uninstaller
-{
-    /// <summary>
-    /// Interaction logic for MainWindow.xaml
-    /// </summary>
-    public partial class MainWindow : Window
-    {
-        public MainWindow()
-        {
-            //All our work is behind the scenes
-            var args = Environment.GetCommandLineArgs();
-            var product = args.Length > 1 ? args[1] : "server";
-            //copy the real program to a temp location so we can delete everything here (including us)
-            var tempExe = Path.Combine(Path.GetTempPath(), "MediaBrowser.Uninstaller.Execute.exe");
-            var tempConfig = Path.Combine(Path.GetTempPath(), "MediaBrowser.Uninstaller.Execute.exe.config");
-            using (var file = File.Create(tempExe, 4096, FileOptions.DeleteOnClose))
-            {
-                //copy the real uninstaller to temp location
-                var sourceDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase) ?? "";
-                File.WriteAllBytes(tempExe, File.ReadAllBytes(Path.Combine(sourceDir ,"MediaBrowser.Uninstaller.Execute.exe")));
-                File.Copy(tempConfig, Path.Combine(sourceDir ,"MediaBrowser.Uninstaller.Execute.exe.config"));
-                //kick off the copy
-                MessageBox.Show("About to start " + tempExe);
-                Process.Start(tempExe, product);
-                //wait for it to start up
-                Thread.Sleep(500);
-                //and shut down
-                Close();
-            }
-            
-            //InitializeComponent();
-        }
-    }
-}

+ 9 - 52
MediaBrowser.Uninstaller/MediaBrowser.Uninstaller.csproj

@@ -4,15 +4,13 @@
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProjectGuid>{21EC6FB8-F444-4B60-8BA5-9CA443901A0D}</ProjectGuid>
+    <ProjectGuid>{8B930005-D5B2-4A78-9377-46AC6EDAB688}</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>
@@ -33,62 +31,21 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
+  <PropertyGroup>
+    <StartupObject />
+  </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>
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
   </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\" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
   <ItemGroup>
     <None Include="App.config" />

+ 33 - 0
MediaBrowser.Uninstaller/Program.cs

@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Uninstaller
+{
+    class Program
+    {
+        static void Main(string[] args)
+        {
+            var product = args.Length > 1 ? args[1] : "server";
+            //copy the real program to a temp location so we can delete everything here (including us)
+            var tempExe = Path.Combine(Path.GetTempPath(), "MediaBrowser.Uninstaller.Execute.exe");
+            var tempConfig = Path.Combine(Path.GetTempPath(), "MediaBrowser.Uninstaller.Execute.exe.config");
+            //using (var file = File.Create(tempExe, 4096, FileOptions.DeleteOnClose))
+            {
+                //copy the real uninstaller to temp location
+                var sourceDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? "";
+                File.WriteAllBytes(tempExe, File.ReadAllBytes(Path.Combine(sourceDir, "MediaBrowser.Uninstaller.Execute.exe")));
+                File.Copy(Path.Combine(sourceDir, "MediaBrowser.Uninstaller.Execute.exe.config"), tempConfig, true);
+                //kick off the copy
+                Process.Start(tempExe, product);
+                //and shut down
+            }
+        }
+    }
+}

+ 2 - 21
MediaBrowser.Uninstaller/Properties/AssemblyInfo.cs

@@ -1,8 +1,6 @@
 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
@@ -21,25 +19,8 @@ using System.Windows;
 // 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)
-)]
-
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("8730b84d-cebf-4e2a-9a17-4be58bd5c2dc")]
 
 // Version information for an assembly consists of the following four values:
 //

+ 0 - 71
MediaBrowser.Uninstaller/Properties/Resources.Designer.cs

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

+ 0 - 117
MediaBrowser.Uninstaller/Properties/Resources.resx

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

+ 0 - 30
MediaBrowser.Uninstaller/Properties/Settings.Designer.cs

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

+ 0 - 7
MediaBrowser.Uninstaller/Properties/Settings.settings

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

+ 15 - 15
MediaBrowser.sln

@@ -51,7 +51,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Server.Impleme
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Uninstaller.Execute", "MediaBrowser.Uninstaller.Execute\MediaBrowser.Uninstaller.Execute.csproj", "{FACAF749-3E28-46DD-B613-654FCD434959}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Uninstaller", "MediaBrowser.Uninstaller\MediaBrowser.Uninstaller.csproj", "{21EC6FB8-F444-4B60-8BA5-9CA443901A0D}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Uninstaller", "MediaBrowser.Uninstaller\MediaBrowser.Uninstaller.csproj", "{8B930005-D5B2-4A78-9377-46AC6EDAB688}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -335,20 +335,20 @@ Global
 		{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
-		{21EC6FB8-F444-4B60-8BA5-9CA443901A0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{21EC6FB8-F444-4B60-8BA5-9CA443901A0D}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{21EC6FB8-F444-4B60-8BA5-9CA443901A0D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
-		{21EC6FB8-F444-4B60-8BA5-9CA443901A0D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
-		{21EC6FB8-F444-4B60-8BA5-9CA443901A0D}.Debug|Win32.ActiveCfg = Debug|Any CPU
-		{21EC6FB8-F444-4B60-8BA5-9CA443901A0D}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{21EC6FB8-F444-4B60-8BA5-9CA443901A0D}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{21EC6FB8-F444-4B60-8BA5-9CA443901A0D}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{21EC6FB8-F444-4B60-8BA5-9CA443901A0D}.Release|Any CPU.Build.0 = Release|Any CPU
-		{21EC6FB8-F444-4B60-8BA5-9CA443901A0D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
-		{21EC6FB8-F444-4B60-8BA5-9CA443901A0D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
-		{21EC6FB8-F444-4B60-8BA5-9CA443901A0D}.Release|Win32.ActiveCfg = Release|Any CPU
-		{21EC6FB8-F444-4B60-8BA5-9CA443901A0D}.Release|x64.ActiveCfg = Release|Any CPU
-		{21EC6FB8-F444-4B60-8BA5-9CA443901A0D}.Release|x86.ActiveCfg = Release|Any CPU
+		{8B930005-D5B2-4A78-9377-46AC6EDAB688}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8B930005-D5B2-4A78-9377-46AC6EDAB688}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8B930005-D5B2-4A78-9377-46AC6EDAB688}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{8B930005-D5B2-4A78-9377-46AC6EDAB688}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{8B930005-D5B2-4A78-9377-46AC6EDAB688}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{8B930005-D5B2-4A78-9377-46AC6EDAB688}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{8B930005-D5B2-4A78-9377-46AC6EDAB688}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{8B930005-D5B2-4A78-9377-46AC6EDAB688}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8B930005-D5B2-4A78-9377-46AC6EDAB688}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8B930005-D5B2-4A78-9377-46AC6EDAB688}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{8B930005-D5B2-4A78-9377-46AC6EDAB688}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{8B930005-D5B2-4A78-9377-46AC6EDAB688}.Release|Win32.ActiveCfg = Release|Any CPU
+		{8B930005-D5B2-4A78-9377-46AC6EDAB688}.Release|x64.ActiveCfg = Release|Any CPU
+		{8B930005-D5B2-4A78-9377-46AC6EDAB688}.Release|x86.ActiveCfg = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE