44
55import UIKit
66import NextcloudKit
7+ import FileProvider
78
89class FileProviderData : NSObject {
910 static let shared = FileProviderData ( )
1011
11- let utilityFileSystem = NCUtilityFileSystem ( )
12- let global = NCGlobal . shared
13- let database = NCManageDatabase . shared
14-
1512 var domain : NSFileProviderDomain ?
1613 var session : NCSession . Session ?
14+ private var isPaginated : Bool ?
1715
1816 var listFavoriteIdentifierRank : [ String : NSNumber ] = [ : ]
1917 var fileProviderSignalDeleteContainerItemIdentifier : [ NSFileProviderItemIdentifier : NSFileProviderItemIdentifier ] = [ : ]
@@ -40,8 +38,8 @@ class FileProviderData: NSObject {
4038 func setupAccount( domain: NSFileProviderDomain ? = nil ,
4139 tblAccount: tableAccount ? = nil ,
4240 providerExtension: NSFileProviderExtension ) -> tableAccount ? {
43- let version = NSString ( format: NCBrandOptions . shared. textCopyrightNextcloudiOS as NSString , NCUtility ( ) . getVersionBuild ( ) ) as String
44- let tblAccounts = self . database . getAllTableAccount ( )
41+ let version = NSString ( format: NCBrandOptions . shared. textCopyrightNextcloudiOS as NSString , fileProviderUtility ( ) . getVersionBuild ( ) ) as String
42+ let tblAccounts = NCManageDatabase . shared . getAllTableAccount ( )
4543 var matchAccount : tableAccount ?
4644
4745 NextcloudKit . configureLogger ( logLevel: ( NCBrandOptions . shared. disable_log ? . disabled : NCPreferences ( ) . log) )
@@ -55,9 +53,9 @@ class FileProviderData: NSObject {
5553 }
5654 let accountDomain = " \( $0. userId) ( \( host) ) "
5755 return accountDomain == domain. identifier. rawValue
58- } ) ?? self . database . getActiveTableAccount ( )
56+ } ) ?? NCManageDatabase . shared . getActiveTableAccount ( )
5957 } else {
60- matchAccount = self . database . getActiveTableAccount ( )
58+ matchAccount = NCManageDatabase . shared . getActiveTableAccount ( )
6159 }
6260
6361 guard let matchAccount else {
@@ -86,11 +84,24 @@ class FileProviderData: NSObject {
8684 return matchAccount
8785 }
8886
87+ // Get capabilities -> Paginate is availible from NC server 32.0.2
88+ func isPaginatedAvailabile( serverUrl: String , session: NCSession . Session ) async -> Bool {
89+ if let isPaginated {
90+ return isPaginated
91+ } else if serverUrl == NCUtilityFileSystem ( ) . getHomeServer ( session: session) ,
92+ let capabilities = await NextcloudKit . shared. getCapabilitiesAsync ( account: session. account) . capabilities,
93+ NCBrandOptions . shared. isServerVersion ( capabilities, greaterOrEqualTo: 32 , 0 , 2 ) {
94+ isPaginated = true
95+ return true
96+ }
97+ return false
98+ }
99+
89100 // MARK: -
90101
91102 @discardableResult
92103 func signalEnumerator( ocId: String , type: TypeSignal ) async -> FileProviderItem ? {
93- guard let metadata = await self . database . getMetadataFromOcIdAsync ( ocId) ,
104+ guard let metadata = await NCManageDatabase . shared . getMetadataFromOcIdAsync ( ocId) ,
94105 let parentItemIdentifier = await fileProviderUtility ( ) . getParentItemIdentifierAsync ( metadata: metadata) else {
95106 return nil
96107 }
@@ -143,7 +154,7 @@ class FileProviderData: NSObject {
143154 task: URLSessionTask ,
144155 error: NKError ) async {
145156 let taskIdentifier = task. taskIdentifier
146- let metadata = await self . database . getMetadataAsync ( predicate: NSPredicate ( format: " serverUrl == %@ AND fileName == %@ " , serverUrl, fileName) )
157+ let metadata = await NCManageDatabase . shared . getMetadataAsync ( predicate: NSPredicate ( format: " serverUrl == %@ AND fileName == %@ " , serverUrl, fileName) )
147158
148159 guard let metadata else {
149160 downloadPendingCompletionHandlers [ taskIdentifier] ? ( nil )
@@ -155,16 +166,16 @@ class FileProviderData: NSObject {
155166
156167 let ocId = metadata. ocId
157168
158- await self . database . setMetadataSessionAsync ( ocId: ocId,
159- session: " " ,
160- sessionTaskIdentifier: 0 ,
161- sessionError: " " ,
162- status: self . global . metadataStatusNormal,
163- etag: etag)
169+ await NCManageDatabase . shared . setMetadataSessionAsync ( ocId: ocId,
170+ session: " " ,
171+ sessionTaskIdentifier: 0 ,
172+ sessionError: " " ,
173+ status: NCGlobal . shared . metadataStatusNormal,
174+ etag: etag)
164175
165176 if error == . success {
166- if let metadata = await self . database . getMetadataFromOcIdAsync ( ocId) {
167- await self . database . addLocalFilesAsync ( metadatas: [ metadata] )
177+ if let metadata = await NCManageDatabase . shared . getMetadataFromOcIdAsync ( ocId) {
178+ await NCManageDatabase . shared . addLocalFilesAsync ( metadatas: [ metadata] )
168179 }
169180 }
170181
@@ -188,24 +199,25 @@ class FileProviderData: NSObject {
188199 size: Int64 ,
189200 task: URLSessionTask ,
190201 error: NKError ) async {
191- guard let metadata = await self . database . getMetadataAsync ( predicate: NSPredicate ( format: " serverUrl == %@ AND fileName == %@ AND sessionTaskIdentifier == %d " , serverUrl, fileName, task. taskIdentifier) ) else {
202+ guard let metadata = await NCManageDatabase . shared . getMetadataAsync ( predicate: NSPredicate ( format: " serverUrl == %@ AND fileName == %@ AND sessionTaskIdentifier == %d " , serverUrl, fileName, task. taskIdentifier) ) else {
192203 let predicate = NSPredicate ( format: " fileName == %@ AND serverUrl == %@ " , fileName, serverUrl)
193- await self . database . deleteMetadataAsync ( predicate: predicate)
204+ await NCManageDatabase . shared . deleteMetadataAsync ( predicate: predicate)
194205
195206 return
196207 }
197208
198209 if let ocId, !metadata. ocIdTransfer. isEmpty {
199- let atPath = self . utilityFileSystem. getDirectoryProviderStorageOcId ( metadata. ocIdTransfer, userId: metadata. userId, urlBase: metadata. urlBase)
200- let toPath = self . utilityFileSystem. getDirectoryProviderStorageOcId ( ocId, userId: metadata. userId, urlBase: metadata. urlBase)
201- self . utilityFileSystem. copyFile ( atPath: atPath, toPath: toPath)
210+ let utilityFileSystem = NCUtilityFileSystem ( )
211+ let atPath = utilityFileSystem. getDirectoryProviderStorageOcId ( metadata. ocIdTransfer, userId: metadata. userId, urlBase: metadata. urlBase)
212+ let toPath = utilityFileSystem. getDirectoryProviderStorageOcId ( ocId, userId: metadata. userId, urlBase: metadata. urlBase)
213+ utilityFileSystem. copyFile ( atPath: atPath, toPath: toPath)
202214 }
203215
204216 if error == . success, let ocId {
205217 await signalEnumerator ( ocId: metadata. ocIdTransfer, type: . delete)
206218
207219 if !metadata. ocIdTransfer. isEmpty, ocId != metadata. ocIdTransfer {
208- await self . database . deleteMetadataAsync ( id: metadata. ocIdTransfer)
220+ await NCManageDatabase . shared . deleteMetadataAsync ( id: metadata. ocIdTransfer)
209221 }
210222
211223 metadata. fileName = fileName
@@ -214,7 +226,7 @@ class FileProviderData: NSObject {
214226 metadata. etag = etag ?? " "
215227 metadata. ocId = ocId
216228 metadata. size = size
217- if let fileId = NCUtility ( ) . ocIdToFileId ( ocId: ocId) {
229+ if let fileId = fileProviderUtility ( ) . ocIdToFileId ( ocId: ocId) {
218230 metadata. fileId = fileId
219231 }
220232
@@ -224,17 +236,16 @@ class FileProviderData: NSObject {
224236 metadata. sessionSelector = " "
225237 metadata. sessionDate = nil
226238 metadata. sessionTaskIdentifier = 0
227- metadata. progress = 0
228239 metadata. status = NCGlobal . shared. metadataStatusNormal
229240
230- await self . database . addMetadataAsync ( metadata)
231- await self . database . addLocalFilesAsync ( metadatas: [ metadata] )
241+ await NCManageDatabase . shared . addMetadataAsync ( metadata)
242+ await NCManageDatabase . shared . addLocalFilesAsync ( metadatas: [ metadata] )
232243
233244 await signalEnumerator ( ocId: ocId, type: . update)
234245
235246 } else {
236247
237- await self . database . deleteMetadataAsync ( id: metadata. ocIdTransfer)
248+ await NCManageDatabase . shared . deleteMetadataAsync ( id: metadata. ocIdTransfer)
238249
239250 await signalEnumerator ( ocId: metadata. ocIdTransfer, type: . delete)
240251 }
0 commit comments