Ensure file provider domain pointers are correctly retained and released in fileproviderdomainmanager

Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
This commit is contained in:
Claudio Cambra 2023-03-11 13:34:16 +01:00
parent dcf39aa9d0
commit ddd564bc5c
No known key found for this signature in database
GPG Key ID: C839200C384636B0

View File

@ -46,6 +46,11 @@ class FileProviderDomainManager::Private {
<< error.localizedDescription;
}
if (domains.count == 0) {
qCDebug(lcMacFileProviderDomainManager) << "Found no existing file provider domains";
return;
}
for (NSFileProviderDomain * const domain in domains) {
const auto accountId = QString::fromNSString(domain.identifier);
@ -56,6 +61,7 @@ class FileProviderDomainManager::Private {
qCDebug(lcMacFileProviderDomainManager) << "Found existing file provider domain for account:"
<< accountState->account()->displayName();
[domain retain];
_registeredDomains.insert(accountId, domain);
} else {
@ -87,6 +93,8 @@ class FileProviderDomainManager::Private {
NSFileProviderDomain * const fileProviderDomain = [[NSFileProviderDomain alloc] initWithIdentifier:accountId.toNSString()
displayName:accountDisplayName.toNSString()];
[fileProviderDomain retain];
[NSFileProviderManager addDomain:fileProviderDomain completionHandler:^(NSError * const error) {
if(error) {
qCDebug(lcMacFileProviderDomainManager) << "Error adding file provider domain: "
@ -131,7 +139,13 @@ class FileProviderDomainManager::Private {
qCDebug(lcMacFileProviderDomainManager) << "Error removing all file provider domains: "
<< error.code
<< error.localizedDescription;
return;
}
for (NSFileProviderDomain * const domain : _registeredDomains.values()) {
[domain release];
}
_registeredDomains.clear();
}];
}
@ -158,6 +172,11 @@ class FileProviderDomainManager::Private {
<< error.localizedDescription;
return;
}
NSFileProviderDomain * const registeredDomainPtr = _registeredDomains.take(QString::fromNSString(domain.identifier));
if (registeredDomainPtr != nil) {
[domain release];
}
}];
}
}];
@ -174,6 +193,8 @@ class FileProviderDomainManager::Private {
}
NSFileProviderDomain * const fileProviderDomain = _registeredDomains[accountId];
Q_ASSERT(fileProviderDomain != nil);
NSFileProviderManager * const fpManager = [NSFileProviderManager managerForDomain:fileProviderDomain];
[fpManager signalEnumeratorForContainerItemIdentifier:NSFileProviderWorkingSetContainerItemIdentifier completionHandler:^(NSError * const error) {
if (error != nil) {