Get services using better non-url based method if available (macOS 13.0+)

Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
This commit is contained in:
Claudio Cambra 2024-01-23 18:05:40 +08:00
parent 798f77fa2b
commit 58dc42a521
3 changed files with 38 additions and 2 deletions

View File

@ -33,8 +33,7 @@ void FileProviderXPC::connectToExtensions()
{
qCInfo(lcFileProviderXPC) << "Starting file provider XPC";
const auto managers = FileProviderXPCUtils::getDomainManagers();
const auto domainUrls = FileProviderXPCUtils::getDomainUrlsForManagers(managers);
const auto fpServices = FileProviderXPCUtils::getFileProviderServicesAtUrls(domainUrls);
const auto fpServices = FileProviderXPCUtils::getFileProviderServices(managers);
const auto connections = FileProviderXPCUtils::connectToFileProviderServices(fpServices);
_clientCommServices = FileProviderXPCUtils::processClientCommunicationConnections(connections);
}

View File

@ -23,6 +23,7 @@ namespace OCC::Mac::FileProviderXPCUtils {
NSArray<NSFileProviderManager *> *getDomainManagers();
NSArray<NSURL *> *getDomainUrlsForManagers(NSArray<NSFileProviderManager *> *managers);
NSArray<NSDictionary<NSFileProviderServiceName, NSFileProviderService *> *> *getFileProviderServices(NSArray<NSFileProviderManager *> *managers);
NSArray<NSDictionary<NSFileProviderServiceName, NSFileProviderService *> *> *getFileProviderServicesAtUrls(NSArray<NSURL *> *urls);
NSArray<NSXPCConnection *> *connectToFileProviderServices(NSArray<NSDictionary<NSFileProviderServiceName, NSFileProviderService *> *> *fpServices);
void configureFileProviderConnection(NSXPCConnection *connection);

View File

@ -60,6 +60,42 @@ NSArray<NSFileProviderManager *> *getDomainManagers()
return managers.copy;
}
// TODO: This should work for all service names, not just the communication service!
NSArray<NSDictionary<NSFileProviderServiceName, NSFileProviderService *> *> *getFileProviderServices(NSArray<NSFileProviderManager *> *managers)
{
if (@available(macOS 13.0, *)) {
NSMutableArray<NSDictionary<NSFileProviderServiceName, NSFileProviderService *> *> *const fpServices = NSMutableArray.array;
dispatch_group_t group = dispatch_group_create();
for (NSFileProviderManager *const manager in managers) {
__block NSFileProviderService *acquiredService;
dispatch_group_enter(group);
[manager getServiceWithName:nsClientCommunicationServiceName
itemIdentifier:NSFileProviderRootContainerItemIdentifier
completionHandler:^(NSFileProviderService *const service, NSError *const error) {
if (error != nil) {
qCWarning(lcFileProviderXPCUtils) << "Error getting file provider service" << error;
dispatch_group_leave(group);
return;
} else if (service == nil) {
qCWarning(lcFileProviderXPCUtils) << "Service is nil";
dispatch_group_leave(group);
return;
}
[service retain];
[fpServices addObject:@{acquiredService.name: acquiredService}];
dispatch_group_leave(group);
}];
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
}
return fpServices.copy;
} else {
const auto domainUrls = FileProviderXPCUtils::getDomainUrlsForManagers(managers);
return FileProviderXPCUtils::getFileProviderServicesAtUrls(domainUrls);
}
}
NSArray<NSURL *> *getDomainUrlsForManagers(NSArray<NSFileProviderManager *> *managers)
{
dispatch_group_t group = dispatch_group_create();