Implement better error handling in enumerator changes
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Mon, 13 Mar 2023 13:15:32 +0000 (14:15 +0100)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 12 May 2023 05:21:30 +0000 (13:21 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift

index 9535af1325c2d624ba72896ad6081ef0f42ed024..8bc69b91ea9d3204ad058e9288542e23c8d65a30 100644 (file)
@@ -235,23 +235,39 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
             guard readError == nil else {
                 NSLog("Finishing enumeration of changes with error")
 
-                if let nkReadError = readError as? NKError, nkReadError.errorCode == 404 {
-                    NSLog("404 error means item no longer exists. Deleting metadata and reporting %@ as deletion without error", self.serverUrl)
+                if let nkReadError = readError as? NKError {
+                    let nkErrorCode = nkReadError.errorCode
 
-                    guard let itemMetadata = self.enumeratedItemMetadata else {
-                        NSLog("Invalid enumeratedItemMetadata, could not delete metadata nor report deletion")
-                        observer.finishEnumeratingWithError(readError!)
-                        return
-                    }
+                    if nkErrorCode == 404 {
+                        NSLog("404 error means item no longer exists. Deleting metadata and reporting %@ as deletion without error", self.serverUrl)
 
-                    let dbManager = NextcloudFilesDatabaseManager.shared
-                    if itemMetadata.directory {
-                        dbManager.deleteDirectoryAndSubdirectoriesMetadata(ocId: itemMetadata.ocId)
+                        guard let itemMetadata = self.enumeratedItemMetadata else {
+                            NSLog("Invalid enumeratedItemMetadata, could not delete metadata nor report deletion")
+                            observer.finishEnumeratingWithError(NSFileProviderError(.noSuchItem))
+                            return
+                        }
+
+                        let dbManager = NextcloudFilesDatabaseManager.shared
+                        if itemMetadata.directory {
+                            dbManager.deleteDirectoryAndSubdirectoriesMetadata(ocId: itemMetadata.ocId)
+                        } else {
+                            dbManager.deleteItemMetadata(ocId: itemMetadata.ocId)
+                        }
+
+                        FileProviderEnumerator.completeChangesObserver(observer, anchor: anchor, ncKit: self.ncKit, newMetadatas: nil, updatedMetadatas: nil, deletedMetadatas: [itemMetadata])
+                    } else if nkErrorCode == -9999 || nkErrorCode == -1001 || nkErrorCode == -1004 || nkErrorCode == -1005 || nkErrorCode == -1009 || nkErrorCode == -1012 || nkErrorCode == -1200 || nkErrorCode == -1202 || nkErrorCode == 500 || nkErrorCode == 503 || nkErrorCode == 200 {
+                        // Provide something the file provider can do something with
+                        observer.finishEnumeratingWithError(NSFileProviderError(.serverUnreachable))
+                        return
+                    } else if nkErrorCode == -1013  {
+                        observer.finishEnumeratingWithError(NSFileProviderError(.notAuthenticated))
+                        return
+                    } else if nkErrorCode == 507 {
+                        observer.finishEnumeratingWithError(NSFileProviderError(.insufficientQuota))
+                        return
                     } else {
-                        dbManager.deleteItemMetadata(ocId: itemMetadata.ocId)
+                        observer.finishEnumeratingWithError(NSFileProviderError(.cannotSynchronize))
                     }
-
-                    FileProviderEnumerator.completeChangesObserver(observer, anchor: anchor, ncKit: self.ncKit, newMetadatas: nil, updatedMetadatas: nil, deletedMetadatas: [itemMetadata])
                 }
 
                 observer.finishEnumeratingWithError(readError!)