Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rewrite communication between client and File Provider extensions using XPC #6324

Merged
merged 52 commits into from
Feb 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
22c176a
Add starter client communication service
claucambra Nov 21, 2023
a2d69fc
Keep pointer to FileProviderExtension around in ClientCommunicationSe…
claucambra Nov 21, 2023
e763a9d
Add ClientCommunicationProtocol
claucambra Nov 21, 2023
dd39991
Implement ClientCommunicationProtocol in ClientCommunicationService
claucambra Nov 21, 2023
026f082
Reimplement ClientCommunicationService in Swift
claucambra Nov 21, 2023
ac43369
Properly implement listener should accept connection in ClientCommuni…
claucambra Nov 21, 2023
5cc8b6e
Add starter FileProviderXPC class on client side
claucambra Nov 21, 2023
e8c1bbb
Add relative symlink to ClientCommunicationProtocol in srd/gui/macOS
claucambra Nov 22, 2023
9dddaf4
Fix logging for fileproviderdomainmanager
claucambra Nov 22, 2023
2520111
Implement connection begin in XPC
claucambra Nov 22, 2023
0b505a9
Flatten FileProviderXPC::start()
claucambra Nov 22, 2023
d4d0cf5
Fix retain issues with domains in FileProviderXPC
claucambra Nov 22, 2023
a6e3f18
Ensure FileProvider components instantiated after account setup
claucambra Nov 22, 2023
5f6f7f3
Add extensionAccountId property to ClientCommunicationProtocol
claucambra Dec 5, 2023
ee82968
Cache NSXPCConnections when starting FileProviderXPC
claucambra Dec 5, 2023
2d1e5ba
Ensure the listener is resumed once the endpoint is created in the ex…
claucambra Dec 11, 2023
eb774ad
Check for protocol type in fileproviderxpc start
claucambra Dec 11, 2023
6cb7169
Log extension id sent over XPC publicly
claucambra Dec 12, 2023
7716860
Retrieve extension account ids over XPC, store client comm service pe…
claucambra Dec 12, 2023
59b8b8e
Upon acquisition of client communication services, send account confi…
claucambra Dec 27, 2023
8eaf4e6
Move domain manager acquisition into separate function
claucambra Dec 27, 2023
4a8d501
Move domain url acquisition to separate function
claucambra Dec 27, 2023
a0376a2
Move acquisition of file provider services to different function
claucambra Dec 27, 2023
5ee2cfa
Moved XPC Utils into separate file
claucambra Dec 27, 2023
95bebc5
Clean up FileProviderXPC code, separate everything into single-respon…
claucambra Dec 27, 2023
6f5b07c
Fix clientcommservices datatype
claucambra Dec 28, 2023
5ed456f
Implement NSFileProviderServicing in FileProviderExtension
claucambra Jan 2, 2024
595c23c
Extract file provider connection configuration into separate util fun…
claucambra Jan 2, 2024
c9997ce
Extract remote service object acquisistion from connection into separ…
claucambra Jan 2, 2024
8a8d3b3
Remove redundant static in anonymous fileproviderxpc utils namespace
claucambra Jan 2, 2024
23a3a3e
Extract account id acquisition from clientCommService into separate f…
claucambra Jan 2, 2024
502d738
Cast clientCommServices to NSObject with correct protocol
claucambra Jan 2, 2024
f728ec1
Add method to unauthenticate file provider extension in FileProviderXPC
claucambra Jan 2, 2024
94bfa03
Define NSDictionary types in _clientCommServices
claucambra Jan 2, 2024
c1fa662
Move extension authentication into separate method
claucambra Jan 2, 2024
0856138
Implement recognition of account state changing in FileProviderXPC
claucambra Jan 2, 2024
fca6b37
Fix clang-tidy namespace concatenation warning
claucambra Jan 2, 2024
784cd12
Remove all obj-c classes from fileproviderxpc.h
claucambra Jan 2, 2024
be3bd7b
Do not shadow sender()
claucambra Jan 2, 2024
6d4e785
Remove unused extension ID NSString
claucambra Jan 2, 2024
43b7ae5
Use accountStateFromFileProviderDomainIdentifier method in authentica…
claucambra Jan 2, 2024
798f77f
Improve domain discovery logging
claucambra Jan 2, 2024
58dc42a
Get services using better non-url based method if available (macOS 13…
claucambra Jan 23, 2024
4238912
Separate starting of domain manager tasks from constructor
claucambra Jan 23, 2024
45b1231
Separate XPC init from file provider constructor
claucambra Jan 23, 2024
a01e552
Only start XPC after file provider domains have been configured
claucambra Jan 23, 2024
a44454d
Simplify and clarify utility of socket system for file provider
claucambra Jan 23, 2024
41133e4
Clarify utility of xpc system for file provider
claucambra Jan 23, 2024
b22f463
Add explainer to client interface
claucambra Jan 23, 2024
9611e47
Simplify xpc service acquisition completion handler
claucambra Jan 23, 2024
71119fe
Improve socket controller logging
claucambra Jan 30, 2024
3334b4e
Do not reconfigure file provider extension account if we are receivin…
claucambra Jan 30, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Copyright (C) 2023 by Claudio Cambra <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/

#ifndef FileProviderExt_Bridging_Header_h
#define FileProviderExt_Bridging_Header_h

#import "Services/ClientCommunicationProtocol.h"

#endif /* FileProviderExt_Bridging_Header_h */
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,38 @@ import NCDesktopClientSocketKit
import NextcloudKit
import OSLog

extension FileProviderExtension {
func sendFileProviderDomainIdentifier() {
extension FileProviderExtension: NSFileProviderServicing {
/*
This FileProviderExtension extension contains everything needed to communicate with the client.
We have two systems for communicating between the extensions and the client.
Apple's XPC based File Provider APIs let us easily communicate client -> extension.
This is what ClientCommunicationService is for.
We also use sockets, because the File Provider XPC system does not let us easily talk from
extension->client.
We need this because the extension needs to be able to request account details. We can't
reliably do this via XPC because the extensions get torn down by the system, out of the control
of the app, and we can receive nil/no services from NSFileProviderManager. Once this is done
then XPC works ok.
*/
func supportedServiceSources(
for itemIdentifier: NSFileProviderItemIdentifier,
completionHandler: @escaping ([NSFileProviderServiceSource]?, Error?) -> Void
) -> Progress {
Logger.desktopClientConnection.debug("Serving supported service sources")
let clientCommService = ClientCommunicationService(fpExtension: self)
let services = [clientCommService]
completionHandler(services, nil)
let progress = Progress()
progress.cancellationHandler = {
let error = NSError(domain: NSCocoaErrorDomain, code: NSUserCancelledError)
completionHandler(nil, error)
}
return progress
}

@objc func sendFileProviderDomainIdentifier() {
let command = "FILE_PROVIDER_DOMAIN_IDENTIFIER_REQUEST_REPLY"
let argument = domain.identifier.rawValue
let message = command + ":" + argument + "\n"
Expand Down Expand Up @@ -57,16 +87,18 @@ extension FileProviderExtension {
}
}

func setupDomainAccount(user: String, serverUrl: String, password: String) {
ncAccount = NextcloudAccount(user: user, serverUrl: serverUrl, password: password)
@objc func setupDomainAccount(user: String, serverUrl: String, password: String) {
let newNcAccount = NextcloudAccount(user: user, serverUrl: serverUrl, password: password)
guard newNcAccount != ncAccount else { return }
ncAccount = newNcAccount
ncKit.setup(
user: ncAccount!.username,
userId: ncAccount!.username,
password: ncAccount!.password,
urlBase: ncAccount!.serverUrl,
userAgent: "Nextcloud-macOS/FileProviderExt",
nextcloudVersion: 25,
delegate: nil) // TODO: add delegate methods for self
delegate: nil) // TODO: add delegate methods for self

Logger.fileProviderExtension.info(
"Nextcloud account set up in File Provider extension for user: \(user, privacy: .public) at server: \(serverUrl, privacy: .public)"
Expand All @@ -75,7 +107,7 @@ extension FileProviderExtension {
signalEnumeratorAfterAccountSetup()
}

func removeAccountConfig() {
@objc func removeAccountConfig() {
Logger.fileProviderExtension.info(
"Received instruction to remove account data for user \(self.ncAccount!.username, privacy: .public) at server \(self.ncAccount!.serverUrl, privacy: .public)"
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import NCDesktopClientSocketKit
import NextcloudKit
import OSLog

class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension, NKCommonDelegate {
@objc class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension, NKCommonDelegate {
let domain: NSFileProviderDomain
let ncKit = NextcloudKit()
let appGroupIdentifier = Bundle.main.object(forInfoDictionaryKey: "SocketApiPrefix") as? String
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import FileProvider
import Foundation

class NextcloudAccount: NSObject {
struct NextcloudAccount: Equatable {
static let webDavFilesUrlSuffix: String = "/remote.php/dav/files/"
let username, password, ncKitAccount, serverUrl, davFilesUrl: String

Expand All @@ -25,7 +25,5 @@ class NextcloudAccount: NSObject {
ncKitAccount = user + " " + serverUrl
self.serverUrl = serverUrl
davFilesUrl = serverUrl + NextcloudAccount.webDavFilesUrlSuffix + user

super.init()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* Copyright (C) 2023 by Claudio Cambra <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/

#ifndef ClientCommunicationProtocol_h
#define ClientCommunicationProtocol_h

#import <Foundation/Foundation.h>

Check failure on line 18 in shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Services/ClientCommunicationProtocol.h

View workflow job for this annotation

GitHub Actions / build

shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Services/ClientCommunicationProtocol.h:18:9 [clang-diagnostic-error]

'Foundation/Foundation.h' file not found

Check failure on line 18 in shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Services/ClientCommunicationProtocol.h

View workflow job for this annotation

GitHub Actions / build

shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Services/ClientCommunicationProtocol.h:18:9 [clang-diagnostic-error]

'Foundation/Foundation.h' file not found
claucambra marked this conversation as resolved.
Show resolved Hide resolved
claucambra marked this conversation as resolved.
Show resolved Hide resolved

@protocol ClientCommunicationProtocol

- (void)getExtensionAccountIdWithCompletionHandler:(void(^)(NSString *extensionAccountId, NSError *error))completionHandler;
- (void)configureAccountWithUser:(NSString *)user
serverUrl:(NSString *)serverUrl
password:(NSString *)password;
- (void)removeAccountConfig;

@end

#endif /* ClientCommunicationProtocol_h */
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/*
* Copyright (C) 2023 by Claudio Cambra <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/

import Foundation
import FileProvider
import OSLog

class ClientCommunicationService: NSObject, NSFileProviderServiceSource, NSXPCListenerDelegate, ClientCommunicationProtocol {
let listener = NSXPCListener.anonymous()
let serviceName = NSFileProviderServiceName("com.nextcloud.desktopclient.ClientCommunicationService")
let fpExtension: FileProviderExtension

init(fpExtension: FileProviderExtension) {
Logger.desktopClientConnection.debug("Instantiating client communication service")
self.fpExtension = fpExtension
super.init()
}

func makeListenerEndpoint() throws -> NSXPCListenerEndpoint {
listener.delegate = self
listener.resume()
return listener.endpoint
}

func listener(_ listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool {
newConnection.exportedInterface = NSXPCInterface(with: ClientCommunicationProtocol.self)
newConnection.exportedObject = self
newConnection.resume()
return true
}

//MARK: - Client Communication Protocol methods

func getExtensionAccountId(completionHandler: @escaping (String?, Error?) -> Void) {
let accountUserId = self.fpExtension.domain.identifier.rawValue
Logger.desktopClientConnection.info("Sending extension account ID \(accountUserId, privacy: .public)")
completionHandler(accountUserId, nil)
}

func configureAccount(withUser user: String,
serverUrl: String,
password: String) {
Logger.desktopClientConnection.info("Received configure account information over client communication service")
self.fpExtension.setupDomainAccount(user: user,
serverUrl: serverUrl,
password: password)
}

func removeAccountConfig() {
self.fpExtension.removeAccountConfig()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 52;
objectVersion = 54;
objects = {

/* Begin PBXBuildFile section */
Expand All @@ -15,6 +15,7 @@
5318AD9529BF438F00CBB71C /* NextcloudLocalFileMetadataTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5318AD9429BF438F00CBB71C /* NextcloudLocalFileMetadataTable.swift */; };
5318AD9729BF493600CBB71C /* FileProviderMaterialisedEnumerationObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5318AD9629BF493600CBB71C /* FileProviderMaterialisedEnumerationObserver.swift */; };
5318AD9929BF58D000CBB71C /* NKError+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5318AD9829BF58D000CBB71C /* NKError+Extensions.swift */; };
5350E4E92B0C534A00F276CB /* ClientCommunicationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5350E4E82B0C534A00F276CB /* ClientCommunicationService.swift */; };
5352B36629DC14970011CE03 /* NextcloudFilesDatabaseManager+Directories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5352B36529DC14970011CE03 /* NextcloudFilesDatabaseManager+Directories.swift */; };
5352B36829DC17D60011CE03 /* NextcloudFilesDatabaseManager+LocalFiles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5352B36729DC17D60011CE03 /* NextcloudFilesDatabaseManager+LocalFiles.swift */; };
5352B36C29DC44B50011CE03 /* FileProviderExtension+Thumbnailing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5352B36B29DC44B50011CE03 /* FileProviderExtension+Thumbnailing.swift */; };
Expand Down Expand Up @@ -145,6 +146,9 @@
5318AD9429BF438F00CBB71C /* NextcloudLocalFileMetadataTable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextcloudLocalFileMetadataTable.swift; sourceTree = "<group>"; };
5318AD9629BF493600CBB71C /* FileProviderMaterialisedEnumerationObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileProviderMaterialisedEnumerationObserver.swift; sourceTree = "<group>"; };
5318AD9829BF58D000CBB71C /* NKError+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NKError+Extensions.swift"; sourceTree = "<group>"; };
5350E4E72B0C514400F276CB /* ClientCommunicationProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ClientCommunicationProtocol.h; sourceTree = "<group>"; };
5350E4E82B0C534A00F276CB /* ClientCommunicationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientCommunicationService.swift; sourceTree = "<group>"; };
5350E4EA2B0C9CE100F276CB /* FileProviderExt-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "FileProviderExt-Bridging-Header.h"; sourceTree = "<group>"; };
5352B36529DC14970011CE03 /* NextcloudFilesDatabaseManager+Directories.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NextcloudFilesDatabaseManager+Directories.swift"; sourceTree = "<group>"; };
5352B36729DC17D60011CE03 /* NextcloudFilesDatabaseManager+LocalFiles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NextcloudFilesDatabaseManager+LocalFiles.swift"; sourceTree = "<group>"; };
5352B36B29DC44B50011CE03 /* FileProviderExtension+Thumbnailing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FileProviderExtension+Thumbnailing.swift"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -238,6 +242,15 @@
path = Database;
sourceTree = "<group>";
};
5350E4C72B0C368B00F276CB /* Services */ = {
isa = PBXGroup;
children = (
5350E4E72B0C514400F276CB /* ClientCommunicationProtocol.h */,
5350E4E82B0C534A00F276CB /* ClientCommunicationService.swift */,
);
path = Services;
sourceTree = "<group>";
};
5352E85929B7BFB4002CE85C /* Extensions */ = {
isa = PBXGroup;
children = (
Expand All @@ -259,6 +272,7 @@
538E396B27F4765000FA63D5 /* FileProviderExt */ = {
isa = PBXGroup;
children = (
5350E4C72B0C368B00F276CB /* Services */,
5318AD8F29BF406500CBB71C /* Database */,
5352E85929B7BFB4002CE85C /* Extensions */,
538E397027F4765000FA63D5 /* FileProviderEnumerator.swift */,
Expand All @@ -273,6 +287,7 @@
536EFC35295E3C1100F4CB13 /* NextcloudAccount.swift */,
538E397327F4765000FA63D5 /* FileProviderExt.entitlements */,
538E397227F4765000FA63D5 /* Info.plist */,
5350E4EA2B0C9CE100F276CB /* FileProviderExt-Bridging-Header.h */,
);
path = FileProviderExt;
sourceTree = "<group>";
Expand Down Expand Up @@ -591,6 +606,7 @@
538E396F27F4765000FA63D5 /* FileProviderItem.swift in Sources */,
5352B36829DC17D60011CE03 /* NextcloudFilesDatabaseManager+LocalFiles.swift in Sources */,
5318AD9129BF42FB00CBB71C /* NextcloudItemMetadataTable.swift in Sources */,
5350E4E92B0C534A00F276CB /* ClientCommunicationService.swift in Sources */,
5352B36629DC14970011CE03 /* NextcloudFilesDatabaseManager+Directories.swift in Sources */,
5318AD9729BF493600CBB71C /* FileProviderMaterialisedEnumerationObserver.swift in Sources */,
5352B36C29DC44B50011CE03 /* FileProviderExtension+Thumbnailing.swift in Sources */,
Expand Down Expand Up @@ -705,6 +721,7 @@
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "FileProviderExt/FileProviderExt-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
};
Expand Down Expand Up @@ -755,6 +772,7 @@
SKIP_INSTALL = YES;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "FileProviderExt/FileProviderExt-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
};
Expand Down
9 changes: 8 additions & 1 deletion src/gui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,9 @@ IF( APPLE )

if (BUILD_FILE_PROVIDER_MODULE)
list(APPEND client_SRCS
# Symlinks to files in shell_integration/MacOSX/NextcloudIntegration/
macOS/ClientCommunicationProtocol.h
# End of symlink files
macOS/fileprovider.h
macOS/fileprovider_mac.mm
macOS/fileproviderdomainmanager.h
Expand All @@ -294,7 +297,11 @@ IF( APPLE )
macOS/fileprovidersocketcontroller.cpp
macOS/fileprovidersocketserver.h
macOS/fileprovidersocketserver.cpp
macOS/fileprovidersocketserver_mac.mm)
macOS/fileprovidersocketserver_mac.mm
macOS/fileproviderxpc.h
macOS/fileproviderxpc_mac.mm
macOS/fileproviderxpc_mac_utils.h
macOS/fileproviderxpc_mac_utils.mm)
endif()

if(SPARKLE_FOUND AND BUILD_UPDATER)
Expand Down
8 changes: 4 additions & 4 deletions src/gui/application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -349,10 +349,6 @@ Application::Application(int &argc, char **argv)

connect(this, &SharedTools::QtSingleApplication::messageReceived, this, &Application::slotParseMessage);

#if defined(BUILD_FILE_PROVIDER_MODULE)
_fileProvider.reset(new Mac::FileProvider);
#endif

// create accounts and folders from a legacy desktop client or from the current config file
setupAccountsAndFolders();

Expand Down Expand Up @@ -420,6 +416,10 @@ Application::Application(int &argc, char **argv)
AccountSetupCommandLineManager::instance()->setupAccountFromCommandLine();
}
AccountSetupCommandLineManager::destroy();

#if defined(BUILD_FILE_PROVIDER_MODULE)
_fileProvider.reset(new Mac::FileProvider);
#endif
}

Application::~Application()
Expand Down
1 change: 1 addition & 0 deletions src/gui/macOS/ClientCommunicationProtocol.h
5 changes: 5 additions & 0 deletions src/gui/macOS/fileprovider.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

#include "fileproviderdomainmanager.h"
#include "fileprovidersocketserver.h"
#include "fileproviderxpc.h"

namespace OCC {

Expand All @@ -38,9 +39,13 @@ class FileProvider : public QObject

static bool fileProviderAvailable();

private slots:
void configureXPC();

private:
std::unique_ptr<FileProviderDomainManager> _domainManager;
std::unique_ptr<FileProviderSocketServer> _socketServer;
std::unique_ptr<FileProviderXPC> _xpc;

static FileProvider *_instance;
explicit FileProvider(QObject * const parent = nullptr);
Expand Down
Loading
Loading