Quellcode durchsuchen

Add Auto Download Queue System

Marino Faggiana vor 7 Jahren
Ursprung
Commit
c2516e2e3c

+ 26 - 8
iOSClient/AppDelegate.m

@@ -232,7 +232,7 @@
     }
     
     // Start Timer
-    self.timerProcessAutoDownloadUpload = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(processAutoUpload) userInfo:nil repeats:YES];
+    self.timerProcessAutoDownloadUpload = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(processAutoDownloadUpload) userInfo:nil repeats:YES];
     
     self.timerUpdateApplicationIconBadgeNumber = [NSTimer scheduledTimerWithTimeInterval:k_timerUpdateApplicationIconBadgeNumber target:self selector:@selector(updateApplicationIconBadgeNumber) userInfo:nil repeats:YES];
 
@@ -356,7 +356,7 @@
 #pragma mark ===== Process Auto Upload < k_timerProcess seconds > =====
 #pragma --------------------------------------------------------------------------------------------
 
-- (void)processAutoUpload
+- (void)processAutoDownloadUpload
 {
     // Test Maintenance
     if (self.maintenanceMode)
@@ -385,13 +385,31 @@
     // Stop Timer
     [_timerProcessAutoDownloadUpload invalidate];
     
-    NSInteger maxConcurrentUpload = [maxConcurrent integerValue];
+    NSInteger maxConcurrentDownloadUpload = [maxConcurrent integerValue];
+    
+    NSInteger counterDownloadInSession = [[[NCManageDatabase sharedInstance] getTableMetadataDownload] count] + [[[NCManageDatabase sharedInstance] getTableMetadataDownloadWWan] count];
     NSInteger counterUploadInSessionAndInLock = [[[NCManageDatabase sharedInstance] getTableMetadataUpload] count] + [[[NCManageDatabase sharedInstance] getTableMetadataUploadWWan] count] + [[[NCManageDatabase sharedInstance] getLockQueueUpload] count];
+    
     NSInteger counterNewUpload = 0;
+
+    // ------------------------- <selector Auto Download> -------------------------
+    
+    while (counterDownloadInSession < maxConcurrentDownloadUpload) {
+        
+        metadataNet = [[NCManageDatabase sharedInstance] getQueueDownload];
+        if (metadataNet) {
+            
+            [[CCNetworking sharedNetworking] downloadFile:metadataNet.fileID serverUrl:metadataNet.serverUrl downloadData:metadataNet.downloadData downloadPlist:metadataNet.downloadPlist selector:metadataNet.selector selectorPost:metadataNet.selectorPost session:metadataNet.session taskStatus:metadataNet.taskStatus delegate:app.activeMain];
+                        
+        } else
+            break;
+        
+        counterDownloadInSession = [[[NCManageDatabase sharedInstance] getTableMetadataDownload] count] + [[[NCManageDatabase sharedInstance] getTableMetadataDownloadWWan] count];
+    }
     
     // ------------------------- <selector Auto Upload> -------------------------
     
-    while (counterUploadInSessionAndInLock < maxConcurrentUpload) {
+    while (counterUploadInSessionAndInLock < maxConcurrentDownloadUpload) {
         
         metadataNet = [[NCManageDatabase sharedInstance] getQueueUploadWithSelector:selectorUploadAutoUpload];
         if (metadataNet) {
@@ -423,7 +441,7 @@
         
     } else {
         
-        while (counterUploadInSessionAndInLock < maxConcurrentUpload) {
+        while (counterUploadInSessionAndInLock < maxConcurrentDownloadUpload) {
             
             metadataNet =  [[NCManageDatabase sharedInstance] getQueueUploadWithSelector:selectorUploadAutoUploadAll];
             if (metadataNet) {
@@ -445,7 +463,7 @@
     
     // ------------------------- <selector Upload File> -------------------------
 
-    while (counterUploadInSessionAndInLock < maxConcurrentUpload) {
+    while (counterUploadInSessionAndInLock < maxConcurrentDownloadUpload) {
         
         metadataNet = [[NCManageDatabase sharedInstance] getQueueUploadWithSelector:selectorUploadFile];
         if (metadataNet) {
@@ -484,7 +502,7 @@
     }
     
     // Start Timer
-    _timerProcessAutoDownloadUpload = [NSTimer scheduledTimerWithTimeInterval:k_timerProcessAutoUpload target:app selector:@selector(processAutoUpload) userInfo:nil repeats:YES];
+    _timerProcessAutoDownloadUpload = [NSTimer scheduledTimerWithTimeInterval:k_timerProcessAutoDownloadUpload target:app selector:@selector(processAutoDownloadUpload) userInfo:nil repeats:YES];
 }
 
 #pragma --------------------------------------------------------------------------------------------
@@ -1050,7 +1068,7 @@
     NSInteger queueUpload = [[[NCManageDatabase sharedInstance] getTableMetadataUpload] count] + [[[NCManageDatabase sharedInstance] getTableMetadataUploadWWan] count];
     
     // Total
-    NSInteger total = queueDownload + queueUpload + [[NCManageDatabase sharedInstance] countQueueUploadWithSession:nil];
+    NSInteger total = queueDownload + queueUpload + [[NCManageDatabase sharedInstance] countQueueDownloadWithSession:nil] + [[NCManageDatabase sharedInstance] countQueueUploadWithSession:nil];
     
     [UIApplication sharedApplication].applicationIconBadgeNumber = total;
     

+ 1 - 1
iOSClient/CCGlobal.h

@@ -127,7 +127,7 @@ extern NSString *const urlBaseUploadDB;
 #define k_taskStatusSuspend                             -3
 
 #define k_timerVerifySession                            10
-#define k_timerProcessAutoUpload                        5
+#define k_timerProcessAutoDownloadUpload                5
 #define k_timerUpdateApplicationIconBadgeNumber         3
 
 #define k_maxConcurrentOperation                         10

+ 1 - 0
iOSClient/Database/NCDatabase.swift

@@ -215,6 +215,7 @@ class tableQueueDownload: Object {
     dynamic var downloadPlist: Bool = false
     dynamic var selector = ""
     dynamic var selectorPost = ""
+    dynamic var serverUrl = ""
     dynamic var session = ""
 
     override static func primaryKey() -> String {

+ 71 - 11
iOSClient/Database/NCManageDatabase.swift

@@ -1165,7 +1165,7 @@ class NCManageDatabase: NSObject {
         return tableMetadata.init(value: metadata)
     }
     
-    func addMetadatas(_ metadatas: [tableMetadata], serverUrl: String) -> [tableMetadata]? {
+    func addMetadatas(_ metadatas: [tableMetadata], serverUrl: String?) -> [tableMetadata]? {
         
         guard self.getAccountActive() != nil else {
             return nil
@@ -1183,8 +1183,10 @@ class NCManageDatabase: NSObject {
             print("Could not write to database: ", error)
         }
         
-        if let directoryID = self.getDirectoryID(serverUrl) {
-            self.setDateReadDirectory(directoryID: directoryID)
+        if let serverUrl = serverUrl {
+            if let directoryID = self.getDirectoryID(serverUrl) {
+                self.setDateReadDirectory(directoryID: directoryID)
+            }
         }
         
         return Array(metadatas.map { tableMetadata.init(value:$0) })
@@ -1609,7 +1611,7 @@ class NCManageDatabase: NSObject {
     //MARK: -
     //MARK: Table Queue Download
     
-    func addQueueDownload(metadataNet: CCMetadataNet) -> Bool {
+    func addQueueDownload(fileID: String, downloadData: Bool, downloadPlist: Bool, selector: String, selectorPost: String?, serverUrl: String, session: String) -> Bool {
         
         guard let tableAccount = self.getAccountActive() else {
             return false
@@ -1631,16 +1633,17 @@ class NCManageDatabase: NSObject {
                     let addObject = tableQueueDownload()
                         
                     addObject.account = tableAccount.account
-                    addObject.fileID = metadataNet.fileID
-                    addObject.downloadData = metadataNet.downloadData
-                    addObject.downloadPlist = metadataNet.downloadPlist
-                    addObject.selector = metadataNet.selector
+                    addObject.fileID = fileID
+                    addObject.downloadData = downloadData
+                    addObject.downloadPlist = downloadPlist
+                    addObject.selector = selector
                         
-                    if let selectorPost = metadataNet.selectorPost {
+                    if let selectorPost = selectorPost {
                         addObject.selectorPost = selectorPost
                     }
-                        
-                    addObject.session = metadataNet.session
+                    
+                    addObject.serverUrl = serverUrl
+                    addObject.session = session
                     
                     realm.add(addObject, update: true)
                 }
@@ -1652,6 +1655,43 @@ class NCManageDatabase: NSObject {
         
         return true
     }
+    
+    func addQueueDownload(metadatasNet: [CCMetadataNet]) {
+        
+        guard let tableAccount = self.getAccountActive() else {
+            return
+        }
+        
+        let realm = try! Realm()
+        
+        do {
+            try realm.write {
+                
+                for metadataNet in metadatasNet {
+                        
+                    // Add new
+                    let addObject = tableQueueDownload()
+                    
+                    addObject.account = tableAccount.account
+                    addObject.fileID = metadataNet.fileID
+                    addObject.downloadData = metadataNet.downloadData
+                    addObject.downloadPlist = metadataNet.downloadPlist
+                    addObject.selector = metadataNet.selector
+                    
+                    if let selectorPost = metadataNet.selectorPost {
+                        addObject.selectorPost = selectorPost
+                    }
+                    
+                    addObject.serverUrl = metadataNet.serverUrl
+                    addObject.session = metadataNet.session
+                    
+                    realm.add(addObject, update: true)
+                }
+            }
+        } catch let error {
+            print("[LOG] Could not write to database: ", error)
+        }
+    }
 
     func getQueueDownload() -> CCMetadataNet? {
         
@@ -1675,6 +1715,7 @@ class NCManageDatabase: NSObject {
         metadataNet.downloadPlist = result.downloadPlist
         metadataNet.selector = result.selector
         metadataNet.selectorPost = result.selectorPost
+        metadataNet.serverUrl = result.serverUrl
         metadataNet.session = result.session
         metadataNet.taskStatus = Int(k_taskStatusResume)
         
@@ -1691,6 +1732,25 @@ class NCManageDatabase: NSObject {
         return metadataNet
     }
     
+    func countQueueDownload(session: String?) -> Int {
+        
+        guard let tableAccount = self.getAccountActive() else {
+            return 0
+        }
+        
+        let realm = try! Realm()
+        let results : Results<tableQueueDownload>
+        
+        if let session = session {
+            results = realm.objects(tableQueueDownload.self).filter("account = %@ AND session = %@", tableAccount.account, session)
+        } else {
+            results = realm.objects(tableQueueDownload.self).filter("account = %@", tableAccount.account)
+        }
+        
+        return results.count
+    }
+
+    
     //MARK: -
     //MARK: Table Queue Upload
     

+ 14 - 2
iOSClient/Main/CCMain.m

@@ -1527,6 +1527,18 @@
     // if exists postselector call self with selectorPost
     if ([selectorPost length] > 0)
         [self downloadFileSuccess:fileID serverUrl:serverUrl selector:selectorPost selectorPost:nil];
+    
+    // Auto Download Upload
+    if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground) {
+        
+        // ONLY BACKGROUND
+        [app performSelectorOnMainThread:@selector(loadAutoDownloadUpload:) withObject:[NSNumber numberWithInt:k_maxConcurrentOperationDownloadUploadBackground] waitUntilDone:NO];
+        
+    } else {
+        
+        // ONLY FOREFROUND
+        [app performSelectorOnMainThread:@selector(loadAutoDownloadUpload:) withObject:[NSNumber numberWithInt:k_maxConcurrentOperationDownloadUpload] waitUntilDone:NO];
+    }
 }
 
 - (void)downloadSelectedFilesFolders
@@ -1587,7 +1599,7 @@
 
 - (void)uploadFileFailure:(CCMetadataNet *)metadataNet fileID:(NSString *)fileID serverUrl:(NSString *)serverUrl selector:(NSString *)selector message:(NSString *)message errorCode:(NSInteger)errorCode
 {
-    // Auto Upload
+    // Auto Download Upload
     if([selector isEqualToString:selectorUploadAutoUpload] || [selector isEqualToString:selectorUploadAutoUploadAll] || [selector isEqualToString:selectorUploadFile]) {
                 
         if ([[NCManageDatabase sharedInstance] getPriorityQueueUploadWithAssetLocalIdentifier:metadataNet.assetLocalIdentifier] > k_priorityAutoUploadStop) {
@@ -1637,7 +1649,7 @@
 
 - (void)uploadFileSuccess:(CCMetadataNet *)metadataNet fileID:(NSString *)fileID serverUrl:(NSString *)serverUrl selector:(NSString *)selector selectorPost:(NSString *)selectorPost
 {
-    // Auto Upload
+    // Auto Download Upload
     if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground) {
         
         // ONLY BACKGROUND

+ 1 - 0
iOSClient/Settings/CCAdvanced.m

@@ -315,6 +315,7 @@
     [self.hud visibleHudTitle:NSLocalizedString(@"_remove_cache_", nil) mode:MBProgressHUDModeIndeterminate color:nil];
     
     [[NCManageDatabase sharedInstance] clearTable:[tableQueueUpload class] account:app.activeAccount];
+    [[NCManageDatabase sharedInstance] clearTable:[tableQueueDownload class] account:app.activeAccount];
     
     [app.netQueue cancelAllOperations];
     

+ 1 - 0
iOSClient/Settings/CCManageAccount.m

@@ -320,6 +320,7 @@
     
     [[NCManageDatabase sharedInstance] clearTable:[tableAccount class] account:account];
     [[NCManageDatabase sharedInstance] clearTable:[tableActivity class] account:account];
+    [[NCManageDatabase sharedInstance] clearTable:[tableQueueDownload class] account:app.activeAccount];
     [[NCManageDatabase sharedInstance] clearTable:[tableQueueUpload class] account:account];
     [[NCManageDatabase sharedInstance] clearTable:[tableCapabilities class] account:account];
     [[NCManageDatabase sharedInstance] clearTable:[tableDirectory class] account:app.activeAccount];

+ 15 - 2
iOSClient/Synchronize/CCSynchronize.m

@@ -346,11 +346,14 @@
 - (void)SynchronizeMetadatas:(NSArray *)metadatas withDownload:(BOOL)withDownload
 {
     NSString *oldDirectoryID, *serverUrl, *fileID;
+    NSMutableArray *metadataToAdd = [NSMutableArray new];
+    NSMutableArray *metadataNetToAdd = [NSMutableArray new];
 
     for (tableMetadata *metadata in metadatas) {
         
         NSString *selector, *selectorPost;
         BOOL downloadData = NO, downloadPlist = NO;
+        CCMetadataNet *metadataNet = [CCMetadataNet new];
         
         if ([metadata.type isEqualToString: k_metadataType_file]) {
             downloadData = YES;
@@ -371,11 +374,21 @@
         }
         
         fileID = metadata.fileID;
-        (void)[[NCManageDatabase sharedInstance] addMetadata:metadata];
+        [metadataToAdd addObject:metadata];
        
-        [[CCNetworking sharedNetworking] downloadFile:fileID serverUrl:serverUrl downloadData:downloadData downloadPlist:downloadPlist selector:selector selectorPost:selectorPost session:k_download_session taskStatus:k_taskStatusResume delegate:app.activeMain];
+        metadataNet.fileID = fileID;
+        metadataNet.downloadData = downloadData;
+        metadataNet.downloadPlist = downloadPlist;
+        metadataNet.selector = selector;
+        metadataNet.selectorPost = selectorPost;
+        metadataNet.serverUrl = serverUrl;
+        metadataNet.session = k_download_session;
+        [metadataNetToAdd addObject:metadataNet];
     }
     
+    (void)[[NCManageDatabase sharedInstance] addMetadatas:metadataToAdd serverUrl:nil];
+    [[NCManageDatabase sharedInstance] addQueueDownloadWithMetadatasNet:metadataNetToAdd];
+    
     dispatch_async(dispatch_get_main_queue(), ^{
         [app.activeMain reloadDatasource:serverUrl];
     });

+ 5 - 4
iOSClient/Transfers/CCTransfers.m

@@ -353,8 +353,9 @@
     NSString *titleSection, *numberTitle;
     NSInteger typeOfSession = 0;
     
-    NSInteger queueDownload = [[[NCManageDatabase sharedInstance] getTableMetadataDownload] count] + [[NCManageDatabase sharedInstance] countQueueUploadWithSession:k_download_session];
-    NSInteger queueDownloadWWan = [[[NCManageDatabase sharedInstance] getTableMetadataDownloadWWan] count] + [[NCManageDatabase sharedInstance] countQueueUploadWithSession:k_download_session_wwan];
+    NSInteger queueDownload = [[[NCManageDatabase sharedInstance] getTableMetadataDownload] count] + [[NCManageDatabase sharedInstance] countQueueDownloadWithSession:k_download_session];
+    NSInteger queueDownloadWWan = [[[NCManageDatabase sharedInstance] getTableMetadataDownloadWWan] count] + [[NCManageDatabase sharedInstance] countQueueDownloadWithSession:k_download_session_wwan];
+    
     NSInteger queueUpload = [[[NCManageDatabase sharedInstance] getTableMetadataUpload] count] + [[NCManageDatabase sharedInstance] countQueueUploadWithSession:k_upload_session];
     NSInteger queueUploadWWan = [[[NCManageDatabase sharedInstance] getTableMetadataUploadWWan] count] + [[NCManageDatabase sharedInstance] countQueueUploadWithSession:k_upload_session_wwan];
     
@@ -438,7 +439,7 @@
     // Footer Download
     if ([titleSection containsString:@"download"] && ![titleSection containsString:@"wwan"] && titleSection != nil) {
         
-        NSInteger queueDownload = [[[NCManageDatabase sharedInstance] getTableMetadataDownload] count] + [[NCManageDatabase sharedInstance] countQueueUploadWithSession:k_download_session];
+        NSInteger queueDownload = [[[NCManageDatabase sharedInstance] getTableMetadataDownload] count] + [[NCManageDatabase sharedInstance] countQueueDownloadWithSession:k_download_session];
         
         // element or elements ?
         if (queueDownload > 1) element_s = NSLocalizedString(@"_elements_",nil);
@@ -455,7 +456,7 @@
     // Footer Download WWAN
     if ([titleSection containsString:@"download"] && [titleSection containsString:@"wwan"] && titleSection != nil) {
         
-        NSInteger queueDownloadWWan = [[[NCManageDatabase sharedInstance] getTableMetadataDownloadWWan] count] + [[NCManageDatabase sharedInstance] countQueueUploadWithSession:k_download_session_wwan];
+        NSInteger queueDownloadWWan = [[[NCManageDatabase sharedInstance] getTableMetadataDownloadWWan] count] + [[NCManageDatabase sharedInstance] countQueueDownloadWithSession:k_download_session_wwan];
         
         // element or elements ?
         if (queueDownloadWWan > 1) element_s = NSLocalizedString(@"_elements_",nil);