]> git.saurik.com Git - apple/security.git/blobdiff - keychain/TrustedPeersHelper/SetValueTransformer.swift
Security-59306.11.20.tar.gz
[apple/security.git] / keychain / TrustedPeersHelper / SetValueTransformer.swift
diff --git a/keychain/TrustedPeersHelper/SetValueTransformer.swift b/keychain/TrustedPeersHelper/SetValueTransformer.swift
new file mode 100644 (file)
index 0000000..ced7dd2
--- /dev/null
@@ -0,0 +1,38 @@
+import CoreData
+import Foundation
+
+@objc(SetValueTransformer)
+class SetValueTransformer: ValueTransformer {
+    override class func transformedValueClass() -> AnyClass {
+        return NSData.self
+    }
+    
+    override class func allowsReverseTransformation() -> Bool {
+        return true
+    }
+    
+    override func transformedValue(_ value: Any?) -> Any? {
+        do {
+            guard let value = value else { return nil }
+            return try NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: true)
+        } catch {
+            os_log("Failed to serialize a Set: %@", log: tplogDebug, type: .default, error as CVarArg)
+            return nil
+        }
+    }
+
+    override func reverseTransformedValue(_ value: Any?) -> Any? {
+        do {
+            guard let dataOp = value as? Data? else { return nil }
+            guard let data = dataOp else { return nil }
+
+            let unarchiver = try NSKeyedUnarchiver(forReadingFrom: data)
+            return unarchiver.decodeObject(of: [NSSet.self], forKey:NSKeyedArchiveRootObjectKey)
+        } catch {
+            os_log("Failed to deserialize a purported Set: %@", log: tplogDebug, type: .default, error as CVarArg)
+            return nil
+        }
+    }
+
+    static let name = NSValueTransformerName(rawValue: "SetValueTransformer")
+}