2 // FPUIExtensionCommunicationService.swift
5 // Created by Claudio Cambra on 21/2/24.
13 class FPUIExtensionServiceSource: NSObject, NSFileProviderServiceSource, NSXPCListenerDelegate, FPUIExtensionService {
14 let listener = NSXPCListener.anonymous()
15 let serviceName = fpUiExtensionServiceName
16 let fpExtension: FileProviderExtension
18 init(fpExtension: FileProviderExtension) {
19 Logger.fpUiExtensionService.debug("Instantiating FPUIExtensionService service")
20 self.fpExtension = fpExtension
24 func makeListenerEndpoint() throws -> NSXPCListenerEndpoint {
25 listener.delegate = self
27 return listener.endpoint
31 _ listener: NSXPCListener,
32 shouldAcceptNewConnection newConnection: NSXPCConnection
34 newConnection.exportedInterface = NSXPCInterface(with: FPUIExtensionService.self)
35 newConnection.exportedObject = self
36 newConnection.resume()
40 //MARK: - FPUIExtensionService protocol methods
42 func credentials() async -> NSDictionary {
43 return (fpExtension.ncAccount?.dictionary() ?? [:]) as NSDictionary
46 func itemServerPath(identifier: NSFileProviderItemIdentifier) async -> NSString? {
47 let rawIdentifier = identifier.rawValue
48 Logger.shares.info("Fetching shares for item \(rawIdentifier, privacy: .public)")
50 guard let baseUrl = fpExtension.ncAccount?.davFilesUrl else {
51 Logger.shares.error("Could not fetch shares as ncAccount on parent extension is nil")
55 let dbManager = NextcloudFilesDatabaseManager.shared
56 guard let item = dbManager.itemMetadataFromFileProviderItemIdentifier(identifier) else {
57 Logger.shares.error("No item \(rawIdentifier, privacy: .public) in db, no shares.")
61 let completePath = item.serverUrl + "/" + item.fileName
62 return completePath.replacingOccurrences(of: baseUrl, with: "") as NSString