From b0c46d58bfc8cb0f76fa8cc8325cd5697146b7b7 Mon Sep 17 00:00:00 2001 From: Marino Faggiana Date: Wed, 23 Jul 2025 11:30:52 +0200 Subject: [PATCH 1/2] coding --- .../NKFilePropertyResolver.swift | 3 +- .../TypeIdentifiers/NKTypeIdentifiers.swift | 63 ++++++++++++++++++- 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/Sources/NextcloudKit/TypeIdentifiers/NKFilePropertyResolver.swift b/Sources/NextcloudKit/TypeIdentifiers/NKFilePropertyResolver.swift index 91c3e2e9..cb1b1bb8 100644 --- a/Sources/NextcloudKit/TypeIdentifiers/NKFilePropertyResolver.swift +++ b/Sources/NextcloudKit/TypeIdentifiers/NKFilePropertyResolver.swift @@ -44,10 +44,9 @@ public final class NKFilePropertyResolver { public init() {} - public func resolve(inUTI: String, account: String) async -> NKFileProperty { + public func resolve(inUTI: String, capabilities: NKCapabilities.Capabilities) -> NKFileProperty { let fileProperty = NKFileProperty() let typeIdentifier = inUTI as String - let capabilities = await NKCapabilities.shared.getCapabilities(for: account) let utiString = inUTI as String // Preferred extension diff --git a/Sources/NextcloudKit/TypeIdentifiers/NKTypeIdentifiers.swift b/Sources/NextcloudKit/TypeIdentifiers/NKTypeIdentifiers.swift index de244286..1f2f6b10 100644 --- a/Sources/NextcloudKit/TypeIdentifiers/NKTypeIdentifiers.swift +++ b/Sources/NextcloudKit/TypeIdentifiers/NKTypeIdentifiers.swift @@ -62,7 +62,68 @@ public actor NKTypeIdentifiers { fileNameWithoutExt = fileName ext = "" } else { - let props = await resolver.resolve(inUTI: typeIdentifier, account: account) + let capabilities = await NKCapabilities.shared.getCapabilities(for: account) + let props = resolver.resolve(inUTI: typeIdentifier, capabilities: capabilities) + classFile = props.classFile.rawValue + iconName = props.iconName.rawValue + } + + // Construct result + let result = NKTypeIdentifierCache( + mimeType: mimeType, + classFile: classFile, + iconName: iconName, + typeIdentifier: typeIdentifier, + fileNameWithoutExt: fileNameWithoutExt, + ext: ext + ) + + // Cache it + if !ext.isEmpty { + filePropertyCache[ext] = result + } + + return result + } + + // Resolves type info from file name and optional MIME type + public func getInternalType(fileName: String, mimeType inputMimeType: String, directory: Bool, capabilities: NKCapabilities.Capabilities) -> NKTypeIdentifierCache { + var ext = (fileName as NSString).pathExtension.lowercased() + var mimeType = inputMimeType + var classFile = "" + var iconName = "" + var typeIdentifier = "" + var fileNameWithoutExt = (fileName as NSString).deletingPathExtension + + // Use full name if no extension + if ext.isEmpty { + fileNameWithoutExt = fileName + } + + // Check cache first + if let cached = filePropertyCache[ext] { + return cached + } + + // Resolve UTType + let type = UTType(filenameExtension: ext) ?? .data + typeIdentifier = type.identifier + + // Resolve MIME type + if mimeType.isEmpty { + mimeType = type.preferredMIMEType ?? "application/octet-stream" + } + + // Handle folder case + if directory { + mimeType = "httpd/unix-directory" + classFile = NKTypeClassFile.directory.rawValue + iconName = NKTypeIconFile.directory.rawValue + typeIdentifier = UTType.folder.identifier + fileNameWithoutExt = fileName + ext = "" + } else { + let props = resolver.resolve(inUTI: typeIdentifier, capabilities: capabilities) classFile = props.classFile.rawValue iconName = props.iconName.rawValue } From 14b5bd7e2a3bd4b75e0a194c73d94742bd6ec188 Mon Sep 17 00:00:00 2001 From: Marino Faggiana Date: Wed, 23 Jul 2025 11:42:31 +0200 Subject: [PATCH 2/2] Update NKTypeIdentifiers.swift --- .../TypeIdentifiers/NKTypeIdentifiers.swift | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/Sources/NextcloudKit/TypeIdentifiers/NKTypeIdentifiers.swift b/Sources/NextcloudKit/TypeIdentifiers/NKTypeIdentifiers.swift index 1f2f6b10..1a2003c0 100644 --- a/Sources/NextcloudKit/TypeIdentifiers/NKTypeIdentifiers.swift +++ b/Sources/NextcloudKit/TypeIdentifiers/NKTypeIdentifiers.swift @@ -86,6 +86,16 @@ public actor NKTypeIdentifiers { return result } + // Clears the internal cache (used for testing or reset) + public func clearCache() { + filePropertyCache.removeAll() + } +} + +/// Helper class to access NKTypeIdentifiers from sync contexts (e.g. in legacy code or libraries). +public final class NKTypeIdentifiersHelper { + public static let shared = NKTypeIdentifiersHelper() + // Resolves type info from file name and optional MIME type public func getInternalType(fileName: String, mimeType inputMimeType: String, directory: Bool, capabilities: NKCapabilities.Capabilities) -> NKTypeIdentifierCache { var ext = (fileName as NSString).pathExtension.lowercased() @@ -100,11 +110,6 @@ public actor NKTypeIdentifiers { fileNameWithoutExt = fileName } - // Check cache first - if let cached = filePropertyCache[ext] { - return cached - } - // Resolve UTType let type = UTType(filenameExtension: ext) ?? .data typeIdentifier = type.identifier @@ -123,7 +128,7 @@ public actor NKTypeIdentifiers { fileNameWithoutExt = fileName ext = "" } else { - let props = resolver.resolve(inUTI: typeIdentifier, capabilities: capabilities) + let props = NKFilePropertyResolver().resolve(inUTI: typeIdentifier, capabilities: capabilities) classFile = props.classFile.rawValue iconName = props.iconName.rawValue } @@ -138,16 +143,6 @@ public actor NKTypeIdentifiers { ext: ext ) - // Cache it - if !ext.isEmpty { - filePropertyCache[ext] = result - } - return result } - - // Clears the internal cache (used for testing or reset) - public func clearCache() { - filePropertyCache.removeAll() - } }