diff options
21 files changed, 834 insertions, 445 deletions
diff --git a/MediaBrowser.Installer/App.config b/MediaBrowser.Installer/App.config index eb69b68d0..558196382 100644 --- a/MediaBrowser.Installer/App.config +++ b/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" /> diff --git a/MediaBrowser.Installer/Code/ShellLinkNative.cs b/MediaBrowser.Installer/Code/ShellLinkNative.cs new file mode 100644 index 000000000..20e0bc6c3 --- /dev/null +++ b/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 + { + } + +} diff --git a/MediaBrowser.Installer/Code/ShellShortcut.cs b/MediaBrowser.Installer/Code/ShellShortcut.cs new file mode 100644 index 000000000..33b60732c --- /dev/null +++ b/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 + + } +} diff --git a/MediaBrowser.Installer/MainWindow.xaml.cs b/MediaBrowser.Installer/MainWindow.xaml.cs index 01e15dfd8..f71173691 100644 --- a/MediaBrowser.Installer/MainWindow.xaml.cs +++ b/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(); } diff --git a/MediaBrowser.Installer/MediaBrowser.Installer.csproj b/MediaBrowser.Installer/MediaBrowser.Installer.csproj index 30267e76e..3193a2d86 100644 --- a/MediaBrowser.Installer/MediaBrowser.Installer.csproj +++ b/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"> @@ -191,17 +199,6 @@ <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> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> diff --git a/MediaBrowser.Model/Configuration/BaseApplicationConfiguration.cs b/MediaBrowser.Model/Configuration/BaseApplicationConfiguration.cs index 61b177df9..474d985f2 100644 --- a/MediaBrowser.Model/Configuration/BaseApplicationConfiguration.cs +++ b/MediaBrowser.Model/Configuration/BaseApplicationConfiguration.cs @@ -1,4 +1,5 @@ -using ProtoBuf; +using MediaBrowser.Model.Updates; +using ProtoBuf; namespace MediaBrowser.Model.Configuration { @@ -39,6 +40,12 @@ namespace MediaBrowser.Model.Configuration 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> /// <value>The log file retention days.</value> diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs index 56bc43425..71f368397 100644 --- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs +++ b/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. diff --git a/MediaBrowser.Uninstaller.Execute/MainWindow.xaml b/MediaBrowser.Uninstaller.Execute/MainWindow.xaml index d2a093ec4..803917109 100644 --- a/MediaBrowser.Uninstaller.Execute/MainWindow.xaml +++ b/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> diff --git a/MediaBrowser.Uninstaller.Execute/MainWindow.xaml.cs b/MediaBrowser.Uninstaller.Execute/MainWindow.xaml.cs index bdf34b956..9937177a7 100644 --- a/MediaBrowser.Uninstaller.Execute/MainWindow.xaml.cs +++ b/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(); } } } diff --git a/MediaBrowser.Uninstaller/App.xaml b/MediaBrowser.Uninstaller/App.xaml deleted file mode 100644 index 8d0735d42..000000000 --- a/MediaBrowser.Uninstaller/App.xaml +++ /dev/null @@ -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> diff --git a/MediaBrowser.Uninstaller/App.xaml.cs b/MediaBrowser.Uninstaller/App.xaml.cs deleted file mode 100644 index b38e27e1a..000000000 --- a/MediaBrowser.Uninstaller/App.xaml.cs +++ /dev/null @@ -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 - { - } -} diff --git a/MediaBrowser.Uninstaller/MainWindow.xaml b/MediaBrowser.Uninstaller/MainWindow.xaml deleted file mode 100644 index 645996503..000000000 --- a/MediaBrowser.Uninstaller/MainWindow.xaml +++ /dev/null @@ -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> diff --git a/MediaBrowser.Uninstaller/MainWindow.xaml.cs b/MediaBrowser.Uninstaller/MainWindow.xaml.cs deleted file mode 100644 index fb5f32a7f..000000000 --- a/MediaBrowser.Uninstaller/MainWindow.xaml.cs +++ /dev/null @@ -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(); - } - } -} diff --git a/MediaBrowser.Uninstaller/MediaBrowser.Uninstaller.csproj b/MediaBrowser.Uninstaller/MediaBrowser.Uninstaller.csproj index c9c3e537c..3291ebdb1 100644 --- a/MediaBrowser.Uninstaller/MediaBrowser.Uninstaller.csproj +++ b/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" /> diff --git a/MediaBrowser.Uninstaller/Program.cs b/MediaBrowser.Uninstaller/Program.cs new file mode 100644 index 000000000..8ea1a950a --- /dev/null +++ b/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 + } + } + } +} diff --git a/MediaBrowser.Uninstaller/Properties/AssemblyInfo.cs b/MediaBrowser.Uninstaller/Properties/AssemblyInfo.cs index c4a6586ee..49b4acc57 100644 --- a/MediaBrowser.Uninstaller/Properties/AssemblyInfo.cs +++ b/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: // diff --git a/MediaBrowser.Uninstaller/Properties/Resources.Designer.cs b/MediaBrowser.Uninstaller/Properties/Resources.Designer.cs deleted file mode 100644 index 3de89d425..000000000 --- a/MediaBrowser.Uninstaller/Properties/Resources.Designer.cs +++ /dev/null @@ -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; - } - } - } -} diff --git a/MediaBrowser.Uninstaller/Properties/Resources.resx b/MediaBrowser.Uninstaller/Properties/Resources.resx deleted file mode 100644 index af7dbebba..000000000 --- a/MediaBrowser.Uninstaller/Properties/Resources.resx +++ /dev/null @@ -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>
\ No newline at end of file diff --git a/MediaBrowser.Uninstaller/Properties/Settings.Designer.cs b/MediaBrowser.Uninstaller/Properties/Settings.Designer.cs deleted file mode 100644 index 0cc99d90c..000000000 --- a/MediaBrowser.Uninstaller/Properties/Settings.Designer.cs +++ /dev/null @@ -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; - } - } - } -} diff --git a/MediaBrowser.Uninstaller/Properties/Settings.settings b/MediaBrowser.Uninstaller/Properties/Settings.settings deleted file mode 100644 index 033d7a5e9..000000000 --- a/MediaBrowser.Uninstaller/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version='1.0' encoding='utf-8'?> -<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)"> - <Profiles> - <Profile Name="(Default)" /> - </Profiles> - <Settings /> -</SettingsFile>
\ No newline at end of file diff --git a/MediaBrowser.sln b/MediaBrowser.sln index 5f94f0cbb..3105614f8 100644 --- a/MediaBrowser.sln +++ b/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 |
