diff --git a/FileProvider.podspec b/FileProvider.podspec index ae365e3..803171e 100644 --- a/FileProvider.podspec +++ b/FileProvider.podspec @@ -16,7 +16,7 @@ Pod::Spec.new do |s| # s.name = "FileProvider" - s.version = "0.15.5" + s.version = "0.16.0" s.summary = "FileManager replacement for Local and Remote (WebDAV/FTP/Dropbox/OneDrive/SMB2) files on iOS and macOS." # This description is used to generate tags and improve search results. diff --git a/FileProvider.xcodeproj/project.pbxproj b/FileProvider.xcodeproj/project.pbxproj index 900b755..21a530e 100644 --- a/FileProvider.xcodeproj/project.pbxproj +++ b/FileProvider.xcodeproj/project.pbxproj @@ -621,7 +621,7 @@ 799396601D48B7BF00086753 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - BUNDLE_VERSION_STRING = 0.15.5; + BUNDLE_VERSION_STRING = 0.16.0; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -652,7 +652,7 @@ 799396611D48B7BF00086753 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - BUNDLE_VERSION_STRING = 0.15.5; + BUNDLE_VERSION_STRING = 0.16.0; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; diff --git a/Sources/CloudFileProvider.swift b/Sources/CloudFileProvider.swift index 675fd7d..8eefef1 100644 --- a/Sources/CloudFileProvider.swift +++ b/Sources/CloudFileProvider.swift @@ -628,7 +628,7 @@ open class CloudFileProvider: LocalFileProvider { let path = self.relativePathOf(url: url) let rpath = path.hasPrefix("/") ? path.substring(from: path.index(after: path.startIndex)) : path - let relativeUrl = URL(string: rpath, relativeTo: self.baseURL) + let relativeUrl = URL(string: rpath.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) ?? rpath, relativeTo: self.baseURL) let file = FileObject(url: relativeUrl ?? url, name: name, path: path) file.size = (attribs[NSMetadataItemFSSizeKey] as? NSNumber)?.int64Value ?? -1 diff --git a/Sources/DropboxHelper.swift b/Sources/DropboxHelper.swift index 23b075f..17c35b1 100644 --- a/Sources/DropboxHelper.swift +++ b/Sources/DropboxHelper.swift @@ -17,19 +17,15 @@ public struct FileProviderDropboxError: FileProviderHTTPError { /// Containts path, url and attributes of a Dropbox file or resource. public final class DropboxFileObject: FileObject { - internal init(name: String, path: String) { - super.init(url: URL(string: path) ?? URL(string: "/")!, name: name, path: path) - } - internal convenience init? (jsonStr: String) { guard let json = jsonStr.deserializeJSON() else { return nil } self.init(json: json) } - internal convenience init? (json: [String: AnyObject]) { + internal init? (json: [String: AnyObject]) { guard let name = json["name"] as? String else { return nil } guard let path = json["path_display"] as? String else { return nil } - self.init(name: name, path: path) + super.init(url: nil, name: name, path: path) self.size = (json["size"] as? NSNumber)?.int64Value ?? -1 self.serverTime = Date(rfcString: json["server_modified"] as? String ?? "") self.modifiedDate = Date(rfcString: json["client_modified"] as? String ?? "") diff --git a/Sources/FileObject.swift b/Sources/FileObject.swift index d73db74..86371f3 100644 --- a/Sources/FileObject.swift +++ b/Sources/FileObject.swift @@ -17,18 +17,25 @@ open class FileObject: Equatable { self.allValues = allValues } - internal init(url: URL, name: String, path: String) { + internal init(url: URL?, name: String, path: String) { self.allValues = [URLResourceKey: Any]() - self.url = url + if let url = url { + self.url = url + } self.name = name self.path = path } /// URL to access the resource, can be a relative URL against base URL. /// not supported by Dropbox provider. - open internal(set) var url: URL? { + open internal(set) var url: URL { get { - return allValues[.fileURLKey] as? URL + if let url = allValues[.fileURLKey] as? URL { + return url + } else { + let path = self.path.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) ?? self.path + return URL(string: path) ?? URL(string: "/")! + } } set { allValues[.fileURLKey] = newValue @@ -133,13 +140,13 @@ open class FileObject: Equatable { /// Check `FileObject` equality public static func ==(lhs: FileObject, rhs: FileObject) -> Bool { - if rhs === lhs { + if rhs === lhs { return true } if type(of: lhs) != type(of: rhs) { return false } - if let rurl = rhs.url, let lurl = lhs.url { + if let rurl = rhs.allValues[.fileURLKey] as? URL, let lurl = lhs.allValues[.fileURLKey] as? URL { return rurl == lurl } return rhs.path == lhs.path && rhs.size == lhs.size && rhs.modifiedDate == lhs.modifiedDate diff --git a/Sources/FileProvider.swift b/Sources/FileProvider.swift index 29408d8..cec2343 100644 --- a/Sources/FileProvider.swift +++ b/Sources/FileProvider.swift @@ -691,7 +691,7 @@ extension FileProviderBasic { } var i = number ?? 2 let similiar = contents.map { - $0.url?.lastPathComponent ?? $0.name + $0.url.lastPathComponent ?? $0.name }.filter { $0.hasPrefix(result) } diff --git a/Sources/LocalHelper.swift b/Sources/LocalHelper.swift index 98daad1..eff5b59 100644 --- a/Sources/LocalHelper.swift +++ b/Sources/LocalHelper.swift @@ -10,7 +10,7 @@ import Foundation /// Containts path, url and attributes of a local file or resource. public final class LocalFileObject: FileObject { - internal override init(url: URL, name: String, path: String) { + internal override init(url: URL?, name: String, path: String) { super.init(url: url, name: name, path: path) } @@ -24,7 +24,8 @@ public final class LocalFileObject: FileObject { if #available(iOS 9.0, macOS 10.11, tvOS 9.0, *) { fileURL = URL(fileURLWithPath: rpath, relativeTo: relativeURL) } else { - fileURL = URL(string: rpath.isEmpty ? "./" : rpath, relativeTo: relativeURL) + rpath = rpath.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) ?? rpath + fileURL = URL(string: rpath, relativeTo: relativeURL) ?? relativeURL } if let fileURL = fileURL { diff --git a/Sources/OneDriveHelper.swift b/Sources/OneDriveHelper.swift index a79879d..fdbfced 100644 --- a/Sources/OneDriveHelper.swift +++ b/Sources/OneDriveHelper.swift @@ -18,11 +18,11 @@ public struct FileProviderOneDriveError: FileProviderHTTPError { /// Containts path, url and attributes of a OneDrive file or resource. public final class OneDriveFileObject: FileObject { internal init(baseURL: URL?, name: String, path: String) { - var rpath = path - if path.hasPrefix("/") { + var rpath = path.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) ?? path + if rpath.hasPrefix("/") { rpath.remove(at: rpath.startIndex) } - let url = URL(string: rpath, relativeTo: baseURL) ?? URL(string: path)! + let url = URL(string: rpath, relativeTo: baseURL) ?? URL(string: rpath)! super.init(url: url, name: name, path: path) }