Browse Source

manage queue Upload e2

Marino Faggiana 7 years ago
parent
commit
3b64dc545a
3 changed files with 86 additions and 100 deletions
  1. 13 5
      iOSClient/AppDelegate.m
  2. 14 47
      iOSClient/Database/NCManageDatabase.swift
  3. 59 48
      iOSClient/Networking/CCNetworking.m

+ 13 - 5
iOSClient/AppDelegate.m

@@ -1457,7 +1457,7 @@
     
     while (counterUploadInSessionAndInLock < maxConcurrentDownloadUpload) {
         
-        metadataNet = [[NCManageDatabase sharedInstance] getQueueUploadWithSelector:selectorUploadAutoUpload];
+        metadataNet = [[NCManageDatabase sharedInstance] getQueueUploadLockWithSelector:selectorUploadAutoUpload];
         if (metadataNet) {
             
             // Priority Error only in Foreground
@@ -1489,7 +1489,7 @@
         
         while (counterUploadInSessionAndInLock < maxConcurrentDownloadUpload) {
             
-            metadataNet =  [[NCManageDatabase sharedInstance] getQueueUploadWithSelector:selectorUploadAutoUploadAll];
+            metadataNet =  [[NCManageDatabase sharedInstance] getQueueUploadLockWithSelector:selectorUploadAutoUploadAll];
             if (metadataNet) {
                 
                 // Priority Error only in Foreground
@@ -1511,15 +1511,23 @@
     
     while (counterUploadInSessionAndInLock < maxConcurrentDownloadUpload) {
         
-        metadataNet = [[NCManageDatabase sharedInstance] getQueueUploadWithSelector:selectorUploadFile];
+        metadataNet = [[NCManageDatabase sharedInstance] getQueueUploadLockWithSelector:selectorUploadFile];
         if (metadataNet) {
             
+            // Encrypted ONLY 1 LOCK
+            if ([CCUtility isFolderEncrypted:metadataNet.serverUrl account:metadataNet.account]) {
+                
+                NSArray *recordUploadInLock = [[NCManageDatabase sharedInstance] getQueueUploadWithPredicate:[NSPredicate predicateWithFormat:@"account = %@ AND lock = true", self.activeAccount]];
+                if (recordUploadInLock.count >= 1)
+                    break;
+            }
+                
             // Priority Error only in Foreground
             if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground && metadataNet.priority <= k_priorityAutoUploadError)
                 continue;
-            
+                
             [[CCNetworking sharedNetworking] uploadFileFromAssetLocalIdentifier:metadataNet delegate:_activeMain];
-            
+                
             counterNewUpload++;
             
         } else

+ 14 - 47
iOSClient/Database/NCManageDatabase.swift

@@ -1840,52 +1840,6 @@ class NCManageDatabase: NSObject {
     //MARK: -
     //MARK: Table Queue Download
     
-    /*
-    @objc func addQueueDownload(fileID: String, encrypted: Bool, selector: String, selectorPost: String?, serverUrl: String, session: String) -> Bool {
-        
-        guard let tableAccount = self.getAccountActive() else {
-            return false
-        }
-        
-        let realm = try! Realm()
-        
-        if realm.isInWriteTransaction {
-            
-            print("[LOG] Could not write to database, addQueueDownload is already in write transaction")
-            return false
-            
-        } else {
-            
-            do {
-                try realm.write {
-                    
-                    // Add new
-                    let addObject = tableQueueDownload()
-                        
-                    addObject.account = tableAccount.account
-                    addObject.encrypted = encrypted
-                    addObject.fileID = fileID
-                    addObject.selector = selector
-                        
-                    if let selectorPost = selectorPost {
-                        addObject.selectorPost = selectorPost
-                    }
-                    
-                    addObject.serverUrl = serverUrl
-                    addObject.session = session
-                    
-                    realm.add(addObject, update: true)
-                }
-            } catch let error {
-                print("[LOG] Could not write to database: ", error)
-                return false
-            }
-        }
-        
-        return true
-    }
-    */
-    
     @objc func addQueueDownload(metadatasNet: [CCMetadataNet]) {
         
         guard let tableAccount = self.getAccountActive() else {
@@ -2069,7 +2023,7 @@ class NCManageDatabase: NSObject {
         }
     }
     
-    @objc func getQueueUpload(selector: String) -> CCMetadataNet? {
+    @objc func getQueueUploadLock(selector: String) -> CCMetadataNet? {
         
         guard let tableAccount = self.getAccountActive() else {
             return nil
@@ -2122,6 +2076,19 @@ class NCManageDatabase: NSObject {
         return Array(results.map { tableQueueUpload.init(value:$0) })
     }
     
+    @objc func getQueueUpload(predicate: NSPredicate) -> [tableQueueUpload]? {
+        
+        guard self.getAccountActive() != nil else {
+            return nil
+        }
+        
+        let realm = try! Realm()
+        
+        let results = realm.objects(tableQueueUpload.self).filter(predicate)
+        
+        return Array(results.map { tableQueueUpload.init(value:$0) })
+    }
+    
     @objc func unlockQueueUpload(assetLocalIdentifier: String) {
         
         guard let tableAccount = self.getAccountActive() else {

+ 59 - 48
iOSClient/Networking/CCNetworking.m

@@ -1117,60 +1117,71 @@
         
     } else {
         
-        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
-
-            NSString *e2eMetadataJSON = nil;
-        
-            // *** IS ENCRYPTED ---> CREATE METADATA ***
-            if ([CCUtility isFolderEncrypted:serverUrl account:_activeAccount]) {
+        // *** IS ENCRYPTED ---> CREATE METADATA ***
+        if ([CCUtility isFolderEncrypted:serverUrl account:_activeAccount]) {
             
-                NSArray *tableE2eEncryption = [[NCManageDatabase sharedInstance] getE2eEncryptionsWithPredicate:[NSPredicate predicateWithFormat:@"account = %@ AND serverUrl = %@", _activeAccount, serverUrl]];
-                tableDirectory *tableDirectory = [[NCManageDatabase sharedInstance] getTableDirectoryWithPredicate:[NSPredicate predicateWithFormat:@"account = %@ AND serverUrl = %@", _activeAccount, serverUrl]];
-
-                e2eMetadataJSON = [[NCEndToEndMetadata sharedInstance] encoderMetadata:tableE2eEncryption privateKey:[CCUtility getEndToEndPrivateKey:_activeAccount] serverUrl:serverUrl metadataKey:tableDirectory.e2eMetadataKey];
+            NSArray *tableE2eEncryption = [[NCManageDatabase sharedInstance] getE2eEncryptionsWithPredicate:[NSPredicate predicateWithFormat:@"account = %@ AND serverUrl = %@", _activeAccount, serverUrl]];
+            tableDirectory *tableDirectory = [[NCManageDatabase sharedInstance] getTableDirectoryWithPredicate:[NSPredicate predicateWithFormat:@"account = %@ AND serverUrl = %@", _activeAccount, serverUrl]];
             
-                if (!e2eMetadataJSON) {
-                    
-                    dispatch_async(dispatch_get_main_queue(), ^{
-                        [[NCManageDatabase sharedInstance] addActivityClient:fileName fileID:assetLocalIdentifier action:k_activityDebugActionUpload selector:selector note:@"Serious internal error to encoding metadata" type:k_activityTypeFailure verbose:k_activityVerboseHigh activeUrl:_activeUrl];
-                        [[NCManageDatabase sharedInstance] setMetadataSession:session sessionError:@"Serious internal error to encoding metadata" sessionSelector:nil sessionSelectorPost:nil sessionTaskIdentifier:k_taskIdentifierError predicate:[NSPredicate predicateWithFormat:@"sessionID = %@ AND account = %@", sessionID, _activeAccount]];
-                        [[NCManageDatabase sharedInstance] deleteQueueUploadWithAssetLocalIdentifier:assetLocalIdentifier selector:selector];
-                        [uploadTask cancel];
-                    });
-
-                    return;
-                }
-            }
+            NSString *e2eMetadataJSON = [[NCEndToEndMetadata sharedInstance] encoderMetadata:tableE2eEncryption privateKey:[CCUtility getEndToEndPrivateKey:_activeAccount] serverUrl:serverUrl metadataKey:tableDirectory.e2eMetadataKey];
 
-            // *** IS e2eMetadataJSON ---> SEND METADATA ***
-            if (e2eMetadataJSON) {
-                if ([self SendEndToEndMetadata:e2eMetadataJSON serverUrl:serverUrl] == false) {
+            if (!e2eMetadataJSON) {
+                [[NCManageDatabase sharedInstance] addActivityClient:fileName fileID:assetLocalIdentifier action:k_activityDebugActionUpload selector:selector note:@"Serious internal error to encoding metadata" type:k_activityTypeFailure verbose:k_activityVerboseHigh activeUrl:_activeUrl];
+                [[NCManageDatabase sharedInstance] setMetadataSession:session sessionError:@"Serious internal error to encoding metadata" sessionSelector:nil sessionSelectorPost:nil sessionTaskIdentifier:k_taskIdentifierError predicate:[NSPredicate predicateWithFormat:@"sessionID = %@ AND account = %@", sessionID, _activeAccount]];
+                [[NCManageDatabase sharedInstance] deleteQueueUploadWithAssetLocalIdentifier:assetLocalIdentifier selector:selector];
+                [uploadTask cancel];
+                
+            } else {
+                
+                // Send Metadata
+                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
                     
-                    dispatch_async(dispatch_get_main_queue(), ^{
-                        [[NCManageDatabase sharedInstance] addActivityClient:fileName fileID:assetLocalIdentifier action:k_activityDebugActionUpload selector:selector note:@"Error to send metadata" type:k_activityTypeFailure verbose:k_activityVerboseHigh activeUrl:_activeUrl];
-                        [[NCManageDatabase sharedInstance] setMetadataSession:session sessionError:@"Error to send metadata" sessionSelector:nil sessionSelectorPost:nil sessionTaskIdentifier:k_taskIdentifierError predicate:[NSPredicate predicateWithFormat:@"sessionID = %@ AND account = %@", sessionID, _activeAccount]];
+                    if ([self SendEndToEndMetadata:e2eMetadataJSON serverUrl:serverUrl]) {
+                        
+                        [[NCManageDatabase sharedInstance] setMetadataSession:session sessionError:@"" sessionSelector:nil sessionSelectorPost:nil sessionTaskIdentifier:uploadTask.taskIdentifier predicate:[NSPredicate predicateWithFormat:@"sessionID = %@ AND account = %@", sessionID, _activeAccount]];
+                        
+                        // OOOOOOKKKK remove record on Table Auto Upload
                         [[NCManageDatabase sharedInstance] deleteQueueUploadWithAssetLocalIdentifier:assetLocalIdentifier selector:selector];
-                        [uploadTask cancel];
-                    });
-                
-                    return;
-                }
+                        
+                        // Manage uploadTask cancel,suspend,resume
+                        if (taskStatus == k_taskStatusCancel) [uploadTask cancel];
+                        else if (taskStatus == k_taskStatusSuspend) [uploadTask suspend];
+                        else if (taskStatus == k_taskStatusResume) [uploadTask resume];
+                        
+                        NSLog(@"[LOG] Upload file %@ TaskIdentifier %lu", fileName, (unsigned long)uploadTask.taskIdentifier);
+                        
+#ifndef EXTENSION
+                        // Force Next
+                        [app loadAutoDownloadUpload:[NSNumber numberWithInt:10]];
+#endif
+
+                    } else {
+                        dispatch_async(dispatch_get_main_queue(), ^{
+                            [[NCManageDatabase sharedInstance] addActivityClient:fileName fileID:assetLocalIdentifier action:k_activityDebugActionUpload selector:selector note:@"Error to send metadata" type:k_activityTypeFailure verbose:k_activityVerboseHigh activeUrl:_activeUrl];
+                            [[NCManageDatabase sharedInstance] setMetadataSession:session sessionError:@"Error to send metadata" sessionSelector:nil sessionSelectorPost:nil sessionTaskIdentifier:k_taskIdentifierError predicate:[NSPredicate predicateWithFormat:@"sessionID = %@ AND account = %@", sessionID, _activeAccount]];
+                            [[NCManageDatabase sharedInstance] deleteQueueUploadWithAssetLocalIdentifier:assetLocalIdentifier selector:selector];
+                            [uploadTask cancel];
+                        });
+                    }
+                });
             }
-        
-            dispatch_async(dispatch_get_main_queue(), ^{
-                [[NCManageDatabase sharedInstance] setMetadataSession:session sessionError:@"" sessionSelector:nil sessionSelectorPost:nil sessionTaskIdentifier:uploadTask.taskIdentifier predicate:[NSPredicate predicateWithFormat:@"sessionID = %@ AND account = %@", sessionID, _activeAccount]];
-        
-                // OOOOOOKKKK remove record on Table Auto Upload
-                [[NCManageDatabase sharedInstance] deleteQueueUploadWithAssetLocalIdentifier:assetLocalIdentifier selector:selector];
-        
-                // Manage uploadTask cancel,suspend,resume
-                if (taskStatus == k_taskStatusCancel) [uploadTask cancel];
-                else if (taskStatus == k_taskStatusSuspend) [uploadTask suspend];
-                else if (taskStatus == k_taskStatusResume) [uploadTask resume];
-        
-                NSLog(@"[LOG] Upload file %@ TaskIdentifier %lu", fileName, (unsigned long)uploadTask.taskIdentifier);
-            });
-        });
+            
+         } else {
+    
+             // *** PLAIN ***
+             
+             [[NCManageDatabase sharedInstance] setMetadataSession:session sessionError:@"" sessionSelector:nil sessionSelectorPost:nil sessionTaskIdentifier:uploadTask.taskIdentifier predicate:[NSPredicate predicateWithFormat:@"sessionID = %@ AND account = %@", sessionID, _activeAccount]];
+             
+             // OOOOOOKKKK remove record on Table Auto Upload
+             [[NCManageDatabase sharedInstance] deleteQueueUploadWithAssetLocalIdentifier:assetLocalIdentifier selector:selector];
+             
+             // Manage uploadTask cancel,suspend,resume
+             if (taskStatus == k_taskStatusCancel) [uploadTask cancel];
+             else if (taskStatus == k_taskStatusSuspend) [uploadTask suspend];
+             else if (taskStatus == k_taskStatusResume) [uploadTask resume];
+             
+             NSLog(@"[LOG] Upload file %@ TaskIdentifier %lu", fileName, (unsigned long)uploadTask.taskIdentifier);
+         }
     }
 
     // refresh main