NSError+KCCreationHelpers.m [plain text]
//
// NSError+KCCreationHelpers.m
// KechainCircle
//
//
#import <Foundation/Foundation.h>
#import <NSError+KCCreationHelpers.h>
static NSString* coreCryptoDomain = @"kSecCoreCryptoDomain";
static NSString* srpDomain = @"com.apple.security.srp";
static NSDictionary* UserInfoFromVA(NSString*description, va_list va)
NS_FORMAT_FUNCTION(1, 0);
static NSDictionary* UserInfoFromVA(NSString*description, va_list va) {
return @{NSLocalizedDescriptionKey:[[NSString alloc] initWithFormat:description
arguments:va]};
}
// We should get this from SecCFError.h and Security.framework..
bool CoreCryptoError(int cc_result, NSError** error, NSString* description, ...)
{
bool failed = cc_result != 0;
if (failed && error && !*error) {
va_list va;
va_start(va, description);
*error = [NSError errorWithCoreCryptoStatus:cc_result
description:description
args:va];
va_end(va);
}
return !failed;
}
bool OSStatusError(OSStatus status, NSError** error, NSString*description, ...) {
bool failed = status != 0;
if (failed && error && !*error) {
va_list va;
va_start(va, description);
*error = [NSError errorWithOSStatus:status
description:description
args:va];
va_end(va);
}
return !failed;
}
bool RequirementError(bool requirement, NSError** error, NSString*description, ...) {
bool failed = !requirement;
if (failed && error && !*error) {
va_list va;
va_start(va, description);
*error = [NSError errorWithOSStatus:-50
description:description
args:va];
va_end(va);
}
return !failed;
}
@implementation NSError(KCCreationHelpers)
+ (instancetype) errorWithOSStatus:(OSStatus) status
userInfo:(NSDictionary *)dict {
return [[NSError alloc] initWithOSStatus:status userInfo:dict];
}
- (instancetype) initWithOSStatus:(OSStatus) status
userInfo:(NSDictionary *)dict {
return [self initWithDomain:NSOSStatusErrorDomain code:status userInfo:dict];
}
+ (instancetype) errorWithOSStatus:(OSStatus) status
description:(NSString*)description
args:(va_list)va {
return [[NSError alloc] initWithOSStatus:status description:description args:va];
}
- (instancetype) initWithOSStatus:(OSStatus) status
description:(NSString*)description
args:(va_list)va {
return [self initWithOSStatus:status
userInfo:UserInfoFromVA(description, va)];
}
+ (instancetype) errorWithCoreCryptoStatus:(int) status
userInfo:(NSDictionary *)dict {
return [[NSError alloc] initWithCoreCryptoStatus:status userInfo:dict];
}
- (instancetype) initWithCoreCryptoStatus:(int) status
userInfo:(NSDictionary *)dict {
return [self initWithDomain:coreCryptoDomain code:status userInfo:dict];
}
+ (instancetype) errorWithCoreCryptoStatus:(int) status
description:(NSString*)description
args:(va_list)va {
return [[NSError alloc] initWithCoreCryptoStatus:status description:description args:va];
}
- (instancetype) initWithCoreCryptoStatus:(int) status
description:(NSString*)description
args:(va_list)va {
return [self initWithCoreCryptoStatus:status
userInfo:UserInfoFromVA(description, va)];
}
@end