From 58dc42a5212e9964e4e16b17672af8d15ce3c6e2 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Tue, 23 Jan 2024 18:05:40 +0800 Subject: [PATCH] Get services using better non-url based method if available (macOS 13.0+) Signed-off-by: Claudio Cambra --- src/gui/macOS/fileproviderxpc_mac.mm | 3 +- src/gui/macOS/fileproviderxpc_mac_utils.h | 1 + src/gui/macOS/fileproviderxpc_mac_utils.mm | 36 ++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/gui/macOS/fileproviderxpc_mac.mm b/src/gui/macOS/fileproviderxpc_mac.mm index 1262422770..399c1af6d4 100644 --- a/src/gui/macOS/fileproviderxpc_mac.mm +++ b/src/gui/macOS/fileproviderxpc_mac.mm @@ -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); } diff --git a/src/gui/macOS/fileproviderxpc_mac_utils.h b/src/gui/macOS/fileproviderxpc_mac_utils.h index ceda2b55f7..f66d585f63 100644 --- a/src/gui/macOS/fileproviderxpc_mac_utils.h +++ b/src/gui/macOS/fileproviderxpc_mac_utils.h @@ -23,6 +23,7 @@ namespace OCC::Mac::FileProviderXPCUtils { NSArray *getDomainManagers(); NSArray *getDomainUrlsForManagers(NSArray *managers); +NSArray *> *getFileProviderServices(NSArray *managers); NSArray *> *getFileProviderServicesAtUrls(NSArray *urls); NSArray *connectToFileProviderServices(NSArray *> *fpServices); void configureFileProviderConnection(NSXPCConnection *connection); diff --git a/src/gui/macOS/fileproviderxpc_mac_utils.mm b/src/gui/macOS/fileproviderxpc_mac_utils.mm index 3038e72eed..da1d9a6316 100644 --- a/src/gui/macOS/fileproviderxpc_mac_utils.mm +++ b/src/gui/macOS/fileproviderxpc_mac_utils.mm @@ -60,6 +60,42 @@ NSArray *getDomainManagers() return managers.copy; } +// TODO: This should work for all service names, not just the communication service! +NSArray *> *getFileProviderServices(NSArray *managers) +{ + if (@available(macOS 13.0, *)) { + NSMutableArray *> *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 *getDomainUrlsForManagers(NSArray *managers) { dispatch_group_t group = dispatch_group_create();