Browse Source

Improvements code

Marino Faggiana 7 years ago
parent
commit
c7216eb407

+ 80 - 83
PickerFileProvider/FileProvider.swift

@@ -48,6 +48,13 @@ let FILEID_IMPORT_METADATA_TEMP = k_uploadSessionID + "FILE_PROVIDER_EXTENSION"
 
 var timerUpload: Timer?
 
+// -------------------------------------------------------------------------------------------
+//
+// parentItemIdentifier = NSFileProviderRootContainerItemIdentifier / tableDirectory.fileID
+// ItemIdentifier       = metadata.fileID
+//
+// -------------------------------------------------------------------------------------------
+
 class FileProvider: NSFileProviderExtension, CCNetworkingDelegate {
     
     var fileManager = FileManager()
@@ -149,13 +156,12 @@ class FileProvider: NSFileProviderExtension, CCNetworkingDelegate {
             }
             
         } else {
-        
-            let fileID = identifier.rawValue
             
-            if let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account = %@ AND fileID = %@", account, fileID))  {
-                let parentItemIdentifier = getDirectoryParent(metadataDirectoryID: metadata.directoryID)
+            let metadata = getMetadataFromItemIdentifier(identifier)
+            if  metadata != nil {
+                let parentItemIdentifier = getDirectoryParent(metadataDirectoryID: metadata!.directoryID)
                 if parentItemIdentifier != nil {
-                    let item = FileProviderItem(metadata: metadata, parentItemIdentifier: parentItemIdentifier!)
+                    let item = FileProviderItem(metadata: metadata!, parentItemIdentifier: parentItemIdentifier!)
                     return item
                 }
             }
@@ -246,7 +252,6 @@ class FileProvider: NSFileProviderExtension, CCNetworkingDelegate {
 
             let pathComponents = url.pathComponents
             let identifier = NSFileProviderItemIdentifier(pathComponents[pathComponents.count - 2])
-            let fileID = identifier.rawValue
             var fileSize = 0 as Double
             var localEtag = ""
             var localEtagFPE = ""
@@ -257,12 +262,12 @@ class FileProvider: NSFileProviderExtension, CCNetworkingDelegate {
                 return
             }
             
-            guard let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account = %@ AND fileID = %@", account, fileID)) else {
+            guard let metadata = getMetadataFromItemIdentifier(identifier) else {
                 completionHandler(NSFileProviderError(.noSuchItem))
                 return
             }
             
-            let tableLocalFile = NCManageDatabase.sharedInstance.getTableLocalFile(predicate: NSPredicate(format: "account = %@ AND fileID = %@", account, fileID))
+            let tableLocalFile = NCManageDatabase.sharedInstance.getTableLocalFile(predicate: NSPredicate(format: "account = %@ AND fileID = %@", account, metadata.fileID))
             if tableLocalFile != nil {
                 localEtag = tableLocalFile!.etag
                 localEtagFPE = tableLocalFile!.etagFPE
@@ -349,9 +354,8 @@ class FileProvider: NSFileProviderExtension, CCNetworkingDelegate {
 
             assert(pathComponents.count > 2)
             let identifier = NSFileProviderItemIdentifier(pathComponents[pathComponents.count - 2])
-            let fileID = identifier.rawValue
             
-            guard let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account = %@ AND fileID = %@", account, fileID))  else {
+            guard let metadata = getMetadataFromItemIdentifier(identifier) else {
                 return
             }
             
@@ -472,15 +476,14 @@ class FileProvider: NSFileProviderExtension, CCNetworkingDelegate {
             
         for itemIdentifier in itemIdentifiers {
             
-            let fileID = itemIdentifier.rawValue
-            
-            if let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account = %@ AND fileID = %@", account, fileID))  {
+            let metadata = getMetadataFromItemIdentifier(itemIdentifier)
+            if metadata != nil {
                     
-                if (metadata.typeFile == k_metadataTypeFile_image || metadata.typeFile == k_metadataTypeFile_video) {
+                if (metadata!.typeFile == k_metadataTypeFile_image || metadata!.typeFile == k_metadataTypeFile_video) {
                         
-                    let serverUrl = NCManageDatabase.sharedInstance.getServerUrl(metadata.directoryID)
-                    let fileName = CCUtility.returnFileNamePath(fromFileName: metadata.fileName, serverUrl: serverUrl, activeUrl: accountUrl)
-                    let fileNameLocal = metadata.fileID
+                    let serverUrl = NCManageDatabase.sharedInstance.getServerUrl(metadata!.directoryID)
+                    let fileName = CCUtility.returnFileNamePath(fromFileName: metadata!.fileName, serverUrl: serverUrl, activeUrl: accountUrl)
+                    let fileNameLocal = metadata!.fileID
 
                     ocNetworking?.downloadThumbnail(withDimOfThumbnail: "m", fileName: fileName, fileNameLocal: fileNameLocal, success: {
 
@@ -535,24 +538,13 @@ class FileProvider: NSFileProviderExtension, CCNetworkingDelegate {
             return
         }
         
-        var serverUrl = ""
-        
-        if parentItemIdentifier == .rootContainer {
-            
-            serverUrl = homeServerUrl
-            
-        } else {
-            
-            let fileID = parentItemIdentifier.rawValue
-            
-            guard let directoryParent = NCManageDatabase.sharedInstance.getTableDirectory(predicate: NSPredicate(format: "account = %@ AND fileID = %@", account, fileID)) else {
-                completionHandler(nil, NSFileProviderError(.noSuchItem))
-                return
-            }
-            
-            serverUrl = directoryParent.serverUrl
+        guard let tableDirectory = getDirectoryFromParentItemIdentifier(parentItemIdentifier) else {
+            completionHandler(nil, NSFileProviderError(.noSuchItem))
+            return
         }
         
+        let serverUrl = tableDirectory.serverUrl
+        
         ocNetworking?.createFolder(directoryName, serverUrl: serverUrl, account: account, success: { (fileID, date) in
     
             let metadata = tableMetadata()
@@ -597,9 +589,7 @@ class FileProvider: NSFileProviderExtension, CCNetworkingDelegate {
             return
         }
         
-        let fileID = itemIdentifier.rawValue
-        
-        guard let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account = %@ AND fileID = %@", account, fileID)) else {
+        guard let metadata = getMetadataFromItemIdentifier(itemIdentifier) else {
             completionHandler(nil)
             return
         }
@@ -655,23 +645,18 @@ class FileProvider: NSFileProviderExtension, CCNetworkingDelegate {
             return
         }
         
-        let fileIDFrom = itemIdentifier.rawValue
-        let fileIDTo = parentItemIdentifier.rawValue
-        
-        var serverUrlTo = ""
-        var fileNameTo = ""
-        var directoryIDTo = ""
-        
         guard let itemFrom = try? item(for: itemIdentifier) else {
             completionHandler(nil, NSFileProviderError(.noSuchItem))
             return
         }
         
-        guard let metadataFrom = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account = %@ AND fileID = %@", account, fileIDFrom)) else {
+        guard let metadataFrom = getMetadataFromItemIdentifier(itemIdentifier) else {
             completionHandler(nil, NSFileProviderError(.noSuchItem))
             return
         }
         
+        let fileIDFrom = metadataFrom.fileID
+        
         guard let serverUrlFrom = NCManageDatabase.sharedInstance.getServerUrl(metadataFrom.directoryID) else {
             completionHandler(nil, NSFileProviderError(.noSuchItem))
             return
@@ -679,18 +664,13 @@ class FileProvider: NSFileProviderExtension, CCNetworkingDelegate {
         
         let fileNameFrom = serverUrlFrom + "/" + itemFrom.filename
 
-        if parentItemIdentifier == NSFileProviderItemIdentifier.rootContainer {
-            serverUrlTo = homeServerUrl
-        } else {
-            guard let metadataTo = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account = %@ AND fileID = %@", account, fileIDTo)) else {
-                completionHandler(nil, NSFileProviderError(.noSuchItem))
-                return
-            }
-            serverUrlTo = NCManageDatabase.sharedInstance.getServerUrl(metadataTo.directoryID)! + "/" + metadataTo.fileName
+        guard let tableDirectoryTo = getDirectoryFromParentItemIdentifier(parentItemIdentifier) else {
+            completionHandler(nil, NSFileProviderError(.noSuchItem))
+            return
         }
-        
-        directoryIDTo = NCManageDatabase.sharedInstance.getDirectoryID(serverUrlTo)!
-        fileNameTo = serverUrlTo + "/" + itemFrom.filename
+        let serverUrlTo = tableDirectoryTo.serverUrl
+        let directoryIDTo = NCManageDatabase.sharedInstance.getDirectoryID(serverUrlTo)!
+        let fileNameTo = serverUrlTo + "/" + itemFrom.filename
     
         ocNetworking?.moveFileOrFolder(fileNameFrom, fileNameTo: fileNameTo, success: {
             
@@ -729,13 +709,11 @@ class FileProvider: NSFileProviderExtension, CCNetworkingDelegate {
             return
         }
         
-        let fileID = itemIdentifier.rawValue
-
-        guard let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account = %@ AND fileID = %@", account, fileID)) else {
+        guard let metadata = getMetadataFromItemIdentifier(itemIdentifier) else {
             completionHandler(nil, NSFileProviderError(.noSuchItem))
             return
         }
-        
+
         guard let serverUrl = NCManageDatabase.sharedInstance.getServerUrl(metadata.directoryID) else {
             completionHandler(nil, NSFileProviderError(.noSuchItem))
             return
@@ -858,15 +836,13 @@ class FileProvider: NSFileProviderExtension, CCNetworkingDelegate {
             return
         }
         
-        let fileID = itemIdentifier.rawValue
-
-        // Add, Remove (nil)
-        NCManageDatabase.sharedInstance.addTag(fileID, tagIOS: tagData)
-        
-        guard let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account = %@ AND fileID = %@", account, fileID))  else {
+        guard let metadata = getMetadataFromItemIdentifier(itemIdentifier) else {
             completionHandler(nil, NSFileProviderError(.noSuchItem))
             return
         }
+       
+        // Add, Remove (nil)
+        NCManageDatabase.sharedInstance.addTag(metadata.fileID, tagIOS: tagData)
         
         let parentItemIdentifier = getDirectoryParent(metadataDirectoryID: metadata.directoryID)
         if parentItemIdentifier != nil {
@@ -898,25 +874,15 @@ class FileProvider: NSFileProviderExtension, CCNetworkingDelegate {
             return
         }
         
-        var directoryPredicate: NSPredicate
         var size = 0 as Double
         let metadata = tableMetadata()
-
-        // get serverUrl
         
-        if parentItemIdentifier == .rootContainer {
-            directoryPredicate = NSPredicate(format: "account = %@ AND serverUrl = %@", account, homeServerUrl)
-        } else {
-            directoryPredicate = NSPredicate(format: "account = %@ AND fileID = %@", account, parentItemIdentifier.rawValue)
-        }
-            
-        guard let directoryParent = NCManageDatabase.sharedInstance.getTableDirectory(predicate: directoryPredicate) else {
+        guard let tableDirectory = getDirectoryFromParentItemIdentifier(parentItemIdentifier) else {
             completionHandler(nil, NSFileProviderError(.noSuchItem))
             return
         }
-        
-        let serverUrl = directoryParent.serverUrl
- 
+        let serverUrl = tableDirectory.serverUrl
+       
         // --------------------------------------------- Copy file here with security access
         
         if fileURL.startAccessingSecurityScopedResource() == false {
@@ -924,8 +890,8 @@ class FileProvider: NSFileProviderExtension, CCNetworkingDelegate {
             return
         }
         
-        let fileName = createFileName(fileURL.lastPathComponent, directoryID: directoryParent.directoryID, serverUrl: serverUrl)
-        let fileNamePathDirectory = fileProviderStorageURL!.path + "/" + FILEID_IMPORT_METADATA_TEMP + directoryParent.directoryID + fileName
+        let fileName = createFileName(fileURL.lastPathComponent, directoryID: tableDirectory.directoryID, serverUrl: serverUrl)
+        let fileNamePathDirectory = fileProviderStorageURL!.path + "/" + FILEID_IMPORT_METADATA_TEMP + tableDirectory.directoryID + fileName
         
         do {
             try FileManager.default.createDirectory(atPath: fileNamePathDirectory, withIntermediateDirectories: true, attributes: nil)
@@ -948,9 +914,9 @@ class FileProvider: NSFileProviderExtension, CCNetworkingDelegate {
         metadata.account = account
         metadata.date = NSDate()
         metadata.directory = false
-        metadata.directoryID = directoryParent.directoryID
+        metadata.directoryID = tableDirectory.directoryID
         metadata.etag = ""
-        metadata.fileID = FILEID_IMPORT_METADATA_TEMP + directoryParent.directoryID + fileName
+        metadata.fileID = FILEID_IMPORT_METADATA_TEMP + tableDirectory.directoryID + fileName
         metadata.size = size
         metadata.status = Double(k_metadataStatusHide)
         metadata.fileName = fileURL.lastPathComponent
@@ -962,7 +928,7 @@ class FileProvider: NSFileProviderExtension, CCNetworkingDelegate {
             let metadataNet = CCMetadataNet()
             
             metadataNet.account = account
-            metadataNet.assetLocalIdentifier = FILEID_IMPORT_METADATA_TEMP + directoryParent.directoryID + fileName
+            metadataNet.assetLocalIdentifier = FILEID_IMPORT_METADATA_TEMP + tableDirectory.directoryID + fileName
             metadataNet.fileName = fileName
             metadataNet.path = fileNamePathDirectory + "/" + fileName
             metadataNet.selector = selectorUploadFile
@@ -1249,3 +1215,34 @@ func getDirectoryParent(metadataDirectoryID: String) -> NSFileProviderItemIdenti
     
     return nil
 }
+
+func getMetadataFromItemIdentifier(_ itemIdentifier: NSFileProviderItemIdentifier) -> tableMetadata? {
+    
+    let fileID = itemIdentifier.rawValue
+    
+    return NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account = %@ AND fileID = %@", account, fileID))
+}
+
+func getDirectoryFromParentItemIdentifier(_ parentItemIdentifier: NSFileProviderItemIdentifier) -> tableDirectory? {
+    
+    /* ONLY iOS 11*/
+    guard #available(iOS 11, *) else {
+        return nil
+    }
+    
+    var directoryPredicate: NSPredicate
+
+    if parentItemIdentifier == .rootContainer {
+        directoryPredicate = NSPredicate(format: "account = %@ AND serverUrl = %@", account, homeServerUrl)
+    } else {
+        directoryPredicate = NSPredicate(format: "account = %@ AND fileID = %@", account, parentItemIdentifier.rawValue)
+    }
+    
+    guard let directoryParent = NCManageDatabase.sharedInstance.getTableDirectory(predicate: directoryPredicate) else {
+        return nil
+    }
+    
+    return directoryParent
+}
+    
+

+ 4 - 5
PickerFileProvider/FileProviderEnumerator.swift

@@ -40,11 +40,10 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
                 serverUrl = homeServerUrl
             } else {
                 
-                let fileID = enumeratedItemIdentifier.rawValue
-                
-                if let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account = %@ AND fileID = %@", account, fileID))  {
-                    if let directorySource = NCManageDatabase.sharedInstance.getTableDirectory(predicate: NSPredicate(format: "account = %@ AND directoryID = %@", account, metadata.directoryID))  {
-                        serverUrl = directorySource.serverUrl + "/" + metadata.fileName
+                let metadata = getMetadataFromItemIdentifier(enumeratedItemIdentifier)
+                if metadata != nil  {
+                    if let directorySource = NCManageDatabase.sharedInstance.getTableDirectory(predicate: NSPredicate(format: "account = %@ AND directoryID = %@", account, metadata!.directoryID))  {
+                        serverUrl = directorySource.serverUrl + "/" + metadata!.fileName
                     }
                 }
             }

+ 1 - 2
PickerFileProvider/FileProviderEnumeratorFile.swift

@@ -38,9 +38,8 @@ class FileProviderEnumeratorFile: NSObject, NSFileProviderEnumerator {
     func enumerateItems(for observer: NSFileProviderEnumerationObserver, startingAt page: NSFileProviderPage) {
         
         var items: [NSFileProviderItemProtocol] = []
-        let fileID = enumeratedItemIdentifier.rawValue
         
-        guard let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account = %@ AND fileID = %@", account, fileID)) else {
+        guard let metadata = getMetadataFromItemIdentifier(enumeratedItemIdentifier) else {
             observer.finishEnumerating(upTo: nil)
             return
         }

+ 4 - 1
PickerFileProvider/FileProviderItem.swift

@@ -72,9 +72,12 @@ class FileProviderItem: NSObject, NSFileProviderItem {
 
     init(metadata: tableMetadata, parentItemIdentifier: NSFileProviderItemIdentifier) {
         
-        self.itemIdentifier = NSFileProviderItemIdentifier(metadata.fileID)
+        // parentItemIdentifier = NSFileProviderRootContainerItemIdentifier / tableDirectory.fileID
         self.parentItemIdentifier = parentItemIdentifier
         
+        // ItemIdentifier = metadata.fileID
+        self.itemIdentifier = NSFileProviderItemIdentifier(metadata.fileID)
+        
         self.contentModificationDate = metadata.date as Date
         self.creationDate = metadata.date as Date
         self.documentSize = NSNumber(value: metadata.size)