@@ -43,6 +43,7 @@ public class FileProviderAdapter: FileProviderAdapterType {
43
43
private let localURLProvider : LocalURLProviderType
44
44
private let notificator : FileProviderItemUpdateDelegate ?
45
45
private let fullVersionChecker : FullVersionChecker
46
+ private let workflowFactory : WorkflowFactoryLocking
46
47
47
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) {
48
49
self . lastUnlockedDate = Date ( )
@@ -53,6 +54,15 @@ public class FileProviderAdapter: FileProviderAdapterType {
53
54
self . deletionTaskManager = deletionTaskManager
54
55
self . itemEnumerationTaskManager = itemEnumerationTaskManager
55
56
self . downloadTaskManager = downloadTaskManager
57
+ let factory = WorkflowFactory ( provider: provider,
58
+ uploadTaskManager: uploadTaskManager,
59
+ cachedFileManager: cachedFileManager,
60
+ itemMetadataManager: itemMetadataManager,
61
+ reparentTaskManager: reparentTaskManager,
62
+ deletionTaskManager: deletionTaskManager,
63
+ itemEnumerationTaskManager: itemEnumerationTaskManager,
64
+ downloadTaskManager: downloadTaskManager)
65
+ self . workflowFactory = WorkflowFactoryLocking ( lockManager: LockManager ( ) , workflowFactory: factory)
56
66
self . scheduler = scheduler
57
67
self . provider = provider
58
68
self . notificator = notificator
@@ -116,8 +126,7 @@ public class FileProviderAdapter: FileProviderAdapterType {
116
126
} catch {
117
127
return Promise ( error)
118
128
}
119
- let workflow = WorkflowFactory . createWorkflow ( for: enumerationTask, provider: provider, itemMetadataManager: itemMetadataManager, cachedFileManager: cachedFileManager, reparentTaskManager: reparentTaskManager, uploadTaskManager: uploadTaskManager, deletionTaskManager: deletionTaskManager, itemEnumerationTaskManager: itemEnumerationTaskManager)
120
- return scheduler. schedule ( workflow)
129
+ return workflowFactory. createWorkflow ( for: enumerationTask) . then ( scheduler. schedule)
121
130
}
122
131
123
132
private func enumerateWorkingSet( ) -> Promise < FileProviderItemList > {
@@ -154,10 +163,15 @@ public class FileProviderAdapter: FileProviderAdapterType {
154
163
}
155
164
return completionHandler ( nil , NSFileProviderError ( . noSuchItem) )
156
165
}
157
- completionHandler ( localItemImportResult. item, nil )
158
-
166
+ let localImportHandler : ( Error ? ) -> Void = { error in
167
+ if let error = error {
168
+ completionHandler ( nil , error)
169
+ } else {
170
+ completionHandler ( localItemImportResult. item, nil )
171
+ }
172
+ }
159
173
// Network Stuff
160
- self . uploadFile ( taskRecord: localItemImportResult. uploadTaskRecord) . then { item in
174
+ self . uploadFile ( taskRecord: localItemImportResult. uploadTaskRecord, completionHandler : localImportHandler ) . then { item in
161
175
self . notificator? . signalUpdate ( for: item)
162
176
} . catch { error in
163
177
DDLogError ( " importDocument uploadFile failed: \( error) " )
@@ -252,15 +266,18 @@ public class FileProviderAdapter: FileProviderAdapterType {
252
266
}
253
267
}
254
268
255
- func uploadFile( taskRecord: UploadTaskRecord ) -> Promise < FileProviderItem > {
256
- let workflow : Workflow < FileProviderItem >
269
+ func uploadFile( taskRecord: UploadTaskRecord , completionHandler : ( ( Error ? ) -> Void ) ? = nil ) -> Promise < FileProviderItem > {
270
+ let task : UploadTask
257
271
do {
258
- let task = try uploadTaskManager. getTask ( for: taskRecord)
259
- workflow = WorkflowFactory . createWorkflow ( for: task, provider: provider, itemMetadataManager: itemMetadataManager, cachedFileManager: cachedFileManager, uploadTaskManager: uploadTaskManager)
272
+ task = try uploadTaskManager. getTask ( for: taskRecord)
260
273
} catch {
274
+ completionHandler ? ( error)
261
275
return Promise ( error)
262
276
}
263
- return scheduler. schedule ( workflow)
277
+ return workflowFactory. createWorkflow ( for: task) . then { workflow -> Workflow < FileProviderItem > in
278
+ completionHandler ? ( nil )
279
+ return workflow
280
+ } . then ( scheduler. schedule)
264
281
}
265
282
266
283
func registerFileInUploadQueue( with localURL: URL , itemMetadata: ItemMetadata ) throws -> UploadTaskRecord {
@@ -293,12 +310,15 @@ public class FileProviderAdapter: FileProviderAdapterType {
293
310
DDLogError ( " Create directory: createPlaceholderItemForFolder failed with error: \( error) " )
294
311
return completionHandler ( nil , error)
295
312
}
296
- completionHandler ( placeholderItem , nil )
313
+
297
314
let task = FolderCreationTask ( itemMetadata: placeholderItem. metadata)
298
- let workflow = WorkflowFactory . createWorkflow ( for: task, provider: provider, itemMetadataManager: itemMetadataManager)
299
- scheduler. schedule ( workflow) . then { item in
300
- self . notificator? . signalUpdate ( for: item)
301
- }
315
+ workflowFactory. createWorkflow ( for: task) . then { workflow -> Workflow < FileProviderItem > in
316
+ completionHandler ( placeholderItem, nil )
317
+ return workflow
318
+ } . then ( scheduler. schedule)
319
+ . then { item in
320
+ self . notificator? . signalUpdate ( for: item)
321
+ }
302
322
}
303
323
304
324
// MARK: Move Item
@@ -317,11 +337,13 @@ public class FileProviderAdapter: FileProviderAdapterType {
317
337
} catch {
318
338
return completionHandler ( nil , error)
319
339
}
320
- completionHandler ( result. item, nil )
321
- let workflow = WorkflowFactory . createWorkflow ( for: reparentTask, provider: provider, itemMetadataManager: itemMetadataManager, cachedFileManager: cachedFileManager, reparentTaskManager: reparentTaskManager)
322
- scheduler. schedule ( workflow) . then { item in
323
- self . notificator? . signalUpdate ( for: item)
324
- }
340
+ workflowFactory. createWorkflow ( for: reparentTask) . then { workflow -> Workflow < FileProviderItem > in
341
+ completionHandler ( result. item, nil )
342
+ return workflow
343
+ } . then ( scheduler. schedule)
344
+ . then { item in
345
+ self . notificator? . signalUpdate ( for: item)
346
+ }
325
347
}
326
348
327
349
public func reparentItem( withIdentifier itemIdentifier: NSFileProviderItemIdentifier , toParentItemWithIdentifier parentItemIdentifier: NSFileProviderItemIdentifier , newName: String ? , completionHandler: @escaping ( NSFileProviderItem ? , Error ? ) -> Void ) {
@@ -339,10 +361,11 @@ public class FileProviderAdapter: FileProviderAdapterType {
339
361
return completionHandler ( nil , error)
340
362
}
341
363
completionHandler ( result. item, nil )
342
- let workflow = WorkflowFactory . createWorkflow ( for: reparentTask, provider: provider, itemMetadataManager: itemMetadataManager, cachedFileManager: cachedFileManager, reparentTaskManager: reparentTaskManager)
343
- scheduler. schedule ( workflow) . then { item in
344
- self . notificator? . signalUpdate ( for: item)
345
- }
364
+ workflowFactory. createWorkflow ( for: reparentTask)
365
+ . then ( scheduler. schedule)
366
+ . then { item in
367
+ self . notificator? . signalUpdate ( for: item)
368
+ }
346
369
}
347
370
348
371
/**
@@ -416,18 +439,20 @@ public class FileProviderAdapter: FileProviderAdapterType {
416
439
completionHandler ( error)
417
440
return
418
441
}
419
- let workflow : Workflow < Void >
442
+ let deletionTask : DeletionTask
420
443
do {
421
- let deletionTaskInfo = try deletionTaskManager. getTask ( for: taskRecord)
422
- workflow = WorkflowFactory . createWorkflow ( for: deletionTaskInfo, provider: provider, itemMetadataManager: itemMetadataManager)
444
+ deletionTask = try deletionTaskManager. getTask ( for: taskRecord)
423
445
} catch {
424
446
completionHandler ( error)
425
447
return
426
448
}
427
- completionHandler ( nil )
428
- scheduler. schedule ( workflow) . then {
429
- DDLogVerbose ( " DeleteItem success " )
430
- }
449
+ workflowFactory. createWorkflow ( for: deletionTask) . then { workflow -> Workflow < Void > in
450
+ completionHandler ( nil )
451
+ return workflow
452
+ } . then ( scheduler. schedule)
453
+ . then {
454
+ DDLogVerbose ( " DeleteItem success " )
455
+ }
431
456
}
432
457
433
458
/**
@@ -590,8 +615,7 @@ public class FileProviderAdapter: FileProviderAdapterType {
590
615
} catch {
591
616
return Promise ( error)
592
617
}
593
- let workflow = WorkflowFactory . createWorkflow ( for: task, provider: provider, itemMetadataManager: itemMetadataManager, cachedFileManager: cachedFileManager, downloadTaskManager: downloadTaskManager)
594
- return scheduler. schedule ( workflow) . then { item -> Void in
618
+ return workflowFactory. createWorkflow ( for: task) . then ( scheduler. schedule) . then { item -> Void in
595
619
self . notificator? . signalUpdate ( for: item)
596
620
}
597
621
}
0 commit comments