Skip to content

Commit 2972bc7

Browse files
UniformTypeIdentifiers
Signed-off-by: Marino Faggiana <marino@marinofaggiana.com>
1 parent 8f8ba70 commit 2972bc7

4 files changed

Lines changed: 42 additions & 27 deletions

File tree

Package.swift

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ import PackageDescription
1010
let package = Package(
1111
name: "NextcloudKit",
1212
platforms: [
13-
.macOS(.v10_15),
14-
.iOS(.v13),
15-
.tvOS(.v13),
16-
.watchOS(.v6),
13+
.iOS(.v14),
14+
.macOS(.v11),
15+
.tvOS(.v14),
16+
.watchOS(.v7),
1717
.visionOS(.v1)
1818
],
1919
products: [
@@ -41,4 +41,28 @@ let package = Package(
4141
name: "NextcloudKitIntegrationTests",
4242
dependencies: ["NextcloudKit", "Mocker"])
4343
]
44+
45+
/* Test simulate 6
46+
targets: [
47+
.target(
48+
name: "NextcloudKit",
49+
dependencies: ["Alamofire", "SwiftyJSON", "SwiftyXMLParser"],
50+
swiftSettings: [
51+
.enableUpcomingFeature("StrictConcurrency"), // simulate Swift 6
52+
.enableExperimentalFeature("StrictConcurrency"),
53+
.unsafeFlags(["-Xfrontend", "-warn-concurrency"]),
54+
.unsafeFlags(["-Xfrontend", "-enable-actor-data-race-checks"])
55+
]
56+
),
57+
.testTarget(
58+
name: "NextcloudKitUnitTests",
59+
dependencies: ["NextcloudKit", "Mocker"],
60+
resources: [
61+
.process("Resources")
62+
]),
63+
.testTarget(
64+
name: "NextcloudKitIntegrationTests",
65+
dependencies: ["NextcloudKit", "Mocker"])
66+
]
67+
*/
4468
)

Sources/NextcloudKit/Log/NKLogFileManager.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public enum NKLogTagEmoji: String {
5353
/// A logger that writes log messages to a file in a subdirectory of the user's Documents folder,
5454
/// rotates the log daily
5555
/// Compatible with iOS 13.0+ and Swift 6.
56-
public final class NKLogFileManager {
56+
public final class NKLogFileManager: @unchecked Sendable {
5757

5858
// MARK: - Singleton
5959

@@ -79,13 +79,13 @@ public final class NKLogFileManager {
7979
private let logDirectory: URL
8080
public var logLevel: NKLogLevel
8181
private var currentLogDate: String
82-
private let logQueue = DispatchQueue(label: "LogWriterQueue", attributes: .concurrent)
83-
private let rotationQueue = DispatchQueue(label: "LogRotationQueue")
82+
private let logQueue = DispatchQueue(label: "com.nextcloud.LogWriterQueue", attributes: .concurrent)
83+
private let rotationQueue = DispatchQueue(label: "com.nextcloud.LogRotationQueue")
8484
private let fileManager = FileManager.default
8585

8686
// Cache for dynamic format strings, populated at runtime. Thread-safe via serial queue.
8787
private static var cachedDynamicFormatters: [String: DateFormatter] = [:]
88-
private static let formatterAccessQueue = DispatchQueue(label: "com.yourapp.dateformatter.cache")
88+
private static let formatterAccessQueue = DispatchQueue(label: "com.nextcloud.dateformatter.cache")
8989

9090
// MARK: - Initialization
9191

Sources/NextcloudKit/NKCommon.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,6 @@
66
import Foundation
77
import Alamofire
88

9-
#if os(iOS)
10-
import MobileCoreServices
11-
#else
12-
import CoreServices
13-
#endif
14-
159
public enum NKTypeReachability: Int {
1610
case unknown = 0
1711
case notReachable = 1

Sources/NextcloudKit/TypeIdentifiers/NKTypeIdentifiers.swift

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

55
import Foundation
6-
import MobileCoreServices
6+
import UniformTypeIdentifiers
77

88
/// Actor responsible for resolving file type metadata (UTI, MIME type, icon, class file, etc.) in a thread-safe manner.
99
public actor NKTypeIdentifiers {
@@ -28,16 +28,13 @@ public actor NKTypeIdentifiers {
2828
var iconName = ""
2929
var typeIdentifier = ""
3030
var fileNameWithoutExt = ""
31-
32-
var uti: CFString?
31+
var uti: String?
3332

3433
// UTI cache
3534
if let cachedUTI = utiCache[ext] {
36-
uti = cachedUTI as CFString
37-
} else if let unmanagedUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, ext as CFString, nil) {
38-
let resolvedUTI = unmanagedUTI.takeRetainedValue()
39-
uti = resolvedUTI
40-
utiCache[ext] = resolvedUTI as String
35+
uti = cachedUTI
36+
} else if let type = UTType(filenameExtension: ext) {
37+
utiCache[ext] = type.identifier
4138
}
4239

4340
if let uti {
@@ -48,10 +45,10 @@ public actor NKTypeIdentifiers {
4845
if mimeType.isEmpty {
4946
if let cachedMime = mimeTypeCache[typeIdentifier] {
5047
mimeType = cachedMime
51-
} else if let mime = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType) {
52-
let mimeStr = mime.takeRetainedValue() as String
53-
mimeType = mimeStr
54-
mimeTypeCache[typeIdentifier] = mimeStr
48+
} else if let type = UTType(typeIdentifier),
49+
let resolvedMime = type.preferredMIMEType {
50+
mimeType = resolvedMime
51+
mimeTypeCache[typeIdentifier] = resolvedMime
5552
}
5653
}
5754

@@ -60,7 +57,7 @@ public actor NKTypeIdentifiers {
6057
mimeType = "httpd/unix-directory"
6158
classFile = NKTypeClassFile.directory.rawValue
6259
iconName = NKTypeIconFile.directory.rawValue
63-
typeIdentifier = kUTTypeFolder as String
60+
typeIdentifier = UTType.folder.identifier
6461
fileNameWithoutExt = fileName
6562
ext = ""
6663
} else {

0 commit comments

Comments
 (0)