mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-10-30 18:22:48 -04:00 
			
		
		
		
	Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser
This commit is contained in:
		
						commit
						cbb2f00da5
					
				| @ -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
									
								
								MediaBrowser.Installer/Code/ShellLinkNative.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										276
									
								
								MediaBrowser.Installer/Code/ShellLinkNative.cs
									
									
									
									
									
										Normal file
									
								
							| @ -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
									
								
								MediaBrowser.Installer/Code/ShellShortcut.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										348
									
								
								MediaBrowser.Installer/Code/ShellShortcut.cs
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||
| 
 | ||||
| 	} | ||||
| } | ||||
| @ -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(); | ||||
| 
 | ||||
|         } | ||||
|  | ||||
| @ -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> | ||||
|  | ||||
| @ -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> | ||||
|  | ||||
| @ -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. | ||||
|  | ||||
| @ -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> | ||||
|  | ||||
| @ -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  | ||||
|             { | ||||
|                 File.Delete(Path.Combine(startMenu,linkName)); | ||||
|             } | ||||
|             catch {} // oh well | ||||
| 
 | ||||
|             RemoveShortcut(Path.Combine(startMenu, linkName)); | ||||
|             RemoveShortcut(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup),linkName)); | ||||
|             linkName = "Uninstall " + linkName; | ||||
|             try  | ||||
|             RemoveShortcut(Path.Combine(startMenu, linkName)); | ||||
|             if (Product == "Server") | ||||
|             { | ||||
|                 File.Delete(Path.Combine(startMenu,linkName)); | ||||
|                 RemoveShortcut(Path.Combine(startMenu, "MB Dashboard.lnk")); | ||||
|             } | ||||
|             // 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"); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             catch {} // oh well | ||||
| 
 | ||||
|             var rootPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MediaBrowser" + RootSuffix); | ||||
| 
 | ||||
|             if (cbxRemoveAll.IsChecked == true) | ||||
|             { | ||||
|                 // Just remove our whole directory | ||||
|                 RemovePath(rootPath); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 // 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")); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             // 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(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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> | ||||
| @ -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 | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -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> | ||||
| @ -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(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -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" /> | ||||
|     <Reference Include="Microsoft.CSharp" /> | ||||
|     <Reference Include="System.Data" /> | ||||
|     <Reference Include="System.Xml" /> | ||||
|   </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\" /> | ||||
|     <Compile Include="Program.cs" /> | ||||
|     <Compile Include="Properties\AssemblyInfo.cs" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <None Include="App.config" /> | ||||
|  | ||||
							
								
								
									
										33
									
								
								MediaBrowser.Uninstaller/Program.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								MediaBrowser.Uninstaller/Program.cs
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -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: | ||||
| // | ||||
|  | ||||
| @ -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; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,117 +0,0 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <root> | ||||
|   <!--  | ||||
|     Microsoft ResX Schema  | ||||
|      | ||||
|     Version 2.0 | ||||
|      | ||||
|     The primary goals of this format is to allow a simple XML format  | ||||
|     that is mostly human readable. The generation and parsing of the  | ||||
|     various data types are done through the TypeConverter classes  | ||||
|     associated with the data types. | ||||
|      | ||||
|     Example: | ||||
|      | ||||
|     ... ado.net/XML headers & schema ... | ||||
|     <resheader name="resmimetype">text/microsoft-resx</resheader> | ||||
|     <resheader name="version">2.0</resheader> | ||||
|     <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> | ||||
|     <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> | ||||
|     <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> | ||||
|     <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> | ||||
|     <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> | ||||
|         <value>[base64 mime encoded serialized .NET Framework object]</value> | ||||
|     </data> | ||||
|     <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> | ||||
|         <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> | ||||
|         <comment>This is a comment</comment> | ||||
|     </data> | ||||
|                  | ||||
|     There are any number of "resheader" rows that contain simple  | ||||
|     name/value pairs. | ||||
|      | ||||
|     Each data row contains a name, and value. The row also contains a  | ||||
|     type or mimetype. Type corresponds to a .NET class that support  | ||||
|     text/value conversion through the TypeConverter architecture.  | ||||
|     Classes that don't support this are serialized and stored with the  | ||||
|     mimetype set. | ||||
|      | ||||
|     The mimetype is used for serialized objects, and tells the  | ||||
|     ResXResourceReader how to depersist the object. This is currently not  | ||||
|     extensible. For a given mimetype the value must be set accordingly: | ||||
|      | ||||
|     Note - application/x-microsoft.net.object.binary.base64 is the format  | ||||
|     that the ResXResourceWriter will generate, however the reader can  | ||||
|     read any of the formats listed below. | ||||
|      | ||||
|     mimetype: application/x-microsoft.net.object.binary.base64 | ||||
|     value   : The object must be serialized with  | ||||
|             : System.Serialization.Formatters.Binary.BinaryFormatter | ||||
|             : and then encoded with base64 encoding. | ||||
|      | ||||
|     mimetype: application/x-microsoft.net.object.soap.base64 | ||||
|     value   : The object must be serialized with  | ||||
|             : System.Runtime.Serialization.Formatters.Soap.SoapFormatter | ||||
|             : and then encoded with base64 encoding. | ||||
| 
 | ||||
|     mimetype: application/x-microsoft.net.object.bytearray.base64 | ||||
|     value   : The object must be serialized into a byte array  | ||||
|             : using a System.ComponentModel.TypeConverter | ||||
|             : and then encoded with base64 encoding. | ||||
|     --> | ||||
|   <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> | ||||
|     <xsd:element name="root" msdata:IsDataSet="true"> | ||||
|       <xsd:complexType> | ||||
|         <xsd:choice maxOccurs="unbounded"> | ||||
|           <xsd:element name="metadata"> | ||||
|             <xsd:complexType> | ||||
|               <xsd:sequence> | ||||
|                 <xsd:element name="value" type="xsd:string" minOccurs="0" /> | ||||
|               </xsd:sequence> | ||||
|               <xsd:attribute name="name" type="xsd:string" /> | ||||
|               <xsd:attribute name="type" type="xsd:string" /> | ||||
|               <xsd:attribute name="mimetype" type="xsd:string" /> | ||||
|             </xsd:complexType> | ||||
|           </xsd:element> | ||||
|           <xsd:element name="assembly"> | ||||
|             <xsd:complexType> | ||||
|               <xsd:attribute name="alias" type="xsd:string" /> | ||||
|               <xsd:attribute name="name" type="xsd:string" /> | ||||
|             </xsd:complexType> | ||||
|           </xsd:element> | ||||
|           <xsd:element name="data"> | ||||
|             <xsd:complexType> | ||||
|               <xsd:sequence> | ||||
|                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||||
|                 <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> | ||||
|               </xsd:sequence> | ||||
|               <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> | ||||
|               <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> | ||||
|               <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> | ||||
|             </xsd:complexType> | ||||
|           </xsd:element> | ||||
|           <xsd:element name="resheader"> | ||||
|             <xsd:complexType> | ||||
|               <xsd:sequence> | ||||
|                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> | ||||
|               </xsd:sequence> | ||||
|               <xsd:attribute name="name" type="xsd:string" use="required" /> | ||||
|             </xsd:complexType> | ||||
|           </xsd:element> | ||||
|         </xsd:choice> | ||||
|       </xsd:complexType> | ||||
|     </xsd:element> | ||||
|   </xsd:schema> | ||||
|   <resheader name="resmimetype"> | ||||
|     <value>text/microsoft-resx</value> | ||||
|   </resheader> | ||||
|   <resheader name="version"> | ||||
|     <value>2.0</value> | ||||
|   </resheader> | ||||
|   <resheader name="reader"> | ||||
|     <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||||
|   </resheader> | ||||
|   <resheader name="writer"> | ||||
|     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> | ||||
|   </resheader> | ||||
| </root> | ||||
| @ -1,30 +0,0 @@ | ||||
| //------------------------------------------------------------------------------ | ||||
| // <auto-generated> | ||||
| //     This code was generated by a tool. | ||||
| //     Runtime Version:4.0.30319.17929 | ||||
| // | ||||
| //     Changes to this file may cause incorrect behavior and will be lost if | ||||
| //     the code is regenerated. | ||||
| // </auto-generated> | ||||
| //------------------------------------------------------------------------------ | ||||
| 
 | ||||
| namespace MediaBrowser.Uninstaller.Properties | ||||
| { | ||||
| 
 | ||||
| 
 | ||||
|     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] | ||||
|     [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] | ||||
|     internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase | ||||
|     { | ||||
| 
 | ||||
|         private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); | ||||
| 
 | ||||
|         public static Settings Default | ||||
|         { | ||||
|             get | ||||
|             { | ||||
|                 return defaultInstance; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -1,7 +0,0 @@ | ||||
| <?xml version='1.0' encoding='utf-8'?> | ||||
| <SettingsFile xmlns="uri:settings" CurrentProfile="(Default)"> | ||||
|   <Profiles> | ||||
|     <Profile Name="(Default)" /> | ||||
|   </Profiles> | ||||
|   <Settings /> | ||||
| </SettingsFile> | ||||
| @ -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 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user