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

Merge pull request #539 from nextcloud/develop

Changelog for v2.20.7
Marino Faggiana 7 жил өмнө
parent
commit
f263682a66
100 өөрчлөгдсөн 473 нэмэгдсэн , 293 устгасан
  1. 4 1
      CHANGELOG.md
  2. 1 1
      Nextcloud.xcodeproj/project.pbxproj
  3. 2 2
      iOSClient/Brand/Picker.plist
  4. 2 2
      iOSClient/Brand/PickerFileProvider.plist
  5. 2 2
      iOSClient/Brand/Share.plist
  6. 2 2
      iOSClient/Brand/iOSClient.plist
  7. 1 0
      iOSClient/CCGlobal.h
  8. 1 0
      iOSClient/Database/NCDatabase.swift
  9. 67 16
      iOSClient/Database/NCManageDatabase.swift
  10. 23 0
      iOSClient/Images.xcassets/loadingTitle.imageset/Contents.json
  11. BIN
      iOSClient/Images.xcassets/loadingTitle.imageset/loadingTitle.png
  12. BIN
      iOSClient/Images.xcassets/loadingTitle.imageset/loadingTitle@2x.png
  13. BIN
      iOSClient/Images.xcassets/loadingTitle.imageset/loadingTitle@3x.png
  14. 23 0
      iOSClient/Images.xcassets/startDirectoryPhotosTab.imageset/Contents.json
  15. BIN
      iOSClient/Images.xcassets/startDirectoryPhotosTab.imageset/startDirectoryPhotosTab.png
  16. BIN
      iOSClient/Images.xcassets/startDirectoryPhotosTab.imageset/startDirectoryPhotosTab@2x.png
  17. BIN
      iOSClient/Images.xcassets/startDirectoryPhotosTab.imageset/startDirectoryPhotosTab@3x.png
  18. 152 179
      iOSClient/Library/OCCommunicationLib/OCCommunication.m
  19. 2 2
      iOSClient/Library/OCCommunicationLib/OCWebDavClient/OCWebDAVClient.m
  20. 3 3
      iOSClient/Main/CCMain.m
  21. 1 0
      iOSClient/Move/CCMove.h
  22. 11 5
      iOSClient/Move/CCMove.m
  23. 31 11
      iOSClient/Networking/NCService.swift
  24. 32 32
      iOSClient/Networking/OCNetworking.m
  25. 4 2
      iOSClient/Photos/CCPhotos.h
  26. 107 33
      iOSClient/Photos/CCPhotos.m
  27. BIN
      iOSClient/Settings/CCAdvanced.h
  28. BIN
      iOSClient/Supporting Files/cs-CZ.lproj/Localizable.strings
  29. BIN
      iOSClient/Supporting Files/de.lproj/Error.strings
  30. BIN
      iOSClient/Supporting Files/de.lproj/Localizable.strings
  31. BIN
      iOSClient/Supporting Files/en-GB.lproj/Error.strings
  32. BIN
      iOSClient/Supporting Files/en-GB.lproj/Localizable.strings
  33. 1 0
      iOSClient/Supporting Files/en.lproj/Error.strings
  34. 1 0
      iOSClient/Supporting Files/en.lproj/Localizable.strings
  35. BIN
      iOSClient/Supporting Files/es-419.lproj/Error.strings
  36. BIN
      iOSClient/Supporting Files/es-419.lproj/Localizable.strings
  37. BIN
      iOSClient/Supporting Files/es-CL.lproj/Error.strings
  38. BIN
      iOSClient/Supporting Files/es-CL.lproj/Localizable.strings
  39. BIN
      iOSClient/Supporting Files/es-CO.lproj/Error.strings
  40. BIN
      iOSClient/Supporting Files/es-CO.lproj/Localizable.strings
  41. BIN
      iOSClient/Supporting Files/es-CR.lproj/Error.strings
  42. BIN
      iOSClient/Supporting Files/es-CR.lproj/Localizable.strings
  43. BIN
      iOSClient/Supporting Files/es-DO.lproj/Error.strings
  44. BIN
      iOSClient/Supporting Files/es-DO.lproj/Localizable.strings
  45. BIN
      iOSClient/Supporting Files/es-EC.lproj/Error.strings
  46. BIN
      iOSClient/Supporting Files/es-EC.lproj/Localizable.strings
  47. BIN
      iOSClient/Supporting Files/es-GT.lproj/Error.strings
  48. BIN
      iOSClient/Supporting Files/es-GT.lproj/Localizable.strings
  49. BIN
      iOSClient/Supporting Files/es-HN.lproj/Error.strings
  50. BIN
      iOSClient/Supporting Files/es-HN.lproj/Localizable.strings
  51. BIN
      iOSClient/Supporting Files/es-MX.lproj/Error.strings
  52. BIN
      iOSClient/Supporting Files/es-MX.lproj/Localizable.strings
  53. BIN
      iOSClient/Supporting Files/es-NI.lproj/Error.strings
  54. BIN
      iOSClient/Supporting Files/es-NI.lproj/Localizable.strings
  55. BIN
      iOSClient/Supporting Files/es-PA.lproj/Error.strings
  56. BIN
      iOSClient/Supporting Files/es-PA.lproj/Localizable.strings
  57. BIN
      iOSClient/Supporting Files/es-PE.lproj/Error.strings
  58. BIN
      iOSClient/Supporting Files/es-PE.lproj/Localizable.strings
  59. BIN
      iOSClient/Supporting Files/es-PR.lproj/Error.strings
  60. BIN
      iOSClient/Supporting Files/es-PR.lproj/Localizable.strings
  61. BIN
      iOSClient/Supporting Files/es-PY.lproj/Error.strings
  62. BIN
      iOSClient/Supporting Files/es-PY.lproj/Localizable.strings
  63. BIN
      iOSClient/Supporting Files/es-SV.lproj/Error.strings
  64. BIN
      iOSClient/Supporting Files/es-SV.lproj/Localizable.strings
  65. BIN
      iOSClient/Supporting Files/es-UY.lproj/Error.strings
  66. BIN
      iOSClient/Supporting Files/es-UY.lproj/Localizable.strings
  67. BIN
      iOSClient/Supporting Files/es.lproj/Error.strings
  68. BIN
      iOSClient/Supporting Files/es.lproj/Localizable.strings
  69. BIN
      iOSClient/Supporting Files/fi-FI.lproj/BKPasscodeView.strings
  70. BIN
      iOSClient/Supporting Files/fi-FI.lproj/CTAssetsPicker.strings
  71. BIN
      iOSClient/Supporting Files/fi-FI.lproj/Error.strings
  72. BIN
      iOSClient/Supporting Files/fi-FI.lproj/InfoPlist.strings
  73. BIN
      iOSClient/Supporting Files/fi-FI.lproj/Intro.strings
  74. BIN
      iOSClient/Supporting Files/fi-FI.lproj/Localizable.strings
  75. BIN
      iOSClient/Supporting Files/fi-FI.lproj/SwiftWebVC.strings
  76. BIN
      iOSClient/Supporting Files/fr.lproj/Error.strings
  77. BIN
      iOSClient/Supporting Files/fr.lproj/Localizable.strings
  78. BIN
      iOSClient/Supporting Files/hu.lproj/Error.strings
  79. BIN
      iOSClient/Supporting Files/hu.lproj/Localizable.strings
  80. BIN
      iOSClient/Supporting Files/is.lproj/Error.strings
  81. BIN
      iOSClient/Supporting Files/is.lproj/Localizable.strings
  82. BIN
      iOSClient/Supporting Files/it.lproj/Error.strings
  83. BIN
      iOSClient/Supporting Files/it.lproj/Localizable.strings
  84. BIN
      iOSClient/Supporting Files/it.lproj/SwiftWebVC.strings
  85. BIN
      iOSClient/Supporting Files/ka-GE.lproj/Error.strings
  86. BIN
      iOSClient/Supporting Files/ka-GE.lproj/Localizable.strings
  87. BIN
      iOSClient/Supporting Files/ko.lproj/Error.strings
  88. BIN
      iOSClient/Supporting Files/ko.lproj/Localizable.strings
  89. BIN
      iOSClient/Supporting Files/nb-NO.lproj/Error.strings
  90. BIN
      iOSClient/Supporting Files/nb-NO.lproj/Localizable.strings
  91. BIN
      iOSClient/Supporting Files/nl.lproj/Error.strings
  92. BIN
      iOSClient/Supporting Files/nl.lproj/Localizable.strings
  93. BIN
      iOSClient/Supporting Files/pl.lproj/Error.strings
  94. BIN
      iOSClient/Supporting Files/pl.lproj/Localizable.strings
  95. BIN
      iOSClient/Supporting Files/pt-BR.lproj/Error.strings
  96. BIN
      iOSClient/Supporting Files/pt-BR.lproj/Localizable.strings
  97. BIN
      iOSClient/Supporting Files/pt-PT.lproj/Error.strings
  98. BIN
      iOSClient/Supporting Files/pt-PT.lproj/Localizable.strings
  99. BIN
      iOSClient/Supporting Files/ru.lproj/Error.strings
  100. BIN
      iOSClient/Supporting Files/ru.lproj/Localizable.strings

+ 4 - 1
CHANGELOG.md

@@ -5,7 +5,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
 and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
 
 ## [Unreleased]
-### [2.20.6] - 2018-xx-xx
+### [2.20.7] - 2018-xx-xx
+- See https://github.com/nextcloud/ios/milestone/29
+
+## [2.20.6] - 2018-03-21
 - See https://github.com/nextcloud/ios/milestone/28
 
 ## [2.20.5] - 2018-03-08

+ 1 - 1
Nextcloud.xcodeproj/project.pbxproj

@@ -2159,8 +2159,8 @@
 		F74D3DB81BAC1941000BAE4B /* Networking */ = {
 			isa = PBXGroup;
 			children = (
-				F732BA031D76CE1500E9878B /* CCNetworking.h */,
 				F755BD9A20594AC7008C5FBB /* NCService.swift */,
+				F732BA031D76CE1500E9878B /* CCNetworking.h */,
 				F732BA041D76CE1500E9878B /* CCNetworking.m */,
 				F74D3DBD1BAC1941000BAE4B /* OCNetworking.h */,
 				F74D3DBE1BAC1941000BAE4B /* OCNetworking.m */,

+ 2 - 2
iOSClient/Brand/Picker.plist

@@ -17,9 +17,9 @@
 	<key>CFBundlePackageType</key>
 	<string>XPC!</string>
 	<key>CFBundleShortVersionString</key>
-	<string>2.20.6</string>
+	<string>2.20.7</string>
 	<key>CFBundleVersion</key>
-	<string>00010</string>
+	<string>00002</string>
 	<key>NSAppTransportSecurity</key>
 	<dict>
 		<key>NSAllowsArbitraryLoads</key>

+ 2 - 2
iOSClient/Brand/PickerFileProvider.plist

@@ -17,9 +17,9 @@
 	<key>CFBundlePackageType</key>
 	<string>XPC!</string>
 	<key>CFBundleShortVersionString</key>
-	<string>2.20.6</string>
+	<string>2.20.7</string>
 	<key>CFBundleVersion</key>
-	<string>00010</string>
+	<string>00002</string>
 	<key>NSExtension</key>
 	<dict>
 		<key>NSExtensionFileProviderDocumentGroup</key>

+ 2 - 2
iOSClient/Brand/Share.plist

@@ -17,9 +17,9 @@
 	<key>CFBundlePackageType</key>
 	<string>XPC!</string>
 	<key>CFBundleShortVersionString</key>
-	<string>2.20.6</string>
+	<string>2.20.7</string>
 	<key>CFBundleVersion</key>
-	<string>00010</string>
+	<string>00002</string>
 	<key>NSAppTransportSecurity</key>
 	<dict>
 		<key>NSAllowsArbitraryLoads</key>

+ 2 - 2
iOSClient/Brand/iOSClient.plist

@@ -46,7 +46,7 @@
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>2.20.6</string>
+	<string>2.20.7</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleURLTypes</key>
@@ -69,7 +69,7 @@
 		</dict>
 	</array>
 	<key>CFBundleVersion</key>
-	<string>00010</string>
+	<string>00002</string>
 	<key>Fabric</key>
 	<dict>
 		<key>APIKey</key>

+ 1 - 0
iOSClient/CCGlobal.h

@@ -142,6 +142,7 @@ extern NSString *const flowEndpoint;
 #define k_CCErrorUserNotAvailble                        -9997
 #define k_CCErrorInternalError                          -9996
 #define k_CCErrorFileAlreadyInDownload                  -9995
+#define k_CCErrorWebdavResponseError                    -9994
 
 // Search
 #define k_minCharsSearch                                2

+ 1 - 0
iOSClient/Database/NCDatabase.swift

@@ -51,6 +51,7 @@ class tableAccount: Object {
     @objc dynamic var quotaRelative: Double = 0
     @objc dynamic var quotaTotal: Double = 0
     @objc dynamic var quotaUsed: Double = 0
+    @objc dynamic var startDirectoryPhotosTab = ""
     @objc dynamic var twitter = ""
     @objc dynamic var url = ""
     @objc dynamic var user = ""

+ 67 - 16
iOSClient/Database/NCManageDatabase.swift

@@ -57,7 +57,7 @@ class NCManageDatabase: NSObject {
         let config = Realm.Configuration(
         
             fileURL: dirGroup?.appendingPathComponent("\(appDatabaseNextcloud)/\(k_databaseDefault)"),
-            schemaVersion: 18,
+            schemaVersion: 19,
             
             // 10 : Version 2.18.0
             // 11 : Version 2.18.2
@@ -68,6 +68,7 @@ class NCManageDatabase: NSObject {
             // 16 : Version 2.20.2
             // 17 : Version 2.20.4
             // 18 : Version 2.20.6
+            // 19 : Version 2.20.7
             
             migrationBlock: { migration, oldSchemaVersion in
                 // We haven’t migrated anything yet, so oldSchemaVersion == 0
@@ -476,6 +477,51 @@ class NCManageDatabase: NSObject {
         }
     }
     
+    @objc func getAccountStartDirectoryPhotosTab(_ homeServerUrl: String) -> String {
+        
+        guard let activeAccount = self.getAccountActive() else {
+            return ""
+        }
+        
+        let realm = try! Realm()
+        realm.refresh()
+
+        guard let result = realm.objects(tableAccount.self).filter("account = %@", activeAccount.account).first else {
+            return ""
+        }
+        
+        if result.startDirectoryPhotosTab == "" {
+            
+            self.setAccountStartDirectoryPhotosTab(homeServerUrl)
+            return homeServerUrl
+            
+        } else {
+            return result.startDirectoryPhotosTab
+        }
+    }
+    
+    @objc func setAccountStartDirectoryPhotosTab(_ directory: String) {
+        
+        guard let activeAccount = self.getAccountActive() else {
+            return
+        }
+        
+        let realm = try! Realm()
+        
+        do {
+            try realm.write {
+                
+                guard let result = realm.objects(tableAccount.self).filter("account = %@", activeAccount.account).first else {
+                    return
+                }
+                
+                result.startDirectoryPhotosTab = directory
+            }
+        } catch let error {
+            print("[LOG] Could not write to database: ", error)
+        }
+    }
+    
     //MARK: -
     //MARK: Table Activity
 
@@ -833,7 +879,6 @@ class NCManageDatabase: NSObject {
                 result.e2eEncrypted = encrypted
                 if let serverUrlTo = serverUrlTo {
                     result.serverUrl = serverUrlTo
-
                 }
                 if let etag = etag {
                     result.etag = etag
@@ -928,7 +973,7 @@ class NCManageDatabase: NSObject {
         let realm = try! Realm()
         realm.refresh()
 
-        guard let result = realm.objects(tableDirectory.self).filter("account = %@ AND serverUrl = %@", tableAccount.account,serverUrl).first else {
+        guard let result = realm.objects(tableDirectory.self).filter("account = %@ AND serverUrl = %@", tableAccount.account, serverUrl).first else {
             return self.addDirectory(encrypted: false, favorite: false, fileID: nil, permissions: nil, serverUrl: serverUrl)?.directoryID
         }
         
@@ -1865,7 +1910,7 @@ class NCManageDatabase: NSObject {
         return self.getMetadatas(predicate: predicate, sorted: nil, ascending: false)
     }
     
-    @objc func getTableMetadatasContentTypeImageVideo() -> [tableMetadata]? {
+    @objc func getTableMetadatasContentTypeImageVideo(_ startDirectory: String, activeUrl: String) -> [tableMetadata]? {
         
         guard let tableAccount = self.getAccountActive() else {
             return nil
@@ -1874,12 +1919,23 @@ class NCManageDatabase: NSObject {
         let realm = try! Realm()
         realm.refresh()
         
-        let metadatas = realm.objects(tableMetadata.self).filter(NSPredicate(format: "account = %@ AND NOT (session CONTAINS 'upload') AND (typeFile = %@ OR typeFile = %@)", tableAccount.account, k_metadataTypeFile_image, k_metadataTypeFile_video)).sorted(byKeyPath: "date", ascending: false)
+        if (startDirectory == CCUtility.getHomeServerUrlActiveUrl(activeUrl)) {
             
-        return Array(metadatas.map { tableMetadata.init(value:$0) })
+            // All directory
+            let metadatas = realm.objects(tableMetadata.self).filter(NSPredicate(format: "account = %@ AND NOT (session CONTAINS 'upload') AND (typeFile = %@ OR typeFile = %@)", tableAccount.account, k_metadataTypeFile_image, k_metadataTypeFile_video)).sorted(byKeyPath: "date", ascending: false)
+            return Array(metadatas.map { tableMetadata.init(value:$0) })
+            
+        } else {
+            
+            let directories = realm.objects(tableDirectory.self).filter(NSPredicate(format: "account = %@ AND serverUrl BEGINSWITH %@", tableAccount.account, startDirectory)).sorted(byKeyPath: "serverUrl", ascending: true)
+            let directoriesID = Array(directories.map { $0.directoryID })
+            let metadatas = realm.objects(tableMetadata.self).filter(NSPredicate(format: "account = %@ AND session = '' AND (typeFile = %@ OR typeFile = %@) AND directoryID IN %@", tableAccount.account, k_metadataTypeFile_image, k_metadataTypeFile_video, directoriesID)).sorted(byKeyPath: "date", ascending: false)
+            
+            return Array(metadatas.map { tableMetadata.init(value:$0) })
+        }
     }
     
-    @objc func updateTableMetadatasContentTypeImageVideo(_ metadatas: [tableMetadata]) -> Bool {
+    @objc func updateTableMetadatasContentTypeImageVideo(_ metadatas: [tableMetadata], startDirectory: String, activeUrl: String) -> Bool {
         
         guard let tableAccount = self.getAccountActive() else {
             return false
@@ -1888,8 +1944,8 @@ class NCManageDatabase: NSObject {
         let realm = try! Realm()
         realm.refresh()
         
-        let metadatasDBImageVideo = realm.objects(tableMetadata.self).filter(NSPredicate(format: "account = %@ AND NOT (session CONTAINS 'upload') AND (typeFile = %@ OR typeFile = %@)", tableAccount.account, k_metadataTypeFile_image, k_metadataTypeFile_video))
-        let fileIDArrayDB = metadatasDBImageVideo.map({ $0.fileID }) as [String]
+        let metadatasDBImageVideo = self.getTableMetadatasContentTypeImageVideo(startDirectory, activeUrl: activeUrl)
+        let fileIDArrayDB = metadatasDBImageVideo!.map({ $0.fileID }) as [String]
         let fileIDArraySearch = metadatas.map({ $0.fileID }) as [String]
         
         // DELETE RECORD IF NOT PRESENT ON DB [From DB To SEARCH]
@@ -1912,15 +1968,10 @@ class NCManageDatabase: NSObject {
         
         do {
             try realm.write {
-                
                 // DELETE
-                for metadata in resultsDelete {
-                    realm.delete(metadata)
-                }
+                realm.delete(resultsDelete)
                 // INSERT
-                for metadata in resultsInsert {
-                    realm.add(metadata, update: true)
-                }
+                realm.add(resultsInsert, update: true)
             }
         } catch let error {
             print("[LOG] Could not write to database: ", error)

+ 23 - 0
iOSClient/Images.xcassets/loadingTitle.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "loadingTitle.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "loadingTitle@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "loadingTitle@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
iOSClient/Images.xcassets/loadingTitle.imageset/loadingTitle.png


BIN
iOSClient/Images.xcassets/loadingTitle.imageset/loadingTitle@2x.png


BIN
iOSClient/Images.xcassets/loadingTitle.imageset/loadingTitle@3x.png


+ 23 - 0
iOSClient/Images.xcassets/startDirectoryPhotosTab.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "startDirectoryPhotosTab.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "startDirectoryPhotosTab@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "startDirectoryPhotosTab@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}

BIN
iOSClient/Images.xcassets/startDirectoryPhotosTab.imageset/startDirectoryPhotosTab.png


BIN
iOSClient/Images.xcassets/startDirectoryPhotosTab.imageset/startDirectoryPhotosTab@2x.png


BIN
iOSClient/Images.xcassets/startDirectoryPhotosTab.imageset/startDirectoryPhotosTab@3x.png


+ 152 - 179
iOSClient/Library/OCCommunicationLib/OCCommunication.m

@@ -1291,15 +1291,14 @@
     [request getCapabilitiesOfServer:serverPath onCommunication:sharedOCComunication success:^(NSHTTPURLResponse *response, id responseObject) {
         
         NSData *responseData = (NSData*) responseObject;
+        OCCapabilities *capabilities = [OCCapabilities new];
         
         //Parse
         NSError *error;
         NSDictionary *jsongParsed = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
         NSLog(@"dic: %@",jsongParsed);
         
-        OCCapabilities *capabilities = [OCCapabilities new];
-        
-        if (jsongParsed.allKeys > 0) {
+        if (jsongParsed && jsongParsed.allKeys > 0) {
             
             NSDictionary *ocs = [jsongParsed valueForKey:@"ocs"];
             NSDictionary *data = [ocs valueForKey:@"data"];
@@ -1480,8 +1479,7 @@
             successRequest(response, capabilities, request.redirectedServer);
             
         } else {
-            
-            failureRequest(response, error, request.redirectedServer);
+            failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
         }
         
     } failure:^(NSHTTPURLResponse *response, NSData *responseData, NSError *error) {
@@ -1489,9 +1487,6 @@
     }];
 }
 
-
-#pragma mark - Remote thumbnails
-
 - (NSURLSessionTask *) getRemoteThumbnailByServer:(NSString*)serverPath ofFilePath:(NSString *)filePath withWidth:(NSInteger)fileWidth andHeight:(NSInteger)fileHeight onCommunication:(OCCommunication *)sharedOCComunication
                      successRequest:(void(^)(NSHTTPURLResponse *response, NSData *thumbnail, NSString *redirectedServer)) successRequest
                      failureRequest:(void(^)(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer)) failureRequest {
@@ -1519,8 +1514,6 @@
     return operation;
 }
 
-#pragma mark - Notification Server
-
 - (void)getNotificationServer:(NSString*)serverPath onCommunication:(OCCommunication *)sharedOCComunication successRequest:(void(^)(NSHTTPURLResponse *response, NSArray *listOfNotifications, NSString *redirectedServer)) successRequest failureRequest:(void(^)(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer)) failureRequest {
     
     serverPath = [serverPath encodeString:NSUTF8StringEncoding];
@@ -1532,15 +1525,14 @@
     [request getNotificationServer:serverPath onCommunication:sharedOCComunication success:^(NSHTTPURLResponse *response, id responseObject) {
         
         NSData *responseData = (NSData*) responseObject;
-        
+        NSMutableArray *listOfNotifications = [NSMutableArray new];
+
         //Parse
         NSError *error;
         NSDictionary *jsongParsed = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
         NSLog(@"[LOG] Notifications : %@",jsongParsed);
         
-        NSMutableArray *listOfNotifications = [NSMutableArray new];
-
-        if (jsongParsed.allKeys > 0) {
+        if (jsongParsed && jsongParsed.allKeys > 0) {
         
             NSDictionary *ocs = [jsongParsed valueForKey:@"ocs"];
             NSDictionary *meta = [ocs valueForKey:@"meta"];
@@ -1633,22 +1625,20 @@
                     [listOfNotifications addObject:notification];
                 }
                 
-            } else {
+                successRequest(response, listOfNotifications, request.redirectedServer);
                 
-                NSString *message = (NSString*)[meta objectForKey:@"message"];
+            } else {
                 
+                NSString *message = (NSString *)[meta objectForKey:@"message"];
                 if ([message isKindOfClass:[NSNull class]]) {
-                    message = @"";
+                    message = NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil);
                 }
-                
-                NSError *error = [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message];
-                failureRequest(response, error, request.redirectedServer);
+                failureRequest(response, [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message], request.redirectedServer);
             }
+        } else {
+            failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
         }
     
-        //Return success
-        successRequest(response, listOfNotifications, request.redirectedServer);
-        
     } failure:^(NSHTTPURLResponse *response, NSData *responseData, NSError *error) {
         failureRequest(response, error, request.redirectedServer);
     }];
@@ -1723,8 +1713,6 @@
     }];
 }
 
-#pragma mark - Activity
-
 - (void) getActivityServer:(NSString*)serverPath onCommunication:(OCCommunication *)sharedOCComunication successRequest:(void(^)(NSHTTPURLResponse *response, NSArray *listOfActivity, NSString *redirectedServer)) successRequest failureRequest:(void(^)(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer)) failureRequest {
 
     serverPath = [serverPath encodeString:NSUTF8StringEncoding];
@@ -1736,15 +1724,14 @@
     [request getActivityServer:serverPath onCommunication:sharedOCComunication success:^(NSHTTPURLResponse *response, id responseObject) {
         
         NSData *responseData = (NSData*) responseObject;
-        
+        NSMutableArray *listOfActivity = [NSMutableArray new];
+
         //Parse
         NSError *error;
         NSDictionary *jsongParsed = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
         NSLog(@"[LOG] Activity : %@",jsongParsed);
         
-        NSMutableArray *listOfActivity = [NSMutableArray new];
-        
-        if (jsongParsed.allKeys > 0) {
+        if (jsongParsed && jsongParsed.allKeys > 0) {
             
             NSDictionary *ocs = [jsongParsed valueForKey:@"ocs"];
             NSDictionary *meta = [ocs valueForKey:@"meta"];
@@ -1788,30 +1775,26 @@
                     [listOfActivity addObject:activity];
                 }
                 
+                successRequest(response, listOfActivity, request.redirectedServer);
+
             } else {
                 
-                NSString *message = (NSString*)[meta objectForKey:@"message"];
-                
+                NSString *message = (NSString *)[meta objectForKey:@"message"];
                 if ([message isKindOfClass:[NSNull class]]) {
-                    message = @"";
+                    message = NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil);
                 }
-                
-                NSError *error = [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message];
-                failureRequest(response, error, request.redirectedServer);
+                failureRequest(response, [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message], request.redirectedServer);
             }
+            
+        } else {
+            failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
         }
 
-        //Return success
-        successRequest(response, listOfActivity, request.redirectedServer);
-
     } failure:^(NSHTTPURLResponse *response, NSData *responseData, NSError *error) {
         failureRequest(response, error, request.redirectedServer);
     }];
 }
 
-
-#pragma mark - External sites
-
 - (void) getExternalSitesServer:(NSString*)serverPath onCommunication:(OCCommunication *)sharedOCComunication successRequest:(void(^)(NSHTTPURLResponse *response, NSArray *listOfExternalSites, NSString *redirectedServer)) successRequest failureRequest:(void(^)(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer)) failureRequest {
     serverPath = [serverPath encodeString:NSUTF8StringEncoding];
     serverPath = [serverPath stringByAppendingString:k_url_acces_external_sites_api];
@@ -1822,15 +1805,14 @@
     [request getExternalSitesServer:serverPath onCommunication:sharedOCComunication success:^(NSHTTPURLResponse *response, id responseObject) {
         
         NSData *responseData = (NSData*) responseObject;
-        
+        NSMutableArray *listOfExternalSites = [NSMutableArray new];
+
         //Parse
         NSError *error;
         NSDictionary *jsongParsed = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
         NSLog(@"[LOG] External Sites : %@",jsongParsed);
         
-        NSMutableArray *listOfExternalSites = [NSMutableArray new];
-        
-        if (jsongParsed.allKeys > 0) {
+        if (jsongParsed && jsongParsed.allKeys > 0) {
             
             NSDictionary *ocs = [jsongParsed valueForKey:@"ocs"];
             NSDictionary *meta = [ocs valueForKey:@"meta"];
@@ -1864,31 +1846,26 @@
                     [listOfExternalSites addObject:externalSites];
                 }
                 
+                successRequest(response, listOfExternalSites, request.redirectedServer);
+
             } else {
                 
-                NSString *message = (NSString*)[meta objectForKey:@"message"];
-                
+                NSString *message = (NSString *)[meta objectForKey:@"message"];
                 if ([message isKindOfClass:[NSNull class]]) {
-                    message = @"";
+                    message = NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil);
                 }
-                
-                NSError *error = [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message];
-                failureRequest(response, error, request.redirectedServer);
+                failureRequest(response, [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message], request.redirectedServer);
             }
+            
+        } else {
+            failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
         }
         
-        //Return success
-        successRequest(response, listOfExternalSites, request.redirectedServer);
-        
     } failure:^(NSHTTPURLResponse *response, NSData *responseData, NSError *error) {
         failureRequest(response, error, request.redirectedServer);
     }];
 }
 
-
-
-#pragma mark - User Profile
-
 - (void) getUserProfileServer:(NSString*)serverPath onCommunication:(OCCommunication *)sharedOCComunication successRequest:(void(^)(NSHTTPURLResponse *response, OCUserProfile *userProfile, NSString *redirectedServer)) successRequest failureRequest:(void(^)(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer)) failureRequest {
     
     serverPath = [serverPath stringByAppendingString:k_url_acces_remote_userprofile_api];
@@ -1900,15 +1877,14 @@
     [request getUserProfileServer:serverPath onCommunication:sharedOCComunication success:^(NSHTTPURLResponse *response, id responseObject) {
     
         NSData *responseData = (NSData*) responseObject;
-        
+        OCUserProfile *userProfile = [OCUserProfile new];
+
         //Parse
         NSError *error;
         NSDictionary *jsongParsed = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
         NSLog(@"[LOG] User Profile : %@",jsongParsed);
         
-        OCUserProfile *userProfile = [OCUserProfile new];
-        
-        if (jsongParsed.allKeys > 0) {
+        if (jsongParsed && jsongParsed.allKeys > 0) {
 
             NSDictionary *ocs = [jsongParsed valueForKey:@"ocs"];
             NSDictionary *meta = [ocs valueForKey:@"meta"];
@@ -1964,22 +1940,21 @@
                         userProfile.quotaUsed = [[quota valueForKey:@"used"] doubleValue];
                 }
                 
+                successRequest(response, userProfile, request.redirectedServer);
+
             } else {
                 
-                NSString *message = (NSString*)[meta objectForKey:@"message"];
-                
+                NSString *message = (NSString *)[meta objectForKey:@"message"];
                 if ([message isKindOfClass:[NSNull class]]) {
-                    message = @"";
+                    message = NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil);
                 }
-                
-                NSError *error = [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message];
-                failureRequest(response, error, request.redirectedServer);
+                failureRequest(response, [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message], request.redirectedServer);
             }
+            
+        } else {
+            failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
         }
         
-        //Return success
-        successRequest(response, userProfile, request.redirectedServer);
-        
     } failure:^(NSHTTPURLResponse *response, NSData *responseData, NSError *error) {
     
         failureRequest(response, error, request.redirectedServer);
@@ -2000,14 +1975,14 @@
     [request getEndToEndPublicKeys:serverPath onCommunication:sharedOCComunication success:^(NSHTTPURLResponse *response, id responseObject) {
         
         NSData *responseData = (NSData*) responseObject;
-        NSString *publicKey;
+        NSString *publicKey = @"";
         
         //Parse
         NSError *error;
         NSDictionary *jsongParsed = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
         NSLog(@"[LOG] E2E Get PublicKey : %@",jsongParsed);
         
-        if (jsongParsed.allKeys > 0) {
+        if (jsongParsed && jsongParsed.allKeys > 0) {
             
             NSDictionary *ocs = [jsongParsed valueForKey:@"ocs"];
             NSDictionary *meta = [ocs valueForKey:@"meta"];
@@ -2021,24 +1996,26 @@
                     
                     NSDictionary *publickeys = [data valueForKey:@"public-keys"];
                     publicKey = [publickeys valueForKey:self.userID];
+                    
+                    successRequest(response, publicKey, request.redirectedServer);
+                    
+                } else {
+                    failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
                 }
                 
             } else {
                 
-                NSString *message = (NSString*)[meta objectForKey:@"message"];
-                
+                NSString *message = (NSString *)[meta objectForKey:@"message"];
                 if ([message isKindOfClass:[NSNull class]]) {
-                    message = @"";
+                    message = NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil);
                 }
-                
-                NSError *error = [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message];
-                failureRequest(response, error, request.redirectedServer);
+                failureRequest(response, [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message], request.redirectedServer);
             }
+            
+        } else {
+            failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
         }
         
-        //Return success
-        successRequest(response, publicKey, request.redirectedServer);
-        
     } failure:^(NSHTTPURLResponse *response, NSData *responseData, NSError *error) {
         
         //Return error
@@ -2058,14 +2035,14 @@
     [request getEndToEndPrivateKeyCipher:serverPath onCommunication:sharedOCComunication success:^(NSHTTPURLResponse *response, id responseObject) {
         
         NSData *responseData = (NSData*) responseObject;
-        NSString *privateKeyChiper;
+        NSString *privateKeyChiper = @"";
         
         //Parse
         NSError *error;
         NSDictionary *jsongParsed = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
         NSLog(@"[LOG] E2E Get PrivateKey : %@",jsongParsed);
         
-        if (jsongParsed.allKeys > 0) {
+        if (jsongParsed && jsongParsed.allKeys > 0) {
             
             NSDictionary *ocs = [jsongParsed valueForKey:@"ocs"];
             NSDictionary *meta = [ocs valueForKey:@"meta"];
@@ -2075,25 +2052,26 @@
             
             if (statusCode == kOCUserProfileAPISuccessful) {
                 
-                if ([data valueForKey:@"private-key"] && ![[data valueForKey:@"private-key"] isKindOfClass:[NSNull class]])
+                if ([data valueForKey:@"private-key"] && ![[data valueForKey:@"private-key"] isKindOfClass:[NSNull class]]) {
+                    
                     privateKeyChiper = [data valueForKey:@"private-key"];
-                
+                    successRequest(response, privateKeyChiper, request.redirectedServer);
+                    
+                } else {
+                    failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
+                }
             } else {
                 
-                NSString *message = (NSString*)[meta objectForKey:@"message"];
-                
+                NSString *message = (NSString *)[meta objectForKey:@"message"];
                 if ([message isKindOfClass:[NSNull class]]) {
-                    message = @"";
+                    message = NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil);
                 }
-                
-                NSError *error = [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message];
-                failureRequest(response, error, request.redirectedServer);
+                failureRequest(response, [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message], request.redirectedServer);
             }
+        } else {
+            failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
         }
         
-        //Return success
-        successRequest(response, privateKeyChiper, request.redirectedServer);
-        
     } failure:^(NSHTTPURLResponse *response, NSData *responseData, NSError *error) {
         
         //Return error
@@ -2113,14 +2091,14 @@
     [request getEndToEndServerPublicKey:serverPath onCommunication:sharedOCComunication success:^(NSHTTPURLResponse *response, id responseObject) {
         
         NSData *responseData = (NSData*) responseObject;
-        NSString *publicKey;
+        NSString *publicKey = @"";
         
         //Parse
         NSError *error;
         NSDictionary *jsongParsed = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
         NSLog(@"[LOG] E2E Get Server PublicKey : %@",jsongParsed);
         
-        if (jsongParsed.allKeys > 0) {
+        if (jsongParsed && jsongParsed.allKeys > 0) {
             
             NSDictionary *ocs = [jsongParsed valueForKey:@"ocs"];
             NSDictionary *meta = [ocs valueForKey:@"meta"];
@@ -2133,23 +2111,24 @@
                 if ([data valueForKey:@"public-key"] && ![[data valueForKey:@"public-key"] isKindOfClass:[NSNull class]]) {
                     
                     publicKey = [data valueForKey:@"public-key"];
+                    successRequest(response, publicKey, request.redirectedServer);
+                    
+                } else {
+                    failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
                 }
-                
             } else {
                 
-                NSString *message = (NSString*)[meta objectForKey:@"message"];
-                
+                NSString *message = (NSString *)[meta objectForKey:@"message"];
                 if ([message isKindOfClass:[NSNull class]]) {
-                    message = @"";
+                    message = NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil);
                 }
-                
-                NSError *error = [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message];
-                failureRequest(response, error, request.redirectedServer);
+                failureRequest(response, [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message], request.redirectedServer);
             }
+        } else {
+            failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
         }
         
         //Return success
-        successRequest(response, publicKey, request.redirectedServer);
         
     } failure:^(NSHTTPURLResponse *response, NSData *responseData, NSError *error) {
         
@@ -2170,14 +2149,14 @@
     [request signEndToEndPublicKey:serverPath key:publicKey onCommunication:sharedOCComunication success:^(NSHTTPURLResponse *response, id responseObject) {
         
         NSData *responseData = (NSData*) responseObject;
-        NSString *publicKey;
+        NSString *publicKey = @"";
         
         //Parse
         NSError *error;
         NSDictionary *jsongParsed = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
         NSLog(@"[LOG] E2E Sign PublicKey : %@",jsongParsed);
         
-        if (jsongParsed.allKeys > 0) {
+        if (jsongParsed && jsongParsed.allKeys > 0) {
             
             NSDictionary *ocs = [jsongParsed valueForKey:@"ocs"];
             NSDictionary *meta = [ocs valueForKey:@"meta"];
@@ -2190,24 +2169,23 @@
                 if ([data valueForKey:@"public-key"] && ![[data valueForKey:@"public-key"] isKindOfClass:[NSNull class]]) {
                     
                     publicKey = [data valueForKey:@"public-key"];
+                    successRequest(response, publicKey, request.redirectedServer);
+                    
+                } else {
+                    failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
                 }
-                
             } else {
                 
-                NSString *message = (NSString*)[meta objectForKey:@"message"];
-                
+                NSString *message = (NSString *)[meta objectForKey:@"message"];
                 if ([message isKindOfClass:[NSNull class]]) {
-                    message = @"";
+                    message = NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil);
                 }
-                
-                NSError *error = [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message];
-                failureRequest(response, error, request.redirectedServer);
+                failureRequest(response, [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message], request.redirectedServer);
             }
+        } else {
+            failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
         }
         
-        //Return success
-        successRequest(response, publicKey, request.redirectedServer);
-        
     } failure:^(NSHTTPURLResponse *response, NSData *responseData, NSError *error) {
         
         //Return error
@@ -2227,14 +2205,14 @@
     [request storeEndToEndPrivateKeyCipher:serverPath key:privateKeyChiper onCommunication:sharedOCComunication success:^(NSHTTPURLResponse *response, id responseObject) {
         
         NSData *responseData = (NSData*) responseObject;
-        NSString *privateKey;
+        NSString *privateKey = @"";
         
         //Parse
         NSError *error;
         NSDictionary *jsongParsed = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
         NSLog(@"[LOG] E2E Store PrivateKey : %@",jsongParsed);
         
-        if (jsongParsed.allKeys > 0) {
+        if (jsongParsed && jsongParsed.allKeys > 0) {
             
             NSDictionary *ocs = [jsongParsed valueForKey:@"ocs"];
             NSDictionary *meta = [ocs valueForKey:@"meta"];
@@ -2247,24 +2225,24 @@
                 if ([data valueForKey:@"private-key"] && ![[data valueForKey:@"private-key"] isKindOfClass:[NSNull class]]) {
                     
                     privateKey = [data valueForKey:@"private-key"];
+                    successRequest(response, privateKey, request.redirectedServer);
+                    
+                } else {
+                    failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
                 }
                 
             } else {
                 
-                NSString *message = (NSString*)[meta objectForKey:@"message"];
-                
+                NSString *message = (NSString *)[meta objectForKey:@"message"];
                 if ([message isKindOfClass:[NSNull class]]) {
-                    message = @"";
+                    message = NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil);
                 }
-                
-                NSError *error = [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message];
-                failureRequest(response, error, request.redirectedServer);
+                failureRequest(response, [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message], request.redirectedServer);
             }
+        } else {
+            failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
         }
         
-        //Return success
-        successRequest(response, privateKey, request.redirectedServer);
-        
     } failure:^(NSHTTPURLResponse *response, NSData *responseData, NSError *error) {
         
         //Return error
@@ -2373,14 +2351,14 @@
     [request lockEndToEndFolderEncrypted:serverPath onCommunication:sharedOCComunication success:^(NSHTTPURLResponse *response, id responseObject) {
         
         NSData *responseData = (NSData*) responseObject;
-        NSString *token;
+        NSString *token = @"";
         
         //Parse
         NSError *error;
         NSDictionary *jsongParsed = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
         NSLog(@"[LOG] E2E Lock File : %@",jsongParsed);
         
-        if (jsongParsed.allKeys > 0) {
+        if (jsongParsed && jsongParsed.allKeys > 0) {
             
             NSDictionary *ocs = [jsongParsed valueForKey:@"ocs"];
             NSDictionary *meta = [ocs valueForKey:@"meta"];
@@ -2393,24 +2371,23 @@
                 if ([data valueForKey:@"token"] && ![[data valueForKey:@"token"] isKindOfClass:[NSNull class]]) {
                     
                     token = [data valueForKey:@"token"];
+                    successRequest(response, token, request.redirectedServer);
+                    
+                } else {
+                    failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
                 }
-                
             } else {
                 
-                NSString *message = (NSString*)[meta objectForKey:@"message"];
-                
+                NSString *message = (NSString *)[meta objectForKey:@"message"];
                 if ([message isKindOfClass:[NSNull class]]) {
-                    message = @"";
+                    message = NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil);
                 }
-                
-                NSError *error = [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message];
-                failureRequest(response, error, request.redirectedServer);
+                failureRequest(response, [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message], request.redirectedServer);
             }
+        } else {
+            failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
         }
         
-        //Return success
-        successRequest(response, token, request.redirectedServer);
-        
     } failure:^(NSHTTPURLResponse *response, NSData *responseData, NSError *error) {
         
         //Return error
@@ -2451,14 +2428,14 @@
     [request getEndToEndMetadata:serverPath onCommunication:sharedOCComunication success:^(NSHTTPURLResponse *response, id responseObject) {
         
         NSData *responseData = (NSData*) responseObject;
-        NSString *encryptedMetadata;
+        NSString *encryptedMetadata = @"";
         
         //Parse
         NSError *error;
         NSDictionary *jsongParsed = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
         NSLog(@"[LOG] E2E Get Metadata : %@",jsongParsed);
         
-        if (jsongParsed.allKeys > 0) {
+        if (jsongParsed && jsongParsed.allKeys > 0) {
             
             NSDictionary *ocs = [jsongParsed valueForKey:@"ocs"];
             NSDictionary *meta = [ocs valueForKey:@"meta"];
@@ -2471,24 +2448,22 @@
                 if ([data valueForKey:@"meta-data"] && ![[data valueForKey:@"meta-data"] isKindOfClass:[NSNull class]]) {
                     
                     encryptedMetadata = [data valueForKey:@"meta-data"];
+                    successRequest(response, encryptedMetadata, request.redirectedServer);
+                    
+                } else {
+                    failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
                 }
-                
             } else {
-                
-                NSString *message = (NSString*)[meta objectForKey:@"message"];
-                
+                NSString *message = (NSString *)[meta objectForKey:@"message"];
                 if ([message isKindOfClass:[NSNull class]]) {
-                    message = @"";
+                    message = NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil);
                 }
-                
-                NSError *error = [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message];
-                failureRequest(response, error, request.redirectedServer);
+                failureRequest(response, [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message], request.redirectedServer);
             }
+        } else {
+            failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
         }
         
-        //Return success
-        successRequest(response, encryptedMetadata, request.redirectedServer);
-        
     } failure:^(NSHTTPURLResponse *response, NSData *responseData, NSError *error) {
         
         //Return error
@@ -2510,14 +2485,14 @@
     [request storeEndToEndMetadata:serverPath metadata:encryptedMetadata onCommunication:sharedOCComunication success:^(NSHTTPURLResponse *response, id responseObject) {
         
         NSData *responseData = (NSData*) responseObject;
-        NSString *encryptedMetadata;
+        NSString *encryptedMetadata = @"";
         
         //Parse
         NSError *error;
         NSDictionary *jsongParsed = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
         NSLog(@"[LOG] E2E Store Metadata : %@",jsongParsed);
         
-        if (jsongParsed.allKeys > 0) {
+        if (jsongParsed && jsongParsed.allKeys > 0) {
             
             NSDictionary *ocs = [jsongParsed valueForKey:@"ocs"];
             NSDictionary *meta = [ocs valueForKey:@"meta"];
@@ -2527,27 +2502,26 @@
             
             if (statusCode == kOCUserProfileAPISuccessful) {
                 
-                if ([data valueForKey:@"encrypted-meta-data"] && ![[data valueForKey:@"encrypted-meta-data"] isKindOfClass:[NSNull class]]) {
+                if ([data valueForKey:@"meta-data"] && ![[data valueForKey:@"meta-data"] isKindOfClass:[NSNull class]]) {
                     
-                    encryptedMetadata = [data valueForKey:@"encrypted-meta-data"];
+                    encryptedMetadata = [data valueForKey:@"meta-data"];
+                    successRequest(response, encryptedMetadata, request.redirectedServer);
+                    
+                } else {
+                    failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
                 }
-                
             } else {
                 
-                NSString *message = (NSString*)[meta objectForKey:@"message"];
-                
+                NSString *message = (NSString *)[meta objectForKey:@"message"];
                 if ([message isKindOfClass:[NSNull class]]) {
-                    message = @"";
+                    message = NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil);
                 }
-                
-                NSError *error = [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message];
-                failureRequest(response, error, request.redirectedServer);
+                failureRequest(response, [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message], request.redirectedServer);
             }
+        } else {
+            failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
         }
         
-        //Return success
-        successRequest(response, encryptedMetadata, request.redirectedServer);
-        
     } failure:^(NSHTTPURLResponse *response, NSData *responseData, NSError *error) {
         
         //Return error
@@ -2570,14 +2544,14 @@
     [request updateEndToEndMetadata:serverPath metadata:encryptedMetadata onCommunication:sharedOCComunication success:^(NSHTTPURLResponse *response, id responseObject) {
         
         NSData *responseData = (NSData*) responseObject;
-        NSString *encryptedMetadata;
+        NSString *encryptedMetadata = @"";
         
         //Parse
         NSError *error;
         NSDictionary *jsongParsed = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
         NSLog(@"[LOG] E2E Update Metadata : %@",jsongParsed);
         
-        if (jsongParsed.allKeys > 0) {
+        if (jsongParsed && jsongParsed.allKeys > 0) {
             
             NSDictionary *ocs = [jsongParsed valueForKey:@"ocs"];
             NSDictionary *meta = [ocs valueForKey:@"meta"];
@@ -2590,24 +2564,23 @@
                 if ([data valueForKey:@"meta-data"] && ![[data valueForKey:@"meta-data"] isKindOfClass:[NSNull class]]) {
                     
                     encryptedMetadata = [data valueForKey:@"meta-data"];
+                    successRequest(response, encryptedMetadata, request.redirectedServer);
+                    
+                } else {
+                    failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
                 }
-                
             } else {
                 
-                NSString *message = (NSString*)[meta objectForKey:@"message"];
-                
+                NSString *message = (NSString *)[meta objectForKey:@"message"];
                 if ([message isKindOfClass:[NSNull class]]) {
-                    message = @"";
+                    message = NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil);
                 }
-                
-                NSError *error = [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message];
-                failureRequest(response, error, request.redirectedServer);
+                failureRequest(response, [UtilsFramework getErrorWithCode:statusCode andCustomMessageFromTheServer:message], request.redirectedServer);
             }
+        } else {
+            failureRequest(response, [UtilsFramework getErrorWithCode:k_CCErrorWebdavResponseError andCustomMessageFromTheServer:NSLocalizedStringFromTable(@"_server_response_error_", @"Error", nil)], request.redirectedServer);
         }
         
-        //Return success
-        successRequest(response, encryptedMetadata, request.redirectedServer);
-        
     } failure:^(NSHTTPURLResponse *response, NSData *responseData, NSError *error) {
         
         //Return error

+ 2 - 2
iOSClient/Library/OCCommunicationLib/OCWebDavClient/OCWebDAVClient.m

@@ -300,11 +300,11 @@ NSString const *OCWebDAVModificationDateKey	= @"modificationdate";
                 "</d:select>"
                 "<d:from>"
                     "<d:scope>"
-                        "<d:href>/files/%@</d:href>"
+                        "<d:href>/files/%@%@</d:href>"
                         "<d:depth>infinity</d:depth>"
                     "</d:scope>"
                 "</d:from>"
-                "<d:where><d:and><d:or>", userID];
+                "<d:where><d:and><d:or>", userID, folder];
         
         for (NSString *type in contentType) {
             whereType = [NSString stringWithFormat: @"%@<d:like><d:prop><d:getcontenttype/></d:prop><d:literal>%@</d:literal></d:like>", whereType, type];

+ 3 - 3
iOSClient/Main/CCMain.m

@@ -393,7 +393,7 @@
         [[NCService sharedInstance] startRequestServicesServer];
         
         // Clear datasorce
-        [appDelegate.activePhotos reloadDatasource];
+        [appDelegate.activePhotos reloadDatasourceFromSearch:NO];
         [appDelegate.activeFavorites reloadDatasource];
         
         // Read this folder
@@ -1639,9 +1639,9 @@
 
 - (void)searchStartTimer
 {
-    NSString *home = [CCUtility getHomeServerUrlActiveUrl:appDelegate.activeUrl];
+    NSString *startDirectory = [CCUtility getHomeServerUrlActiveUrl:appDelegate.activeUrl];
     
-    [[CCActions sharedInstance] search:home fileName:_searchFileName depth:@"infinity" date:nil contenType:nil selector:selectorSearchFiles delegate:self];
+    [[CCActions sharedInstance] search:startDirectory fileName:_searchFileName depth:@"infinity" date:nil contenType:nil selector:selectorSearchFiles delegate:self];
 
     _noFilesSearchTitle = @"";
     _noFilesSearchDescription = NSLocalizedString(@"_search_in_progress_", nil);

+ 1 - 0
iOSClient/Move/CCMove.h

@@ -39,6 +39,7 @@
 @property (nonatomic, weak) id <CCMoveDelegate> delegate;
 @property (nonatomic, strong) NSOperationQueue *networkingOperationQueue;
 @property BOOL includeDirectoryE2EEncryption;
+@property BOOL hideCreateFolder;
 
 @property (nonatomic, strong) NSString *serverUrl;
 @property (nonatomic, strong) tableMetadata *passMetadata;

+ 11 - 5
iOSClient/Move/CCMove.m

@@ -72,7 +72,7 @@
     
     [self.cancel setTitle:NSLocalizedString(@"_cancel_", nil)];
     [self.create setTitle:NSLocalizedString(@"_create_folder_", nil)];
-
+    
     if (![_serverUrl length]) {
         
         UIImageView *image;
@@ -106,6 +106,10 @@
     self.tableView.emptyDataSetDelegate = self;
     self.tableView.emptyDataSetSource = self;
 
+    // get auto upload folder
+    _autoUploadFileName = [[NCManageDatabase sharedInstance] getAccountAutoUploadFileName];
+    _autoUploadDirectory = [[NCManageDatabase sharedInstance] getAccountAutoUploadDirectory:activeUrl];
+    
     // read file->folder
     [self readFileReloadFolder];
 }
@@ -120,6 +124,11 @@
     
     self.navigationController.toolbar.barTintColor = NCBrandColor.sharedInstance.tabBar;
     self.navigationController.toolbar.tintColor = NCBrandColor.sharedInstance.brandElement;
+    
+    if (self.hideCreateFolder) {
+        [self.create setEnabled:NO];
+        [self.create setTintColor: [UIColor clearColor]];
+    }
 }
 
 #pragma --------------------------------------------------------------------------------------------
@@ -323,10 +332,6 @@
         // insert in Database
         metadatas = [[NCManageDatabase sharedInstance] addMetadatas:metadatasToInsertInDB serverUrl:metadataNet.serverUrl];
 
-        // get auto upload folder
-        _autoUploadFileName = [[NCManageDatabase sharedInstance] getAccountAutoUploadFileName];
-        _autoUploadDirectory = [[NCManageDatabase sharedInstance] getAccountAutoUploadDirectory:activeUrl];
-        
         _loadingFolder = NO;
         
         [self.tableView reloadData];
@@ -528,6 +533,7 @@
     viewController.delegate = self.delegate;
     viewController.includeDirectoryE2EEncryption = self.includeDirectoryE2EEncryption;
     viewController.move.title = self.move.title;
+    viewController.hideCreateFolder = self.hideCreateFolder;
     viewController.networkingOperationQueue = _networkingOperationQueue;
 
     viewController.passMetadata = metadata;

+ 31 - 11
iOSClient/Networking/NCService.swift

@@ -209,9 +209,13 @@ class NCService: NSObject, OCNetworkingDelegate {
             // Change Theming color
             appDelegate.settingThemingColorBrand()
             
-            let error = "Get Capabilities failure error \(errorCode) \(message!)"
-            print("[LOG] \(error)")
-            
+            var error = ""
+            if let message = message {
+                error = "Get Capabilities failure error \(errorCode) \(message)"
+            } else {
+                error = "Get Capabilities failure error \(errorCode)"
+            }
+                        
             NCManageDatabase.sharedInstance.addActivityClient("", fileID: "", action: k_activityDebugActionCapabilities, selector: "Get Capabilities of Server", note: error, type: k_activityTypeFailure, verbose: true, activeUrl: appDelegate.activeUrl)
         }
     }
@@ -268,8 +272,12 @@ class NCService: NSObject, OCNetworkingDelegate {
             
         } else {
             
-            let error = "Get user profile failure error \(errorCode) \(message!)"
-            print("[LOG] \(error)")
+            var error = ""
+            if let message = message {
+                error = "Get user profile failure error \(errorCode) \(message)"
+            } else {
+                error = "Get user profile failure error \(errorCode)"
+            }
             
             NCManageDatabase.sharedInstance.addActivityClient("", fileID: "", action: k_activityDebugActionCapabilities, selector: "Get user profile Server", note: error, type: k_activityTypeFailure, verbose: true, activeUrl: appDelegate.activeUrl)
         }
@@ -291,8 +299,12 @@ class NCService: NSObject, OCNetworkingDelegate {
             
         } else {
          
-            let error = "Get external site failure error \(errorCode) \(message!)"
-            print("[LOG] \(error)")
+            var error = ""
+            if let message = message {
+                error = "Get external site failure error \(errorCode) \(message)"
+            } else {
+                error = "Get external site failure error \(errorCode)"
+            }
             
             NCManageDatabase.sharedInstance.addActivityClient("", fileID: "", action: k_activityDebugActionCapabilities, selector: "Get external site Server", note: error, type: k_activityTypeFailure, verbose: true, activeUrl: appDelegate.activeUrl)
         }
@@ -314,8 +326,12 @@ class NCService: NSObject, OCNetworkingDelegate {
             
         } else {
             
-            let error = "Get Activity Server failure error \(errorCode) \(message!)"
-            print("[LOG] \(error)")
+            var error = ""
+            if let message = message {
+                error = "Get Activity Server failure error \(errorCode) \(message)"
+            } else {
+                error = "Get Activity Server failure error \(errorCode)"
+            }
             
             NCManageDatabase.sharedInstance.addActivityClient("", fileID: "", action: k_activityDebugActionCapabilities, selector: "Get Activity Server", note: error, type: k_activityTypeFailure, verbose: true, activeUrl: appDelegate.activeUrl)
         }
@@ -366,8 +382,12 @@ class NCService: NSObject, OCNetworkingDelegate {
             
         } else {
             
-            let error = "Get Notification Server failure error \(errorCode) \(message!)"
-            print("[LOG] \(error)")
+            var error = ""
+            if let message = message {
+                error = "Get Notification Server failure error \(errorCode) \(message)"
+            } else {
+                error = "Get Notification Server failure error \(errorCode)"
+            }
             
             NCManageDatabase.sharedInstance.addActivityClient("", fileID: "", action: k_activityDebugActionCapabilities, selector: "Get Notification Server", note: error, type: k_activityTypeFailure, verbose: true, activeUrl: appDelegate.activeUrl)
             

+ 32 - 32
iOSClient/Networking/OCNetworking.m

@@ -185,7 +185,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -343,7 +343,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *token, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -465,7 +465,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *token, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
 
         // Error
@@ -518,7 +518,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *token, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -641,7 +641,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *token, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -708,7 +708,7 @@
             message = [CCError manageErrorOC:response.statusCode error:error];
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
 
         if ([self.delegate respondsToSelector:@selector(createFolderSuccessFailure:message:errorCode:)])
@@ -780,7 +780,7 @@
     } failureRquest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -827,7 +827,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         if ([self.delegate respondsToSelector:@selector(renameMoveFileOrFolderFailure:message:errorCode:)])
@@ -947,7 +947,7 @@
         _metadataNet.errorRetry++;
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -1016,7 +1016,7 @@
     } failureRequest :^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -1051,7 +1051,7 @@
     } failureRequest :^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
 
         // Error
@@ -1087,7 +1087,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
 
         // Error
@@ -1127,7 +1127,7 @@
 #endif
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
 
         // Error
@@ -1168,7 +1168,7 @@
 #endif
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
 
         // Error
@@ -1205,7 +1205,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
 
         // Error
@@ -1254,7 +1254,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -1305,7 +1305,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -1356,7 +1356,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -1395,7 +1395,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -1448,7 +1448,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -1500,7 +1500,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -1553,7 +1553,7 @@
         } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
            
             NSInteger errorCode = response.statusCode;
-            if (errorCode == 0)
+            if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
                 errorCode = error.code;
             
             // Error
@@ -1578,7 +1578,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
     
         // Error
@@ -1632,7 +1632,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -1683,7 +1683,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
 
         // Error
@@ -1729,7 +1729,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -1763,7 +1763,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -1800,7 +1800,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -1835,7 +1835,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -1867,7 +1867,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -1899,7 +1899,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error
@@ -1933,7 +1933,7 @@
     } failureRequest:^(NSHTTPURLResponse *response, NSError *error, NSString *redirectedServer) {
         
         NSInteger errorCode = response.statusCode;
-        if (errorCode == 0)
+        if (errorCode == 0 || (errorCode >= 200 && errorCode < 300))
             errorCode = error.code;
         
         // Error

+ 4 - 2
iOSClient/Photos/CCPhotos.h

@@ -34,16 +34,18 @@
 #import "CCSection.h"
 #import "CCHud.h"
 #import "OCNetworking.h"
+#import "CCMove.h"
 
 @class tableMetadata;
 
-@interface CCPhotos: UICollectionViewController <UICollectionViewDataSource, UICollectionViewDelegate, UIActionSheetDelegate, DZNEmptyDataSetSource, DZNEmptyDataSetDelegate, OCNetworkingDelegate>
+@interface CCPhotos: UICollectionViewController <UICollectionViewDataSource, UICollectionViewDelegate, UIActionSheetDelegate, DZNEmptyDataSetSource, DZNEmptyDataSetDelegate, OCNetworkingDelegate, CCMoveDelegate>
 
 @property (nonatomic, weak) CCDetail *detailViewController;
+@property BOOL isSearchMode;
 
 - (void)downloadFileSuccessFailure:(NSString *)fileName fileID:(NSString *)fileID serverUrl:(NSString *)serverUrl selector:(NSString *)selector selectorPost:(NSString *)selectorPost errorMessage:(NSString *)errorMessage errorCode:(NSInteger)errorCode;
 
-- (void)reloadDatasource;
+- (void)reloadDatasourceFromSearch:(BOOL)fromSearch;
 - (void)searchPhotoVideo;
 
 @end

+ 107 - 33
iOSClient/Photos/CCPhotos.m

@@ -42,9 +42,7 @@
     
     CCHud *_hud;
     
-    TOScrollBar *_scrollBar;
-    
-    BOOL _isSearchMode;
+    TOScrollBar *_scrollBar;    
 }
 @end
 
@@ -120,7 +118,8 @@
     // Plus Button
     [appDelegate plusButtonVisibile:true];
 
-    [self reloadDatasource];
+    if(!_isSearchMode)
+        [self reloadDatasourceFromSearch:NO];
 }
 
 - (void)viewSafeAreaInsetsDidChange
@@ -166,24 +165,38 @@
 - (void)setUINavigationBarDefault
 {
     [appDelegate aspectNavigationControllerBar:self.navigationController.navigationBar online:[appDelegate.reachability isReachable] hidden:NO];
+ 
+    // curront folder search
+    NSString *directory = [[NCManageDatabase sharedInstance] getAccountStartDirectoryPhotosTab:[CCUtility getHomeServerUrlActiveUrl:appDelegate.activeUrl]];
+    NSString *folder = [directory stringByReplacingOccurrencesOfString:[CCUtility getHomeServerUrlActiveUrl:appDelegate.activeUrl] withString:@""];
     
-    // select
-    UIImage *icon = [UIImage imageNamed:@"seleziona"];
-    UIBarButtonItem *buttonSelect = [[UIBarButtonItem alloc] initWithImage:icon style:UIBarButtonItemStylePlain target:self action:@selector(collectionSelectYES)];
+    // Title
+    self.navigationItem.titleView = nil;
+    if (folder.length == 0) {
+        self.navigationItem.title = NSLocalizedString(@"_photo_camera_", nil);
+    } else {
+        self.navigationItem.title = [NSString stringWithFormat:@"%@: %@", NSLocalizedString(@"_photo_camera_", nil), [folder substringFromIndex:1]];
+    }
     
+    if (_isSearchMode) {
+        [CCGraphics addImageToTitle:self.navigationItem.title colorTitle:[NCBrandColor sharedInstance].brandText imageTitle:[CCGraphics changeThemingColorImage:[UIImage imageNamed:@"loadingTitle"] color:[NCBrandColor sharedInstance].brandText] navigationItem:self.navigationItem];
+        [self.collectionView reloadData];
+        return;
+    }
+    
+    // Button Item
+    UIImage *icon;
+    icon = [UIImage imageNamed:@"seleziona"];
+    UIBarButtonItem *buttonSelect = [[UIBarButtonItem alloc] initWithImage:icon style:UIBarButtonItemStylePlain target:self action:@selector(collectionSelectYES)];
+    icon = [UIImage imageNamed:@"startDirectoryPhotosTab"];
+    UIBarButtonItem *buttonStartDirectoryPhotosTab = [[UIBarButtonItem alloc] initWithImage:icon style:UIBarButtonItemStylePlain target:self action:@selector(selectStartDirectoryPhotosTab)];
+
     if ([_sectionDataSource.allRecordsDataSource count] > 0) {
-        
         self.navigationItem.rightBarButtonItems = [[NSArray alloc] initWithObjects:buttonSelect, nil];
-        
     } else {
-        
         self.navigationItem.rightBarButtonItems = nil;
     }
-    
-    self.navigationItem.leftBarButtonItem = nil;
-    
-    // Title
-    self.navigationItem.title = NSLocalizedString(@"_photo_camera_", nil);
+    self.navigationItem.leftBarButtonItems = [[NSArray alloc] initWithObjects:buttonStartDirectoryPhotosTab, nil];
 }
 
 - (void)setUINavigationBarSelected
@@ -269,6 +282,22 @@
     }
 }
 
+- (void)searchInProgress:(BOOL)search
+{
+    dispatch_async(dispatch_get_main_queue(), ^{
+        if (search) {
+            _isSearchMode = YES;
+            [self.navigationItem.leftBarButtonItems[0] setEnabled:NO];
+            [self.navigationItem.rightBarButtonItems[0] setEnabled:NO];
+        } else {
+            _isSearchMode = NO;
+            [self.navigationItem.leftBarButtonItems[0] setEnabled:YES];
+            [self.navigationItem.rightBarButtonItems[0] setEnabled:YES];
+        }
+        [self setUINavigationBarDefault];
+    });
+}
+
 #pragma --------------------------------------------------------------------------------------------
 #pragma mark ==== DZNEmptyDataSetSource Methods ====
 #pragma --------------------------------------------------------------------------------------------
@@ -455,12 +484,12 @@
                 
             } else {
                 
-                [self reloadDatasource];
+                [self reloadDatasourceFromSearch:NO];
             }
             
         } else {
             
-            [self reloadDatasource];
+            [self reloadDatasourceFromSearch:NO];
         }
     }
 }
@@ -532,14 +561,52 @@
 }
 
 #pragma --------------------------------------------------------------------------------------------
-#pragma mark ==== readPhotoVideo ====
+#pragma mark ==== Change Start directory ====
+#pragma --------------------------------------------------------------------------------------------
+
+- (void)moveServerUrlTo:(NSString *)serverUrlTo title:(NSString *)title
+{
+    NSString *oldStartDirectoryPhotosTab = [[NCManageDatabase sharedInstance] getAccountStartDirectoryPhotosTab:[CCUtility getHomeServerUrlActiveUrl:appDelegate.activeUrl]];
+    
+    if (![serverUrlTo isEqualToString:oldStartDirectoryPhotosTab]) {
+        
+        // Save
+        [[NCManageDatabase sharedInstance] setAccountStartDirectoryPhotosTab:serverUrlTo];
+        
+        // search PhotoVideo with new start directory
+        [self searchPhotoVideo];
+    }
+}
+
+- (void)selectStartDirectoryPhotosTab
+{
+    UINavigationController* navigationController = [[UIStoryboard storyboardWithName:@"CCMove" bundle:nil] instantiateViewControllerWithIdentifier:@"CCMove"];
+    
+    CCMove *viewController = (CCMove *)navigationController.topViewController;
+    
+    viewController.delegate = self;
+    viewController.move.title = NSLocalizedString(@"_select_dir_photos_tab_", nil);
+    viewController.tintColor = [NCBrandColor sharedInstance].brandText;
+    viewController.barTintColor = [NCBrandColor sharedInstance].brand;
+    viewController.tintColorTitle = [NCBrandColor sharedInstance].brandText;
+    viewController.networkingOperationQueue = appDelegate.netQueue;
+    viewController.hideCreateFolder = YES;
+    // E2EE
+    viewController.includeDirectoryE2EEncryption = NO;
+    
+    [navigationController setModalPresentationStyle:UIModalPresentationFormSheet];
+    [self presentViewController:navigationController animated:YES completion:nil];
+}
+
+#pragma --------------------------------------------------------------------------------------------
+#pragma mark ==== Search Photo/Video ====
 #pragma --------------------------------------------------------------------------------------------
 
 - (void)searchSuccessFailure:(CCMetadataNet *)metadataNet metadatas:(NSArray *)metadatas message:(NSString *)message errorCode:(NSInteger)errorCode
 {
     // Check Active Account
     if (![metadataNet.account isEqualToString:appDelegate.activeAccount]) {
-        _isSearchMode = NO;
+        [self searchInProgress:NO];
         return;
     }
     
@@ -550,19 +617,17 @@
         
         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
             
-            BOOL isUpdate = [[NCManageDatabase sharedInstance] updateTableMetadatasContentTypeImageVideo:metadatas];
-            
-            if (isUpdate) {
-                dispatch_async(dispatch_get_main_queue(), ^{
-                    [self reloadDatasource];
-                });
-            }
+            NSString *startDirectory = [[NCManageDatabase sharedInstance] getAccountStartDirectoryPhotosTab:[CCUtility getHomeServerUrlActiveUrl:appDelegate.activeUrl]];
+
+            (void)[[NCManageDatabase sharedInstance] updateTableMetadatasContentTypeImageVideo:metadatas startDirectory:startDirectory activeUrl:appDelegate.activeUrl];
             
-            _isSearchMode = NO;
+            dispatch_async(dispatch_get_main_queue(), ^{
+                [self reloadDatasourceFromSearch:YES];
+            });
         });
     
     } else {
-        _isSearchMode = NO;
+        [self searchInProgress:NO];
     }
 }
 
@@ -577,25 +642,32 @@
     // tableAccount *account = [[NCManageDatabase sharedInstance] getAccountActive];
     // account.dateSearchContentTypeImageVideo
     
-    [[CCActions sharedInstance] search:@"" fileName:@"" depth:@"infinity" date:[NSDate distantPast] contenType:@[@"image/%", @"video/%"] selector:selectorSearchContentType delegate:self];
+    NSString *startDirectory = [[NCManageDatabase sharedInstance] getAccountStartDirectoryPhotosTab:[CCUtility getHomeServerUrlActiveUrl:appDelegate.activeUrl]];
+
+    [[CCActions sharedInstance] search:startDirectory fileName:@"" depth:@"infinity" date:[NSDate distantPast] contenType:@[@"image/%", @"video/%"] selector:selectorSearchContentType delegate:self];
     
-    _isSearchMode = YES;
+    [self searchInProgress:YES];
+    [self collectionSelect:NO];
 }
 
 #pragma --------------------------------------------------------------------------------------------
 #pragma mark ==== Collection ====
 #pragma --------------------------------------------------------------------------------------------
 
-- (void)reloadDatasource
+- (void)reloadDatasourceFromSearch:(BOOL)fromSearch
 {
     @synchronized(self) {
         // test
-        if (appDelegate.activeAccount.length == 0)
+        if (appDelegate.activeAccount.length == 0) {
+            [self searchInProgress:NO];
             return;
+        }
     
         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 
-            NSArray *metadatasDBImageVideo = [[NCManageDatabase sharedInstance] getTableMetadatasContentTypeImageVideo];
+            NSString *startDirectory = [[NCManageDatabase sharedInstance] getAccountStartDirectoryPhotosTab:[CCUtility getHomeServerUrlActiveUrl:appDelegate.activeUrl]];
+
+            NSArray *metadatasDBImageVideo = [[NCManageDatabase sharedInstance] getTableMetadatasContentTypeImageVideo:startDirectory activeUrl:appDelegate.activeUrl];
             CCSectionDataSourceMetadata *tempSectionDataSource = [CCSectionMetadata creataDataSourseSectionMetadata:metadatasDBImageVideo listProgressMetadata:nil groupByField:@"date" activeAccount:appDelegate.activeAccount];
         
             dispatch_async(dispatch_get_main_queue(), ^{
@@ -604,6 +676,8 @@
                     _sectionDataSource = [tempSectionDataSource copy];
                     [self reloadCollection];
                 }
+                if (fromSearch)
+                    [self searchInProgress:NO];
             });
         });
     }

BIN
iOSClient/Settings/CCAdvanced.h


BIN
iOSClient/Supporting Files/cs-CZ.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/de.lproj/Error.strings


BIN
iOSClient/Supporting Files/de.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/en-GB.lproj/Error.strings


BIN
iOSClient/Supporting Files/en-GB.lproj/Localizable.strings


+ 1 - 0
iOSClient/Supporting Files/en.lproj/Error.strings

@@ -52,5 +52,6 @@
 "_bad_request_"                         = "Bad request";
 "_webdav_locked_"                       = "WebDAV Locked : The resource that is being accessed is locked";
 "_error_user_not_available_"            = "The user is no longer available";
+"_server_response_error_"               = "Server response contenent error";
 
 

+ 1 - 0
iOSClient/Supporting Files/en.lproj/Localizable.strings

@@ -83,6 +83,7 @@
 "_success_"                 = "Success";
 "_initialization_"          = "Initialization";
 "_experimental_"            = "Experimental";
+"_select_dir_photos_tab_"   = "Select as folder \"Photos\"";
 
 // App
 

BIN
iOSClient/Supporting Files/es-419.lproj/Error.strings


BIN
iOSClient/Supporting Files/es-419.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-CL.lproj/Error.strings


BIN
iOSClient/Supporting Files/es-CL.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-CO.lproj/Error.strings


BIN
iOSClient/Supporting Files/es-CO.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-CR.lproj/Error.strings


BIN
iOSClient/Supporting Files/es-CR.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-DO.lproj/Error.strings


BIN
iOSClient/Supporting Files/es-DO.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-EC.lproj/Error.strings


BIN
iOSClient/Supporting Files/es-EC.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-GT.lproj/Error.strings


BIN
iOSClient/Supporting Files/es-GT.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-HN.lproj/Error.strings


BIN
iOSClient/Supporting Files/es-HN.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-MX.lproj/Error.strings


BIN
iOSClient/Supporting Files/es-MX.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-NI.lproj/Error.strings


BIN
iOSClient/Supporting Files/es-NI.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-PA.lproj/Error.strings


BIN
iOSClient/Supporting Files/es-PA.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-PE.lproj/Error.strings


BIN
iOSClient/Supporting Files/es-PE.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-PR.lproj/Error.strings


BIN
iOSClient/Supporting Files/es-PR.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-PY.lproj/Error.strings


BIN
iOSClient/Supporting Files/es-PY.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-SV.lproj/Error.strings


BIN
iOSClient/Supporting Files/es-SV.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es-UY.lproj/Error.strings


BIN
iOSClient/Supporting Files/es-UY.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/es.lproj/Error.strings


BIN
iOSClient/Supporting Files/es.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/fi-FI.lproj/BKPasscodeView.strings


BIN
iOSClient/Supporting Files/fi-FI.lproj/CTAssetsPicker.strings


BIN
iOSClient/Supporting Files/fi-FI.lproj/Error.strings


BIN
iOSClient/Supporting Files/fi-FI.lproj/InfoPlist.strings


BIN
iOSClient/Supporting Files/fi-FI.lproj/Intro.strings


BIN
iOSClient/Supporting Files/fi-FI.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/fi-FI.lproj/SwiftWebVC.strings


BIN
iOSClient/Supporting Files/fr.lproj/Error.strings


BIN
iOSClient/Supporting Files/fr.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/hu.lproj/Error.strings


BIN
iOSClient/Supporting Files/hu.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/is.lproj/Error.strings


BIN
iOSClient/Supporting Files/is.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/it.lproj/Error.strings


BIN
iOSClient/Supporting Files/it.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/it.lproj/SwiftWebVC.strings


BIN
iOSClient/Supporting Files/ka-GE.lproj/Error.strings


BIN
iOSClient/Supporting Files/ka-GE.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/ko.lproj/Error.strings


BIN
iOSClient/Supporting Files/ko.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/nb-NO.lproj/Error.strings


BIN
iOSClient/Supporting Files/nb-NO.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/nl.lproj/Error.strings


BIN
iOSClient/Supporting Files/nl.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/pl.lproj/Error.strings


BIN
iOSClient/Supporting Files/pl.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/pt-BR.lproj/Error.strings


BIN
iOSClient/Supporting Files/pt-BR.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/pt-PT.lproj/Error.strings


BIN
iOSClient/Supporting Files/pt-PT.lproj/Localizable.strings


BIN
iOSClient/Supporting Files/ru.lproj/Error.strings


BIN
iOSClient/Supporting Files/ru.lproj/Localizable.strings


Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно