diff --git a/Headers/Foundation/NSKeyedArchiver.h b/Headers/Foundation/NSKeyedArchiver.h index 8fe727a1a..32790351f 100644 --- a/Headers/Foundation/NSKeyedArchiver.h +++ b/Headers/Foundation/NSKeyedArchiver.h @@ -87,6 +87,18 @@ extern "C" { */ + (NSData*) archivedDataWithRootObject: (id)anObject; + +#if OS_API_VERSION(MAC_OS_X_VERSION_10_13,GS_API_LATEST) +/** + * Encodes anObject and returns the resulting data object. Allows + * secure coding if specified. Returns an error if an object + * violates secure coding rules. + */ ++ (NSData *) archivedDataWithRootObject: (id)anObject + requiringSecureCoding: (BOOL)requiresSecureCoding + error: (NSError **)error; +#endif + /** * Encodes anObject and writes the resulting data ti aPath. */ diff --git a/Source/NSKeyedArchiver.m b/Source/NSKeyedArchiver.m index d50ba2515..a89799fae 100644 --- a/Source/NSKeyedArchiver.m +++ b/Source/NSKeyedArchiver.m @@ -430,34 +430,49 @@ static NSDictionary *makeReference(unsigned ref) @implementation NSKeyedArchiver ++ (NSData *) archivedDataWithRootObject: (id)anObject + requiringSecureCoding: (BOOL)requiresSecureCoding + error: (NSError **)error +{ + NSData *d = nil; + + if (requiresSecureCoding == NO) + { + NSMutableData *m = nil; + NSKeyedArchiver *a = nil; + + error = NULL; + NS_DURING + { + m = [[NSMutableData alloc] initWithCapacity: 10240]; + a = [[NSKeyedArchiver alloc] initForWritingWithMutableData: m]; + [a encodeObject: anObject forKey: @"root"]; + [a finishEncoding]; + d = [m copy]; + DESTROY(m); + DESTROY(a); + } + NS_HANDLER + { + DESTROY(m); + DESTROY(a); + [localException raise]; + } + NS_ENDHANDLER; + } + + return AUTORELEASE(d); +} + /* * When I tried this on MacOS 10.3 it encoded the object with the key 'root', * so this implementation does the same. */ + (NSData*) archivedDataWithRootObject: (id)anObject { - NSMutableData *m = nil; - NSKeyedArchiver *a = nil; - NSData *d = nil; - - NS_DURING - { - m = [[NSMutableData alloc] initWithCapacity: 10240]; - a = [[NSKeyedArchiver alloc] initForWritingWithMutableData: m]; - [a encodeObject: anObject forKey: @"root"]; - [a finishEncoding]; - d = [m copy]; - DESTROY(m); - DESTROY(a); - } - NS_HANDLER - { - DESTROY(m); - DESTROY(a); - [localException raise]; - } - NS_ENDHANDLER - return AUTORELEASE(d); + return [self archivedDataWithRootObject: anObject + requiringSecureCoding: NO + error: NULL]; } + (BOOL) archiveRootObject: (id)anObject toFile: (NSString*)aPath