From c7b4e1f124c96139ebc513b05fd7f167fdc47e31 Mon Sep 17 00:00:00 2001 From: Amir Abbas Mousavian Date: Tue, 28 Mar 2017 19:25:41 +0430 Subject: [PATCH] Ensure baseURL is absolute, fixed warnings for Swift 3.1 --- Sources/DropboxFileProvider.swift | 2 +- Sources/DropboxHelper.swift | 4 +- Sources/FPSStreamTask.swift | 424 +++++++++++++++++------------- Sources/LocalFileProvider.swift | 4 +- Sources/OneDriveFileProvide.swift | 4 +- Sources/OneDriveHelper.swift | 4 +- Sources/RemoteSession.swift | 9 +- Sources/SMBClient.swift | 12 +- Sources/WebDAVFileProvider.swift | 4 +- 9 files changed, 263 insertions(+), 204 deletions(-) diff --git a/Sources/DropboxFileProvider.swift b/Sources/DropboxFileProvider.swift index 5c65bbb..ad4f908 100644 --- a/Sources/DropboxFileProvider.swift +++ b/Sources/DropboxFileProvider.swift @@ -329,7 +329,7 @@ extension DropboxFileProvider: FileProviderReadWrite { request.httpMethod = "GET" request.setValue("Bearer \(credential?.password ?? "")", forHTTPHeaderField: "Authorization") if length > 0 { - request.setValue("bytes=\(offset)-\(offset + length - 1)", forHTTPHeaderField: "Range") + request.setValue("bytes=\(offset)-\(offset + Int64(length) - 1)", forHTTPHeaderField: "Range") } else if offset > 0 && length < 0 { request.setValue("bytes=\(offset)-", forHTTPHeaderField: "Range") } diff --git a/Sources/DropboxHelper.swift b/Sources/DropboxHelper.swift index b6bad4a..c93183d 100644 --- a/Sources/DropboxHelper.swift +++ b/Sources/DropboxHelper.swift @@ -241,8 +241,8 @@ internal extension DropboxFileProvider { DropboxFileProvider.decimalFormatter.numberStyle = .decimal DropboxFileProvider.decimalFormatter.maximumFractionDigits = 5 keys.append("Location") - let latStr = DropboxFileProvider.decimalFormatter.string(from: NSNumber(value: latitude)) - let longStr = DropboxFileProvider.decimalFormatter.string(from: NSNumber(value: longitude)) + let latStr = DropboxFileProvider.decimalFormatter.string(from: NSNumber(value: latitude))! + let longStr = DropboxFileProvider.decimalFormatter.string(from: NSNumber(value: longitude))! dic["Location"] = "\(latStr), \(longStr)" } if let timeTakenStr = json["time_taken"] as? String, let timeTaken = resolve(dateString: timeTakenStr) { diff --git a/Sources/FPSStreamTask.swift b/Sources/FPSStreamTask.swift index 110282e..1763c6a 100644 --- a/Sources/FPSStreamTask.swift +++ b/Sources/FPSStreamTask.swift @@ -24,6 +24,7 @@ internal class FPSStreamTask: URLSessionTask, StreamDelegate { } fileprivate var _taskIdentifier: Int + public var useURLSession = false @available(iOS 9.0, OSX 10.11, *) static var streamTasks = [Int: URLSessionStreamTask]() @@ -34,27 +35,33 @@ internal class FPSStreamTask: URLSessionTask, StreamDelegate { open override var taskIdentifier: Int { if #available(iOS 9.0, OSX 10.11, *) { - return _underlyingTask!.taskIdentifier - } else { - return _taskIdentifier + if self.useURLSession { + return _underlyingTask!.taskIdentifier + } } + + return _taskIdentifier } fileprivate var _state: URLSessionTask.State = .suspended override open var state: URLSessionTask.State { if #available(iOS 9.0, OSX 10.11, *) { - return _underlyingTask!.state - } else { - return _state + if self.useURLSession { + return _underlyingTask!.state + } } + + return _state } override open var originalRequest: URLRequest? { if #available(iOS 9.0, OSX 10.11, *) { - return _underlyingTask!.originalRequest - } else { - return nil + if self.useURLSession { + return _underlyingTask!.originalRequest + } } + + return nil } override open var currentRequest: URLRequest? { @@ -70,18 +77,22 @@ internal class FPSStreamTask: URLSessionTask, StreamDelegate { override open var countOfBytesSent: Int64 { if #available(iOS 9.0, OSX 10.11, *) { - return _underlyingTask!.countOfBytesSent - } else { - return _countOfBytesSent + if self.useURLSession { + return _underlyingTask!.countOfBytesSent + } } + + return _countOfBytesSent } override open var countOfBytesReceived: Int64 { if #available(iOS 9.0, OSX 10.11, *) { - return _underlyingTask!.countOfBytesReceived - } else { - return _countOfBytesRecieved + if self.useURLSession { + return _underlyingTask!.countOfBytesReceived + } } + + return _countOfBytesRecieved } override open var countOfBytesExpectedToSend: Int64 { @@ -94,10 +105,12 @@ internal class FPSStreamTask: URLSessionTask, StreamDelegate { override open var countOfBytesExpectedToReceive: Int64 { if #available(iOS 9.0, OSX 10.11, *) { - return _underlyingTask!.countOfBytesExpectedToReceive - } else { - return Int64(dataReceived.length) + if self.useURLSession { + return _underlyingTask!.countOfBytesExpectedToReceive + } } + + return Int64(dataReceived.length) } override public init() { @@ -110,115 +123,133 @@ internal class FPSStreamTask: URLSessionTask, StreamDelegate { internal init(session: URLSession, host: String, port: Int) { self._underlyingSession = session if #available(iOS 9.0, OSX 10.11, *) { - let task = session.streamTask(withHostName: host, port: port) - self._taskIdentifier = task.taskIdentifier - FPSStreamTask.streamTasks[_taskIdentifier] = task - } else { - lasttaskIdAssociated += 1 - self._taskIdentifier = lasttaskIdAssociated - self.host = (host, port) - self.dispatch_queue = DispatchQueue(label: "FSPStreamTask", attributes: DispatchQueue.Attributes.concurrent) + if self.useURLSession { + let task = session.streamTask(withHostName: host, port: port) + self._taskIdentifier = task.taskIdentifier + FPSStreamTask.streamTasks[_taskIdentifier] = task + return + } } + + lasttaskIdAssociated += 1 + self._taskIdentifier = lasttaskIdAssociated + self.host = (host, port) + self.dispatch_queue = DispatchQueue(label: "FSPStreamTask", attributes: DispatchQueue.Attributes.concurrent) + } internal init(session: URLSession, netService: NetService) { self._underlyingSession = session if #available(iOS 9.0, OSX 10.11, *) { - let task = session.streamTask(with: netService) - self._taskIdentifier = task.taskIdentifier - FPSStreamTask.streamTasks[_taskIdentifier] = task - } else { - lasttaskIdAssociated += 1 - self._taskIdentifier = lasttaskIdAssociated - self.service = netService - self.dispatch_queue = DispatchQueue(label: "FSPStreamTask", attributes: DispatchQueue.Attributes.concurrent) + if self.useURLSession { + let task = session.streamTask(with: netService) + self._taskIdentifier = task.taskIdentifier + FPSStreamTask.streamTasks[_taskIdentifier] = task + return + } } + + lasttaskIdAssociated += 1 + self._taskIdentifier = lasttaskIdAssociated + self.service = netService + self.dispatch_queue = DispatchQueue(label: "FSPStreamTask", attributes: DispatchQueue.Attributes.concurrent) } override open func cancel() { if #available(iOS 9.0, OSX 10.11, *) { - _underlyingTask!.cancel() - } else { - self._state = .canceling - inputStream?.setValue(kCFBooleanTrue, forKey: kCFStreamPropertyShouldCloseNativeSocket as String) - outputStream?.setValue(kCFBooleanTrue, forKey: kCFStreamPropertyShouldCloseNativeSocket as String) - - self.inputStream?.close() - self.outputStream?.close() - - self.inputStream?.remove(from: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) - self.outputStream?.remove(from: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) - - self.inputStream?.delegate = nil - self.outputStream?.delegate = nil - - self.inputStream = nil - self.outputStream = nil - - self._state = .completed - self._countOfBytesSent = 0 - self._countOfBytesRecieved = 0 + if self.useURLSession { + _underlyingTask!.cancel() + return + } } + + self._state = .canceling + inputStream?.setValue(kCFBooleanTrue, forKey: kCFStreamPropertyShouldCloseNativeSocket as String) + outputStream?.setValue(kCFBooleanTrue, forKey: kCFStreamPropertyShouldCloseNativeSocket as String) + + self.inputStream?.close() + self.outputStream?.close() + + self.inputStream?.remove(from: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) + self.outputStream?.remove(from: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) + + self.inputStream?.delegate = nil + self.outputStream?.delegate = nil + + self.inputStream = nil + self.outputStream = nil + + self._state = .completed + self._countOfBytesSent = 0 + self._countOfBytesRecieved = 0 } var _error: Error? = nil override open var error: Error? { if #available(iOS 9.0, OSX 10.11, *) { - return _underlyingTask!.error - } else { - return _error + if useURLSession { + return _underlyingTask!.error + } } + + return _error } override open func suspend() { if #available(iOS 9.0, OSX 10.11, *) { - _underlyingTask!.suspend() - } else { - self._state = .suspended + if self.useURLSession { + _underlyingTask!.suspend() + return + } } + + self._state = .suspended } override open func resume() { if #available(iOS 9.0, OSX 10.11, *) { - _underlyingTask!.resume() - } else { - var readStream : Unmanaged? - var writeStream : Unmanaged? - - if inputStream == nil || outputStream == nil { - if let host = host { - let hostRef: CFString = NSString(string: host.hostname) - CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, hostRef, UInt32(host.port), &readStream, &writeStream) - } else if let service = service { - let cfnetService = CFNetServiceCreate(kCFAllocatorDefault, service.domain as CFString, service.type as CFString, service.name as CFString, Int32(service.port)) - CFStreamCreatePairWithSocketToNetService(kCFAllocatorDefault, cfnetService.takeRetainedValue(), &readStream, &writeStream) - } - - inputStream = readStream?.takeRetainedValue() - outputStream = writeStream?.takeRetainedValue() - guard let inputStream = inputStream, let outputStream = outputStream else { - return - } - streamDelegate?.urlSession?(self._underlyingSession, streamTask: self, didBecome: inputStream, outputStream: outputStream) + if self.useURLSession { + _underlyingTask!.resume() + return + } + } + + var readStream : Unmanaged? + var writeStream : Unmanaged? + + if inputStream == nil || outputStream == nil { + if let host = host { + let hostRef: CFString = NSString(string: host.hostname) + CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, hostRef, UInt32(host.port), &readStream, &writeStream) + } else if let service = service { + let cfnetService = CFNetServiceCreate(kCFAllocatorDefault, service.domain as CFString, service.type as CFString, service.name as CFString, Int32(service.port)) + CFStreamCreatePairWithSocketToNetService(kCFAllocatorDefault, cfnetService.takeRetainedValue(), &readStream, &writeStream) } + inputStream = readStream?.takeRetainedValue() + outputStream = writeStream?.takeRetainedValue() guard let inputStream = inputStream, let outputStream = outputStream else { return } - - inputStream.delegate = self - outputStream.delegate = self - - dispatch_queue.sync(execute: { - inputStream.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) - outputStream.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) - }) - - inputStream.open() - outputStream.open() - - _state = .running + streamDelegate?.urlSession?(self._underlyingSession, streamTask: self, didBecome: inputStream, outputStream: outputStream) } + + guard let inputStream = inputStream, let outputStream = outputStream else { + return + } + + inputStream.delegate = self + outputStream.delegate = self + + dispatch_queue.sync(execute: { + inputStream.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) + outputStream.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) + }) + + inputStream.open() + outputStream.open() + + _state = .running } fileprivate let dataToBeSent: NSMutableData = NSMutableData() @@ -229,36 +260,39 @@ internal class FPSStreamTask: URLSessionTask, StreamDelegate { * If an error occurs, any outstanding reads will also fail, and new * read requests will error out immediately. */ - open func readData(OfMinLength minBytes: Int, maxLength maxBytes: Int, timeout: TimeInterval, completionHandler: @escaping (Data?, Bool, NSError?) -> Void) { + open func readData(ofMinLength minBytes: Int, maxLength maxBytes: Int, timeout: TimeInterval, completionHandler: @escaping (Data?, Bool, NSError?) -> Void) { if #available(iOS 9.0, OSX 10.11, *) { - _underlyingTask!.readData(ofMinLength: minBytes, maxLength: maxBytes, timeout: timeout, completionHandler: completionHandler as! (Data?, Bool, Error?) -> Void) - } else { - guard let inputStream = inputStream else { + if self.useURLSession { + _underlyingTask!.readData(ofMinLength: minBytes, maxLength: maxBytes, timeout: timeout, completionHandler: completionHandler as! (Data?, Bool, Error?) -> Void) return } - var timedOut: Bool = false - dispatch_queue.async { - if timeout > 0 { - self.dispatch_queue.asyncAfter(deadline: .now() + 1) { - timedOut = true - completionHandler(nil, inputStream.streamStatus == .atEnd, inputStream.streamError as NSError?) - } + } + + guard let inputStream = inputStream else { + return + } + var timedOut: Bool = false + dispatch_queue.async { + if timeout > 0 { + self.dispatch_queue.asyncAfter(deadline: .now() + 1) { + timedOut = true + completionHandler(nil, inputStream.streamStatus == .atEnd, inputStream.streamError as NSError?) } - while (self.dataReceived.length == 0 || self.dataReceived.length < minBytes) && !timedOut { - RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.1)); - Thread.sleep(forTimeInterval: 0.1) - } - let dR = NSMutableData() - if self.dataReceived.length > maxBytes { - let range = NSRange(location: 0, length: maxBytes - 1) - dR.append(self.dataReceived.subdata(with: range)) - self.dataReceived.replaceBytes(in: range, withBytes: nil, length: 0) - } else { - dR.append(self.dataReceived as Data) - self.dataReceived.length = 0 - } - completionHandler(dR as Data, inputStream.streamStatus == .atEnd, inputStream.streamError as NSError?) } + while (self.dataReceived.length == 0 || self.dataReceived.length < minBytes) && !timedOut { + //RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.1)); + Thread.sleep(forTimeInterval: 0.1) + } + let dR = NSMutableData() + if self.dataReceived.length > maxBytes { + let range = NSRange(location: 0, length: maxBytes - 1) + dR.append(self.dataReceived.subdata(with: range)) + self.dataReceived.replaceBytes(in: range, withBytes: nil, length: 0) + } else { + dR.append(self.dataReceived as Data) + self.dataReceived.length = 0 + } + completionHandler(dR as Data, inputStream.streamStatus == .atEnd, inputStream.streamError as NSError?) } } @@ -267,38 +301,41 @@ internal class FPSStreamTask: URLSessionTask, StreamDelegate { * occur. Note that invocation of the completion handler does not * guarantee that the remote side has received all the bytes, only * that they have been written to the kernel. */ - open func writeData(_ data: Data, timeout: TimeInterval, completionHandler: @escaping (Error?) -> Void) { + open func write(_ data: Data, timeout: TimeInterval, completionHandler: @escaping (Error?) -> Void) { if #available(iOS 9.0, OSX 10.11, *) { - _underlyingTask!.write(data, timeout: timeout, completionHandler: completionHandler) - } else { - guard let outputStream = outputStream else { + if self.useURLSession { + _underlyingTask!.write(data, timeout: timeout, completionHandler: completionHandler) return } - var timedOut: Bool = false - dispatch_queue.async { - if timeout > 0 { - self.dispatch_queue.asyncAfter(deadline: .now() + 1) { - timedOut = true - completionHandler(self._error) - } + } + + guard let outputStream = outputStream else { + return + } + var timedOut: Bool = false + dispatch_queue.async { + if timeout > 0 { + self.dispatch_queue.asyncAfter(deadline: .now() + 1) { + timedOut = true + completionHandler(self._error) } - - self.dataToBeSent.append(data) - while !outputStream.hasSpaceAvailable && !timedOut { - RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.1)); - Thread.sleep(forTimeInterval: 0.1) - } - if self.dataToBeSent.length > 0 { - let bytesWritten = outputStream.write(self.dataToBeSent.bytes.bindMemory(to: UInt8.self, capacity: self.dataToBeSent.length), maxLength: self.dataToBeSent.length) - if bytesWritten > 0 { - let range = NSRange(location: 0, length: bytesWritten) - self.dataToBeSent.replaceBytes(in: range, withBytes: nil, length: 0) - self._countOfBytesSent += bytesWritten - completionHandler(nil) - } else { - self._error = outputStream.streamError - completionHandler(outputStream.streamError) - } + } + + self.dataToBeSent.append(data) + while !outputStream.hasSpaceAvailable && !timedOut { + //RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.1)); + Thread.sleep(forTimeInterval: 0.1) + } + if self.dataToBeSent.length > 0 { + let bytesWritten = outputStream.write(self.dataToBeSent.bytes.bindMemory(to: UInt8.self, capacity: self.dataToBeSent.length), maxLength: self.dataToBeSent.length) + if bytesWritten > 0 { + let range = NSRange(location: 0, length: bytesWritten) + self.dataToBeSent.replaceBytes(in: range, withBytes: nil, length: 0) + self._countOfBytesSent += Int64(bytesWritten) + completionHandler(nil) + } else { + self._error = outputStream.streamError + completionHandler(outputStream.streamError) } } } @@ -312,19 +349,22 @@ internal class FPSStreamTask: URLSessionTask, StreamDelegate { * messages. */ open func captureStreams() { if #available(iOS 9.0, OSX 10.11, *) { - _underlyingTask!.captureStreams() - } else { - guard let outputStream = outputStream, let inputStream = inputStream else { + if self.useURLSession { + _underlyingTask!.captureStreams() return } - dispatch_queue.async { - self.write(false) - while inputStream.streamStatus != .atEnd { - RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.1)); - Thread.sleep(forTimeInterval: 0.1) - } - self.streamDelegate?.urlSession?(self._underlyingSession, streamTask: self, didBecome: inputStream, outputStream: outputStream) + } + + guard let outputStream = outputStream, let inputStream = inputStream else { + return + } + dispatch_queue.async { + self.write(false) + while inputStream.streamStatus != .atEnd { + //RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.1)); + Thread.sleep(forTimeInterval: 0.1) } + self.streamDelegate?.urlSession?(self._underlyingSession, streamTask: self, didBecome: inputStream, outputStream: outputStream) } } @@ -336,11 +376,14 @@ internal class FPSStreamTask: URLSessionTask, StreamDelegate { */ open func closeWrite() { if #available(iOS 9.0, OSX 10.11, *) { - _underlyingTask!.closeWrite() - } else { - dispatch_queue.async(execute: { - self.write(true) - }) + if self.useURLSession { + _underlyingTask!.closeWrite() + return + } + } + + dispatch_queue.async { + self.write(true) } } @@ -353,14 +396,14 @@ internal class FPSStreamTask: URLSessionTask, StreamDelegate { if bytesWritten > 0 { let range = NSRange(location: 0, length: bytesWritten) self.dataToBeSent.replaceBytes(in: range, withBytes: nil, length: 0) - self._countOfBytesSent += bytesWritten + self._countOfBytesSent += Int64(bytesWritten) } else { self._error = outputStream.streamError as NSError? } if self.dataToBeSent.length == 0 { break } - RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.1)); + //RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.1)); Thread.sleep(forTimeInterval: 0.1) } if close { @@ -375,19 +418,22 @@ internal class FPSStreamTask: URLSessionTask, StreamDelegate { */ open func closeRead() { if #available(iOS 9.0, OSX 10.11, *) { - _underlyingTask!.closeRead() - } else { - guard let inputStream = inputStream else { + if self.useURLSession { + _underlyingTask!.closeRead() return } - dispatch_queue.async { - while inputStream.streamStatus != .atEnd { - RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.1)); - Thread.sleep(forTimeInterval: 0.1) - } - inputStream.close() - self.streamDelegate?.urlSession?(self._underlyingSession, readClosedFor: self) + } + + guard let inputStream = inputStream else { + return + } + dispatch_queue.async { + while inputStream.streamStatus != .atEnd { + //RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.1)); + Thread.sleep(forTimeInterval: 0.1) } + inputStream.close() + self.streamDelegate?.urlSession?(self._underlyingSession, readClosedFor: self) } } @@ -398,11 +444,14 @@ internal class FPSStreamTask: URLSessionTask, StreamDelegate { */ open func startSecureConnection() { if #available(iOS 9.0, OSX 10.11, *) { - _underlyingTask!.startSecureConnection() - } else { - inputStream!.setProperty(StreamSocketSecurityLevel.negotiatedSSL.rawValue, forKey: .socketSecurityLevelKey) - outputStream!.setProperty(StreamSocketSecurityLevel.negotiatedSSL.rawValue, forKey: .socketSecurityLevelKey) + if self.useURLSession { + _underlyingTask!.startSecureConnection() + return + } } + + inputStream!.setProperty(StreamSocketSecurityLevel.negotiatedSSL.rawValue, forKey: .socketSecurityLevelKey) + outputStream!.setProperty(StreamSocketSecurityLevel.negotiatedSSL.rawValue, forKey: .socketSecurityLevelKey) } /* @@ -411,11 +460,14 @@ internal class FPSStreamTask: URLSessionTask, StreamDelegate { */ open func stopSecureConnection() { if #available(iOS 9.0, OSX 10.11, *) { - _underlyingTask!.stopSecureConnection() - } else { - inputStream!.setProperty(StreamSocketSecurityLevel.none.rawValue, forKey: .socketSecurityLevelKey) - outputStream!.setProperty(StreamSocketSecurityLevel.none.rawValue, forKey: .socketSecurityLevelKey) + if self.useURLSession { + _underlyingTask!.stopSecureConnection() + return + } } + + inputStream!.setProperty(StreamSocketSecurityLevel.none.rawValue, forKey: .socketSecurityLevelKey) + outputStream!.setProperty(StreamSocketSecurityLevel.none.rawValue, forKey: .socketSecurityLevelKey) } open func stream(_ aStream: Stream, handle eventCode: Stream.Event) { @@ -436,7 +488,7 @@ internal class FPSStreamTask: URLSessionTask, StreamDelegate { let len = inputStream!.read(&buffer, maxLength: buffer.count) if len > 0 { dataReceived.append(&buffer, length: len) - self._countOfBytesRecieved += len + self._countOfBytesRecieved += Int64(len) } } } @@ -451,15 +503,15 @@ internal class FPSStreamTask: URLSessionTask, StreamDelegate { internal extension URLSession { /* Creates a bidirectional stream task to a given host and port. */ - func fpstreamTaskWithHostName(_ hostname: String, port: Int) -> FPSStreamTask { + func fpstreamTask(withHostName hostname: String, port: Int) -> FPSStreamTask { return FPSStreamTask(session: self, host: hostname, port: port) } /* Creates a bidirectional stream task with an NSNetService to identify the endpoint. * The NSNetService will be resolved before any IO completes. */ - func fpstreamTaskWithNetService(_ service: NetService) -> FPSStreamTask { - return fpstreamTaskWithNetService(service) + func fpstreamTask(withNetService service: NetService) -> FPSStreamTask { + return fpstreamTask(withNetService: service) } } diff --git a/Sources/LocalFileProvider.swift b/Sources/LocalFileProvider.swift index a9a0277..7e56096 100644 --- a/Sources/LocalFileProvider.swift +++ b/Sources/LocalFileProvider.swift @@ -70,7 +70,7 @@ open class LocalFileProvider: FileProvider, FileProviderMonitor, FileProvideUndo return nil } - var finalBaseURL = baseURL + var finalBaseURL = baseURL.absoluteURL switch directory { case .documentDirectory: @@ -116,7 +116,7 @@ open class LocalFileProvider: FileProvider, FileProviderMonitor, FileProvideUndo return nil } self.init(baseURL: baseURL) - self.currentPath = aDecoder.decodeObject(of: NSString.self, forKey: "currentPath") as? String ?? "" + self.currentPath = aDecoder.decodeObject(forKey: "currentPath") as? String ?? "" self.isCoorinating = aDecoder.decodeBool(forKey: "isCoorinating") } diff --git a/Sources/OneDriveFileProvide.swift b/Sources/OneDriveFileProvide.swift index 3a56588..bddcd88 100644 --- a/Sources/OneDriveFileProvide.swift +++ b/Sources/OneDriveFileProvide.swift @@ -68,7 +68,7 @@ open class OneDriveFileProvider: FileProviderBasicRemote { - cache: A URLCache to cache downloaded files and contents. */ public init(credential: URLCredential?, serverURL: URL? = nil, drive: String = "root", cache: URLCache? = nil) { - let baseURL = serverURL ?? URL(string: "https://api.onedrive.com/")! + let baseURL = serverURL?.absoluteURL ?? URL(string: "https://api.onedrive.com/")! self.baseURL = baseURL.path.hasSuffix("/") ? baseURL : baseURL.appendingPathComponent("") self.drive = drive self.currentPath = "" @@ -334,7 +334,7 @@ extension OneDriveFileProvider: FileProviderReadWrite { request.httpMethod = "GET" request.setValue("Bearer \(credential?.password ?? "")", forHTTPHeaderField: "Authorization") if length > 0 { - request.setValue("bytes=\(offset)-\(offset + length - 1)", forHTTPHeaderField: "Range") + request.setValue("bytes=\(offset)-\(offset + Int64(length) - 1)", forHTTPHeaderField: "Range") } else if offset > 0 && length < 0 { request.setValue("bytes=\(offset)-", forHTTPHeaderField: "Range") } diff --git a/Sources/OneDriveHelper.swift b/Sources/OneDriveHelper.swift index 581a8fc..efd1900 100644 --- a/Sources/OneDriveHelper.swift +++ b/Sources/OneDriveHelper.swift @@ -240,8 +240,8 @@ internal extension OneDriveFileProvider { if let location = json["location"] as? [String: Any], let latitude = location["latitude"] as? Double, let longitude = location["longitude"] as? Double { OneDriveFileProvider.decimalFormatter.numberStyle = .decimal OneDriveFileProvider.decimalFormatter.maximumFractionDigits = 5 - let latStr = OneDriveFileProvider.decimalFormatter.string(from: NSNumber(value: latitude)) - let longStr = OneDriveFileProvider.decimalFormatter.string(from: NSNumber(value: longitude)) + let latStr = OneDriveFileProvider.decimalFormatter.string(from: NSNumber(value: latitude))! + let longStr = OneDriveFileProvider.decimalFormatter.string(from: NSNumber(value: longitude))! add(key: "Location", value: "\(latStr), \(longStr)") } if let parent = json["image"] as? [String: Any] ?? json["video"] as? [String: Any], let duration = parent["duration"] as? UInt64 { diff --git a/Sources/RemoteSession.swift b/Sources/RemoteSession.swift index 367657a..47ac27e 100644 --- a/Sources/RemoteSession.swift +++ b/Sources/RemoteSession.swift @@ -83,7 +83,7 @@ extension FileProviderHTTPError { } } -class SessionDelegate: NSObject, URLSessionDataDelegate, URLSessionDownloadDelegate { +class SessionDelegate: NSObject, URLSessionDataDelegate, URLSessionDownloadDelegate, URLSessionStreamDelegate { weak var fileProvider: (FileProviderBasicRemote & FileProviderOperations)? var credential: URLCredential? @@ -91,6 +91,8 @@ class SessionDelegate: NSObject, URLSessionDataDelegate, URLSessionDownloadDeleg var finishDownloadHandler: ((_ session: Foundation.URLSession, _ downloadTask: URLSessionDownloadTask, _ didFinishDownloadingToURL: URL) -> Void)? var didSendDataHandler: ((_ session: Foundation.URLSession, _ task: URLSessionTask, _ bytesSent: Int64, _ totalBytesSent: Int64, _ totalBytesExpectedToSend: Int64) -> Void)? var didReceivedData: ((_ session: Foundation.URLSession, _ downloadTask: URLSessionDownloadTask, _ bytesWritten: Int64, _ totalBytesWritten: Int64, _ totalBytesExpectedToWrite: Int64) -> Void)? + var didBecomeStream :((_ session: URLSession, _ taskId: Int, _ didBecome: InputStream, _ outputStream: OutputStream) -> Void)? + init(fileProvider: FileProviderBasicRemote & FileProviderOperations, credential: URLCredential?) { self.fileProvider = fileProvider @@ -145,6 +147,11 @@ class SessionDelegate: NSObject, URLSessionDataDelegate, URLSessionDownloadDeleg completionHandler(.performDefaultHandling, nil) } } + + @available(iOSApplicationExtension 9.0, *) + func urlSession(_ session: URLSession, streamTask: URLSessionStreamTask, didBecome inputStream: InputStream, outputStream: OutputStream) { + self.didBecomeStream?(session, streamTask.taskIdentifier, inputStream, outputStream) + } } /// HTTP status codes as an enum. diff --git a/Sources/SMBClient.swift b/Sources/SMBClient.swift index 0ad0cf5..6485d79 100644 --- a/Sources/SMBClient.swift +++ b/Sources/SMBClient.swift @@ -38,7 +38,7 @@ class SMB2ProtocolClient: FPSStreamTask { let smbHeader = SMB2.Header(command: .NEGOTIATE, creditRequestResponse: UInt16(126), messageId: mId, treeId: UInt32(0), sessionId: UInt64(0)) let msg = SMB2.NegotiateRequest() let data = createSMB2Message(header: smbHeader, message: msg) - self.writeData(data, timeout: 0, completionHandler: { (e) in + self.write(data, timeout: 0, completionHandler: { (e) in completionHandler?(e) }) return mId @@ -50,9 +50,9 @@ class SMB2ProtocolClient: FPSStreamTask { let smbHeader = SMB2.Header(command: SMB2.Command.SESSION_SETUP, creditRequestResponse: credit, messageId: mId, treeId: UInt32(0), sessionId: sessionId) let msg = SMB2.SessionSetupRequest(singing: []) let data = createSMB2Message(header: smbHeader, message: msg) - self.writeData(data, timeout: 0, completionHandler: { (e) in + self.write(data, timeout: 0, completionHandler: { (e) in if self.sessionId == 0 { - self.readData(OfMinLength: 64, maxLength: 65536, timeout: self.timeout, completionHandler: { (data, eof, e2) in + self.readData(ofMinLength: 64, maxLength: 65536, timeout: self.timeout, completionHandler: { (data, eof, e2) in // TODO: set session id completionHandler?(e2 ?? e) }) @@ -73,7 +73,7 @@ class SMB2ProtocolClient: FPSStreamTask { let tcHeader = SMB2.TreeConnectRequest.Header(flags: []) let msg = SMB2.TreeConnectRequest(header: tcHeader, host: host, share: share) let data = createSMB2Message(header: smbHeader, message: msg!) - self.writeData(data, timeout: 0, completionHandler: { (e) in + self.write(data, timeout: 0, completionHandler: { (e) in completionHandler?(e) }) @@ -85,7 +85,7 @@ class SMB2ProtocolClient: FPSStreamTask { let smbHeader = SMB2.Header(command: .TREE_DISCONNECT, creditRequestResponse: 111, messageId: mId, treeId: treeId, sessionId: sessionId) let msg = SMB2.TreeDisconnect() let data = createSMB2Message(header: smbHeader, message: msg) - self.writeData(data, timeout: 0, completionHandler: { (e) in + self.write(data, timeout: 0, completionHandler: { (e) in completionHandler?(e) }) return mId @@ -96,7 +96,7 @@ class SMB2ProtocolClient: FPSStreamTask { let smbHeader = SMB2.Header(command: .LOGOFF, creditRequestResponse: 0, messageId: mId, treeId: 0, sessionId: sessionId) let msg = SMB2.LogOff() let data = createSMB2Message(header: smbHeader, message: msg) - self.writeData(data, timeout: 0, completionHandler: { (e) in + self.write(data, timeout: 0, completionHandler: { (e) in completionHandler?(e) }) return mId diff --git a/Sources/WebDAVFileProvider.swift b/Sources/WebDAVFileProvider.swift index dac91f8..1e0ccb2 100644 --- a/Sources/WebDAVFileProvider.swift +++ b/Sources/WebDAVFileProvider.swift @@ -68,7 +68,7 @@ open class WebDAVFileProvider: FileProviderBasicRemote { if !["http", "https"].contains(baseURL.uw_scheme.lowercased()) { return nil } - self.baseURL = baseURL.path.hasSuffix("/") ? baseURL : baseURL.appendingPathComponent("") + self.baseURL = (baseURL.path.hasSuffix("/") ? baseURL : baseURL.appendingPathComponent("")).absoluteURL self.currentPath = "" self.useCache = false self.validatingCache = true @@ -435,7 +435,7 @@ extension WebDAVFileProvider: FileProviderReadWrite { var request = URLRequest(url: url) request.httpMethod = "GET" if length > 0 { - request.setValue("bytes=\(offset)-\(offset + length - 1)", forHTTPHeaderField: "Range") + request.setValue("bytes=\(offset)-\(offset + Int64(length) - 1)", forHTTPHeaderField: "Range") } else if offset > 0 && length < 0 { request.setValue("bytes=\(offset)-", forHTTPHeaderField: "Range") }