From 548524dd09b3017c69216961972ef83c1977536c Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 26 Mar 2025 13:21:30 +0100 Subject: [PATCH 01/14] gui/macOS: Avoid leaking objc objects added to arrays and dicts The array/dict will retain them Signed-off-by: Claudio Cambra --- src/gui/macOS/fileproviderxpc_mac_utils.mm | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/gui/macOS/fileproviderxpc_mac_utils.mm b/src/gui/macOS/fileproviderxpc_mac_utils.mm index eb385d1c42858..fe33492ad48b1 100644 --- a/src/gui/macOS/fileproviderxpc_mac_utils.mm +++ b/src/gui/macOS/fileproviderxpc_mac_utils.mm @@ -78,7 +78,6 @@ } else if (service == nil) { qCWarning(lcFileProviderXPCUtils) << "Service is nil"; } else { - [service retain]; [fpServices addObject:@{service.name: service}]; } dispatch_group_leave(group); @@ -191,7 +190,6 @@ return; } - [connection retain]; [connections addObject:connection]; dispatch_group_leave(group); }]; From 46679e84c310d0bd78a2de742334b53d332a8ca6 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 26 Mar 2025 13:24:05 +0100 Subject: [PATCH 02/14] gui/macOS: Avoid unnecessary retain on alloced objects Fixes leaks Signed-off-by: Claudio Cambra --- src/gui/macOS/fileproviderdomainmanager_mac.mm | 1 - src/gui/macOS/fileprovidersettingscontroller_mac.mm | 1 - src/gui/updater/sparkleupdater_mac.mm | 3 --- 3 files changed, 5 deletions(-) diff --git a/src/gui/macOS/fileproviderdomainmanager_mac.mm b/src/gui/macOS/fileproviderdomainmanager_mac.mm index 233d5adac6be0..1e4807cd4b33d 100644 --- a/src/gui/macOS/fileproviderdomainmanager_mac.mm +++ b/src/gui/macOS/fileproviderdomainmanager_mac.mm @@ -275,7 +275,6 @@ void addFileProviderDomain(const AccountState * const accountState) NSFileProviderDomain * const fileProviderDomain = [[NSFileProviderDomain alloc] initWithIdentifier:domainId.toNSString() displayName:domainDisplayName.toNSString()]; - [fileProviderDomain retain]; [NSFileProviderManager addDomain:fileProviderDomain completionHandler:^(NSError * const error) { if(error) { diff --git a/src/gui/macOS/fileprovidersettingscontroller_mac.mm b/src/gui/macOS/fileprovidersettingscontroller_mac.mm index 9d083300c6b49..d1fd68e69cd81 100644 --- a/src/gui/macOS/fileprovidersettingscontroller_mac.mm +++ b/src/gui/macOS/fileprovidersettingscontroller_mac.mm @@ -194,7 +194,6 @@ void enumerateMaterialisedFilesForDomainManager(NSFileProviderManager * const ma [enumerator retain]; FileProviderStorageUseEnumerationObserver *const storageUseObserver = [[FileProviderStorageUseEnumerationObserver alloc] init]; - [storageUseObserver retain]; storageUseObserver.enumerationFinishedHandler = ^(NSError *const error) { qCInfo(lcFileProviderSettingsController) << "Enumeration finished for" << domain.identifier; if (error != nil) { diff --git a/src/gui/updater/sparkleupdater_mac.mm b/src/gui/updater/sparkleupdater_mac.mm index 05c868e1e8f21..7197ae807be61 100644 --- a/src/gui/updater/sparkleupdater_mac.mm +++ b/src/gui/updater/sparkleupdater_mac.mm @@ -248,13 +248,10 @@ - (NSString *)feedURLStringForUpdater:(SPUUpdater *)updater , _interface(std::make_unique(this)) { _interface->delegate = [[NCSparkleUpdaterDelegate alloc] initWithOwner:_interface.get()]; - [_interface->delegate retain]; - _interface->updaterController = [[SPUStandardUpdaterController alloc] initWithStartingUpdater:YES updaterDelegate:_interface->delegate userDriverDelegate:nil]; - [_interface->updaterController retain]; setUpdateUrl(appCastUrl); From c2f5acab82ea646be1be2a7df7a949340459292e Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 26 Mar 2025 13:24:47 +0100 Subject: [PATCH 03/14] gui/macOS: Constify some Obj-C pointers Signed-off-by: Claudio Cambra --- src/gui/macOS/fileprovideritemmetadata_mac.mm | 2 +- src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm | 2 +- src/gui/macOS/fileproviderxpc_mac_utils.mm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gui/macOS/fileprovideritemmetadata_mac.mm b/src/gui/macOS/fileprovideritemmetadata_mac.mm index d8e64abb68832..ec96674709ea4 100644 --- a/src/gui/macOS/fileprovideritemmetadata_mac.mm +++ b/src/gui/macOS/fileprovideritemmetadata_mac.mm @@ -120,7 +120,7 @@ QString nsNameComponentsToLocalisedQString(NSPersonNameComponents *const nameCom } __block QString returnPath = QObject::tr("Unknown"); - NSFileProviderManager *manager = FileProviderUtils::managerForDomainIdentifier(domainId); + NSFileProviderManager *const manager = FileProviderUtils::managerForDomainIdentifier(domainId); if (manager == nil) { qCWarning(lcMacImplFileProviderItemMetadata) << "Null manager, cannot get item path"; diff --git a/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm b/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm index ec1dd2ce0c98b..646f583b45f79 100644 --- a/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm +++ b/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm @@ -30,7 +30,7 @@ void FileProviderMaterialisedItemsModel::evictItem(const QString &identifier, const QString &domainIdentifier) { - NSFileProviderManager * const manager = FileProviderUtils::managerForDomainIdentifier(domainIdentifier); + NSFileProviderManager *const manager = FileProviderUtils::managerForDomainIdentifier(domainIdentifier); if (manager == nil) { qCWarning(lcMacImplFileProviderMaterialisedItemsModelMac) << "Received null manager for domain" << domainIdentifier diff --git a/src/gui/macOS/fileproviderxpc_mac_utils.mm b/src/gui/macOS/fileproviderxpc_mac_utils.mm index fe33492ad48b1..2d94f1f21799a 100644 --- a/src/gui/macOS/fileproviderxpc_mac_utils.mm +++ b/src/gui/macOS/fileproviderxpc_mac_utils.mm @@ -94,7 +94,7 @@ NSArray *getDomainUrlsForManagers(NSArray *managers) { dispatch_group_t group = dispatch_group_create(); - __block NSMutableArray *urls = NSMutableArray.array; + __block NSMutableArray *const urls = NSMutableArray.array; for (NSFileProviderManager *const manager in managers) { From ebf48b04973a175169568c2c88e815096a883bea Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 26 Mar 2025 13:25:34 +0100 Subject: [PATCH 04/14] gui/macOS: Correctly retain/release manager and domain in sync status object Signed-off-by: Claudio Cambra --- src/gui/macOS/fileproviderdomainsyncstatus_mac.mm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/macOS/fileproviderdomainsyncstatus_mac.mm b/src/gui/macOS/fileproviderdomainsyncstatus_mac.mm index 17e77a680da97..76e88d1fa8e16 100644 --- a/src/gui/macOS/fileproviderdomainsyncstatus_mac.mm +++ b/src/gui/macOS/fileproviderdomainsyncstatus_mac.mm @@ -41,6 +41,7 @@ explicit MacImplementation(const QString &domainIdentifier, FileProviderDomainSy qCWarning(lcMacFileProviderDomainSyncStatus) << "Could not get manager for domain" << domainIdentifier; return; } + [_manager retain]; if (@available(macOS 11.3, *)) { NSProgress *const downloadProgress = [_manager globalProgressForKind:NSProgressFileOperationKindDownloading]; @@ -61,6 +62,8 @@ explicit MacImplementation(const QString &domainIdentifier, FileProviderDomainSy { [_downloadProgressObserver release]; [_uploadProgressObserver release]; + [_domain release]; + [_manager release]; } void updateDownload(NSProgress *const progress) const From d97b5b5711265acda74a796ea276eb3fa69056a9 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 26 Mar 2025 13:26:38 +0100 Subject: [PATCH 05/14] gui/macOS: Do not leak local url and error objects in edit locally job Signed-off-by: Claudio Cambra --- src/gui/macOS/fileprovidereditlocallyjob_mac.mm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/macOS/fileprovidereditlocallyjob_mac.mm b/src/gui/macOS/fileprovidereditlocallyjob_mac.mm index f7ebd1d281e9e..28ff7fd5b237a 100644 --- a/src/gui/macOS/fileprovidereditlocallyjob_mac.mm +++ b/src/gui/macOS/fileprovidereditlocallyjob_mac.mm @@ -87,6 +87,9 @@ << ocId; emit notAvailable(); } + + [itemLocalUrl release]; + [receivedError release]; } } // namespace OCC::Mac From 1b56f2e38a54e6e3d2eb9cfcde1ff865cb0871f1 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 26 Mar 2025 13:28:37 +0100 Subject: [PATCH 06/14] gui/macOS: Properly wait for eviction result in materialised items model Signed-off-by: Claudio Cambra --- src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm b/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm index 646f583b45f79..b2fe54011e025 100644 --- a/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm +++ b/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm @@ -42,7 +42,8 @@ return; } - __block BOOL successfullyDeleted = YES; + __block BOOL successfullyDeleted = NO; + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); [manager evictItemWithIdentifier:identifier.toNSString() completionHandler:^(NSError *error) { if (error != nil) { @@ -51,10 +52,13 @@ Systray::instance()->showMessage(tr("Error"), tr("An error occurred while trying to delete the local copy of this item: %1").arg(errorDesc), QSystemTrayIcon::Warning); - successfullyDeleted = NO; + } else { + successfullyDeleted = YES; } + dispatch_semaphore_signal(semaphore); }]; + dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC)); if (successfullyDeleted == NO) { return; } From 6eca65b888d8c1a4f583cc5d7ac876cb7ffca6dc Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 26 Mar 2025 13:31:00 +0100 Subject: [PATCH 07/14] gui/macOS: Correctly release objects received via FileProviderUtils functions Signed-off-by: Claudio Cambra --- src/gui/macOS/fileprovideritemmetadata_mac.mm | 2 ++ src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm | 2 ++ src/gui/macOS/fileprovidersettingscontroller_mac.mm | 8 +++++++- src/gui/macOS/fileproviderutils.h | 4 ++++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/gui/macOS/fileprovideritemmetadata_mac.mm b/src/gui/macOS/fileprovideritemmetadata_mac.mm index ec96674709ea4..8ff39979f9113 100644 --- a/src/gui/macOS/fileprovideritemmetadata_mac.mm +++ b/src/gui/macOS/fileprovideritemmetadata_mac.mm @@ -147,6 +147,8 @@ QString nsNameComponentsToLocalisedQString(NSPersonNameComponents *const nameCom dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_release(semaphore); + [manager release]; + return returnPath; } diff --git a/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm b/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm index b2fe54011e025..cfa73a14a498b 100644 --- a/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm +++ b/src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm @@ -59,6 +59,8 @@ }]; dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC)); + [manager release]; + if (successfullyDeleted == NO) { return; } diff --git a/src/gui/macOS/fileprovidersettingscontroller_mac.mm b/src/gui/macOS/fileprovidersettingscontroller_mac.mm index d1fd68e69cd81..89e1b76e2b5b8 100644 --- a/src/gui/macOS/fileprovidersettingscontroller_mac.mm +++ b/src/gui/macOS/fileprovidersettingscontroller_mac.mm @@ -167,6 +167,7 @@ void signalFileProviderDomain(const QString &userIdAtHost) const qCInfo(lcFileProviderSettingsController) << "Signalling file provider domain" << userIdAtHost; NSFileProviderDomain * const domain = FileProviderUtils::domainForIdentifier(userIdAtHost); NSFileProviderManager * const manager = [NSFileProviderManager managerForDomain:domain]; + [domain release]; [manager signalEnumeratorForContainerItemIdentifier:NSFileProviderRootContainerItemIdentifier completionHandler:^(NSError *const error) { if (error != nil) { @@ -186,6 +187,7 @@ void signalFileProviderDomain(const QString &userIdAtHost) const } public slots: + // NOTE: This method will release the provided args so make sure to retain them beforehand void enumerateMaterialisedFilesForDomainManager(NSFileProviderManager * const managerForDomain, NSFileProviderDomain * const domain) { @@ -228,6 +230,9 @@ void enumerateMaterialisedFilesForDomainManager(NSFileProviderManager * const ma [storageUseObserver release]; [enumerator release]; + + [managerForDomain release]; + [domain release]; }; [enumerator enumerateItemsForObserver:storageUseObserver startingAtPage:NSFileProviderInitialPageSortedByName]; } @@ -283,7 +288,8 @@ void fetchMaterialisedFilesStorageUsage() << ", returning early."; return; } - + [managerForDomain retain]; + [domain retain]; enumerateMaterialisedFilesForDomainManager(managerForDomain, domain); } }]; diff --git a/src/gui/macOS/fileproviderutils.h b/src/gui/macOS/fileproviderutils.h index 063be6d6d4d72..8a710fccf9602 100644 --- a/src/gui/macOS/fileproviderutils.h +++ b/src/gui/macOS/fileproviderutils.h @@ -29,6 +29,10 @@ class QString; * * You should threfore try to avoid using this in C++ code wherever possible * and only use this in *_mac.mm implementation files. + * + * IMPORTANT: All Objective-C objects returned here need to be released! + * They have been internally retained due to the async nature of the + * FileProvider API. */ namespace OCC { From 44fc083fed7aad3ecf1a56cc78923cd894b9bd51 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 26 Mar 2025 13:34:59 +0100 Subject: [PATCH 08/14] gui/macOS: Use explicit type in connections array arg Signed-off-by: Claudio Cambra --- src/gui/macOS/fileproviderxpc_mac_utils.h | 2 +- src/gui/macOS/fileproviderxpc_mac_utils.mm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/macOS/fileproviderxpc_mac_utils.h b/src/gui/macOS/fileproviderxpc_mac_utils.h index f66d585f6375a..00b70c9e09134 100644 --- a/src/gui/macOS/fileproviderxpc_mac_utils.h +++ b/src/gui/macOS/fileproviderxpc_mac_utils.h @@ -29,6 +29,6 @@ NSArray *connectToFileProviderServices(NSArray *clientCommService); -QHash processClientCommunicationConnections(NSArray *connections); +QHash processClientCommunicationConnections(NSArray *connections); } \ No newline at end of file diff --git a/src/gui/macOS/fileproviderxpc_mac_utils.mm b/src/gui/macOS/fileproviderxpc_mac_utils.mm index 2d94f1f21799a..4549f4853af29 100644 --- a/src/gui/macOS/fileproviderxpc_mac_utils.mm +++ b/src/gui/macOS/fileproviderxpc_mac_utils.mm @@ -249,7 +249,7 @@ void configureFileProviderConnection(NSXPCConnection *const connection) return extensionNcAccount; } -QHash processClientCommunicationConnections(NSArray *const connections) +QHash processClientCommunicationConnections(NSArray *const connections) { QHash clientCommServices; From 5f9f3c31c082a2b45bac096821c6d94700bc0a00 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 26 Mar 2025 13:35:41 +0100 Subject: [PATCH 09/14] gui/macOS: Do not leak debug log string after use Signed-off-by: Claudio Cambra --- src/gui/macOS/fileproviderxpc_mac.mm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/macOS/fileproviderxpc_mac.mm b/src/gui/macOS/fileproviderxpc_mac.mm index 60fe7c2a54f2a..227e48d653142 100644 --- a/src/gui/macOS/fileproviderxpc_mac.mm +++ b/src/gui/macOS/fileproviderxpc_mac.mm @@ -148,6 +148,8 @@ } else { qCWarning(lcFileProviderXPC) << "Could not open debug log file" << filename; } + + [rcvdDebugLogString release]; } bool FileProviderXPC::fileProviderExtReachable(const QString &extensionAccountId, const bool retry, const bool reconfigureOnFail) From 1b296b4afc5b41d164bff474a122ce9ca3b01aea Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 26 Mar 2025 13:44:03 +0100 Subject: [PATCH 10/14] gui/macOS: Improve overall memory management in XPCUtils::getDomainManagers Signed-off-by: Claudio Cambra --- src/gui/macOS/fileproviderxpc_mac_utils.mm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/gui/macOS/fileproviderxpc_mac_utils.mm b/src/gui/macOS/fileproviderxpc_mac_utils.mm index 4549f4853af29..344031144f060 100644 --- a/src/gui/macOS/fileproviderxpc_mac_utils.mm +++ b/src/gui/macOS/fileproviderxpc_mac_utils.mm @@ -30,7 +30,7 @@ NSArray *getDomainManagers() { dispatch_group_t group = dispatch_group_create(); - __block NSMutableArray *managers = NSMutableArray.array; + __block NSMutableArray *const managers = NSMutableArray.array; dispatch_group_enter(group); @@ -45,8 +45,11 @@ for (NSFileProviderDomain *const domain in domains) { qCInfo(lcFileProviderXPCUtils) << "Got domain" << domain.identifier; NSFileProviderManager *const manager = [NSFileProviderManager managerForDomain:domain]; - [manager retain]; - [managers addObject:manager]; + if (manager) { + [managers addObject:manager]; + } else { + qCWarning(lcFileProviderXPCUtils) << "Could not get manager for domain" << domain.identifier; + } } dispatch_group_leave(group); From 3df4cece3a884e1f6bb42717c2a575096b8e66a0 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 26 Mar 2025 13:44:28 +0100 Subject: [PATCH 11/14] gui/macOS: Avoid retain call on extensionNcAccount by allocing new string Signed-off-by: Claudio Cambra --- src/gui/macOS/fileproviderxpc_mac_utils.mm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/gui/macOS/fileproviderxpc_mac_utils.mm b/src/gui/macOS/fileproviderxpc_mac_utils.mm index 344031144f060..42aefe9a3047a 100644 --- a/src/gui/macOS/fileproviderxpc_mac_utils.mm +++ b/src/gui/macOS/fileproviderxpc_mac_utils.mm @@ -244,8 +244,7 @@ void configureFileProviderConnection(NSXPCConnection *const connection) dispatch_group_leave(group); return; } - extensionNcAccount = [NSString stringWithString:extensionAccountId]; - [extensionNcAccount retain]; + extensionNcAccount = [[NSString alloc] initWithString:extensionAccountId]; dispatch_group_leave(group); }]; dispatch_group_wait(group, DISPATCH_TIME_FOREVER); From 90a66f5a5db3a8dba9af891e48a981d9efd9cfa0 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 26 Mar 2025 17:53:42 +0100 Subject: [PATCH 12/14] gui/macOS: Avoid crash from bad manager release Signed-off-by: Claudio Cambra --- src/gui/macOS/fileprovideritemmetadata_mac.mm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/gui/macOS/fileprovideritemmetadata_mac.mm b/src/gui/macOS/fileprovideritemmetadata_mac.mm index 8ff39979f9113..9a4e00c89be40 100644 --- a/src/gui/macOS/fileprovideritemmetadata_mac.mm +++ b/src/gui/macOS/fileprovideritemmetadata_mac.mm @@ -122,7 +122,7 @@ QString nsNameComponentsToLocalisedQString(NSPersonNameComponents *const nameCom __block QString returnPath = QObject::tr("Unknown"); NSFileProviderManager *const manager = FileProviderUtils::managerForDomainIdentifier(domainId); - if (manager == nil) { + if (manager == nil) { qCWarning(lcMacImplFileProviderItemMetadata) << "Null manager, cannot get item path"; return returnPath; } @@ -147,8 +147,6 @@ QString nsNameComponentsToLocalisedQString(NSPersonNameComponents *const nameCom dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_release(semaphore); - [manager release]; - return returnPath; } From de082e05f3a9fb327af4db744134b0ac18fd5ee5 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 27 Mar 2025 11:45:13 +0100 Subject: [PATCH 13/14] gui/macOS: Avoid need to retain/release things in file provider edit locally Signed-off-by: Claudio Cambra --- .../macOS/fileprovidereditlocallyjob_mac.mm | 56 ++++++++----------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/src/gui/macOS/fileprovidereditlocallyjob_mac.mm b/src/gui/macOS/fileprovidereditlocallyjob_mac.mm index 28ff7fd5b237a..ec5ffcc755b0f 100644 --- a/src/gui/macOS/fileprovidereditlocallyjob_mac.mm +++ b/src/gui/macOS/fileprovidereditlocallyjob_mac.mm @@ -44,8 +44,7 @@ NSFileProviderDomain *const domain = (NSFileProviderDomain *)voidDomain; if (domain == nil) { - qCWarning(lcFileProviderEditLocallyMacJob) << "Could not get domain for account:" - << userId; + qCWarning(lcFileProviderEditLocallyMacJob) << "Could not get domain for account:" << userId; emit notAvailable(); } @@ -56,40 +55,33 @@ emit notAvailable(); } - dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); - __block NSError *receivedError; - __block NSURL *itemLocalUrl; [manager getUserVisibleURLForItemIdentifier:nsOcId completionHandler:^(NSURL *const url, NSError *const error) { - [url retain]; - [error retain]; - itemLocalUrl = url; - receivedError = error; - dispatch_semaphore_signal(semaphore); - }]; - dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); - - Systray::instance()->destroyEditFileLocallyLoadingDialog(); - if (receivedError != nil) { - const auto errorMessage = QString::fromNSString(receivedError.localizedDescription); - qCWarning(lcFileProviderEditLocallyMacJob) << "Error getting user visible URL for item" - << ocId << ":" << errorMessage; - emit notAvailable(); - } else if (itemLocalUrl != nil) { - const auto itemLocalPath = QString::fromNSString(itemLocalUrl.path); - qCDebug(lcFileProviderEditLocallyMacJob) << "Got user visible URL for item" - << ocId << ":" << itemLocalPath; - [NSWorkspace.sharedWorkspace openURL:itemLocalUrl]; - emit finished(); - } else { - qCWarning(lcFileProviderEditLocallyMacJob) << "Got nil user visible URL for item" - << ocId; - emit notAvailable(); - } + dispatch_async(dispatch_get_main_queue(), ^{ + Systray::instance()->destroyEditFileLocallyLoadingDialog(); + }); - [itemLocalUrl release]; - [receivedError release]; + if (error != nil) { + const auto errorMessage = QString::fromNSString(error.localizedDescription); + qCWarning(lcFileProviderEditLocallyMacJob) << "Error getting user visible URL for item:" << errorMessage; + dispatch_async(dispatch_get_main_queue(), ^{ + emit notAvailable(); + }); + } else if (url != nil) { + const auto itemLocalPath = QString::fromNSString(url.path); + qCDebug(lcFileProviderEditLocallyMacJob) << "Got user visible URL for item:" << itemLocalPath; + [NSWorkspace.sharedWorkspace openURL:url]; + dispatch_async(dispatch_get_main_queue(), ^{ + emit finished(); + }); + } else { + qCWarning(lcFileProviderEditLocallyMacJob) << "Got nil user visible URL for item" << ocId; + dispatch_async(dispatch_get_main_queue(), ^{ + emit notAvailable(); + }); + } + }]; } } // namespace OCC::Mac From e91a0c181cad80468b5cd37545573ec54a8e1800 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 27 Mar 2025 13:07:37 +0100 Subject: [PATCH 14/14] gui/macOS: Properly retain/release NSFileProviderManager(s) Signed-off-by: Claudio Cambra --- src/gui/macOS/fileprovidereditlocallyjob_mac.mm | 2 ++ src/gui/macOS/fileprovideritemmetadata_mac.mm | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/gui/macOS/fileprovidereditlocallyjob_mac.mm b/src/gui/macOS/fileprovidereditlocallyjob_mac.mm index ec5ffcc755b0f..483fc08ece05f 100644 --- a/src/gui/macOS/fileprovidereditlocallyjob_mac.mm +++ b/src/gui/macOS/fileprovidereditlocallyjob_mac.mm @@ -55,6 +55,7 @@ emit notAvailable(); } + [manager retain]; [manager getUserVisibleURLForItemIdentifier:nsOcId completionHandler:^(NSURL *const url, NSError *const error) { @@ -81,6 +82,7 @@ emit notAvailable(); }); } + [manager release]; }]; } diff --git a/src/gui/macOS/fileprovideritemmetadata_mac.mm b/src/gui/macOS/fileprovideritemmetadata_mac.mm index 9a4e00c89be40..8b79a60bd3432 100644 --- a/src/gui/macOS/fileprovideritemmetadata_mac.mm +++ b/src/gui/macOS/fileprovideritemmetadata_mac.mm @@ -132,6 +132,7 @@ QString nsNameComponentsToLocalisedQString(NSPersonNameComponents *const nameCom // getUserVisibleUrl is async, so wait here + [manager retain]; [manager getUserVisibleURLForItemIdentifier:nsItemIdentifier completionHandler:^(NSURL *const userVisibleFile, NSError *const error) { @@ -141,6 +142,7 @@ QString nsNameComponentsToLocalisedQString(NSPersonNameComponents *const nameCom returnPath = QString::fromNSString(userVisibleFile.path); } + [manager release]; dispatch_semaphore_signal(semaphore); }];