blob: abfdbb8691698504f47f8291355b15dc7338953e [file] [log] [blame]
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
public protocol NSCoding {
func encode(with aCoder: NSCoder)
init?(coder aDecoder: NSCoder)
}
public protocol NSSecureCoding : NSCoding {
static func supportsSecureCoding() -> Bool
}
public class NSCoder : NSObject {
internal var _pendingBuffers = Array<(UnsafeMutableRawPointer, Int)>()
deinit {
for buffer in _pendingBuffers {
// Cannot deinitialize a pointer to unknown type.
buffer.0.deallocate(bytes: buffer.1, alignedTo: alignof(Int.self))
}
}
public func encodeValue(ofObjCType type: UnsafePointer<Int8>, at addr: UnsafeRawPointer) {
NSRequiresConcreteImplementation()
}
public func encodeDataObject(_ data: Data) {
NSRequiresConcreteImplementation()
}
public func decodeValue(ofObjCType type: UnsafePointer<Int8>, at data: UnsafeMutableRawPointer) {
NSRequiresConcreteImplementation()
}
public func decodeDataObject() -> Data? {
NSRequiresConcreteImplementation()
}
public func version(forClassName className: String) -> Int {
NSRequiresConcreteImplementation()
}
public func decodeObjectOfClass<DecodedObjectType : NSCoding where DecodedObjectType : NSObject>(_ cls: DecodedObjectType.Type, forKey key: String) -> DecodedObjectType? {
NSUnimplemented()
}
/*!
@method decodeObjectOfClasses:forKey:
@abstract Decodes an object for the key, restricted to the specified classes.
@param classes An array of the expected classes.
@param key The code key.
@return The decoded object.
@discussion This function signature differs from Foundation OS X in that
classes is an array of Classes, not a NSSet. This is because AnyClass cannot
be casted to NSObject, nor is it Hashable.
*/
/// - Experiment: This is a draft API currently under consideration for official import into Foundation
public func decodeObjectOfClasses(_ classes: [AnyClass], forKey key: String) -> AnyObject? {
NSUnimplemented()
}
public func decodeTopLevelObject() throws -> AnyObject? {
NSUnimplemented()
}
public func decodeTopLevelObjectForKey(_ key: String) throws -> AnyObject? {
NSUnimplemented()
}
public func decodeTopLevelObjectOfClass<DecodedObjectType : NSCoding where DecodedObjectType : NSObject>(_ cls: DecodedObjectType.Type, forKey key: String) throws -> DecodedObjectType? {
NSUnimplemented()
}
/*!
@method decodeTopLevelObjectOfClasses:
@abstract Decodes an top-level object for the key, restricted to the specified classes.
@param classes An array of the expected classes.
@param key The code key.
@return The decoded object.
@discussion This function signature differs from Foundation OS X in that
classes is an array of Classes, not a NSSet. This is because AnyClass cannot
be casted to NSObject, nor is it Hashable.
*/
/// - Experiment: This is a draft API currently under consideration for official import into Foundation
public func decodeTopLevelObjectOfClasses(_ classes: [AnyClass], forKey key: String) throws -> AnyObject? {
NSUnimplemented()
}
internal var error: NSError? {
return nil
}
public func encode(_ object: AnyObject?) {
var object = object
withUnsafePointer(to: &object) { (ptr: UnsafePointer<AnyObject?>) -> Void in
encodeValue(ofObjCType: "@", at: unsafeBitCast(ptr, to: UnsafeRawPointer.self))
}
}
public func encodeRootObject(_ rootObject: AnyObject) {
encode(rootObject)
}
public func encodeBycopyObject(_ anObject: AnyObject?) {
encode(anObject)
}
public func encodeByrefObject(_ anObject: AnyObject?) {
encode(anObject)
}
public func encodeConditionalObject(_ object: AnyObject?) {
encode(object)
}
public func encodeArray(ofObjCType type: UnsafePointer<Int8>, count: Int, at array: UnsafeRawPointer) {
encodeValue(ofObjCType: "[\(count)\(String(cString: type))]", at: array)
}
public func encodeBytes(_ byteaddr: UnsafeRawPointer?, length: Int) {
var newLength = UInt32(length)
withUnsafePointer(to: &newLength) { (ptr: UnsafePointer<UInt32>) -> Void in
encodeValue(ofObjCType: "I", at: ptr)
}
var empty: [Int8] = []
withUnsafePointer(to: &empty) {
encodeArray(ofObjCType: "c", count: length, at: byteaddr ?? UnsafeRawPointer($0))
}
}
public func decodeObject() -> AnyObject? {
if self.error != nil {
return nil
}
var obj: AnyObject? = nil
withUnsafeMutablePointer(to: &obj) { (ptr: UnsafeMutablePointer<AnyObject?>) -> Void in
decodeValue(ofObjCType: "@", at: unsafeBitCast(ptr, to: UnsafeMutableRawPointer.self))
}
return obj
}
public func decodeArray(ofObjCType itemType: UnsafePointer<Int8>, count: Int, at array: UnsafeMutableRawPointer) {
decodeValue(ofObjCType: "[\(count)\(String(cString: itemType))]", at: array)
}
/*
// TODO: This is disabled, as functions which return unsafe interior pointers are inherently unsafe when we have no autorelease pool.
public func decodeBytes(withReturnedLength lengthp: UnsafeMutablePointer<Int>) -> UnsafeMutableRawPointer? {
var length: UInt32 = 0
withUnsafeMutablePointer(to: &length) { (ptr: UnsafeMutablePointer<UInt32>) -> Void in
decodeValue(ofObjCType: "I", at: unsafeBitCast(ptr, to: UnsafeMutableRawPointer.self))
}
// we cannot autorelease here so instead the pending buffers will manage the lifespan of the returned data... this is wasteful but good enough...
let result = UnsafeMutableRawPointer.allocate(bytes: Int(length), alignedTo: alignof(Int.self))
decodeValue(ofObjCType: "c", at: result)
lengthp.pointee = Int(length)
_pendingBuffers.append((result, Int(length)))
return result
}
*/
public func encodePropertyList(_ aPropertyList: AnyObject) {
NSUnimplemented()
}
public func decodePropertyList() -> AnyObject? {
NSUnimplemented()
}
public var systemVersion: UInt32 {
return 1000
}
public var allowsKeyedCoding: Bool {
return false
}
public func encode(_ objv: AnyObject?, forKey key: String) {
NSRequiresConcreteImplementation()
}
public func encodeConditionalObject(_ objv: AnyObject?, forKey key: String) {
NSRequiresConcreteImplementation()
}
public func encode(_ boolv: Bool, forKey key: String) {
NSRequiresConcreteImplementation()
}
public func encode(_ intv: Int32, forKey key: String) {
NSRequiresConcreteImplementation()
}
public func encode(_ intv: Int64, forKey key: String) {
NSRequiresConcreteImplementation()
}
public func encode(_ realv: Float, forKey key: String) {
NSRequiresConcreteImplementation()
}
public func encode(_ realv: Double, forKey key: String) {
NSRequiresConcreteImplementation()
}
public func encodeBytes(_ bytesp: UnsafePointer<UInt8>?, length lenv: Int, forKey key: String) {
NSRequiresConcreteImplementation()
}
public func containsValue(forKey key: String) -> Bool {
NSRequiresConcreteImplementation()
}
public func decodeObject(forKey key: String) -> AnyObject? {
NSRequiresConcreteImplementation()
}
public func decodeBool(forKey key: String) -> Bool {
NSRequiresConcreteImplementation()
}
public func decodeInt32(forKey key: String) -> Int32 {
NSRequiresConcreteImplementation()
}
public func decodeInt64(forKey key: String) -> Int64 {
NSRequiresConcreteImplementation()
}
public func decodeFloat(forKey key: String) -> Float {
NSRequiresConcreteImplementation()
}
public func decodeDouble(forKey key: String) -> Double {
NSRequiresConcreteImplementation()
}
// TODO: This is disabled, as functions which return unsafe interior pointers are inherently unsafe when we have no autorelease pool.
/*
public func decodeBytes(forKey key: String, returnedLength lengthp: UnsafeMutablePointer<Int>?) -> UnsafePointer<UInt8>? { // returned bytes immutable!
NSRequiresConcreteImplementation()
}
*/
/// - experimental: This method does not exist in the Darwin Foundation.
public func withDecodedUnsafeBufferPointer<ResultType>(forKey key: String, body: @noescape (UnsafeBufferPointer<UInt8>?) throws -> ResultType) rethrows -> ResultType {
NSRequiresConcreteImplementation()
}
public func encode(_ intv: Int, forKey key: String) {
NSRequiresConcreteImplementation()
}
public func decodeInteger(forKey key: String) -> Int {
NSRequiresConcreteImplementation()
}
public var requiresSecureCoding: Bool {
return false
}
public func decodePropertyListForKey(_ key: String) -> AnyObject? {
NSUnimplemented()
}
/*!
@property allowedClasses
@abstract The set of coded classes allowed for secure coding. (read-only)
@discussion This property type differs from Foundation OS X in that
classes is an array of Classes, not a Set. This is because AnyClass is not
hashable.
*/
/// - Experiment: This is a draft API currently under consideration for official import into Foundation
public var allowedClasses: [AnyClass]? {
NSUnimplemented()
}
public func failWithError(_ error: NSError) {
if let debugDescription = error.userInfo["NSDebugDescription"] {
NSLog("*** NSKeyedUnarchiver.init: \(debugDescription)")
} else {
NSLog("*** NSKeyedUnarchiver.init: decoding error")
}
}
internal func _decodeArrayOfObjectsForKey(_ key: String) -> [AnyObject] {
NSRequiresConcreteImplementation()
}
internal func _decodePropertyListForKey(_ key: String) -> Any {
NSRequiresConcreteImplementation()
}
}