marinofaggiana 5 năm trước cách đây
mục cha
commit
45bc319f9b

+ 1 - 1
Cartfile.resolved

@@ -16,7 +16,7 @@ github "krzyzanowskim/OpenSSL" "1.0.218"
 github "malcommac/SwiftRichString" "3.0.3"
 github "marinofaggiana/AFNetworking" "2967678c3e0e98c9b8d7e06222ad12d1f49c26f2"
 github "marinofaggiana/FastScroll" "81967c2309d29bc2c330d422da612160a30bade8"
-github "nextcloud/ios-communication-library" "9e7b4a9ceded729d9199d3565d095ca37fa35263"
+github "nextcloud/ios-communication-library" "cf0b7b52c5512a8e7603764946098c121a6f5fee"
 github "realm/realm-cocoa" "v4.1.1"
 github "rechsteiner/Parchment" "v1.7.0"
 github "tilltue/TLPhotoPicker" "2.0.7"

+ 2 - 1
iOSClient/CCGlobal.h

@@ -82,7 +82,7 @@
 
 // Database Realm
 #define k_databaseDefault                               @"nextcloud.realm"
-#define k_databaseSchemaVersion                         80
+#define k_databaseSchemaVersion                         81
 
 // Intro selector
 #define k_intro_login                                   0
@@ -298,6 +298,7 @@
 #define k_nextcloud_version_15_0                        15
 #define k_nextcloud_version_16_0                        16
 #define k_nextcloud_version_17_0                        17
+#define k_nextcloud_version_18_0                        18
 
 // -----------------------------------------------------------------------------------------------------------
 // INTERNAL

+ 20 - 0
iOSClient/Database/NCDatabase.swift

@@ -218,6 +218,26 @@ class tableComments: Object {
     }
 }
 
+class tableDirectEditingCreators: Object {
+    
+    @objc dynamic var account = ""
+    @objc dynamic var editor = ""
+    @objc dynamic var ext = ""
+    @objc dynamic var identifier = ""
+    @objc dynamic var mimetype = ""
+    @objc dynamic var name = ""
+    @objc dynamic var templates: Int = 0
+}
+
+class tableDirectEditingEditors: Object {
+    
+    @objc dynamic var account = ""
+    let mimetypes = List<String>()
+    @objc dynamic var name = ""
+    let optionalMimetypes = List<String>()
+    @objc dynamic var secure: Int = 0
+}
+
 class tableDirectory: Object {
     
     @objc dynamic var account = ""

+ 79 - 0
iOSClient/Database/NCManageDatabase.swift

@@ -164,6 +164,8 @@ class NCManageDatabase: NSObject {
         self.clearTable(tableActivitySubjectRich.self, account: account)
         self.clearTable(tableCapabilities.self, account: account)
         self.clearTable(tableComments.self, account: account)
+        self.clearTable(tableDirectEditingCreators.self, account: account)
+        self.clearTable(tableDirectEditingEditors.self, account: account)
         self.clearTable(tableDirectory.self, account: account)
         self.clearTable(tableE2eEncryption.self, account: account)
         self.clearTable(tableE2eEncryptionLock.self, account: account)
@@ -1039,6 +1041,83 @@ class NCManageDatabase: NSObject {
         return Array(results.map { tableComments.init(value:$0) })
     }
     
+    //MARK: -
+    //MARK: Table Direct Editing
+    
+    @objc func addDirectEditing(account: String, editors: [NCEditorDetailsEditors], creators: [NCEditorDetailsCreators]) {
+        
+        let realm = try! Realm()
+
+        do {
+            try realm.write {
+            
+                let resultsCreators = realm.objects(tableDirectEditingCreators.self).filter("account == %@", account)
+                realm.delete(resultsCreators)
+                
+                let resultsEditors = realm.objects(tableDirectEditingEditors.self).filter("account == %@", account)
+                realm.delete(resultsEditors)
+                
+                for creator in creators {
+                    
+                    let addObject = tableDirectEditingCreators()
+                    
+                    addObject.account = account
+                    addObject.editor = creator.editor
+                    addObject.ext = creator.ext
+                    addObject.identifier = creator.identifier
+                    addObject.mimetype = creator.mimetype
+                    addObject.name = creator.name
+                    addObject.templates = creator.templates
+                    
+                    realm.add(addObject)
+                }
+                
+                for editor in editors {
+                    
+                    let addObject = tableDirectEditingEditors()
+                    
+                    addObject.account = account
+                    for mimeType in editor.mimetypes {
+                        addObject.mimetypes.append(mimeType)
+                    }
+                    addObject.name = editor.name
+                    for mimeType in editor.optionalMimetypes {
+                        addObject.optionalMimetypes.append(mimeType)
+                    }
+                    addObject.secure = editor.secure
+                    
+                    realm.add(addObject)
+                }
+            }
+        } catch let error {
+            print("[LOG] Could not write to database: ", error)
+        }
+    }
+    
+    @objc func getDirectEditingCreators(account: String) -> [tableDirectEditingCreators]? {
+        
+        let realm = try! Realm()
+        let results = realm.objects(tableDirectEditingCreators.self).filter("account == %@", account)
+        
+        if (results.count > 0) {
+            return Array(results.map { tableDirectEditingCreators.init(value:$0) })
+        } else {
+            return nil
+        }
+    }
+    
+    @objc func getDirectEditingEditors(account: String) -> [tableDirectEditingEditors]? {
+        
+        let realm = try! Realm()
+        let results = realm.objects(tableDirectEditingEditors.self).filter("account == %@", account)
+        
+        if (results.count > 0) {
+            return Array(results.map { tableDirectEditingEditors.init(value:$0) })
+        } else {
+            return nil
+        }
+    }
+    
     //MARK: -
     //MARK: Table Directory
     

+ 16 - 0
iOSClient/Main/CCDetail.m

@@ -206,6 +206,22 @@
             return;
         }
         
+        // Direct Editing
+        if ([[NCUtility sharedInstance] isDirectEditing:self.metadataDetail] != nil && appDelegate.reachability.isReachable) {
+            NSString *editor = [[NCUtility sharedInstance] isDirectEditing:self.metadataDetail];
+            if ([editor.lowercaseString isEqualToString:@"nextcloud text"]) {
+                
+                [[NCUtility sharedInstance] startActivityIndicatorWithView:self.view bottom:0];
+                
+                NSString *fileNamePath = [CCUtility returnFileNamePathFromFileName:self.metadataDetail.fileName serverUrl:self.metadataDetail.serverUrl activeUrl:appDelegate.activeUrl];
+                [[NCCommunication sharedInstance] NCTextOpenFileWithUrlString:appDelegate.activeUrl fileNamePath:fileNamePath editor: @"text" account:self.metadataDetail.account completionHandler:^(NSString *account, NSString *url, NSInteger errorCode, NSString *errorMessage) {
+                    
+                }];
+                
+            }
+            return;
+        }
+        
         // RichDocument
         if ([[NCUtility sharedInstance] isRichDocument:self.metadataDetail] && appDelegate.reachability.isReachable) {
             

+ 12 - 4
iOSClient/Main/CCMain.m

@@ -1490,8 +1490,8 @@
     } else  {
         
         // verify permission
-        BOOL permission = [[NCUtility sharedInstance] permissionsContainsString:metadata.permissions permissions:@"NV"]; // Update file
-        if (permission == false) {
+        BOOL permission = [[NCUtility sharedInstance] permissionsContainsString:metadata.permissions permissions:k_permission_can_rename];
+        if (![metadata.permissions isEqualToString:@""] && permission == false) {
             [appDelegate messageNotification:@"_error_" description:@"_no_permission_modify_file_" visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError errorCode:k_CCErrorInternalError];
             return;
         }
@@ -1582,8 +1582,8 @@
 - (void)moveFileOrFolderMetadata:(tableMetadata *)metadata serverUrlTo:(NSString *)serverUrlTo numFile:(NSInteger)numFile ofFile:(NSInteger)ofFile
 {
     // verify permission
-    BOOL permission = [[NCUtility sharedInstance] permissionsContainsString:metadata.permissions permissions:@"NV"]; // Delete file
-    if (permission == false) {
+    BOOL permission = [[NCUtility sharedInstance] permissionsContainsString:metadata.permissions permissions:k_permission_can_move];
+    if (![metadata.permissions isEqualToString:@""] && permission == false) {
         [appDelegate messageNotification:@"_error_" description:@"_no_permission_modify_file_" visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeError errorCode:k_CCErrorInternalError];
         return;
     }
@@ -3892,6 +3892,14 @@
                     
                     [self shouldPerformSegue:self.metadata];
                     
+                } else if ([self.metadata.typeFile isEqualToString: k_metadataTypeFile_document] && [[NCUtility sharedInstance] isDirectEditing:self.metadata] != nil) {
+                    
+                    if (appDelegate.reachability.isReachable) {
+                        [self shouldPerformSegue:self.metadata];
+                    } else {
+                        [appDelegate messageNotification:@"_info_" description:@"_go_online_" visible:YES delay:k_dismissAfterSecond type:TWMessageBarMessageTypeInfo errorCode:0];
+                    }
+                    
                 } else if ([self.metadata.typeFile isEqualToString: k_metadataTypeFile_document] && [[NCUtility sharedInstance] isRichDocument:self.metadata]) {
                     
                     if (appDelegate.reachability.isReachable) {

+ 2 - 2
iOSClient/Main/NCMainCommon.swift

@@ -968,8 +968,8 @@ class NCMainCommon: NSObject, PhotoEditorDelegate, NCAudioRecorderViewController
         for metadata in metadatas {
             
             // verify permission
-            let permission = NCUtility.sharedInstance.permissionsContainsString(metadata.permissions, permissions: "D")
-            if permission == false {
+            let permission = NCUtility.sharedInstance.permissionsContainsString(metadata.permissions, permissions: k_permission_can_delete)
+            if metadata.permissions != "" && permission == false {
                 completion(Int(k_CCErrorInternalError), "_no_permission_delete_file_")
                 return
             }

+ 10 - 1
iOSClient/Networking/NCService.swift

@@ -268,7 +268,7 @@ class NCService: NSObject {
                 if (capabilities!.isFilesSharingAPIEnabled && self.appDelegate.activeMain != nil) {
                     
                     OCNetworking.sharedManager()?.readShare(withAccount: account, completion: { (account, items, message, errorCode) in
-                        if errorCode == 0 && account == self.appDelegate.activeAccount{
+                        if errorCode == 0 && account == self.appDelegate.activeAccount {
                             let itemsOCSharedDto = items as! [OCSharedDto]
                             NCManageDatabase.sharedInstance.deleteTableShare(account: account!)
                             self.appDelegate.shares = NCManageDatabase.sharedInstance.addShare(account: account!, activeUrl: self.appDelegate.activeUrl, items: itemsOCSharedDto)
@@ -284,6 +284,15 @@ class NCService: NSObject {
                 if (capabilities!.isHandwerkcloudEnabled) {
                     self.requestHC()
                 }
+                
+                // NCTextObtainEditorDetails
+                if capabilities!.versionMajor >= k_nextcloud_version_18_0 {
+                    NCCommunication.sharedInstance.NCTextObtainEditorDetails(urlString: self.appDelegate.activeUrl, account: self.appDelegate.activeAccount) { (account, editors, creators, errorCode, errorMessage) in
+                        if errorCode == 0 && account == self.appDelegate.activeAccount {
+                            NCManageDatabase.sharedInstance.addDirectEditing(account: account, editors: editors, creators: creators)
+                        }
+                    }
+                }
               
             } else if errorCode != 0 {
                 

+ 22 - 0
iOSClient/Utility/NCUtility.swift

@@ -384,6 +384,28 @@ class NCUtility: NSObject {
         return false
     }
     
+    @objc func isDirectEditing(_ metadata: tableMetadata) -> String? {
+        
+        guard let results = NCManageDatabase.sharedInstance.getDirectEditingEditors(account: metadata.account) else {
+            return nil
+        }
+        
+        for result: tableDirectEditingEditors in results {
+            for mimetype in result.mimetypes {
+                if mimetype == metadata.contentType {
+                    return result.name
+                }
+            }
+            for mimetype in result.optionalMimetypes {
+                if mimetype == metadata.contentType {
+                    return result.name
+                }
+            }
+        }
+        
+        return nil
+    }
+    
     @objc func removeAllSettings() {
         
         URLCache.shared.memoryCapacity = 0