marinofaggiana 4 years ago
parent
commit
b2596a370c

+ 1 - 1
Cartfile

@@ -4,7 +4,7 @@ github "kishikawakatsumi/UICKeyChainStore" "v2.1.2"
 github "MortimerGoro/MGSwipeTableCell" "1.6.8"
 github "dzenbot/DZNEmptyDataSet" "v1.8.1"
 github "jdg/MBProgressHUD" "1.1.0"
-github "realm/realm-cocoa" "v5.3.5"
+github "realm/realm-cocoa"
 github "SVGKit/SVGKit" "3.x"
 github "WeTransfer/WeScan" "1.2.0"
 github "malcommac/SwiftRichString"

+ 2 - 2
Cartfile.resolved

@@ -3,7 +3,7 @@ github "AssistoLab/DropDown" "v2.3.13"
 github "CocoaLumberjack/CocoaLumberjack" "3.6.2"
 github "FabrizioBrancati/Queuer" "2.1.1"
 github "MortimerGoro/MGSwipeTableCell" "1.6.8"
-github "SVGKit/SVGKit" "baebd784aa614cb7633d0e7fad6afdede6f34704"
+github "SVGKit/SVGKit" "c7557c9576fa34ba3f01b7e70f0f681b87e1eb4e"
 github "SwiftyJSON/SwiftyJSON" "5.0.0"
 github "WeTransfer/WeScan" "1.2.0"
 github "WenchaoD/FSCalendar" "2.8.0"
@@ -19,7 +19,7 @@ github "malcommac/SwiftRichString" "3.7.2"
 github "marinofaggiana/KTVHTTPCache" "2.0.2"
 github "marinofaggiana/TOPasscodeViewController" "0.0.7"
 github "nextcloud/ios-communication-library" "350d2a3188a877373832fd4eaa4e7018cd8022cc"
-github "realm/realm-cocoa" "v5.3.5"
+github "realm/realm-cocoa" "v5.3.6"
 github "rechsteiner/Parchment" "v2.4.0"
 github "scenee/FloatingPanel" "v1.7.5"
 github "tilltue/TLPhotoPicker" "2.0.12"

+ 1 - 1
Carthage/Checkouts/SVGKit/Source/DOM classes/SVG-DOM/SVGDocument.h

@@ -15,7 +15,7 @@
 
 #import <Foundation/Foundation.h>
 
-#import "Document.h"
+#import <SVGKit/Document.h>
 #import "SVGSVGElement.h"
 
 @interface SVGDocument : Document

+ 28 - 0
Carthage/Checkouts/realm-cocoa/CHANGELOG.md

@@ -1,3 +1,31 @@
+5.3.6 Release notes (2020-09-02)
+=============================================================
+
+### Fixed
+
+* Work around iOS 14 no longer allowing the use of file locks in shared
+  containers, which resulted in the OS killing an app which entered the
+  background while a Realm was open ([#6671](https://github.com/realm/realm-cocoa/issues/6671)).
+* If an attempt to upgrade a realm has ended with a crash with "migrate_links()"
+  in the call stack, the realm was left in an invalid state. The migration
+  logic now handles this state and can complete upgrading files which were
+  incompletely upgraded by pre-5.3.4 versions.
+* Fix deadlocks when writing to a Realm file on an exFAT partition from macOS.
+  ([#6691](https://github.com/realm/realm-cocoa/issues/6691)).
+
+### Compatibility
+
+* File format: Generates Realms with format v10 (Reads and upgrades all previous formats)
+* Realm Object Server: 3.21.0 or later.
+* Realm Studio: 3.11 or later.
+* APIs are backwards compatible with all previous releases in the 5.x.y series.
+* Carthage release for Swift is built with Xcode 11.6.
+
+### Internal
+
+* Upgraded realm-core from v6.0.19 to v6.0.23
+* Upgraded realm-sync from v5.0.16 to v5.0.20
+
 5.3.5 Release notes (2020-08-20)
 =============================================================
 

+ 2 - 2
Carthage/Checkouts/realm-cocoa/Realm/Realm-Info.plist

@@ -17,11 +17,11 @@
 	<key>CFBundlePackageType</key>
 	<string>FMWK</string>
 	<key>CFBundleShortVersionString</key>
-	<string>5.3.5</string>
+	<string>5.3.6</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>5.3.5</string>
+	<string>5.3.6</string>
 	<key>NSHumanReadableCopyright</key>
 	<string>Copyright © 2014 Realm. All rights reserved.</string>
 	<key>NSPrincipalClass</key>

+ 4 - 3
Carthage/Checkouts/realm-cocoa/Realm/Tests/RealmTests.mm

@@ -2033,9 +2033,9 @@
     XCTAssertEqualObjects([testObjects.firstObject stringCol], @"b", @"Expecting column to be 'b'");
 }
 
-
-- (void)testInvalidLockFile
-{
+// iOS uses a different locking scheme which breaks how we stop core from reinitializing the lock file
+#if !TARGET_OS_IPHONE
+- (void)testInvalidLockFile {
     // Create the realm file and lock file
     @autoreleasepool { [RLMRealm defaultRealm]; }
 
@@ -2059,6 +2059,7 @@
     flock(fd, LOCK_UN);
     close(fd);
 }
+#endif
 
 - (void)testCannotMigrateRealmWhenRealmIsOpen {
     RLMRealm *realm = [self realmWithTestPath];

+ 12 - 12
Carthage/Checkouts/realm-cocoa/RealmSwift/RealmConfiguration.swift

@@ -107,26 +107,26 @@ extension Realm {
          exclusive with `inMemoryIdentifier`.
          */
         public var syncConfiguration: SyncConfiguration? {
+            get {
+                return _syncConfiguration
+            }
             set {
                 _inMemoryIdentifier = nil
                 _syncConfiguration = newValue
             }
-            get {
-                return _syncConfiguration
-            }
         }
 
         private var _syncConfiguration: SyncConfiguration?
 
         /// The local URL of the Realm file. Mutually exclusive with `inMemoryIdentifier`.
         public var fileURL: URL? {
+            get {
+                return _path.map { URL(fileURLWithPath: $0) }
+            }
             set {
                 _inMemoryIdentifier = nil
                 _path = newValue?.path
             }
-            get {
-                return _path.map { URL(fileURLWithPath: $0) }
-            }
         }
 
         private var _path: String?
@@ -134,14 +134,14 @@ extension Realm {
         /// A string used to identify a particular in-memory Realm. Mutually exclusive with `fileURL` and
         /// `syncConfiguration`.
         public var inMemoryIdentifier: String? {
+            get {
+                return _inMemoryIdentifier
+            }
             set {
                 _path = nil
                 _syncConfiguration = nil
                 _inMemoryIdentifier = newValue
             }
-            get {
-                return _inMemoryIdentifier
-            }
         }
 
         private var _inMemoryIdentifier: String?
@@ -199,12 +199,12 @@ extension Realm {
 
         /// The classes managed by the Realm.
         public var objectTypes: [Object.Type]? {
-            set {
-                self.customSchema = newValue.map { RLMSchema(objectClasses: $0) }
-            }
             get {
                 return self.customSchema.map { $0.objectSchema.compactMap { $0.objectClass as? Object.Type } }
             }
+            set {
+                self.customSchema = newValue.map { RLMSchema(objectClasses: $0) }
+            }
         }
         /**
          The maximum number of live versions in the Realm file before an exception will

+ 21 - 6
Carthage/Checkouts/realm-cocoa/build.sh

@@ -358,7 +358,7 @@ download_common() {
             echo "Switching from version $(cat core/version.txt) to ${version}"
         fi
     else
-        if [ "$(find core -name librealm.a)" ]; then
+        if [ "$(find core -name librealm-sync.a)" ]; then
             echo 'Using existing custom core build without checking version'
             exit 0
         fi
@@ -398,11 +398,26 @@ download_common() {
 
     (
         cd "$temp_dir"
-        rm -rf "$download_type"
+        rm -rf core
         tar xf "$tar_path" --xz
         if [ ! -f core/version.txt ]; then
             printf %s "${version}" > core/version.txt
         fi
+
+        # Xcode 11 dsymutil crashes when given debugging symbols created by
+        # Xcode 12. Check if this breaks, and strip them if so.
+        local test_lib=core/realm-sync-dbg.xcframework/ios-*-simulator/librealm-sync-dbg.a
+        if ! [ -f $test_lib ]; then
+            test_lib="core/librealm-sync-ios-dbg.a"
+        fi
+        clang++ -Wl,-all_load -g -arch x86_64 -shared -target ios13.0 \
+          -isysroot $(xcrun --sdk iphonesimulator --show-sdk-path) -o tmp.dylib \
+          $test_lib -lz -framework Security
+        if ! dsymutil tmp.dylib -o tmp.dSYM 2> /dev/null; then
+            find core -name '*.a' -exec strip -x "{}" \; 2> /dev/null
+        fi
+        rm -r tmp.dylib tmp.dSYM
+
         mv core "${versioned_dir}"
     )
 
@@ -1210,10 +1225,10 @@ EOM
 
           if [ ! -f core/version.txt ]; then
             sh build.sh download-sync
-            mv core/librealm-ios.a core/librealmcore-ios.a
-            mv core/librealm-macosx.a core/librealmcore-macosx.a
-            mv core/librealm-tvos.a core/librealmcore-tvos.a
-            mv core/librealm-watchos.a core/librealmcore-watchos.a
+            mv core/librealm-sync-ios.a core/librealmcore-ios.a
+            mv core/librealm-sync-macosx.a core/librealmcore-macosx.a
+            mv core/librealm-sync-tvos.a core/librealmcore-tvos.a
+            mv core/librealm-sync-watchos.a core/librealmcore-watchos.a
             rm core/librealm*-dbg.a
           fi
 

+ 3 - 3
Carthage/Checkouts/realm-cocoa/dependencies.list

@@ -1,4 +1,4 @@
-VERSION=5.3.5
-REALM_CORE_VERSION=6.0.19
-REALM_SYNC_VERSION=5.0.16
+VERSION=5.3.6
+REALM_CORE_VERSION=6.0.23
+REALM_SYNC_VERSION=5.0.20
 REALM_OBJECT_SERVER_VERSION=3.28.5

+ 8 - 5
iOSClient/Main/NCSplitViewController.swift

@@ -68,16 +68,19 @@ class NCSplitViewController: UISplitViewController {
         
         var fraction: CGFloat = 0.4
         let gap = 1.0 / self.traitCollection.displayScale
+        let device = UIDevice.current.userInterfaceIdiom
         
-        if let detailNavigationController = self.viewControllers.last as? NCDetailNavigationController {
-            if let detailViewController = detailNavigationController.topViewController as? NCDetailViewController {
-                if detailViewController.metadata == nil {
-                    fraction = 1
+        if device == .pad {
+            if let detailNavigationController = self.viewControllers.last as? NCDetailNavigationController {
+                if let detailViewController = detailNavigationController.topViewController as? NCDetailViewController {
+                    if detailViewController.metadata == nil {
+                        fraction = 1
+                    }
                 }
             }
         }
         
-        if fraction == 1 || self.isCollapsed {
+        if fraction == 1 {
            if UIScreen.main.bounds.width > UIScreen.main.bounds.height {
                self.maximumPrimaryColumnWidth = max(UIScreen.main.bounds.width - gap, UIScreen.main.bounds.height - gap)
            } else {

+ 22 - 0
iOSClient/Networking/NCNetworking.swift

@@ -575,6 +575,28 @@ import Queuer
             })
         }
     }
+    
+    func getOcIdInSession(completion: @escaping (_ listOcId: [String])->()) {
+        
+        var listOcId: [String] = []
+        
+        sessionManagerBackground.getAllTasks(completionHandler: { (tasks) in
+            for task in tasks {
+                listOcId.append(task.description)
+            }
+            self.sessionManagerBackgroundWWan.getAllTasks(completionHandler: { (tasks) in
+                for task in tasks {
+                    listOcId.append(task.description)
+                }
+                self.sessionManagerBackgroundExtension.getAllTasks(completionHandler: { (tasks) in
+                    for task in tasks {
+                        listOcId.append(task.description)
+                    }
+                    completion(listOcId)
+                })
+            })
+        })
+    }
         
     //MARK: - WebDav Read file, folder
     

+ 59 - 48
iOSClient/Networking/NCNetworkingAutoUpload.swift

@@ -49,6 +49,7 @@ class NCNetworkingAutoUpload: NSObject {
         var counterUpload: Int = 0
         var sizeUpload = 0
         var maxConcurrentOperationUpload = Int(k_maxConcurrentOperation)
+        let sessionSelectors = [selectorUploadFile, selectorUploadAutoUpload, selectorUploadAutoUploadAll]
         
         if appDelegate.account == nil || appDelegate.account.count == 0 || appDelegate.maintenanceMode {
             return
@@ -67,64 +68,74 @@ class NCNetworkingAutoUpload: NSObject {
         
         debugPrint("[LOG] PROCESS-AUTO-UPLOAD \(counterUpload)")
     
-        let sessionSelectors = [selectorUploadFile, selectorUploadAutoUpload, selectorUploadAutoUploadAll]
-        for sessionSelector in sessionSelectors {
-            if counterUpload < maxConcurrentOperationUpload {
-                let limit = maxConcurrentOperationUpload - counterUpload
-                var predicate = NSPredicate()
-                if UIApplication.shared.applicationState == .background {
-                    predicate = NSPredicate(format: "sessionSelector == %@ AND status == %d AND (typeFile != %@ || livePhoto == true)", sessionSelector, k_metadataStatusWaitUpload, k_metadataTypeFile_video)
-                } else {
-                    predicate = NSPredicate(format: "sessionSelector == %@ AND status == %d", sessionSelector, k_metadataStatusWaitUpload)
-                }
-                let metadatas = NCManageDatabase.sharedInstance.getMetadatas(predicate: predicate, page: 1, limit: limit, sorted: "date", ascending: true)
-                if metadatas.count > 0 {
-                    NCCommunicationCommon.shared.writeLog("PROCESS-AUTO-UPLOAD find \(metadatas.count) items")
-                }
-                for metadata in metadatas {
-                    if CCUtility.isFolderEncrypted(metadata.serverUrl, e2eEncrypted: metadata.e2eEncrypted, account: metadata.account, urlBase: metadata.urlBase) {
-                        if UIApplication.shared.applicationState == .background { break }
-                        maxConcurrentOperationUpload = 1
-                        counterUpload += 1
-                        if let metadata = NCManageDatabase.sharedInstance.setMetadataStatus(ocId: metadata.ocId, status: Int(k_metadataStatusInUpload)) {
-                            NCNetworking.shared.upload(metadata: metadata, background: true) { (_, _) in }
-                        }
-                        startTimer()
-                        return
+        NCNetworking.shared.getOcIdInSession { (listOcId) in
+            
+            for sessionSelector in sessionSelectors {
+                if counterUpload < maxConcurrentOperationUpload {
+                    let limit = maxConcurrentOperationUpload - counterUpload
+                    var predicate = NSPredicate()
+                    if UIApplication.shared.applicationState == .background {
+                        predicate = NSPredicate(format: "sessionSelector == %@ AND status == %d AND (typeFile != %@ || livePhoto == true)", sessionSelector, k_metadataStatusWaitUpload, k_metadataTypeFile_video)
                     } else {
-                        counterUpload += 1
-                        if let metadata = NCManageDatabase.sharedInstance.setMetadataStatus(ocId: metadata.ocId, status: Int(k_metadataStatusInUpload)) {
-                            NCNetworking.shared.upload(metadata: metadata, background: true) { (_, _) in }
+                        predicate = NSPredicate(format: "sessionSelector == %@ AND status == %d", sessionSelector, k_metadataStatusWaitUpload)
+                    }
+                    let metadatas = NCManageDatabase.sharedInstance.getMetadatas(predicate: predicate, page: 1, limit: limit, sorted: "date", ascending: true)
+                    if metadatas.count > 0 {
+                        NCCommunicationCommon.shared.writeLog("PROCESS-AUTO-UPLOAD find \(metadatas.count) items")
+                    }
+                    
+                    for metadata in metadatas {
+                        
+                        // Is already in upload ?
+                        if listOcId.contains(metadata.ocId) {
+                            continue
                         }
-                        sizeUpload = sizeUpload + Int(metadata.size)
-                        if sizeUpload > k_maxSizeOperationUpload {
-                            startTimer()
+                        
+                        if CCUtility.isFolderEncrypted(metadata.serverUrl, e2eEncrypted: metadata.e2eEncrypted, account: metadata.account, urlBase: metadata.urlBase) {
+                            if UIApplication.shared.applicationState == .background { break }
+                            maxConcurrentOperationUpload = 1
+                            counterUpload += 1
+                            if let metadata = NCManageDatabase.sharedInstance.setMetadataStatus(ocId: metadata.ocId, status: Int(k_metadataStatusInUpload)) {
+                                NCNetworking.shared.upload(metadata: metadata, background: true) { (_, _) in }
+                            }
+                            self.startTimer()
                             return
+                        } else {
+                            counterUpload += 1
+                            if let metadata = NCManageDatabase.sharedInstance.setMetadataStatus(ocId: metadata.ocId, status: Int(k_metadataStatusInUpload)) {
+                                NCNetworking.shared.upload(metadata: metadata, background: true) { (_, _) in }
+                            }
+                            sizeUpload = sizeUpload + Int(metadata.size)
+                            if sizeUpload > k_maxSizeOperationUpload {
+                                self.startTimer()
+                                return
+                            }
                         }
                     }
+                    
+                } else {
+                    self.startTimer()
+                    return
                 }
-            } else {
-                startTimer()
-                return
             }
-        }
-        
-        // No upload available ? --> Retry Upload in Error
-        if counterUpload == 0 {
-            let metadatas = NCManageDatabase.sharedInstance.getMetadatas(predicate: NSPredicate(format: "status == %d", k_metadataStatusUploadError))
-            for metadata in metadatas {
-                NCManageDatabase.sharedInstance.setMetadataSession(ocId: metadata.ocId, session: NCNetworking.shared.sessionIdentifierBackground, sessionError: "", sessionTaskIdentifier: 0 ,status: Int(k_metadataStatusWaitUpload))
+            
+            // No upload available ? --> Retry Upload in Error
+            if counterUpload == 0 {
+                let metadatas = NCManageDatabase.sharedInstance.getMetadatas(predicate: NSPredicate(format: "status == %d", k_metadataStatusUploadError))
+                for metadata in metadatas {
+                    NCManageDatabase.sharedInstance.setMetadataSession(ocId: metadata.ocId, session: NCNetworking.shared.sessionIdentifierBackground, sessionError: "", sessionTaskIdentifier: 0 ,status: Int(k_metadataStatusWaitUpload))
+                }
             }
-        }
-         
-        // verify delete Asset Local Identifiers in auto upload (DELETE Photos album)
-        if (counterUpload == 0 && appDelegate.passcodeViewController == nil) {
-            NCUtility.shared.deleteAssetLocalIdentifiers(account: appDelegate.account, sessionSelector: selectorUploadAutoUpload) {
+             
+            // verify delete Asset Local Identifiers in auto upload (DELETE Photos album)
+            if (counterUpload == 0 && self.appDelegate.passcodeViewController == nil) {
+                NCUtility.shared.deleteAssetLocalIdentifiers(account: self.appDelegate.account, sessionSelector: selectorUploadAutoUpload) {
+                    self.startTimer()
+                }
+            } else {
                 self.startTimer()
             }
-        } else {
-            startTimer()
         }
-     }
+    }
 }