From: Claudio Cambra Date: Mon, 27 Feb 2023 16:31:35 +0000 (+0100) Subject: Extension can now upload modifications to items on the server X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~10^2~55^2~220 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=c6cc87a4b8f53cd8d32b56fb1e41db78a50fdfe4;p=nextcloud-desktop.git Extension can now upload modifications to items on the server Signed-off-by: Claudio Cambra --- diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift index 7e2c6af82..3cc2a13d2 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderExtension.swift @@ -313,8 +313,93 @@ class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension, NKComm func modifyItem(_ item: NSFileProviderItem, baseVersion version: NSFileProviderItemVersion, changedFields: NSFileProviderItemFields, contents newContents: URL?, options: NSFileProviderModifyItemOptions = [], request: NSFileProviderRequest, completionHandler: @escaping (NSFileProviderItem?, NSFileProviderItemFields, Bool, Error?) -> Void) -> Progress { // TODO: an item was modified on disk, process the item's modification - - completionHandler(nil, [], false, NSError(domain: NSCocoaErrorDomain, code: NSFeatureUnsupportedError, userInfo:[:])) + + NSLog("Received modify item request for item with identifier: %@ and filename: %@", item.itemIdentifier.rawValue, item.filename) + + guard let ncAccount = ncAccount else { + NSLog("Not modifying item: %@ as account not set up yet", item.itemIdentifier.rawValue) + completionHandler(nil, [], false, NSFileProviderError(.notAuthenticated)) + return Progress() + } + + let dbManager = NextcloudFilesDatabaseManager.shared + let parentItemIdentifier = item.parentItemIdentifier + let itemTemplateIsFolder = item.contentType == .folder || + item.contentType == .directory + + if options.contains(.mayAlreadyExist) { + // TODO: This needs to be properly handled with a check in the db + NSLog("Modification for item: %@ may already exist", item.itemIdentifier.rawValue) + } + + var parentItemMetadata: NextcloudDirectoryMetadataTable? + + if parentItemIdentifier == .rootContainer { + let rootMetadata = NextcloudDirectoryMetadataTable() + + rootMetadata.account = ncAccount.ncKitAccount + rootMetadata.ocId = NSFileProviderItemIdentifier.rootContainer.rawValue + rootMetadata.serverUrl = ncAccount.davFilesUrl + + parentItemMetadata = rootMetadata + } else { + parentItemMetadata = dbManager.directoryMetadata(ocId: parentItemIdentifier.rawValue) + } + + guard let parentItemMetadata = parentItemMetadata else { + NSLog("Not modifying item: %@, could not find metadata for parentItemIdentifier %@", item.itemIdentifier.rawValue, parentItemIdentifier.rawValue) + completionHandler(nil, [], false, NSFileProviderError(.noSuchItem)) + return Progress() + } + + let fileNameLocalPath = newContents?.path ?? "" + let newServerUrlFileName = parentItemMetadata.serverUrl + "/" + item.filename + + NSLog("About to upload item with identifier: %@ of type: %@ (is folder: %@) and filename: %@ to server url: %@ with contents located at: %@", item.itemIdentifier.rawValue, item.contentType?.identifier ?? "UNKNOWN", itemTemplateIsFolder ? "yes" : "no", item.filename, newServerUrlFileName, fileNameLocalPath) + + self.ncKit.upload(serverUrlFileName: newServerUrlFileName, + fileNameLocalPath: fileNameLocalPath, + requestHandler: { _ in + }, taskHandler: { task in + self.outstandingSessionTasks[newServerUrlFileName] = task + NSFileProviderManager(for: self.domain)?.register(task, forItemWithIdentifier: item.itemIdentifier, completionHandler: { _ in }) + }, progressHandler: { _ in + + }) { account, ocId, etag, date, size, _, _, error in + self.outstandingSessionTasks.removeValue(forKey: newServerUrlFileName) + + guard error == .success, let ocId = ocId/*, size == itemTemplate.documentSize as! Int64*/ else { + NSLog("Could not upload item with filename: %@, received error: %@", item.filename, error.errorDescription) + completionHandler(nil, [], false, NSFileProviderError(.cannotSynchronize)) + return + } + + NSLog("Successfully uploaded item with identifier: %@ and filename: %@", ocId, item.filename) + + let newMetadata = NextcloudItemMetadataTable() + newMetadata.date = (date ?? NSDate()) as Date + newMetadata.etag = etag ?? "" + newMetadata.account = account + newMetadata.fileName = item.filename + newMetadata.fileNameView = item.filename + newMetadata.ocId = ocId + newMetadata.size = size + newMetadata.contentType = item.contentType?.preferredMIMEType ?? "" + newMetadata.directory = itemTemplateIsFolder + newMetadata.serverUrl = parentItemMetadata.serverUrl + newMetadata.session = "" + newMetadata.sessionError = "" + newMetadata.sessionTaskIdentifier = 0 + newMetadata.status = NextcloudItemMetadataTable.Status.normal.rawValue + + dbManager.addLocalFileMetadataFromItemMetadata(newMetadata) + dbManager.addItemMetadata(newMetadata) + + let fpItem = FileProviderItem(metadata: newMetadata, parentItemIdentifier: parentItemIdentifier, ncKit: self.ncKit) + + completionHandler(fpItem, [], false, nil) + } + return Progress() }