瀏覽代碼

Improvements code FileProviderExtension

Marino Faggiana 6 年之前
父節點
當前提交
56115b807a

+ 16 - 0
PickerFileProvider/FileProviderData.swift

@@ -50,6 +50,22 @@ class FileProviderData: NSObject {
     // List of etag for serverUrl
     var listServerUrlEtag = [String:String]()
     
+    // Anchor
+    var currentAnchor: UInt64 = 0
+
+    // Rank favorite
+    var listFavoriteIdentifierRank = [String:NSNumber]()
+    
+    // Queue for trade-safe
+    let queueTradeSafe = DispatchQueue(label: "com.nextcloud.fileproviderextension.tradesafe", attributes: .concurrent)
+
+    // Item for signalEnumerator
+    var fileProviderSignalDeleteContainerItemIdentifier = [NSFileProviderItemIdentifier:NSFileProviderItemIdentifier]()
+    var fileProviderSignalUpdateContainerItem = [NSFileProviderItemIdentifier:FileProviderItem]()
+    var fileProviderSignalDeleteWorkingSetItemIdentifier = [NSFileProviderItemIdentifier:NSFileProviderItemIdentifier]()
+    var fileProviderSignalUpdateWorkingSetItem = [NSFileProviderItemIdentifier:FileProviderItem]()
+
+    
     func setupActiveAccount() -> Bool {
         
         queueTradeSafe.sync(flags: .barrier) {

+ 20 - 20
PickerFileProvider/FileProviderEnumerator.swift

@@ -87,8 +87,8 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
             }
             
             // ***** Favorite *****
-            listFavoriteIdentifierRank = NCManageDatabase.sharedInstance.getTableMetadatasDirectoryFavoriteIdentifierRank()
-            for (identifier, _) in listFavoriteIdentifierRank {
+            providerData.listFavoriteIdentifierRank = NCManageDatabase.sharedInstance.getTableMetadatasDirectoryFavoriteIdentifierRank()
+            for (identifier, _) in providerData.listFavoriteIdentifierRank {
              
                 guard let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account = %@ AND fileID = %@", providerData.account, identifier)) else {
                     continue
@@ -204,30 +204,30 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
         // Report the deleted items
         //
         if enumeratedItemIdentifier == .workingSet {
-            queueTradeSafe.sync() {
-                for (itemIdentifier, _) in fileProviderSignalDeleteWorkingSetItemIdentifier {
+            providerData.queueTradeSafe.sync() {
+                for (itemIdentifier, _) in providerData.fileProviderSignalDeleteWorkingSetItemIdentifier {
                     itemsDelete.append(itemIdentifier)
                 }
             }
-            queueTradeSafe.sync(flags: .barrier) {
-                fileProviderSignalDeleteWorkingSetItemIdentifier.removeAll()
+            providerData.queueTradeSafe.sync(flags: .barrier) {
+                providerData.fileProviderSignalDeleteWorkingSetItemIdentifier.removeAll()
             }
         } else {
-            queueTradeSafe.sync() {
-                for (itemIdentifier, _) in fileProviderSignalDeleteContainerItemIdentifier {
+            providerData.queueTradeSafe.sync() {
+                for (itemIdentifier, _) in providerData.fileProviderSignalDeleteContainerItemIdentifier {
                     itemsDelete.append(itemIdentifier)
                 }
             }
-            queueTradeSafe.sync(flags: .barrier) {
-                fileProviderSignalDeleteContainerItemIdentifier.removeAll()
+            providerData.queueTradeSafe.sync(flags: .barrier) {
+                providerData.fileProviderSignalDeleteContainerItemIdentifier.removeAll()
             }
         }
             
         // Report the updated items
         //
         if enumeratedItemIdentifier == .workingSet {
-            queueTradeSafe.sync() {
-                for (itemIdentifier, item) in fileProviderSignalUpdateWorkingSetItem {
+            providerData.queueTradeSafe.sync() {
+                for (itemIdentifier, item) in providerData.fileProviderSignalUpdateWorkingSetItem {
                     let account = providerData.getAccountFromItemIdentifier(itemIdentifier)
                     if account != nil && account == providerData.account {
                         itemsUpdate.append(item)
@@ -236,12 +236,12 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
                     }
                 }
             }
-            queueTradeSafe.sync(flags: .barrier) {
-                fileProviderSignalUpdateWorkingSetItem.removeAll()
+            providerData.queueTradeSafe.sync(flags: .barrier) {
+                providerData.fileProviderSignalUpdateWorkingSetItem.removeAll()
             }
         } else {
-            queueTradeSafe.sync(flags: .barrier) {
-                for (itemIdentifier, item) in fileProviderSignalUpdateContainerItem {
+            providerData.queueTradeSafe.sync(flags: .barrier) {
+                for (itemIdentifier, item) in providerData.fileProviderSignalUpdateContainerItem {
                     let account = providerData.getAccountFromItemIdentifier(itemIdentifier)
                     if account != nil && account == providerData.account {
                         itemsUpdate.append(item)
@@ -250,20 +250,20 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
                     }
                 }
             }
-            queueTradeSafe.sync(flags: .barrier) {
-                fileProviderSignalUpdateContainerItem.removeAll()
+            providerData.queueTradeSafe.sync(flags: .barrier) {
+                providerData.fileProviderSignalUpdateContainerItem.removeAll()
             }
         }
             
         observer.didDeleteItems(withIdentifiers: itemsDelete)
         observer.didUpdate(itemsUpdate)
             
-        let data = "\(currentAnchor)".data(using: .utf8)
+        let data = "\(providerData.currentAnchor)".data(using: .utf8)
         observer.finishEnumeratingChanges(upTo: NSFileProviderSyncAnchor(data!), moreComing: false)
     }
     
     func currentSyncAnchor(completionHandler: @escaping (NSFileProviderSyncAnchor?) -> Void) {
-        let data = "\(currentAnchor)".data(using: .utf8)
+        let data = "\(providerData.currentAnchor)".data(using: .utf8)
         completionHandler(NSFileProviderSyncAnchor(data!))
     }
     

+ 22 - 22
PickerFileProvider/FileProviderExtension+Actions.swift

@@ -73,9 +73,9 @@ extension FileProviderExtension {
                 
                 let item = FileProviderItem(metadata: metadataDB, parentItemIdentifier: parentItemIdentifier!, providerData: self.providerData)
                 
-                queueTradeSafe.sync(flags: .barrier) {
-                    fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
-                    fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
+                self.providerData.queueTradeSafe.sync(flags: .barrier) {
+                    self.providerData.fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
+                    self.providerData.fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
                 }
 
                 self.signalEnumerator(for: [item.parentItemIdentifier, .workingSet])
@@ -123,9 +123,9 @@ extension FileProviderExtension {
         deleteFile(withIdentifier: itemIdentifier, parentItemIdentifier: parentItemIdentifier, metadata: metadata, serverUrl: serverUrl)
        
         // return immediately
-        queueTradeSafe.sync(flags: .barrier) {
-            fileProviderSignalDeleteContainerItemIdentifier[itemIdentifier] = itemIdentifier
-            fileProviderSignalDeleteWorkingSetItemIdentifier[itemIdentifier] = itemIdentifier
+        providerData.queueTradeSafe.sync(flags: .barrier) {
+            providerData.fileProviderSignalDeleteContainerItemIdentifier[itemIdentifier] = itemIdentifier
+            providerData.fileProviderSignalDeleteWorkingSetItemIdentifier[itemIdentifier] = itemIdentifier
         }
 
         self.signalEnumerator(for: [parentItemIdentifier, .workingSet])
@@ -191,9 +191,9 @@ extension FileProviderExtension {
             
             let item = FileProviderItem(metadata: metadata, parentItemIdentifier: parentItemIdentifier, providerData: self.providerData)
             
-            queueTradeSafe.sync(flags: .barrier) {
-                fileProviderSignalUpdateContainerItem[itemIdentifier] = item
-                fileProviderSignalUpdateWorkingSetItem[itemIdentifier] = item
+            self.providerData.queueTradeSafe.sync(flags: .barrier) {
+                self.providerData.fileProviderSignalUpdateContainerItem[itemIdentifier] = item
+                self.providerData.fileProviderSignalUpdateWorkingSetItem[itemIdentifier] = item
             }
 
             self.signalEnumerator(for: [parentItemIdentifier, .workingSet])
@@ -264,9 +264,9 @@ extension FileProviderExtension {
             
             let item = FileProviderItem(metadata: metadata, parentItemIdentifier: parentItemIdentifier, providerData: self.providerData)
             
-            queueTradeSafe.sync(flags: .barrier) {
-                fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
-                fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
+            self.providerData.queueTradeSafe.sync(flags: .barrier) {
+                self.providerData.fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
+                self.providerData.fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
             }
 
             self.signalEnumerator(for: [item.parentItemIdentifier, .workingSet])
@@ -301,20 +301,20 @@ extension FileProviderExtension {
         
         var favorite = false
         if favoriteRank == nil {
-            listFavoriteIdentifierRank.removeValue(forKey: itemIdentifier.rawValue)
+            providerData.listFavoriteIdentifierRank.removeValue(forKey: itemIdentifier.rawValue)
         } else {
-            let rank = listFavoriteIdentifierRank[itemIdentifier.rawValue]
+            let rank = providerData.listFavoriteIdentifierRank[itemIdentifier.rawValue]
             if rank == nil {
-                listFavoriteIdentifierRank[itemIdentifier.rawValue] = favoriteRank
+                providerData.listFavoriteIdentifierRank[itemIdentifier.rawValue] = favoriteRank
             }
             favorite = true
         }
         
         let item = FileProviderItem(metadata: metadata, parentItemIdentifier: parentItemIdentifier, providerData: providerData)
         
-        queueTradeSafe.sync(flags: .barrier) {
-            fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
-            fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
+        providerData.queueTradeSafe.sync(flags: .barrier) {
+            providerData.fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
+            providerData.fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
         }
 
         signalEnumerator(for: [item.parentItemIdentifier, .workingSet])
@@ -346,9 +346,9 @@ extension FileProviderExtension {
         
         let item = FileProviderItem(metadata: metadata, parentItemIdentifier: parentItemIdentifier, providerData: providerData)
         
-        queueTradeSafe.sync(flags: .barrier) {
-            fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
-            fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
+        providerData.queueTradeSafe.sync(flags: .barrier) {
+            providerData.fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
+            providerData.fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
         }
         
         signalEnumerator(for: [item.parentItemIdentifier, .workingSet])
@@ -483,7 +483,7 @@ extension FileProviderExtension {
         
         var resultFileName = fileName
         
-        queueTradeSafe.sync {
+        providerData.queueTradeSafe.sync {
             
             var exitLoop = false
             

+ 21 - 21
PickerFileProvider/FileProviderExtension+Network.swift

@@ -65,8 +65,8 @@ extension FileProviderExtension {
              
                 let item = FileProviderItem(metadata: metadata, parentItemIdentifier: enumeratedItemIdentifier, providerData: self.providerData)
              
-                queueTradeSafe.sync(flags: .barrier) {
-                    fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
+                self.providerData.queueTradeSafe.sync(flags: .barrier) {
+                    self.providerData.fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
                 }
              
                 counter += 1
@@ -99,9 +99,9 @@ extension FileProviderExtension {
         }, failure: { (errorMessage, errorCode) in
             
             // remove itemIdentifier on fileProviderSignalDeleteItemIdentifier
-            queueTradeSafe.sync(flags: .barrier) {
-                fileProviderSignalDeleteContainerItemIdentifier.removeValue(forKey: itemIdentifier)
-                fileProviderSignalDeleteWorkingSetItemIdentifier.removeValue(forKey: itemIdentifier)
+            self.providerData.queueTradeSafe.sync(flags: .barrier) {
+                self.providerData.fileProviderSignalDeleteContainerItemIdentifier.removeValue(forKey: itemIdentifier)
+                self.providerData.fileProviderSignalDeleteWorkingSetItemIdentifier.removeValue(forKey: itemIdentifier)
             }
             
             self.signalEnumerator(for: [parentItemIdentifier, .workingSet])
@@ -161,13 +161,13 @@ extension FileProviderExtension {
         }, failure: { (errorMessage, errorCode) in
             
             // Errore, remove from listFavoriteIdentifierRank
-            listFavoriteIdentifierRank.removeValue(forKey: itemIdentifier.rawValue)
+            self.providerData.listFavoriteIdentifierRank.removeValue(forKey: itemIdentifier.rawValue)
 
             let item = FileProviderItem(metadata: metadata, parentItemIdentifier: parentItemIdentifier, providerData: self.providerData)
             
-            queueTradeSafe.sync(flags: .barrier) {
-                fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
-                fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
+            self.providerData.queueTradeSafe.sync(flags: .barrier) {
+                self.providerData.fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
+                self.providerData.fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
             }
             
             self.signalEnumerator(for: [item.parentItemIdentifier, .workingSet])
@@ -195,9 +195,9 @@ extension FileProviderExtension {
 
         NSFileProviderManager.default.register(task, forItemWithIdentifier: NSFileProviderItemIdentifier(item.itemIdentifier.rawValue)) { (error) in }
         
-        queueTradeSafe.sync(flags: .barrier) {
-            fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
-            fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
+        providerData.queueTradeSafe.sync(flags: .barrier) {
+            self.providerData.fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
+            self.providerData.fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
         }
         
         self.signalEnumerator(for: [item.parentItemIdentifier, .workingSet])
@@ -229,10 +229,10 @@ extension FileProviderExtension {
                     _ = moveFile(providerData.fileProviderStorageURL!.path + "/" + assetLocalIdentifier, toPath: providerData.fileProviderStorageURL!.path + "/" + itemIdentifier.rawValue)
                 }
                 
-                queueTradeSafe.sync(flags: .barrier) {
+                providerData.queueTradeSafe.sync(flags: .barrier) {
                     let itemIdentifier = NSFileProviderItemIdentifier(assetLocalIdentifier)
-                    fileProviderSignalDeleteContainerItemIdentifier[itemIdentifier] = itemIdentifier
-                    fileProviderSignalDeleteWorkingSetItemIdentifier[itemIdentifier] = itemIdentifier
+                    self.providerData.fileProviderSignalDeleteContainerItemIdentifier[itemIdentifier] = itemIdentifier
+                    self.providerData.fileProviderSignalDeleteWorkingSetItemIdentifier[itemIdentifier] = itemIdentifier
                 }
                 
             }
@@ -256,9 +256,9 @@ extension FileProviderExtension {
             
             let item = FileProviderItem(metadata: metadata!, parentItemIdentifier: parentItemIdentifier, providerData: providerData)
 
-            queueTradeSafe.sync(flags: .barrier) {
-                fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
-                fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
+            providerData.queueTradeSafe.sync(flags: .barrier) {
+                self.providerData.fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
+                self.providerData.fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
             }
             
             uploadFileImportDocument()
@@ -294,9 +294,9 @@ extension FileProviderExtension {
             
             let item = FileProviderItem(metadata: metadata!, parentItemIdentifier: parentItemIdentifier, providerData: providerData)
             
-            queueTradeSafe.sync(flags: .barrier) {
-                fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
-                fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
+            providerData.queueTradeSafe.sync(flags: .barrier) {
+                providerData.fileProviderSignalUpdateContainerItem[item.itemIdentifier] = item
+                providerData.fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
             }
         }
         

+ 8 - 22
PickerFileProvider/FileProviderExtension.swift

@@ -26,20 +26,6 @@ import FileProvider
 // Timer for Upload (queue)
 var timerUpload: Timer?
 
-// Item for signalEnumerator
-var fileProviderSignalDeleteContainerItemIdentifier = [NSFileProviderItemIdentifier:NSFileProviderItemIdentifier]()
-var fileProviderSignalUpdateContainerItem = [NSFileProviderItemIdentifier:FileProviderItem]()
-var fileProviderSignalDeleteWorkingSetItemIdentifier = [NSFileProviderItemIdentifier:NSFileProviderItemIdentifier]()
-var fileProviderSignalUpdateWorkingSetItem = [NSFileProviderItemIdentifier:FileProviderItem]()
-
-// Rank favorite
-var listFavoriteIdentifierRank = [String:NSNumber]()
-
-// Queue for trade-safe
-let queueTradeSafe = DispatchQueue(label: "com.nextcloud.fileproviderextension.tradesafe", attributes: .concurrent)
-
-var currentAnchor: UInt64 = 0
-
 /* -----------------------------------------------------------------------------------------------------------------------------------------------
                                                             STRUCT item
    -----------------------------------------------------------------------------------------------------------------------------------------------
@@ -166,7 +152,7 @@ class FileProviderExtension: NSFileProviderExtension, CCNetworkingDelegate {
         /* ONLY iOS 11*/
         guard #available(iOS 11, *) else { return }
         
-        currentAnchor += 1
+        providerData.currentAnchor += 1
 
         for containerItemIdentifier in containerItemIdentifiers {
             
@@ -187,10 +173,10 @@ class FileProviderExtension: NSFileProviderExtension, CCNetworkingDelegate {
         
         // ***** Favorite Files <-> Favorite Nextcloud *****
         
-        listFavoriteIdentifierRank = NCManageDatabase.sharedInstance.getTableMetadatasDirectoryFavoriteIdentifierRank()
+        providerData.listFavoriteIdentifierRank = NCManageDatabase.sharedInstance.getTableMetadatasDirectoryFavoriteIdentifierRank()
         
         // (ADD)
-        for (identifier, _) in listFavoriteIdentifierRank {
+        for (identifier, _) in providerData.listFavoriteIdentifierRank {
             
             guard let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account = %@ AND fileID = %@", providerData.account, identifier)) else {
                 continue
@@ -202,8 +188,8 @@ class FileProviderExtension: NSFileProviderExtension, CCNetworkingDelegate {
             
             let item = FileProviderItem(metadata: metadata, parentItemIdentifier: parentItemIdentifier, providerData: providerData)
             
-            queueTradeSafe.sync(flags: .barrier) {
-                fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
+            providerData.queueTradeSafe.sync(flags: .barrier) {
+                providerData.fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
             }
         }
         
@@ -216,11 +202,11 @@ class FileProviderExtension: NSFileProviderExtension, CCNetworkingDelegate {
                 }
                 
                 let itemIdentifier = providerData.getItemIdentifier(metadata: metadata)
-                listFavoriteIdentifierRank.removeValue(forKey: itemIdentifier.rawValue)
+                providerData.listFavoriteIdentifierRank.removeValue(forKey: itemIdentifier.rawValue)
                 let item = FileProviderItem(metadata: metadata, parentItemIdentifier: parentItemIdentifier, providerData: providerData)
                 
-                queueTradeSafe.sync(flags: .barrier) {
-                    fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
+                providerData.queueTradeSafe.sync(flags: .barrier) {
+                    providerData.fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
                 }
             }
         }

+ 2 - 2
PickerFileProvider/FileProviderItem.swift

@@ -129,11 +129,11 @@ class FileProviderItem: NSObject, NSFileProviderItem {
             
             // Favorite directory
             if #available(iOSApplicationExtension 11.0, *) {
-                let rank = listFavoriteIdentifierRank[metadata.fileID]
+                let rank = providerData.listFavoriteIdentifierRank[metadata.fileID]
                 if (rank == nil) {
                     favoriteRank = nil
                 } else {
-                    favoriteRank = listFavoriteIdentifierRank[metadata.fileID]
+                    favoriteRank = providerData.listFavoriteIdentifierRank[metadata.fileID]
                 }
             }
         }