Skip to content

Commit cf9936e

Browse files
Merge pull request #171 from nextcloud/getInternalType
Get internal type
2 parents af4615c + 14b5bd7 commit cf9936e

2 files changed

Lines changed: 58 additions & 3 deletions

File tree

Sources/NextcloudKit/TypeIdentifiers/NKFilePropertyResolver.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,9 @@ public final class NKFilePropertyResolver {
4444

4545
public init() {}
4646

47-
public func resolve(inUTI: String, account: String) async -> NKFileProperty {
47+
public func resolve(inUTI: String, capabilities: NKCapabilities.Capabilities) -> NKFileProperty {
4848
let fileProperty = NKFileProperty()
4949
let typeIdentifier = inUTI as String
50-
let capabilities = await NKCapabilities.shared.getCapabilities(for: account)
5150
let utiString = inUTI as String
5251

5352
// Preferred extension

Sources/NextcloudKit/TypeIdentifiers/NKTypeIdentifiers.swift

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ public actor NKTypeIdentifiers {
6262
fileNameWithoutExt = fileName
6363
ext = ""
6464
} else {
65-
let props = await resolver.resolve(inUTI: typeIdentifier, account: account)
65+
let capabilities = await NKCapabilities.shared.getCapabilities(for: account)
66+
let props = resolver.resolve(inUTI: typeIdentifier, capabilities: capabilities)
6667
classFile = props.classFile.rawValue
6768
iconName = props.iconName.rawValue
6869
}
@@ -90,3 +91,58 @@ public actor NKTypeIdentifiers {
9091
filePropertyCache.removeAll()
9192
}
9293
}
94+
95+
/// Helper class to access NKTypeIdentifiers from sync contexts (e.g. in legacy code or libraries).
96+
public final class NKTypeIdentifiersHelper {
97+
public static let shared = NKTypeIdentifiersHelper()
98+
99+
// Resolves type info from file name and optional MIME type
100+
public func getInternalType(fileName: String, mimeType inputMimeType: String, directory: Bool, capabilities: NKCapabilities.Capabilities) -> NKTypeIdentifierCache {
101+
var ext = (fileName as NSString).pathExtension.lowercased()
102+
var mimeType = inputMimeType
103+
var classFile = ""
104+
var iconName = ""
105+
var typeIdentifier = ""
106+
var fileNameWithoutExt = (fileName as NSString).deletingPathExtension
107+
108+
// Use full name if no extension
109+
if ext.isEmpty {
110+
fileNameWithoutExt = fileName
111+
}
112+
113+
// Resolve UTType
114+
let type = UTType(filenameExtension: ext) ?? .data
115+
typeIdentifier = type.identifier
116+
117+
// Resolve MIME type
118+
if mimeType.isEmpty {
119+
mimeType = type.preferredMIMEType ?? "application/octet-stream"
120+
}
121+
122+
// Handle folder case
123+
if directory {
124+
mimeType = "httpd/unix-directory"
125+
classFile = NKTypeClassFile.directory.rawValue
126+
iconName = NKTypeIconFile.directory.rawValue
127+
typeIdentifier = UTType.folder.identifier
128+
fileNameWithoutExt = fileName
129+
ext = ""
130+
} else {
131+
let props = NKFilePropertyResolver().resolve(inUTI: typeIdentifier, capabilities: capabilities)
132+
classFile = props.classFile.rawValue
133+
iconName = props.iconName.rawValue
134+
}
135+
136+
// Construct result
137+
let result = NKTypeIdentifierCache(
138+
mimeType: mimeType,
139+
classFile: classFile,
140+
iconName: iconName,
141+
typeIdentifier: typeIdentifier,
142+
fileNameWithoutExt: fileNameWithoutExt,
143+
ext: ext
144+
)
145+
146+
return result
147+
}
148+
}

0 commit comments

Comments
 (0)