marinofaggiana 5 lat temu
rodzic
commit
ddd9ad5eef

+ 16 - 5
File Provider Extension/FileProviderData.swift

@@ -47,8 +47,8 @@ class fileProviderData: NSObject {
     var listFavoriteIdentifierRank = [String:NSNumber]()
     
     // Item for signalEnumerator
-    var fileProviderSignalDeleteItemIdentifier = [NSFileProviderItemIdentifier:NSFileProviderItemIdentifier]()
-    var fileProviderSignalUpdateItem = [NSFileProviderItemIdentifier:FileProviderItem]()
+    var fileProviderSignalDelete = [NSFileProviderItemIdentifier:NSFileProviderItemIdentifier]()
+    var fileProviderSignalUpdate = [NSFileProviderItemIdentifier:FileProviderItem]()
    
     // UserDefaults
     var ncUserDefaults = UserDefaults(suiteName: NCBrandOptions.sharedInstance.capabilitiesGroups)
@@ -161,7 +161,7 @@ class fileProviderData: NSObject {
                 }
                 
                 let item = FileProviderItem(metadata: metadata, parentItemIdentifier: parentItemIdentifier)
-                fileProviderSignalUpdateItem[item.itemIdentifier] = item
+                fileProviderSignalUpdate[item.itemIdentifier] = item
                 updateWorkingSet = true
             }
         }
@@ -176,7 +176,7 @@ class fileProviderData: NSObject {
                 }
                 
                 let itemIdentifier = fileProviderUtility.sharedInstance.getItemIdentifier(metadata: metadata)
-                fileProviderSignalDeleteItemIdentifier[itemIdentifier] = itemIdentifier
+                fileProviderSignalDelete[itemIdentifier] = itemIdentifier
                 updateWorkingSet = true
             }
         }
@@ -188,9 +188,20 @@ class fileProviderData: NSObject {
     
     // MARK: -
 
+    // Signal update/delete
+    //
+    func fileProviderSignal(metadata: tableMetadata, parentItemIdentifier: NSFileProviderItemIdentifier, delete: Bool, update: Bool) -> FileProviderItem {
+        let item = FileProviderItem(metadata: metadata, parentItemIdentifier: parentItemIdentifier)
+        if update { fileProviderSignalUpdate[item.itemIdentifier] = item }
+        if delete { fileProviderSignalDelete[item.itemIdentifier] = item.itemIdentifier }
+        signalEnumerator(for: [parentItemIdentifier, .workingSet])
+        
+        return item
+    }
+    
     // Convinent method to signal the enumeration for containers.
     //
-    func signalEnumerator(for containerItemIdentifiers: [NSFileProviderItemIdentifier]) {
+    private func signalEnumerator(for containerItemIdentifiers: [NSFileProviderItemIdentifier]) {
                 
         currentAnchor += 1
         

+ 4 - 4
File Provider Extension/FileProviderEnumerator.swift

@@ -209,13 +209,13 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
         
         // Report the deleted items
         //
-        for (itemIdentifier, _) in fileProviderData.sharedInstance.fileProviderSignalDeleteItemIdentifier {
+        for (itemIdentifier, _) in fileProviderData.sharedInstance.fileProviderSignalDelete {
             itemsDelete.append(itemIdentifier)
         }
        
         // Report the updated items
         //
-        for (itemIdentifier, item) in fileProviderData.sharedInstance.fileProviderSignalUpdateItem {
+        for (itemIdentifier, item) in fileProviderData.sharedInstance.fileProviderSignalUpdate {
             let metadata = fileProviderUtility.sharedInstance.getTableMetadataFromItemIdentifier(itemIdentifier)
             if metadata == nil {
                 itemsDelete.append(itemIdentifier)
@@ -224,8 +224,8 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
             }
         }
         
-        fileProviderData.sharedInstance.fileProviderSignalDeleteItemIdentifier.removeAll()
-        fileProviderData.sharedInstance.fileProviderSignalUpdateItem.removeAll()
+        fileProviderData.sharedInstance.fileProviderSignalDelete.removeAll()
+        fileProviderData.sharedInstance.fileProviderSignalUpdate.removeAll()
         
         observer.didDeleteItems(withIdentifiers: itemsDelete)
         observer.didUpdate(itemsUpdate)

+ 25 - 37
File Provider Extension/FileProviderExtension+Actions.swift

@@ -48,30 +48,25 @@ extension FileProviderExtension {
                 metadata.serverUrl = serverUrl
                 metadata.typeFile = k_metadataTypeFile_directory
                 
-                // METADATA
-                guard let metadataDB = NCManageDatabase.sharedInstance.addMetadata(metadata) else {
+                guard let metadataUpdate = NCManageDatabase.sharedInstance.addMetadata(metadata) else {
                     completionHandler(nil, NSFileProviderError(.noSuchItem))
                     return
                 }
                 
-                // DIRECTORY
                 guard let _ = NCManageDatabase.sharedInstance.addDirectory(encrypted: false, favorite: false, ocId: ocId!, permissions: nil, serverUrl: serverUrl + "/" + directoryName, account: account!) else {
                     completionHandler(nil, NSFileProviderError(.noSuchItem))
                     return
                 }
                 
-                let parentItemIdentifier = fileProviderUtility.sharedInstance.getParentItemIdentifier(metadata: metadataDB, homeServerUrl: fileProviderData.sharedInstance.homeServerUrl)
-                if parentItemIdentifier != nil {
-                    
-                    let item = FileProviderItem(metadata: metadataDB, parentItemIdentifier: parentItemIdentifier!)
-                    fileProviderData.sharedInstance.fileProviderSignalUpdateItem[item.itemIdentifier] = item
-                    fileProviderData.sharedInstance.signalEnumerator(for: [item.parentItemIdentifier, .workingSet])
-                    
-                    completionHandler(item, nil)
-                    
-                } else {
+                guard let parentItemIdentifier = fileProviderUtility.sharedInstance.getParentItemIdentifier(metadata: metadataUpdate, homeServerUrl: fileProviderData.sharedInstance.homeServerUrl) else {
                     completionHandler(nil, NSFileProviderError(.noSuchItem))
+                    return
                 }
+                
+                // Signal update/delete
+                let item = fileProviderData.sharedInstance.fileProviderSignal(metadata: metadataUpdate, parentItemIdentifier: parentItemIdentifier, delete: false, update: true)
+                completionHandler(item, nil)
+                
             } else {
                 completionHandler(nil, NSFileProviderError(.serverUnreachable))
             }
@@ -107,10 +102,11 @@ extension FileProviderExtension {
                 NCManageDatabase.sharedInstance.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
                 NCManageDatabase.sharedInstance.deleteLocalFile(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
                 
-                fileProviderData.sharedInstance.fileProviderSignalDeleteItemIdentifier[itemIdentifier] = itemIdentifier
-                fileProviderData.sharedInstance.signalEnumerator(for: [parentItemIdentifier, .workingSet])
-                completionHandler(nil)
                 
+                // Signal update/delete
+                _ = fileProviderData.sharedInstance.fileProviderSignal(metadata: metadata, parentItemIdentifier: parentItemIdentifier, delete: true, update: false)
+                completionHandler(nil)
+
             } else {
                 completionHandler( NSFileProviderError(.serverUnreachable))
             }
@@ -156,10 +152,8 @@ extension FileProviderExtension {
                     return
                 }
                 
-                let item = FileProviderItem(metadata: metadata, parentItemIdentifier: parentItemIdentifier)
-                fileProviderData.sharedInstance.fileProviderSignalUpdateItem[itemIdentifier] = item
-                fileProviderData.sharedInstance.signalEnumerator(for: [parentItemIdentifier, .workingSet])
-                
+                // Signal update/delete
+                let item = fileProviderData.sharedInstance.fileProviderSignal(metadata: metadata, parentItemIdentifier: parentItemIdentifier, delete: false, update: true)
                 completionHandler(item, nil)
                 
             } else {
@@ -214,11 +208,10 @@ extension FileProviderExtension {
                     return
                 }
                 
-                let item = FileProviderItem(metadata: metadata, parentItemIdentifier: parentItemIdentifier)
-                fileProviderData.sharedInstance.fileProviderSignalUpdateItem[item.itemIdentifier] = item
-                fileProviderData.sharedInstance.signalEnumerator(for: [item.parentItemIdentifier, .workingSet])
-                
+                // Signal update/delete
+                let item = fileProviderData.sharedInstance.fileProviderSignal(metadata: metadata, parentItemIdentifier: parentItemIdentifier, delete: false, update: true)
                 completionHandler(item, nil)
+                
             } else {
                 completionHandler(nil, NSFileProviderError(.serverUnreachable))
             }
@@ -257,20 +250,17 @@ extension FileProviderExtension {
                     metadata.favorite = favorite
                     _ = NCManageDatabase.sharedInstance.addMetadata(metadata)
                     
-                    let item = FileProviderItem(metadata: metadata, parentItemIdentifier: parentItemIdentifier)
-                    fileProviderData.sharedInstance.fileProviderSignalUpdateItem[item.itemIdentifier] = item
-                    fileProviderData.sharedInstance.signalEnumerator(for: [item.parentItemIdentifier, .workingSet])
-                    
+                    // Signal update/delete
+                    let item =  fileProviderData.sharedInstance.fileProviderSignal(metadata: metadata, parentItemIdentifier: parentItemIdentifier, delete: false, update: true)
                     completionHandler(item, nil)
+                    
                 } else {
                     // Errore, remove from listFavoriteIdentifierRank
                     fileProviderData.sharedInstance.listFavoriteIdentifierRank.removeValue(forKey: itemIdentifier.rawValue)
                     
-                    let item = FileProviderItem(metadata: metadata, parentItemIdentifier: parentItemIdentifier)
-                    fileProviderData.sharedInstance.fileProviderSignalUpdateItem[item.itemIdentifier] = item
-                    fileProviderData.sharedInstance.signalEnumerator(for: [item.parentItemIdentifier, .workingSet])
-                    
-                    completionHandler(nil, NSFileProviderError(.serverUnreachable))
+                    // Signal update/delete
+                    let item =  fileProviderData.sharedInstance.fileProviderSignal(metadata: metadata, parentItemIdentifier: parentItemIdentifier, delete: false, update: true)
+                    completionHandler(item, NSFileProviderError(.serverUnreachable))
                 }
             })
         }
@@ -291,10 +281,8 @@ extension FileProviderExtension {
             return
         }
         
-        let item = FileProviderItem(metadata: metadata, parentItemIdentifier: parentItemIdentifier)
-        fileProviderData.sharedInstance.fileProviderSignalUpdateItem[item.itemIdentifier] = item
-        fileProviderData.sharedInstance.signalEnumerator(for: [item.parentItemIdentifier, .workingSet])
-        
+        // Signal update/delete
+        let item =  fileProviderData.sharedInstance.fileProviderSignal(metadata: metadata, parentItemIdentifier: parentItemIdentifier, delete: false, update: true)
         completionHandler(item, nil)
     }
     

+ 23 - 14
File Provider Extension/FileProviderExtension.swift

@@ -228,16 +228,14 @@ class FileProviderExtension: NSFileProviderExtension, CCNetworkingDelegate {
                 metadata.etag = etag!
                 metadata.size = Double(lenght)
                 
-                guard let metadataDB = NCManageDatabase.sharedInstance.addMetadata(metadata) else {
+                guard let metadataUpdate = NCManageDatabase.sharedInstance.addMetadata(metadata) else {
                     return
                 }
-                NCManageDatabase.sharedInstance.addLocalFile(metadata: metadataDB)
+                NCManageDatabase.sharedInstance.addLocalFile(metadata: metadataUpdate)
+                
+                // Signal update/delete
+                _ = fileProviderData.sharedInstance.fileProviderSignal(metadata: metadataUpdate, parentItemIdentifier: parentItemIdentifier, delete: true, update: true)
                 
-                let item = FileProviderItem(metadata: metadataDB, parentItemIdentifier: parentItemIdentifier)
-                fileProviderData.sharedInstance.fileProviderSignalDeleteItemIdentifier[item.itemIdentifier] = item.itemIdentifier
-                fileProviderData.sharedInstance.fileProviderSignalUpdateItem[item.itemIdentifier] = item
-                fileProviderData.sharedInstance.signalEnumerator(for: [parentItemIdentifier, .workingSet])
-            
                 completionHandler(nil)
 
             } else {
@@ -268,7 +266,6 @@ class FileProviderExtension: NSFileProviderExtension, CCNetworkingDelegate {
         let pathComponents = url.pathComponents
         assert(pathComponents.count > 2)
         let itemIdentifier = NSFileProviderItemIdentifier(pathComponents[pathComponents.count - 2])
-        var metadataUpdate: tableMetadata?
         
         guard let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account == %@ AND ocId == %@", fileProviderData.sharedInstance.account, itemIdentifier.rawValue)) else {
             return
@@ -299,24 +296,36 @@ class FileProviderExtension: NSFileProviderExtension, CCNetworkingDelegate {
             
             if account == fileProviderData.sharedInstance.account && errorCode == 0 {
                 
+                metadata.sessionTaskIdentifier = Int(k_taskIdentifierDone)
+                metadata.status = Int(k_metadataStatusNormal)
+                metadata.session = ""
                 metadata.date = date! as NSDate
                 metadata.etag = etag!
                 metadata.size = size
                 
-                guard let metadataDB = NCManageDatabase.sharedInstance.addMetadata(metadata) else {
-                    return
-                }
+                guard let metadataUpdate = NCManageDatabase.sharedInstance.addMetadata(metadata) else { return }
                 NCManageDatabase.sharedInstance.setLocalFile(ocId: metadata.ocId, date: metadata.date, exifDate: nil, exifLatitude: nil, exifLongitude: nil, fileName: nil, etag: metadata.etag)
                 
-                let item = FileProviderItem(metadata: metadataDB, parentItemIdentifier: parentItemIdentifier)
-                fileProviderData.sharedInstance.fileProviderSignalUpdateItem[item.itemIdentifier] = item
+                // Signal update/delete
+                _ = fileProviderData.sharedInstance.fileProviderSignal(metadata: metadataUpdate, parentItemIdentifier: parentItemIdentifier, delete: false, update: true)
                 
-                fileProviderData.sharedInstance.signalEnumerator(for: [parentItemIdentifier, .workingSet])
+            } else {
+                // ????
             }
         })
         
         // Add and register task
         if task != nil {
+            
+            metadata.sessionTaskIdentifier = Int(task!.taskIdentifier)
+            metadata.status = Int(k_metadataStatusUploading)
+            metadata.session = k_upload_session_extension
+            
+            guard let metadataUpdate = NCManageDatabase.sharedInstance.addMetadata(metadata) else { return }
+            
+            // Signal update/delete
+            _ = fileProviderData.sharedInstance.fileProviderSignal(metadata: metadataUpdate, parentItemIdentifier: parentItemIdentifier, delete: false, update: true)
+            
             self.outstandingDownloadTasks[url] = task
             NSFileProviderManager.default.register(task!, forItemWithIdentifier: NSFileProviderItemIdentifier(itemIdentifier.rawValue)) { (error) in }
         }

+ 7 - 6
File Provider Extension/FileProviderItem.swift

@@ -34,11 +34,7 @@ class FileProviderItem: NSObject, NSFileProviderItem {
         if (self.isDirectory) {
             return [ .allowsAddingSubItems, .allowsContentEnumerating, .allowsReading, .allowsDeleting, .allowsRenaming ]
         } else {
-            if isUpload {
-                return [ ]
-            } else {
-                return [ .allowsWriting, .allowsReading, .allowsDeleting, .allowsRenaming, .allowsReparenting ]
-            }
+            return [ .allowsWriting, .allowsReading, .allowsDeleting, .allowsRenaming, .allowsReparenting ]
         }
     }
     
@@ -73,7 +69,6 @@ class FileProviderItem: NSObject, NSFileProviderItem {
     
     var isDirectory = false
     var isDownload = false
-    var isUpload = false
 
     init(metadata: tableMetadata, parentItemIdentifier: NSFileProviderItemIdentifier) {
         
@@ -106,6 +101,12 @@ class FileProviderItem: NSObject, NSFileProviderItem {
                 uploadingError = NSError(domain: NSCocoaErrorDomain, code: NSFeatureUnsupportedError, userInfo:[:])
             }
             
+            // Upload
+            if (metadata.session == k_upload_session_extension) {
+                self.isUploading = true
+                self.isUploaded = false
+            } 
+            
         } else {
             
             // Favorite directory