@@ -27,6 +27,7 @@ public protocol FileProviderAdapterType: AnyObject {
27
27
func startProvidingItem( at url: URL , completionHandler: @escaping ( ( _ error: Error ? ) -> Void ) )
28
28
func setFavoriteRank( _ favoriteRank: NSNumber ? , forItemIdentifier itemIdentifier: NSFileProviderItemIdentifier , completionHandler: @escaping ( NSFileProviderItem ? , Error ? ) -> Void )
29
29
func setTagData( _ tagData: Data ? , forItemIdentifier itemIdentifier: NSFileProviderItemIdentifier , completionHandler: @escaping ( NSFileProviderItem ? , Error ? ) -> Void )
30
+ func retryUpload( for itemIdentifier: NSFileProviderItemIdentifier )
30
31
}
31
32
32
33
public class FileProviderAdapter : FileProviderAdapterType {
@@ -44,9 +45,11 @@ public class FileProviderAdapter: FileProviderAdapterType {
44
45
private let notificator : FileProviderItemUpdateDelegate ?
45
46
private let fullVersionChecker : FullVersionChecker
46
47
private let workflowFactory : WorkflowFactoryLocking
48
+ private let domainIdentifier : NSFileProviderDomainIdentifier
47
49
48
- init ( uploadTaskManager: UploadTaskManager , cachedFileManager: CachedFileManager , itemMetadataManager: ItemMetadataManager , reparentTaskManager: ReparentTaskManager , deletionTaskManager: DeletionTaskManager , itemEnumerationTaskManager: ItemEnumerationTaskManager , downloadTaskManager: DownloadTaskManager , scheduler: WorkflowScheduler , provider: CloudProvider , notificator: FileProviderItemUpdateDelegate ? = nil , localURLProvider: LocalURLProviderType , fullVersionChecker: FullVersionChecker = UserDefaultsFullVersionChecker . shared) {
50
+ init ( domainIdentifier : NSFileProviderDomainIdentifier , uploadTaskManager: UploadTaskManager , cachedFileManager: CachedFileManager , itemMetadataManager: ItemMetadataManager , reparentTaskManager: ReparentTaskManager , deletionTaskManager: DeletionTaskManager , itemEnumerationTaskManager: ItemEnumerationTaskManager , downloadTaskManager: DownloadTaskManager , scheduler: WorkflowScheduler , provider: CloudProvider , notificator: FileProviderItemUpdateDelegate ? = nil , localURLProvider: LocalURLProviderType , fullVersionChecker: FullVersionChecker = UserDefaultsFullVersionChecker . shared) {
49
51
self . lastUnlockedDate = Date ( )
52
+ self . domainIdentifier = domainIdentifier
50
53
self . uploadTaskManager = uploadTaskManager
51
54
self . cachedFileManager = cachedFileManager
52
55
self . itemMetadataManager = itemMetadataManager
@@ -61,7 +64,8 @@ public class FileProviderAdapter: FileProviderAdapterType {
61
64
reparentTaskManager: reparentTaskManager,
62
65
deletionTaskManager: deletionTaskManager,
63
66
itemEnumerationTaskManager: itemEnumerationTaskManager,
64
- downloadTaskManager: downloadTaskManager)
67
+ downloadTaskManager: downloadTaskManager,
68
+ domainIdentifier: domainIdentifier)
65
69
self . workflowFactory = WorkflowFactoryLocking ( lockManager: LockManager ( ) , workflowFactory: factory)
66
70
self . scheduler = scheduler
67
71
self . provider = provider
@@ -84,7 +88,7 @@ public class FileProviderAdapter: FileProviderAdapterType {
84
88
let localCachedFileInfo = try cachedFileManager. getLocalCachedFileInfo ( for: itemMetadata)
85
89
let newestVersionLocallyCached = localCachedFileInfo? . isCurrentVersion ( lastModifiedDateInCloud: itemMetadata. lastModifiedDate) ?? false
86
90
let localURL = localCachedFileInfo? . localURL
87
- return FileProviderItem ( metadata: itemMetadata, newestVersionLocallyCached: newestVersionLocallyCached, localURL: localURL, error: uploadTask? . failedWithError)
91
+ return FileProviderItem ( metadata: itemMetadata, domainIdentifier : domainIdentifier , newestVersionLocallyCached: newestVersionLocallyCached, localURL: localURL, error: uploadTask? . failedWithError)
88
92
}
89
93
90
94
// MARK: Enumerate Item
@@ -140,7 +144,7 @@ public class FileProviderAdapter: FileProviderAdapterType {
140
144
let localCachedFileInfo = try self . cachedFileManager. getLocalCachedFileInfo ( for: metadata)
141
145
let newestVersionLocallyCached = localCachedFileInfo? . isCurrentVersion ( lastModifiedDateInCloud: metadata. lastModifiedDate) ?? false
142
146
let localURL = localCachedFileInfo? . localURL
143
- return FileProviderItem ( metadata: metadata, newestVersionLocallyCached: newestVersionLocallyCached, localURL: localURL, error: uploadTasks [ index] ? . failedWithError)
147
+ return FileProviderItem ( metadata: metadata, domainIdentifier : domainIdentifier , newestVersionLocallyCached: newestVersionLocallyCached, localURL: localURL, error: uploadTasks [ index] ? . failedWithError)
144
148
}
145
149
} catch {
146
150
return Promise ( error)
@@ -218,7 +222,7 @@ public class FileProviderAdapter: FileProviderAdapterType {
218
222
219
223
// Register LocalURL in the DB
220
224
try cachedFileManager. cacheLocalFileInfo ( for: placeholderMetadata. id!, localURL: localURL, lastModifiedDate: nil )
221
- let item = FileProviderItem ( metadata: placeholderMetadata, newestVersionLocallyCached: true , localURL: localURL)
225
+ let item = FileProviderItem ( metadata: placeholderMetadata, domainIdentifier : domainIdentifier , newestVersionLocallyCached: true , localURL: localURL)
222
226
let uploadTaskRecord = try registerFileInUploadQueue ( with: localURL, itemMetadata: placeholderMetadata)
223
227
return LocalItemImportResult ( item: item, uploadTaskRecord: uploadTaskRecord)
224
228
}
@@ -258,14 +262,39 @@ public class FileProviderAdapter: FileProviderAdapterType {
258
262
let itemMetadata = try getCachedMetadata ( for: itemIdentifier)
259
263
uploadTaskRecord = try registerFileInUploadQueue ( with: url, itemMetadata: itemMetadata)
260
264
} catch {
261
- DDLogError ( " itemChanged - failed to register file in upload queue with url: \( url) and identifier: \( itemIdentifier) " )
265
+ DDLogError ( " itemChanged - register file in upload queue with url: \( url) and identifier: \( itemIdentifier) failed with error: \( error ) " )
262
266
return
263
267
}
264
268
uploadFile ( taskRecord: uploadTaskRecord) . then { item in
265
269
self . notificator? . signalUpdate ( for: item)
266
270
}
267
271
}
268
272
273
+ public func retryUpload( for itemIdentifier: NSFileProviderItemIdentifier ) {
274
+ let uploadTaskRecord : UploadTaskRecord
275
+ let itemMetadata : ItemMetadata
276
+ let localCachedFileInfo : LocalCachedFileInfo
277
+ do {
278
+ itemMetadata = try getCachedMetadata ( for: itemIdentifier)
279
+ guard let retrievedLocalCachedFileInfo = try cachedFileManager. getLocalCachedFileInfo ( for: itemMetadata) else {
280
+ DDLogError ( " retryUpload - retrievedLocalCachedFileInfo is nil for identifier: \( itemIdentifier) " )
281
+ return
282
+ }
283
+ localCachedFileInfo = retrievedLocalCachedFileInfo
284
+ uploadTaskRecord = try registerFileInUploadQueue ( with: localCachedFileInfo. localURL, itemMetadata: itemMetadata)
285
+ } catch {
286
+ DDLogError ( " retryUpload - get existing uploadTaskRecord for identifier: \( itemIdentifier) failed with error: \( error) " )
287
+ return
288
+ }
289
+ let newestVersionLocallyCached = localCachedFileInfo. isCurrentVersion ( lastModifiedDateInCloud: itemMetadata. lastModifiedDate)
290
+ let localURL = localCachedFileInfo. localURL
291
+ let item = FileProviderItem ( metadata: itemMetadata, domainIdentifier: domainIdentifier, newestVersionLocallyCached: newestVersionLocallyCached, localURL: localURL, error: nil )
292
+ notificator? . signalUpdate ( for: item)
293
+ uploadFile ( taskRecord: uploadTaskRecord) . then { item in
294
+ self . notificator? . signalUpdate ( for: item)
295
+ }
296
+ }
297
+
269
298
func uploadFile( taskRecord: UploadTaskRecord , completionHandler: ( ( Error ? ) -> Void ) ? = nil ) -> Promise < FileProviderItem > {
270
299
let task : UploadTask
271
300
do {
@@ -412,7 +441,7 @@ public class FileProviderAdapter: FileProviderAdapterType {
412
441
413
442
let localCachedFileInfo = try cachedFileManager. getLocalCachedFileInfo ( for: itemMetadata)
414
443
let newestVersionLocallyCached = localCachedFileInfo? . isCurrentVersion ( lastModifiedDateInCloud: itemMetadata. lastModifiedDate) ?? false
415
- let item = FileProviderItem ( metadata: itemMetadata, newestVersionLocallyCached: newestVersionLocallyCached)
444
+ let item = FileProviderItem ( metadata: itemMetadata, domainIdentifier : domainIdentifier , newestVersionLocallyCached: newestVersionLocallyCached)
416
445
return MoveItemLocallyResult ( item: item, reparentTaskRecord: taskRecord)
417
446
}
418
447
@@ -590,7 +619,7 @@ public class FileProviderAdapter: FileProviderAdapterType {
590
619
} catch {
591
620
return Promise ( error)
592
621
}
593
- if itemMetadata. statusCode == . isUploading {
622
+ if itemMetadata. statusCode == . isUploading || itemMetadata . statusCode == . uploadError {
594
623
return Promise ( true )
595
624
}
596
625
return enumerateItems ( for: identifier, withPageToken: nil ) . then { itemList -> Bool in
@@ -685,7 +714,7 @@ public class FileProviderAdapter: FileProviderAdapterType {
685
714
try checkLocalItemCollision ( for: cloudPath)
686
715
let placeholderMetadata = ItemMetadata ( name: name, type: . folder, size: nil , parentID: parentID, lastModifiedDate: nil , statusCode: . isUploading, cloudPath: cloudPath, isPlaceholderItem: true )
687
716
try itemMetadataManager. cacheMetadata ( placeholderMetadata)
688
- return FileProviderItem ( metadata: placeholderMetadata, newestVersionLocallyCached: true )
717
+ return FileProviderItem ( metadata: placeholderMetadata, domainIdentifier : domainIdentifier , newestVersionLocallyCached: true )
689
718
}
690
719
691
720
/**
@@ -713,7 +742,7 @@ public class FileProviderAdapter: FileProviderAdapterType {
713
742
do {
714
743
_ = try deletionTaskManager. getTaskRecord ( for: existingItemMetadata. id!)
715
744
} catch DBManagerError . taskNotFound {
716
- throw NSError . fileProviderErrorForCollision ( with: FileProviderItem ( metadata: existingItemMetadata) )
745
+ throw NSError . fileProviderErrorForCollision ( with: FileProviderItem ( metadata: existingItemMetadata, domainIdentifier : domainIdentifier ) )
717
746
}
718
747
}
719
748
}
@@ -774,22 +803,17 @@ public class FileProviderAdapter: FileProviderAdapterType {
774
803
}
775
804
776
805
func convertFileProviderItemIdentifierToInt64( _ identifier: NSFileProviderItemIdentifier ) throws -> Int64 {
777
- switch identifier {
778
- case . rootContainer:
779
- return itemMetadataManager. getRootContainerID ( )
780
- default :
781
- guard let id = Int64 ( identifier. rawValue) else {
782
- throw FileProviderAdapterError . unsupportedItemIdentifier
783
- }
784
- return id
806
+ guard let id = identifier. databaseValue else {
807
+ throw FileProviderAdapterError . unsupportedItemIdentifier
785
808
}
809
+ return id
786
810
}
787
811
788
812
func convertIDToItemIdentifier( _ id: Int64 ) -> NSFileProviderItemIdentifier {
789
813
if id == itemMetadataManager. getRootContainerID ( ) {
790
814
return . rootContainer
791
815
}
792
- return NSFileProviderItemIdentifier ( " \( id ) " )
816
+ return NSFileProviderItemIdentifier ( domainIdentifier : domainIdentifier , itemID : id )
793
817
}
794
818
795
819
struct LocalItemImportResult {
0 commit comments