diff --git a/EZPPClient Installer/EZPPClient Installer.csproj b/EZPPClient Installer/EZPPClient Installer.csproj index e6e76ff..60ea8e9 100644 --- a/EZPPClient Installer/EZPPClient Installer.csproj +++ b/EZPPClient Installer/EZPPClient Installer.csproj @@ -93,6 +93,8 @@ + + @@ -134,6 +136,9 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all + + 4.1.3.201115164 + 0.9.4 diff --git a/EZPPClient Installer/MainWindow.xaml.cs b/EZPPClient Installer/MainWindow.xaml.cs index 635aa3e..4bd422c 100644 --- a/EZPPClient Installer/MainWindow.xaml.cs +++ b/EZPPClient Installer/MainWindow.xaml.cs @@ -1,28 +1,24 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; 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 Microsoft.Win32; using System.IO; -using MessageBox = System.Windows.MessageBox; using System.Net; using System.Globalization; using ModernWpf.Controls; using System.Windows.Forms; using System.Media; -using System.Threading; -using Windows.System; +using System.Runtime.InteropServices.ComTypes; +using Shortcut; +using Path = System.Windows.Shapes.Path; + +#if DEBUG +using MessageBox = System.Windows.MessageBox; +#endif namespace EZPPClient_Installer { @@ -67,6 +63,12 @@ namespace EZPPClient_Installer InstallerWindow.Title = "EZPPClient Installer " + versionString.Replace(",", "."); string osuPath = Util.osuInstallDir(); + + if (osuPath.EndsWith(@"\EZPPClient")) + { + osuPath = osuPath.Replace(@"\EZPPClient", ""); + } + bool isValidFolder = await isValidOsuFolder(osuPath); UpdateInstallButton(!string.IsNullOrEmpty(osuPath)); @@ -193,6 +195,17 @@ namespace EZPPClient_Installer string EZPPFolder = osuFolder + @"\EZPPClient"; + if (ProcessUtil.ProgramIsRunning(folderTextbox.Text + @"\EZPPClient.exe")) + { + _ = new ContentDialog() + { + Title = "Oops..", + Content = "The EZPPClient is currently running.", + PrimaryButtonText = "Oh" + }.ShowAsync(); + return; + } + if (InstallButton.Content.Equals("Install")) { if (linkFoldersCheckbox.IsChecked.Value) @@ -251,14 +264,24 @@ namespace EZPPClient_Installer { try { - File.Copy(string.Format(@"{0}\osu!.{1}.cfg", osuFolder, userName), string.Format(@"{0}\osu!.{1}.cfg", EZPPFolder, userName)); + //File.Copy(string.Format(@"{0}\osu!.{1}.cfg", osuFolder, userName), string.Format(@"{0}\osu!.{1}.cfg", EZPPFolder, userName)); + if (!CreateSymbolicLink(string.Format(@"{0}\osu!.{1}.cfg", EZPPFolder, userName), string.Format(@"{0}\osu!.{1}.cfg", osuFolder, userName), SymbolicLink.File)) + { + ContentDialog dg = new ContentDialog() + { + Title = "Hmmm..", + Content = "Failed to create Symlink to cfg file.", + PrimaryButtonText = "Okay :/" + }; + await dg.ShowAsync(); + } } catch (Exception) { ContentDialog dg = new ContentDialog() { Title = "Hmmm..", - Content = string.Format("Failed to copy osu!.{0}.cfg", userName), + Content = string.Format("Failed to link osu!.{0}.cfg", userName), PrimaryButtonText = "Okay :/" }; await dg.ShowAsync(); @@ -268,14 +291,24 @@ namespace EZPPClient_Installer { try { - File.Copy(string.Format(@"{0}\scores.db", osuFolder), string.Format(@"{0}\scores.db", EZPPFolder)); + //File.Copy(string.Format(@"{0}\scores.db", osuFolder), string.Format(@"{0}\scores.db", EZPPFolder)); + if (!CreateSymbolicLink(string.Format(@"{0}\scores.db", EZPPFolder), string.Format(@"{0}\scores.db", osuFolder), SymbolicLink.File)) + { + ContentDialog dg = new ContentDialog() + { + Title = "Hmmm..", + Content = "Failed to create Symlink to scores.db file.", + PrimaryButtonText = "Okay :/" + }; + await dg.ShowAsync(); + } } catch (Exception) { ContentDialog dg = new ContentDialog() { Title = "Hmmm..", - Content = "Failed to copy scores.db", + Content = "Failed to link scores.db", PrimaryButtonText = "Okay :/" }; await dg.ShowAsync(); @@ -285,14 +318,51 @@ namespace EZPPClient_Installer { try { - File.Copy(string.Format(@"{0}\collection.db", osuFolder), string.Format(@"{0}\collection.db", EZPPFolder)); + //File.Copy(string.Format(@"{0}\collection.db", osuFolder), string.Format(@"{0}\collection.db", EZPPFolder)); + if (!CreateSymbolicLink(string.Format(@"{0}\collection.db", EZPPFolder), string.Format(@"{0}\collection.db", osuFolder), SymbolicLink.File)) + { + ContentDialog dg = new ContentDialog() + { + Title = "Hmmm..", + Content = "Failed to create Symlink to collection.db file.", + PrimaryButtonText = "Okay :/" + }; + await dg.ShowAsync(); + } } catch (Exception) { ContentDialog dg = new ContentDialog() { Title = "Hmmm..", - Content = "Failed to copy collection.db", + Content = "Failed to link collection.db", + PrimaryButtonText = "Okay :/" + }; + await dg.ShowAsync(); + } + } + if (File.Exists(string.Format(@"{0}\osu!.db", osuFolder)) && !File.Exists(string.Format(@"{0}\osu!.db", EZPPFolder))) + { + try + { + //File.Copy(string.Format(@"{0}\osu.db", osuFolder), string.Format(@"{0}\osu.db", EZPPFolder)); + if (!CreateSymbolicLink(string.Format(@"{0}\osu!.db", EZPPFolder), string.Format(@"{0}\osu!.db", osuFolder), SymbolicLink.File)) + { + ContentDialog dg = new ContentDialog() + { + Title = "Hmmm..", + Content = "Failed to create Symlink to osu!.db file.", + PrimaryButtonText = "Okay :/" + }; + await dg.ShowAsync(); + } + } + catch (Exception) + { + ContentDialog dg = new ContentDialog() + { + Title = "Hmmm..", + Content = "Failed to link osu!.db", PrimaryButtonText = "Okay :/" }; await dg.ShowAsync(); @@ -318,6 +388,22 @@ namespace EZPPClient_Installer await DownloadUtil.DownloadFiles(filesToDownload, EZPPFolder); + if (InstallButton.Content.Equals("Install")) + { + IShellLink link = (IShellLink)new ShellLink(); + + // setup shortcut information + link.SetDescription("Starts the EZPPClient"); + link.SetPath(EZPPFolder + @"\EZPPClient.exe"); + + // save it + IPersistFile file = (IPersistFile)link; + string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); + string LinkFile = System.IO.Path.Combine(desktopPath, "Start EZPPClient.lnk"); + Console.Out.WriteLine("Saving Shortcut to " + LinkFile); + file.Save(LinkFile, false); + } + InstallButton.Visibility = prevInstallBtnVis; Uninstall_Button.Visibility = prevUninstallBtnVis; linkFoldersCheckbox.Visibility = prevLinkFCVis; @@ -328,9 +414,8 @@ namespace EZPPClient_Installer Uninstall_Button.Visibility = Visibility.Visible; UpdateInstallButton(false); - - string osuEZPPPath = folderTextbox.Text + @"\EZPPClient"; - List outdatedFiles = DownloadUtil.FilesToDownload(osuEZPPPath, false); + + List outdatedFiles = DownloadUtil.FilesToDownload(EZPPFolder, false); if (!IsEmpty(outdatedFiles)) { @@ -447,6 +532,16 @@ namespace EZPPClient_Installer private async void Uninstall_Button_Click(object sender, RoutedEventArgs e) { + if(ProcessUtil.ProgramIsRunning(folderTextbox.Text + @"\EZPPClient.exe")) + { + _ = new ContentDialog() + { + Title = "Oops..", + Content = "The EZPPClient is currently running.", + PrimaryButtonText = "Oh" + }.ShowAsync(); + return; + } SystemSounds.Asterisk.Play(); ContentDialog cd = new ContentDialog() { @@ -461,7 +556,12 @@ namespace EZPPClient_Installer string osuEZPPPath = folderTextbox.Text + @"\EZPPClient"; if (Directory.Exists(osuEZPPPath)) Directory.Delete(osuEZPPPath, true); - + + string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); + string linkFile = System.IO.Path.Combine(desktopPath, "Start EZPPClient.lnk"); + if (File.Exists(linkFile)) + File.Delete(linkFile); + _ = new ContentDialog() { Title = "Success!", diff --git a/EZPPClient Installer/ProcessUtil.cs b/EZPPClient Installer/ProcessUtil.cs new file mode 100644 index 0000000..bd00ae6 --- /dev/null +++ b/EZPPClient Installer/ProcessUtil.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EZPPClient_Installer +{ + class ProcessUtil + { + public static bool ProgramIsRunning(string FullPath) + { + string FilePath = Path.GetDirectoryName(FullPath); + string FileName = Path.GetFileNameWithoutExtension(FullPath).ToLower(); + bool isRunning = false; + + Process[] pList = Process.GetProcessesByName(FileName); + + foreach (Process p in pList) + { + if (p.MainModule.FileName.StartsWith(FilePath, StringComparison.InvariantCultureIgnoreCase)) + { + isRunning = true; + break; + } + } + + return isRunning; + } + } +} diff --git a/EZPPClient Installer/Shortcut.cs b/EZPPClient Installer/Shortcut.cs new file mode 100644 index 0000000..5f4b7a0 --- /dev/null +++ b/EZPPClient Installer/Shortcut.cs @@ -0,0 +1,39 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Text; + +namespace Shortcut +{ + [ComImport] + [Guid("00021401-0000-0000-C000-000000000046")] + internal class ShellLink + { + } + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("000214F9-0000-0000-C000-000000000046")] + internal interface IShellLink + { + void GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out IntPtr pfd, int 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, int fFlags); + void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile); + } +} \ No newline at end of file