#ifndef _SECCFERROR_H_
#define _SECCFERROR_H_
#include <CoreFoundation/CoreFoundation.h>
#include "utilities/SecCFRelease.h"
#define kSecKernDomain kCFErrorDomainMach
bool SecKernError(kern_return_t result, CFErrorRef *error, CFStringRef format, ...)
CF_FORMAT_FUNCTION(3, 4);
#define kSecErrnoDomain kCFErrorDomainPOSIX
bool SecCheckErrno(int result, CFErrorRef *error, CFStringRef format, ...)
CF_FORMAT_FUNCTION(3, 4);
#define kSecErrorDomain kCFErrorDomainOSStatus
bool SecError(OSStatus status, CFErrorRef *error, CFStringRef format, ...)
CF_FORMAT_FUNCTION(3, 4);
bool SecPOSIXError(int error, CFErrorRef *cferror, CFStringRef format, ...)
CF_FORMAT_FUNCTION(3, 4);
#define kSecCoreCryptoDomain CFSTR("kSecCoreCryptoDomain")
bool SecCoreCryptoError(int error, CFErrorRef *cferror, CFStringRef format, ...)
CF_FORMAT_FUNCTION(3, 4);
#define kSecNotifyDomain CFSTR("kSecNotifyDomain")
bool SecNotifyError(uint32_t result, CFErrorRef *error, CFStringRef format, ...)
CF_FORMAT_FUNCTION(3, 4);
bool SecRequirementError(bool requirement, CFErrorRef *error, CFStringRef format, ...)
CF_FORMAT_FUNCTION(3, 4);
bool SecAllocationError(const void *allocated, CFErrorRef *error, CFStringRef format, ...)
CF_FORMAT_FUNCTION(3, 4);
#define SecCFCreateError(errorCode, domain, descriptionString, previousError, newError) \
SecCFCreateErrorWithFormat(errorCode, domain, previousError, newError, NULL, descriptionString)
bool SecCFCreateErrorWithFormat(CFIndex errorCode, CFStringRef domain, CFErrorRef previousError, CFErrorRef *newError,
CFDictionaryRef formatoptions, CFStringRef descriptionString, ...)
CF_FORMAT_FUNCTION(6,7);
bool SecCFCreateErrorWithFormatAndArguments(CFIndex errorCode, CFStringRef domain,
CFErrorRef previousError, CFErrorRef *newError,
CFDictionaryRef formatoptions, CFStringRef descriptionString, va_list args)
CF_FORMAT_FUNCTION(6, 0);
static inline bool asArrayOptional(CFTypeRef cfType, CFArrayRef *array, CFErrorRef *error) {
if (!cfType || CFGetTypeID(cfType) == CFArrayGetTypeID()) {
if (array) *array = (CFArrayRef)cfType;
return true;
}
SecError(-50, error, CFSTR("object %@ is not an array"), cfType);
return false;
}
static inline bool asDataOptional(CFTypeRef cfType, CFDataRef *data, CFErrorRef *error) {
if (!cfType || CFGetTypeID(cfType) == CFDataGetTypeID()) {
if (data) *data = (CFDataRef)cfType;
return true;
}
SecError(-50, error, CFSTR("object %@ is not an data"), cfType);
return false;
}
static inline bool asSetOptional(CFTypeRef cfType, CFSetRef *set, CFErrorRef *error) {
if (!cfType || CFGetTypeID(cfType) == CFSetGetTypeID()) {
if (set) *set = (CFSetRef)cfType;
return true;
}
SecError(-50, error, CFSTR("object %@ is not a set"), cfType);
return false;
}
static inline CFArrayRef copyIfArray(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFArrayGetTypeID())
return (CFArrayRef)CFRetainSafe(cfType);
SecError(-50, error, CFSTR("object %@ is not an array"), cfType);
return NULL;
}
static inline CFBooleanRef copyIfBoolean(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFBooleanGetTypeID())
return (CFBooleanRef)CFRetainSafe(cfType);
SecError(-50, error, CFSTR("object %@ is not an boolean"), cfType);
return NULL;
}
static inline CFDataRef copyIfData(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFDataGetTypeID())
return (CFDataRef)CFRetainSafe(cfType);
SecError(-50, error, CFSTR("object %@ is not a data"), cfType);
return NULL;
}
static inline CFDateRef copyIfDate(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFDateGetTypeID())
return (CFDateRef)CFRetainSafe(cfType);
SecError(-50, error, CFSTR("object %@ is not a date"), cfType);
return NULL;
}
static inline CFDictionaryRef copyIfDictionary(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFDictionaryGetTypeID())
return (CFDictionaryRef)CFRetainSafe(cfType);
SecError(-50, error, CFSTR("object %@ is not a dictionary"), cfType);
return NULL;
}
static inline CFSetRef copyIfSet(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFSetGetTypeID())
return (CFSetRef)CFRetainSafe(cfType);
SecError(-50, error, CFSTR("object %@ is not a set"), cfType);
return NULL;
}
static inline CFStringRef copyIfString(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFStringGetTypeID())
return (CFStringRef)CFRetainSafe(cfType);
SecError(-50, error, CFSTR("object %@ is not a string"), cfType);
return NULL;
}
static inline CFUUIDRef copyIfUUID(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFUUIDGetTypeID())
return (CFUUIDRef)CFRetainSafe(cfType);
SecError(-50, error, CFSTR("object %@ is not a UUID"), cfType);
return NULL;
}
static inline CFArrayRef asArray(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFArrayGetTypeID())
return (CFArrayRef)cfType;
SecError(-50, error, CFSTR("object %@ is not an array"), cfType);
return NULL;
}
static inline CFBooleanRef asBoolean(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFBooleanGetTypeID())
return (CFBooleanRef)cfType;
SecError(-50, error, CFSTR("object %@ is not an boolean"), cfType);
return NULL;
}
static inline CFDataRef asData(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFDataGetTypeID())
return (CFDataRef)cfType;
SecError(-50, error, CFSTR("object %@ is not a data"), cfType);
return NULL;
}
static inline CFDateRef asDate(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFDateGetTypeID())
return (CFDateRef)cfType;
SecError(-50, error, CFSTR("object %@ is not a date"), cfType);
return NULL;
}
static inline CFDictionaryRef asDictionary(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFDictionaryGetTypeID())
return (CFDictionaryRef)cfType;
SecError(-50, error, CFSTR("object %@ is not a dictionary"), cfType);
return NULL;
}
static inline CFSetRef asSet(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFSetGetTypeID())
return (CFSetRef)cfType;
SecError(-50, error, CFSTR("object %@ is not a set"), cfType);
return NULL;
}
static inline CFStringRef asString(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFStringGetTypeID())
return (CFStringRef)cfType;
SecError(-50, error, CFSTR("object %@ is not a string"), cfType);
return NULL;
}
static inline CFUUIDRef asUUID(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFUUIDGetTypeID())
return (CFUUIDRef)cfType;
SecError(-50, error, CFSTR("object %@ is not a UUID"), cfType);
return NULL;
}
#endif