From 5035fb79e95ede4c8344c04f78a9a419edbcddc0 Mon Sep 17 00:00:00 2001 From: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:04:52 +0900 Subject: [PATCH] Init --- .../Helpers/Win32/Win32Helper.Shell.cs | 4 +- .../Helpers/Win32/Win32Helper.Storage.cs | 137 ------------------ .../Services/Storage/StorageNetworkService.cs | 8 +- .../Storage/StorageTrashBinService.cs | 4 +- .../Windows/WindowsQuickAccessService.cs | 8 +- src/Files.App/Utils/Library/LibraryManager.cs | 12 +- src/Files.App/Utils/Shell/LaunchHelper.cs | 8 +- .../Storage/Helpers/FileThumbnailHelper.cs | 4 +- .../Operations/FileOperationsHelpers.cs | 40 ++--- 9 files changed, 44 insertions(+), 181 deletions(-) diff --git a/src/Files.App/Helpers/Win32/Win32Helper.Shell.cs b/src/Files.App/Helpers/Win32/Win32Helper.Shell.cs index c5892a8a1953..6d66875d7189 100644 --- a/src/Files.App/Helpers/Win32/Win32Helper.Shell.cs +++ b/src/Files.App/Helpers/Win32/Win32Helper.Shell.cs @@ -24,7 +24,7 @@ public static partial class Win32Helper path = $"shell:{path}"; } - return await Win32Helper.StartSTATask(() => + return await STATask.Run(() => { var flc = new List(); var folder = (ShellFileItem)null; @@ -77,7 +77,7 @@ public static partial class Win32Helper } return (folder, flc); - }); + }, App.Logger); } public static string GetFolderFromKnownFolderGUID(Guid guid) diff --git a/src/Files.App/Helpers/Win32/Win32Helper.Storage.cs b/src/Files.App/Helpers/Win32/Win32Helper.Storage.cs index 51bc82a35a73..afdf1cc4a042 100644 --- a/src/Files.App/Helpers/Win32/Win32Helper.Storage.cs +++ b/src/Files.App/Helpers/Win32/Win32Helper.Storage.cs @@ -26,143 +26,6 @@ namespace Files.App.Helpers /// public static partial class Win32Helper { - public static Task StartSTATask(Func func) - { - var taskCompletionSource = new TaskCompletionSource(); - Thread thread = new Thread(async () => - { - Ole32.OleInitialize(); - - try - { - await func(); - taskCompletionSource.SetResult(); - } - catch (Exception ex) - { - taskCompletionSource.SetResult(); - App.Logger.LogWarning(ex, ex.Message); - } - finally - { - Ole32.OleUninitialize(); - } - }) - - { - IsBackground = true, - Priority = ThreadPriority.Normal - }; - - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - - return taskCompletionSource.Task; - } - - public static Task StartSTATask(Action action) - { - var taskCompletionSource = new TaskCompletionSource(); - Thread thread = new Thread(() => - { - Ole32.OleInitialize(); - - try - { - action(); - taskCompletionSource.SetResult(); - } - catch (Exception ex) - { - taskCompletionSource.SetResult(); - App.Logger.LogWarning(ex, ex.Message); - } - finally - { - Ole32.OleUninitialize(); - } - }) - - { - IsBackground = true, - Priority = ThreadPriority.Normal - }; - - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - - return taskCompletionSource.Task; - } - - public static Task StartSTATask(Func func) - { - var taskCompletionSource = new TaskCompletionSource(); - - Thread thread = new Thread(() => - { - Ole32.OleInitialize(); - - try - { - taskCompletionSource.SetResult(func()); - } - catch (Exception ex) - { - taskCompletionSource.SetResult(default); - App.Logger.LogWarning(ex, ex.Message); - //tcs.SetException(e); - } - finally - { - Ole32.OleUninitialize(); - } - }) - - { - IsBackground = true, - Priority = ThreadPriority.Normal - }; - - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - - return taskCompletionSource.Task; - } - - public static Task StartSTATask(Func> func) - { - var taskCompletionSource = new TaskCompletionSource(); - - Thread thread = new Thread(async () => - { - Ole32.OleInitialize(); - try - { - taskCompletionSource.SetResult(await func()); - } - catch (Exception ex) - { - taskCompletionSource.SetResult(default); - App.Logger.LogInformation(ex, ex.Message); - //tcs.SetException(e); - } - finally - { - Ole32.OleUninitialize(); - } - }) - - { - IsBackground = true, - Priority = ThreadPriority.Normal - }; - - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - - return taskCompletionSource.Task; - } - public static async Task GetFileAssociationAsync(string filename, bool checkDesktopFirst = false) { // Find UWP apps diff --git a/src/Files.App/Services/Storage/StorageNetworkService.cs b/src/Files.App/Services/Storage/StorageNetworkService.cs index 5cea00e864a1..b745565a3b79 100644 --- a/src/Files.App/Services/Storage/StorageNetworkService.cs +++ b/src/Files.App/Services/Storage/StorageNetworkService.cs @@ -91,7 +91,7 @@ public async Task> GetComputersAsync() /// public async Task> GetShortcutsAsync() { - var networkLocations = await Win32Helper.StartSTATask(() => + var networkLocations = await STATask.Run(() => { var locations = new List(); using (var netHood = new ShellFolder(Shell32.KNOWNFOLDERID.FOLDERID_NetHood)) @@ -114,7 +114,7 @@ public async Task> GetShortcutsAsync() } } return locations; - }); + }, App.Logger); return (networkLocations ?? Enumerable.Empty()).Select(item => { @@ -192,13 +192,13 @@ public bool DisconnectNetworkDrive(IFolder drive) /// public Task OpenMapNetworkDriveDialogAsync() { - return Win32Helper.StartSTATask(() => + return STATask.Run(() => { return CommonDialogService.Open_NetworkConnectionDialog( MainWindow.Instance.WindowHandle, useMostRecentPath: true, hideRestoreConnectionCheckBox: false); - }); + }, App.Logger); } /// diff --git a/src/Files.App/Services/Storage/StorageTrashBinService.cs b/src/Files.App/Services/Storage/StorageTrashBinService.cs index 41fb69f46e56..f2feafa3620f 100644 --- a/src/Files.App/Services/Storage/StorageTrashBinService.cs +++ b/src/Files.App/Services/Storage/StorageTrashBinService.cs @@ -83,7 +83,7 @@ public bool EmptyTrashBin() /// public async Task RestoreAllTrashesAsync() { - return await Win32Helper.StartSTATask(() => + return await STATask.Run(() => { try { @@ -95,7 +95,7 @@ public async Task RestoreAllTrashesAsync() { return false; } - }); + }, App.Logger); } private unsafe bool RestoreAllTrashesInternal() diff --git a/src/Files.App/Services/Windows/WindowsQuickAccessService.cs b/src/Files.App/Services/Windows/WindowsQuickAccessService.cs index b060f123a4d0..8c1c1438820f 100644 --- a/src/Files.App/Services/Windows/WindowsQuickAccessService.cs +++ b/src/Files.App/Services/Windows/WindowsQuickAccessService.cs @@ -63,20 +63,20 @@ private async Task UnpinFromSidebarAsync(string[] folderPaths, bool doUpdateQuic (folderPaths.Contains(path) || (path.StartsWith(@"\\SHELL\\") && folderPaths.Any(x => x.StartsWith(@"\\SHELL\\"))))) { - await Win32Helper.StartSTATask(async () => + await STATask.Run(async () => { fi.InvokeVerb("unpinfromhome"); - }); + }, App.Logger); continue; } } if (folderPaths.Contains(pathStr)) { - await Win32Helper.StartSTATask(async () => + await STATask.Run(async () => { fi.InvokeVerb("unpinfromhome"); - }); + }, App.Logger); } } diff --git a/src/Files.App/Utils/Library/LibraryManager.cs b/src/Files.App/Utils/Library/LibraryManager.cs index a3520eb6122b..730a14e5ff62 100644 --- a/src/Files.App/Utils/Library/LibraryManager.cs +++ b/src/Files.App/Utils/Library/LibraryManager.cs @@ -67,7 +67,7 @@ private void InitializeWatcher() /// List of library items public static async Task> ListUserLibraries() { - var libraries = await Win32Helper.StartSTATask(() => + var libraries = await STATask.Run(() => { try { @@ -90,7 +90,7 @@ public static async Task> ListUserLibraries() } return []; - }); + }, App.Logger); return libraries.Select(lib => new LibraryLocationItem(lib)).ToList(); } @@ -134,7 +134,7 @@ public async Task CreateNewLibrary(string name) if (string.IsNullOrWhiteSpace(name) || !CanCreateLibrary(name).result) return false; - var newLib = new LibraryLocationItem(await Win32Helper.StartSTATask(() => + var newLib = new LibraryLocationItem(await STATask.Run(() => { try { @@ -150,7 +150,7 @@ public async Task CreateNewLibrary(string name) } return Task.FromResult(null); - })); + }, App.Logger)); if (newLib is not null) { @@ -178,7 +178,7 @@ public async Task UpdateLibrary(string libraryPath, string // Nothing to update return null; - var item = await Win32Helper.StartSTATask(() => + var item = await STATask.Run(() => { try { @@ -231,7 +231,7 @@ public async Task UpdateLibrary(string libraryPath, string } return Task.FromResult(null); - }); + }, App.Logger); var newLib = item is not null ? new LibraryLocationItem(item) : null; if (newLib is not null) diff --git a/src/Files.App/Utils/Shell/LaunchHelper.cs b/src/Files.App/Utils/Shell/LaunchHelper.cs index b00fac7c6380..879ae0cc809a 100644 --- a/src/Files.App/Utils/Shell/LaunchHelper.cs +++ b/src/Files.App/Utils/Shell/LaunchHelper.cs @@ -141,7 +141,7 @@ private static async Task HandleApplicationLaunch(string application, stri { try { - var opened = await Win32Helper.StartSTATask(async () => + var opened = await STATask.Run(async () => { var split = application.Split('|').Where(x => !string.IsNullOrWhiteSpace(x)).Select(x => GetMtpPath(x)); if (split.Count() == 1) @@ -171,13 +171,13 @@ private static async Task HandleApplicationLaunch(string application, stri } return true; - }); + }, App.Logger); if (!opened) { if (application.StartsWith(@"\\SHELL\", StringComparison.Ordinal)) { - opened = await Win32Helper.StartSTATask(async () => + opened = await STATask.Run(async () => { using var cMenu = await ContextMenu.GetContextMenuForFiles(new[] { application }, PInvoke.CMF_DEFAULTONLY); @@ -185,7 +185,7 @@ private static async Task HandleApplicationLaunch(string application, stri await cMenu.InvokeItem(cMenu.Items.FirstOrDefault()?.ID ?? -1); return true; - }); + }, App.Logger); } } diff --git a/src/Files.App/Utils/Storage/Helpers/FileThumbnailHelper.cs b/src/Files.App/Utils/Storage/Helpers/FileThumbnailHelper.cs index 72a838089f47..ffbd9a9d975c 100644 --- a/src/Files.App/Utils/Storage/Helpers/FileThumbnailHelper.cs +++ b/src/Files.App/Utils/Storage/Helpers/FileThumbnailHelper.cs @@ -14,7 +14,7 @@ public static class FileThumbnailHelper { var size = iconOptions.HasFlag(IconOptions.UseCurrentScale) ? requestedSize * App.AppModel.AppWindowDPI : requestedSize; - return await Win32Helper.StartSTATask(() => Win32Helper.GetIcon(path, (int)size, isFolder, iconOptions)); + return await STATask.Run(() => Win32Helper.GetIcon(path, (int)size, isFolder, iconOptions), App.Logger); } /// @@ -24,7 +24,7 @@ public static class FileThumbnailHelper /// /// public static async Task GetIconOverlayAsync(string path, bool isFolder) - => await Win32Helper.StartSTATask(() => Win32Helper.GetIconOverlay(path, isFolder)); + => await STATask.Run(() => Win32Helper.GetIconOverlay(path, isFolder), App.Logger); [Obsolete] public static async Task LoadIconFromPathAsync(string filePath, uint thumbnailSize, ThumbnailMode thumbnailMode, ThumbnailOptions thumbnailOptions, bool isFolder = false) diff --git a/src/Files.App/Utils/Storage/Operations/FileOperationsHelpers.cs b/src/Files.App/Utils/Storage/Operations/FileOperationsHelpers.cs index 870a8d2563ad..0c55158115c8 100644 --- a/src/Files.App/Utils/Storage/Operations/FileOperationsHelpers.cs +++ b/src/Files.App/Utils/Storage/Operations/FileOperationsHelpers.cs @@ -25,7 +25,7 @@ public sealed partial class FileOperationsHelpers public static Task SetClipboard(string[] filesToCopy, DataPackageOperation operation) { - return Win32Helper.StartSTATask(() => + return STATask.Run(() => { System.Windows.Forms.Clipboard.Clear(); var fileList = new System.Collections.Specialized.StringCollection(); @@ -36,12 +36,12 @@ public static Task SetClipboard(string[] filesToCopy, DataPackageOperation opera data.SetFileDropList(fileList); data.SetData("Preferred DropEffect", dropEffect); System.Windows.Forms.Clipboard.SetDataObject(data, true); - }); + }, App.Logger); } public static Task<(bool, ShellOperationResult)> CreateItemAsync(string filePath, string fileOp, long ownerHwnd, bool asAdmin, string template = "", byte[]? dataBytes = null) { - return Win32Helper.StartSTATask(async () => + return STATask.Run(async () => { using var op = new ShellFileOperations2(); @@ -105,12 +105,12 @@ public static Task SetClipboard(string[] filesToCopy, DataPackageOperation opera } return (await createTcs.Task, shellOperationResult); - }); + }, App.Logger); } public static Task<(bool, ShellOperationResult)> TestRecycleAsync(string[] fileToDeletePath) { - return Win32Helper.StartSTATask(async () => + return STATask.Run(async () => { using var op = new ShellFileOperations2(); @@ -193,7 +193,7 @@ public static Task SetClipboard(string[] filesToCopy, DataPackageOperation opera } return (await deleteTcs.Task, shellOperationResult); - }); + }, App.Logger); } public static Task<(bool, ShellOperationResult)> DeleteItemAsync(string[] fileToDeletePath, bool permanently, long ownerHwnd, bool asAdmin, IProgress progress, string operationID = "") @@ -219,7 +219,7 @@ public static Task SetClipboard(string[] filesToCopy, DataPackageOperation opera fsProgress.Report(); progressHandler ??= new(); - return Win32Helper.StartSTATask(async () => + return STATask.Run(async () => { using var op = new ShellFileOperations2(); @@ -324,7 +324,7 @@ public static Task SetClipboard(string[] filesToCopy, DataPackageOperation opera cts.Cancel(); return (await deleteTcs.Task, shellOperationResult); - }); + }, App.Logger); } public static Task<(bool, ShellOperationResult)> RenameItemAsync(string fileToRenamePath, string newName, bool overwriteOnRename, long ownerHwnd, bool asAdmin, string operationID = "") @@ -333,7 +333,7 @@ public static Task SetClipboard(string[] filesToCopy, DataPackageOperation opera progressHandler ??= new(); - return Win32Helper.StartSTATask(async () => + return STATask.Run(async () => { using var op = new ShellFileOperations2(); var shellOperationResult = new ShellOperationResult(); @@ -391,7 +391,7 @@ public static Task SetClipboard(string[] filesToCopy, DataPackageOperation opera progressHandler.RemoveOperation(operationID); return (await renameTcs.Task, shellOperationResult); - }); + }, App.Logger); } public static Task<(bool, ShellOperationResult)> MoveItemAsync(string[] fileToMovePath, string[] moveDestination, bool overwriteOnMove, long ownerHwnd, bool asAdmin, IProgress progress, string operationID = "") @@ -417,7 +417,7 @@ public static Task SetClipboard(string[] filesToCopy, DataPackageOperation opera fsProgress.Report(); progressHandler ??= new(); - return Win32Helper.StartSTATask(async () => + return STATask.Run(async () => { using var op = new ShellFileOperations2(); var shellOperationResult = new ShellOperationResult(); @@ -519,7 +519,7 @@ public static Task SetClipboard(string[] filesToCopy, DataPackageOperation opera cts.Cancel(); return (await moveTcs.Task, shellOperationResult); - }); + }, App.Logger); } public static Task<(bool, ShellOperationResult)> CopyItemAsync(string[] fileToCopyPath, string[] copyDestination, bool overwriteOnCopy, long ownerHwnd, bool asAdmin, IProgress progress, string operationID = "") @@ -545,7 +545,7 @@ public static Task SetClipboard(string[] filesToCopy, DataPackageOperation opera fsProgress.Report(); progressHandler ??= new(); - return Win32Helper.StartSTATask(async () => + return STATask.Run(async () => { using var op = new ShellFileOperations2(); @@ -650,7 +650,7 @@ public static Task SetClipboard(string[] filesToCopy, DataPackageOperation opera cts.Cancel(); return (await copyTcs.Task, shellOperationResult); - }); + }, App.Logger); } public static void TryCancelOperation(string operationId) @@ -696,13 +696,13 @@ public static void TryCancelOperation(string operationId) } else if (FileExtensionHelpers.IsWebLinkFile(linkPath)) { - targetPath = await Win32Helper.StartSTATask(() => + targetPath = await STATask.Run(() => { var ipf = new Url.IUniformResourceLocator(); (ipf as System.Runtime.InteropServices.ComTypes.IPersistFile).Load(linkPath, 0); ipf.GetUrl(out var retVal); return retVal; - }); + }, App.Logger); return string.IsNullOrEmpty(targetPath) ? new ShellLinkItem { @@ -751,13 +751,13 @@ public static Task CreateOrUpdateLinkAsync(string linkSavePath, string tar } else if (FileExtensionHelpers.IsWebLinkFile(linkSavePath)) { - return Win32Helper.StartSTATask(() => + return STATask.Run(() => { var ipf = new Url.IUniformResourceLocator(); ipf.SetUrl(targetPath, Url.IURL_SETURL_FLAGS.IURL_SETURL_FL_GUESS_PROTOCOL); (ipf as System.Runtime.InteropServices.ComTypes.IPersistFile).Save(linkSavePath, false); // Overwrite if exists return true; - }); + }, App.Logger); } } catch (UnauthorizedAccessException ex) @@ -826,7 +826,7 @@ public static bool SetLinkIcon(string filePath, string iconFile, int iconIndex) public static Task OpenObjectPickerAsync(long hWnd) { - return Win32Helper.StartSTATask(() => + return STATask.Run(() => { var picker = new DirectoryObjectPickerDialog() { @@ -855,7 +855,7 @@ public static bool SetLinkIcon(string filePath, string iconFile, int iconIndex) } return null; - }); + }, App.Logger); } private static ShellItem? GetFirstFile(ShellItem shi)