Эх сурвалжийг харах

coding

Signed-off-by: Marino Faggiana <marino@marinofaggiana.com>
Marino Faggiana 2 жил өмнө
parent
commit
6441dd6fef

+ 55 - 2
iOSClient/Networking/NCAutoUpload.swift

@@ -34,6 +34,8 @@ class NCAutoUpload: NSObject {
     }()
 
     private var endForAssetToUpload: Bool = false
+    private let appDelegate = UIApplication.shared.delegate as? AppDelegate
+
 
     // MARK: -
 
@@ -167,9 +169,9 @@ class NCAutoUpload: NSObject {
 
                 self.endForAssetToUpload = true
                 if selector == NCGlobal.shared.selectorUploadAutoUploadAll {
-                    (UIApplication.shared.delegate as? AppDelegate)?.networkingProcessUpload?.createProcessUploads(metadatas: metadatas, verifyAlreadyExists: false, completion: completion)
+                    self.appDelegate?.networkingProcessUpload?.createProcessUploads(metadatas: metadatas, completion: completion)
                 } else {
-                    (UIApplication.shared.delegate as? AppDelegate)?.networkingProcessUpload?.createProcessUploads(metadatas: metadatas, verifyAlreadyExists: true, completion: completion)
+                    self.createProcessAutoUploads(metadatas: metadatas, completion: completion)
                 }
                 completion(metadatas.count)
             }
@@ -178,6 +180,57 @@ class NCAutoUpload: NSObject {
 
     // MARK: -
 
+    func createProcessAutoUploads(metadatas: [tableMetadata], completion: @escaping (_ items: Int) -> Void) {
+
+        var metadatasForUpload: [tableMetadata] = []
+        var numStartUpload: Int = 0
+
+        for metadata in metadatas {
+            if NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ && serverUrl == %@ && fileName == %@ && session != ''", metadata.account, metadata.serverUrl, metadata.fileName)) != nil { continue }
+            metadatasForUpload.append(metadata)
+        }
+        NCManageDatabase.shared.addMetadatas(metadatasForUpload)
+
+        let metadatasInUpload = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "status == %d OR status == %d", NCGlobal.shared.metadataStatusInUpload, NCGlobal.shared.metadataStatusUploading))
+        let counterUpload = NCGlobal.shared.maxConcurrentOperationUpload - metadatasInUpload.count
+        if counterUpload <= 0 { return completion(0) }
+
+        // Extract file
+
+        let metadatas = NCManageDatabase.shared.getAdvancedMetadatas(predicate: NSPredicate(format: "sessionSelector == %@ AND status == %d", NCGlobal.shared.selectorUploadAutoUpload, NCGlobal.shared.metadataStatusWaitUpload), page: 0, limit: counterUpload, sorted: "date", ascending: true)
+
+        for metadata in metadatas {
+
+            let metadata = tableMetadata.init(value: metadata)
+            let semaphore = Semaphore()
+
+            NCUtility.shared.extractFiles(from: metadata) { metadatas in
+                if metadatas.isEmpty {
+                    NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
+                }
+                for metadata in metadatas {
+                    if (metadata.e2eEncrypted || metadata.chunk) && UIApplication.shared.applicationState != .active {  continue }
+                    let isWiFi = NCNetworking.shared.networkReachability == NKCommon.typeReachability.reachableEthernetOrWiFi
+                    if metadata.session == NCNetworking.shared.sessionIdentifierBackgroundWWan && !isWiFi { continue }
+                    guard let metadata = NCManageDatabase.shared.setMetadataStatus(ocId: metadata.ocId, status: NCGlobal.shared.metadataStatusInUpload) else { continue }
+                    // Upload
+                    let semaphoreUpload = Semaphore()
+                    NCNetworking.shared.upload(metadata: metadata) {
+                        numStartUpload += 1
+                    } completion: { error in
+                        semaphoreUpload.continue()
+                    }
+                    semaphoreUpload.wait()
+                }
+                semaphore.continue()
+            }
+            semaphore.wait()
+        }
+        completion(numStartUpload)
+    }
+
+    // MARK: -
+
     @objc func alignPhotoLibrary(viewController: UIViewController?) {
         guard let activeAccount = NCManageDatabase.shared.getActiveAccount() else { return }
 

+ 11 - 25
iOSClient/Networking/NCNetworkingProcessUpload.swift

@@ -36,30 +36,24 @@ class NCNetworkingProcessUpload: NSObject {
 
     private func startProcess(completion: @escaping (_ items: Int) -> Void) {
         if timerProcess?.isValid ?? false {
-            DispatchQueue.main.async {
-                self.process(completion: completion)
-            }
+            DispatchQueue.main.async { self.processForeground() }
         }
     }
 
     func startTimer() {
         timerProcess?.invalidate()
-        timerProcess = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(processTimer), userInfo: nil, repeats: true)
+        timerProcess = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(processForeground), userInfo: nil, repeats: true)
     }
 
     func stopTimer() {
         timerProcess?.invalidate()
     }
 
-    @objc private func processTimer() {
-        self.process { _ in }
-    }
-    private func process(completion: @escaping (_ items: Int) -> Void) {
-        guard let account = NCManageDatabase.shared.getActiveAccount() else { return }
+    @objc private func processForeground() {
+        guard let account = NCManageDatabase.shared.getActiveAccount(), UIApplication.shared.applicationState == .active else { return }
 
         stopTimer()
 
-        let applicationState = UIApplication.shared.applicationState
         var counterUpload: Int = 0
         let sessionSelectors = [NCGlobal.shared.selectorUploadFileNODelete, NCGlobal.shared.selectorUploadFile, NCGlobal.shared.selectorUploadAutoUpload, NCGlobal.shared.selectorUploadAutoUploadAll]
         let metadatasUpload = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "status == %d OR status == %d", NCGlobal.shared.metadataStatusInUpload, NCGlobal.shared.metadataStatusUploading))
@@ -115,22 +109,16 @@ class NCNetworkingProcessUpload: NSObject {
                                 NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
                             }
                             for metadata in metadatas {
-                                if (metadata.e2eEncrypted || metadata.chunk) && applicationState != .active {  continue }
                                 let isWiFi = NCNetworking.shared.networkReachability == NKCommon.typeReachability.reachableEthernetOrWiFi
                                 if metadata.session == NCNetworking.shared.sessionIdentifierBackgroundWWan && !isWiFi { continue }
-                                guard let metadata = NCManageDatabase.shared.setMetadataStatus(ocId: metadata.ocId, status: NCGlobal.shared.metadataStatusInUpload) else { continue }
-                                // Upload
-                                let semaphoreUpload = DispatchSemaphore(value: 1)
-                                NCNetworking.shared.upload(metadata: metadata) {
-                                    if metadata.e2eEncrypted || metadata.chunk {
-                                        counterUpload = NCGlobal.shared.maxConcurrentOperationUpload
-                                    } else {
-                                        counterUpload += 1
-                                    }
-                                } completion: { error in
-                                    semaphoreUpload.signal()
+                                if let metadata = NCManageDatabase.shared.setMetadataStatus(ocId: metadata.ocId, status: NCGlobal.shared.metadataStatusInUpload) {
+                                    NCNetworking.shared.upload(metadata: metadata)
+                                }
+                                if metadata.e2eEncrypted || metadata.chunk {
+                                    counterUpload = NCGlobal.shared.maxConcurrentOperationUpload
+                                } else {
+                                    counterUpload += 1
                                 }
-                                semaphoreUpload.wait()
                             }
                             semaphore.signal()
                         }
@@ -157,8 +145,6 @@ class NCNetworkingProcessUpload: NSObject {
                     self.startTimer()
                 }
             }
-
-            completion(counterUpload)
         })
     }