Marino Faggiana 7 жил өмнө
parent
commit
432b8409b6

+ 30 - 24
PickerFileProvider/FileProvider.swift

@@ -45,7 +45,7 @@ var listUpdateItems = [NSFileProviderItem]()
 var listFavoriteIdentifierRank = [String:NSNumber]()
 var fileNamePathImport = [String]()
 
-var uploadMetadataNet: CCMetadataNet?
+var uploadMetadataNetInProgress: CCMetadataNet?
 var timerUpload: Timer?
 
 class FileProvider: NSFileProviderExtension {
@@ -65,47 +65,50 @@ class FileProvider: NSFileProviderExtension {
                 
                 timerUpload = Timer.init(timeInterval: 0.5, repeats: true, block: { (Timer) in
                     
-                    let metadataNetQueue = NCManageDatabase.sharedInstance.getQueueUpload(withPath: true)
-                    if  metadataNetQueue != nil && uploadMetadataNet == nil {
+                    if uploadMetadataNetInProgress == nil {
                         
-                        if self.copyFile(metadataNetQueue!.path, toPath: directoryUser + "/" + metadataNetQueue!.fileName) == nil {
+                        let metadataNetQueue = NCManageDatabase.sharedInstance.getQueueUploadLock(selector: selectorUploadFile, withPath: true)
+                        if  metadataNetQueue != nil {
+                            
+                            if self.copyFile(metadataNetQueue!.path, toPath: directoryUser + "/" + metadataNetQueue!.fileName) == nil {
 
-                            // *** Don't capture clousure success/failure : is not affidable in extension ... problem of lib ***
-                            let task = ocNetworking?.uploadFileNameServerUrl(metadataNetQueue!.serverUrl+"/"+metadataNetQueue!.fileName, fileNameLocalPath: directoryUser + "/" + metadataNetQueue!.fileName, communication: CCNetworking.shared().sharedOCCommunicationExtensionUpload(k_upload_session_extension), success: { (fileID, etag, date) in }, failure: { (errorMessage, errorCode) in })
-                            if task != nil {
-                                uploadMetadataNet = metadataNetQueue!
-                                uploadMetadataNet!.task = task
+                                // *** Don't capture clousure success/failure : is not affidable in extension ... problem of lib ***
+                                let task = ocNetworking?.uploadFileNameServerUrl(metadataNetQueue!.serverUrl+"/"+metadataNetQueue!.fileName, fileNameLocalPath: directoryUser + "/" + metadataNetQueue!.fileName, communication: CCNetworking.shared().sharedOCCommunicationExtensionUpload(k_upload_session_extension), success: { (fileID, etag, date) in }, failure: { (errorMessage, errorCode) in })
+                                if task != nil {
+                                    uploadMetadataNetInProgress = metadataNetQueue!
+                                    uploadMetadataNetInProgress!.task = task
+                                }
+                            } else {
+                                // file not present, delete record Upload Queue
+                                NCManageDatabase.sharedInstance.deleteQueueUpload(path: metadataNetQueue!.path)
                             }
-                        } else {
-                            // file not present, delete record Upload Queue
-                            NCManageDatabase.sharedInstance.deleteQueueUpload(path: metadataNetQueue!.path)
                         }
                     }
                     
                     // Verify running task
-                    if uploadMetadataNet != nil && uploadMetadataNet?.task != nil {
-                        let task = uploadMetadataNet!.task
+                    if uploadMetadataNetInProgress != nil && uploadMetadataNetInProgress?.task != nil {
+                        let task = uploadMetadataNetInProgress!.task
                         if task!.state != URLSessionTask.State.running {
                            
                             let httpResponse = task!.response as! HTTPURLResponse
 
                             if (httpResponse.statusCode >= 200 && httpResponse.statusCode < 300) {
                             
-                                NCManageDatabase.sharedInstance.deleteQueueUpload(path: uploadMetadataNet!.path)
+                                NCManageDatabase.sharedInstance.deleteQueueUpload(path: uploadMetadataNetInProgress!.path)
 
                                 let fields = httpResponse.allHeaderFields
                                 
                                 let etag = (fields["OC-ETag"] as! String).replacingOccurrences(of: "\"", with: "")
                                 let fileID = fields["OC-FileId"] as! String
                                 
-                                if let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account = %@ AND fileName = %@ AND directoryID = %@", account, uploadMetadataNet!.fileName, uploadMetadataNet!.directoryID)) {
+                                if let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "account = %@ AND fileName = %@ AND directoryID = %@", account, uploadMetadataNetInProgress!.fileName, uploadMetadataNetInProgress!.directoryID)) {
                                         
                                     let prevFileID = metadata.fileID
                                         
                                     metadata.etag = etag
                                     metadata.fileID = fileID
                                     do {
-                                        let attr = try FileManager.default.attributesOfItem(atPath: directoryUser + "/" + uploadMetadataNet!.fileName)
+                                        let attr = try FileManager.default.attributesOfItem(atPath: directoryUser + "/" + uploadMetadataNetInProgress!.fileName)
                                         metadata.size = attr[FileAttributeKey.size] as! Double
                                     } catch { }
                                     metadata.session = ""
@@ -114,7 +117,7 @@ class FileProvider: NSFileProviderExtension {
                                     NCManageDatabase.sharedInstance.addLocalFile(metadata: metadata)
                                     NCManageDatabase.sharedInstance.setLocalFile(fileID: fileID, date: nil, exifDate: nil, exifLatitude: nil, exifLongitude: nil, fileName: nil, etag: etag, etagFPE: etag)
                                     let metadataDB = NCManageDatabase.sharedInstance.addMetadata(metadata)
-                                    _ = self.copyFile(uploadMetadataNet!.path, toPath: directoryUser + "/" + fileID)
+                                    _ = self.copyFile(uploadMetadataNetInProgress!.path, toPath: directoryUser + "/" + fileID)
                                         
                                     // if prevFileID is a k_uploadSessionID remove
                                     if prevFileID.contains(k_uploadSessionID) {
@@ -133,19 +136,22 @@ class FileProvider: NSFileProviderExtension {
                                         }
                                     }
                                         
-                                    let item = FileProviderItem(metadata: metadataDB!, serverUrl: uploadMetadataNet!.serverUrl)
-                                    self.refreshEnumerator(identifier: item.itemIdentifier, serverUrl: uploadMetadataNet!.serverUrl)
+                                    let item = FileProviderItem(metadata: metadataDB!, serverUrl: uploadMetadataNetInProgress!.serverUrl)
+                                    self.refreshEnumerator(identifier: item.itemIdentifier, serverUrl: uploadMetadataNetInProgress!.serverUrl)
                                 }
                                 
                             } else {
-                                // Error
+                                // Http Error unlock
+                                NCManageDatabase.sharedInstance.unlockQueueUpload(assetLocalIdentifier: nil, path: uploadMetadataNetInProgress!.path)
                             }
                             
-                            uploadMetadataNet = nil
+                            uploadMetadataNetInProgress = nil
                         }
+                        
                     } else {
-                       
-                        // remove All
+                        
+                        // NO running task
+                        NCManageDatabase.sharedInstance.unlockAllQueueUploadInPath()
                     }
                 })
                 RunLoop.main.add(timerUpload!, forMode: .defaultRunLoopMode)

+ 22 - 0
iOSClient/Database/NCManageDatabase.swift

@@ -2452,6 +2452,28 @@ class NCManageDatabase: NSObject {
         }
     }
     
+    @objc func unlockAllQueueUploadInPath() {
+        
+        guard let tableAccount = self.getAccountActive() else {
+            return
+        }
+        
+        let realm = try! Realm()
+        
+        do {
+            try realm.write {
+                
+                let results = realm.objects(tableQueueUpload.self).filter("account = %@ AND path != nil", tableAccount.account)
+                
+                for result in results {
+                    result.lock = false;
+                }
+            }
+        } catch let error {
+            print("[LOG] Could not write to database: ", error)
+        }
+    }
+    
     @objc func deleteQueueUpload(assetLocalIdentifier: String, selector: String) {
         
         guard let tableAccount = self.getAccountActive() else {