diff --git a/src/gui/macOS/fileproviderxpc.h b/src/gui/macOS/fileproviderxpc.h index 3ce1628395..79613edaca 100644 --- a/src/gui/macOS/fileproviderxpc.h +++ b/src/gui/macOS/fileproviderxpc.h @@ -13,10 +13,9 @@ */ #include +#include -#import - -#import "ClientCommunicationProtocol.h" +#include "accountstate.h" #pragma once @@ -39,10 +38,7 @@ private slots: void slotAccountStateChanged(AccountState::State state) const; private: - void setupConnections(); - void processConnections(NSArray *const services); - - NSDictionary *_clientCommServices; + QHash _clientCommServices; }; } // namespace OCC::Mac diff --git a/src/gui/macOS/fileproviderxpc_mac.mm b/src/gui/macOS/fileproviderxpc_mac.mm index 19db91e0eb..29570e039b 100644 --- a/src/gui/macOS/fileproviderxpc_mac.mm +++ b/src/gui/macOS/fileproviderxpc_mac.mm @@ -35,44 +35,14 @@ void FileProviderXPC::connectToExtensions() const auto domainUrls = FileProviderXPCUtils::getDomainUrlsForManagers(managers); const auto fpServices = FileProviderXPCUtils::getFileProviderServicesAtUrls(domainUrls); const auto connections = FileProviderXPCUtils::connectToFileProviderServices(fpServices); - processConnections(connections); -} - -void FileProviderXPC::processConnections(NSArray *const connections) -{ - NSMutableDictionary*> *const clientCommServices = NSMutableDictionary.dictionary; - - for (NSXPCConnection * const connection in connections) { - const auto remoteObjectInterfaceProtocol = @protocol(ClientCommunicationProtocol); - connection.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:remoteObjectInterfaceProtocol]; - FileProviderXPCUtils::configureFileProviderConnection(connection); - - const auto clientCommService = (NSObject *)FileProviderXPCUtils::getRemoteServiceObject(connection, remoteObjectInterfaceProtocol); - if (clientCommService == nil) { - qCWarning(lcFileProviderXPC) << "Client communication service is nil"; - continue; - } - [clientCommService retain]; - - const auto extensionNcAccount = FileProviderXPCUtils::getExtensionAccountId(clientCommService); - if (extensionNcAccount == nil) { - qCWarning(lcFileProviderXPC) << "Extension account id is nil"; - continue; - } - qCInfo(lcFileProviderXPC) << "Got extension account id" << extensionNcAccount.UTF8String; - [clientCommServices setObject:clientCommService forKey:extensionNcAccount]; - } - - _clientCommServices = clientCommServices.copy; + _clientCommServices = FileProviderXPCUtils::processClientCommunicationConnections(connections); } void FileProviderXPC::configureExtensions() { - for (NSString *const extensionNcAccount in _clientCommServices) { + for (const auto &extensionNcAccount : _clientCommServices.keys()) { qCInfo(lcFileProviderXPC) << "Sending message to client communication service"; - - const auto qExtensionNcAccount = QString::fromNSString(extensionNcAccount); - authenticateExtension(qExtensionNcAccount); + authenticateExtension(extensionNcAccount); } } @@ -95,8 +65,7 @@ void FileProviderXPC::authenticateExtension(const QString &extensionAccountId) c NSString *const serverUrl = account->url().toString().toNSString(); NSString *const password = credentials->password().toNSString(); - const auto nsExtensionNcAccount = extensionAccountId.toNSString(); - NSObject *const clientCommService = [_clientCommServices objectForKey:nsExtensionNcAccount]; + const auto clientCommService = (NSObject *)_clientCommServices.value(extensionAccountId); [clientCommService configureAccountWithUser:user serverUrl:serverUrl password:password]; @@ -106,7 +75,7 @@ void FileProviderXPC::unauthenticateExtension(const QString &extensionAccountId) { qCInfo(lcFileProviderXPC) << "Unauthenticating extension" << extensionAccountId; NSString *const nsExtensionAccountId = extensionAccountId.toNSString(); - NSObject *const clientCommService = [_clientCommServices objectForKey:nsExtensionAccountId]; + const auto clientCommService = (NSObject *)_clientCommServices.value(extensionAccountId); [clientCommService removeAccountConfig]; } diff --git a/src/gui/macOS/fileproviderxpc_mac_utils.h b/src/gui/macOS/fileproviderxpc_mac_utils.h index 2e4aed958a..ceda2b55f7 100644 --- a/src/gui/macOS/fileproviderxpc_mac_utils.h +++ b/src/gui/macOS/fileproviderxpc_mac_utils.h @@ -28,5 +28,6 @@ NSArray *connectToFileProviderServices(NSArray *clientCommService); +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 964d248221..3038e72eed 100644 --- a/src/gui/macOS/fileproviderxpc_mac_utils.mm +++ b/src/gui/macOS/fileproviderxpc_mac_utils.mm @@ -219,4 +219,32 @@ NSString *getExtensionAccountId(NSObject *const cli return extensionNcAccount; } +QHash processClientCommunicationConnections(NSArray *const connections) +{ + QHash clientCommServices; + + for (NSXPCConnection * const connection in connections) { + const auto remoteObjectInterfaceProtocol = @protocol(ClientCommunicationProtocol); + connection.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:remoteObjectInterfaceProtocol]; + configureFileProviderConnection(connection); + + const auto clientCommService = (NSObject *)getRemoteServiceObject(connection, remoteObjectInterfaceProtocol); + if (clientCommService == nil) { + qCWarning(lcFileProviderXPCUtils) << "Client communication service is nil"; + continue; + } + [clientCommService retain]; + + const auto extensionNcAccount = getExtensionAccountId(clientCommService); + if (extensionNcAccount == nil) { + qCWarning(lcFileProviderXPCUtils) << "Extension account id is nil"; + continue; + } + qCInfo(lcFileProviderXPCUtils) << "Got extension account id" << extensionNcAccount.UTF8String; + clientCommServices.insert(QString::fromNSString(extensionNcAccount), clientCommService); + } + + return clientCommServices; +} + } // namespace OCC::Mac::FileProviderXPCUtils