76f7f10f4e48d4fc359b69fcf46ac73293b0c61e
[nextcloud-desktop.git] /
1 //
2 //  FPUIExtensionCommunicationService.swift
3 //  FileProviderExt
4 //
5 //  Created by Claudio Cambra on 21/2/24.
6 //
7
8 import FileProvider
9 import Foundation
10 import NextcloudKit
11 import OSLog
12
13 class FPUIExtensionServiceSource: NSObject, NSFileProviderServiceSource, NSXPCListenerDelegate, FPUIExtensionService {
14     let listener = NSXPCListener.anonymous()
15     let serviceName = fpUiExtensionServiceName
16     let fpExtension: FileProviderExtension
17
18     init(fpExtension: FileProviderExtension) {
19         Logger.fpUiExtensionService.debug("Instantiating FPUIExtensionService service")
20         self.fpExtension = fpExtension
21         super.init()
22     }
23
24     func makeListenerEndpoint() throws -> NSXPCListenerEndpoint {
25         listener.delegate = self
26         listener.resume()
27         return listener.endpoint
28     }
29
30     func listener(
31         _ listener: NSXPCListener,
32         shouldAcceptNewConnection newConnection: NSXPCConnection
33     ) -> Bool {
34         newConnection.exportedInterface = NSXPCInterface(with: FPUIExtensionService.self)
35         newConnection.exportedObject = self
36         newConnection.resume()
37         return true
38     }
39
40     //MARK: - FPUIExtensionService protocol methods
41
42     func credentials() async -> NSDictionary {
43         return (fpExtension.ncAccount?.dictionary() ?? [:]) as NSDictionary
44     }
45
46     func itemServerPath(identifier: NSFileProviderItemIdentifier) async -> NSString? {
47         let rawIdentifier = identifier.rawValue
48         Logger.shares.info("Fetching shares for item \(rawIdentifier, privacy: .public)")
49
50         guard let baseUrl = fpExtension.ncAccount?.davFilesUrl else {
51             Logger.shares.error("Could not fetch shares as ncAccount on parent extension is nil")
52             return nil
53         }
54
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.")
58             return nil
59         }
60
61         let completePath = item.serverUrl + "/" + item.fileName
62         return completePath.replacingOccurrences(of: baseUrl, with: "") as NSString
63     }
64 }