From 61ba245189113ef44849c33a1e892971a553a65c Mon Sep 17 00:00:00 2001 From: Hans van Dam Date: Mon, 17 Apr 2017 18:16:04 +0200 Subject: [PATCH 1/2] making 'inProgress' of LocalFileProvider work --- Sources/LocalFileProvider.swift | 10 ++++++---- Sources/LocalHelper.swift | 7 +++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Sources/LocalFileProvider.swift b/Sources/LocalFileProvider.swift index 00e85a9..caa8fcc 100644 --- a/Sources/LocalFileProvider.swift +++ b/Sources/LocalFileProvider.swift @@ -259,7 +259,8 @@ open class LocalFileProvider: FileProvider, FileProviderMonitor, FileProvideUndo @discardableResult fileprivate func doOperation(_ opType: FileOperationType, data: Data? = nil, atomically: Bool = false, forUploading: Bool = false, completionHandler: SimpleCompletionHandler) -> OperationHandle? { - + let localOperationHandle = LocalOperationHandle(operationType: opType, baseURL: self.baseURL) + func urlofpath(path: String) -> URL { if path.hasPrefix("file://") { let removedSchemePath = path.replacingOccurrences(of: "file://", with: "", options: .anchored) @@ -293,6 +294,7 @@ open class LocalFileProvider: FileProvider, FileProviderMonitor, FileProvideUndo let operationHandler: (URL, URL?) -> Void = { source, dest in do { + localOperationHandle.inProgress = true switch opType { case .create: if sourcePath.hasSuffix("/") { @@ -316,7 +318,8 @@ open class LocalFileProvider: FileProvider, FileProviderMonitor, FileProvideUndo if successfulSecurityScopedResourceAccess { source.stopAccessingSecurityScopedResource() } - + + localOperationHandle.inProgress = false self.dispatch_queue.async { completionHandler?(nil) } @@ -368,8 +371,7 @@ open class LocalFileProvider: FileProvider, FileProviderMonitor, FileProvideUndo operationHandler(source, dest) } } - - return LocalOperationHandle(operationType: opType, baseURL: self.baseURL) + return localOperationHandle } @discardableResult diff --git a/Sources/LocalHelper.swift b/Sources/LocalHelper.swift index eff5b59..bd1ecbb 100644 --- a/Sources/LocalHelper.swift +++ b/Sources/LocalHelper.swift @@ -280,10 +280,9 @@ open class LocalOperationHandle: OperationHandle { } /// Not usable in local provider - open var inProgress: Bool { - return false - } - + open var inProgress: Bool = false + + /// Not usable in local provider open func cancel() -> Bool{ return false From 5c93bc873160dc3158a08f2f9658fd896190d85e Mon Sep 17 00:00:00 2001 From: Hans van Dam Date: Tue, 18 Apr 2017 11:03:35 +0200 Subject: [PATCH 2/2] making 'inProgress' of LocalFileProvider work more consistently --- Sources/LocalFileProvider.swift | 23 +++++++++++++++-------- Sources/LocalHelper.swift | 3 ++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/Sources/LocalFileProvider.swift b/Sources/LocalFileProvider.swift index caa8fcc..f360a6e 100644 --- a/Sources/LocalFileProvider.swift +++ b/Sources/LocalFileProvider.swift @@ -377,11 +377,14 @@ open class LocalFileProvider: FileProvider, FileProviderMonitor, FileProvideUndo @discardableResult open func contents(path: String, completionHandler: @escaping ((_ contents: Data?, _ error: Error?) -> Void)) -> OperationHandle? { let opType = FileOperationType.fetch(path: path) + let localOperationHandle = LocalOperationHandle(operationType: opType, baseURL: self.baseURL) let url = self.url(of: path) - + let operationHandler: (URL) -> Void = { url in do { + localOperationHandle.inProgress = true let data = try Data(contentsOf: url) + localOperationHandle.inProgress = false self.dispatch_queue.async { completionHandler(data, nil) } @@ -407,8 +410,8 @@ open class LocalFileProvider: FileProvider, FileProviderMonitor, FileProvideUndo operationHandler(url) } } - - return LocalOperationHandle(operationType: opType, baseURL: self.baseURL) + + return localOperationHandle } @discardableResult @@ -419,12 +422,13 @@ open class LocalFileProvider: FileProvider, FileProviderMonitor, FileProvideUndo } return nil } - + if offset == 0 && length < 0 { return self.contents(path: path, completionHandler: completionHandler) } - + let opType = FileOperationType.fetch(path: path) + let localOperationHandle = LocalOperationHandle(operationType: opType, baseURL: self.baseURL) let url = self.url(of: path) let operationHandler: (URL) -> Void = { url in @@ -438,9 +442,11 @@ open class LocalFileProvider: FileProvider, FileProviderMonitor, FileProvideUndo defer { handle.closeFile() } - + + localOperationHandle.inProgress = true let size = LocalFileObject(fileWithURL: url)?.size ?? -1 guard size > offset else { + localOperationHandle.inProgress = false self.dispatch_queue.async { completionHandler(nil, self.throwError(path, code: CocoaError.fileReadTooLarge as FoundationErrorEnum)) } @@ -448,6 +454,7 @@ open class LocalFileProvider: FileProvider, FileProviderMonitor, FileProvideUndo } handle.seek(toFileOffset: UInt64(offset)) guard Int64(handle.offsetInFile) == offset else { + localOperationHandle.inProgress = false self.dispatch_queue.async { completionHandler(nil, self.throwError(path, code: CocoaError.fileReadTooLarge as FoundationErrorEnum)) } @@ -455,7 +462,7 @@ open class LocalFileProvider: FileProvider, FileProviderMonitor, FileProvideUndo } let data = handle.readData(ofLength: length) - + localOperationHandle.inProgress = false self.dispatch_queue.async { completionHandler(data, nil) } @@ -475,7 +482,7 @@ open class LocalFileProvider: FileProvider, FileProviderMonitor, FileProvideUndo } } - return LocalOperationHandle(operationType: opType, baseURL: self.baseURL) + return localOperationHandle } @discardableResult diff --git a/Sources/LocalHelper.swift b/Sources/LocalHelper.swift index bd1ecbb..4ea3511 100644 --- a/Sources/LocalHelper.swift +++ b/Sources/LocalHelper.swift @@ -227,6 +227,7 @@ open class LocalOperationHandle: OperationHandle { init (operationType: FileOperationType, baseURL: URL?) { self.baseURL = baseURL ?? URL(fileURLWithPath: "/") self.operationType = operationType + inProgress = false } private var sourceURL: URL? { @@ -280,7 +281,7 @@ open class LocalOperationHandle: OperationHandle { } /// Not usable in local provider - open var inProgress: Bool = false + open var inProgress: Bool /// Not usable in local provider