#ifndef _SECCFERROR_H_
#define _SECCFERROR_H_
#include <CoreFoundation/CoreFoundation.h>
#define kSecKernDomain kCFErrorDomainMach
bool SecKernError(kern_return_t result, CFErrorRef *error, CFStringRef format, ...);
#define kSecErrnoDomain kCFErrorDomainPOSIX
bool SecCheckErrno(int result, CFErrorRef *error, CFStringRef format, ...);
#define kSecErrorDomain kCFErrorDomainOSStatus
bool SecError(OSStatus status, CFErrorRef *error, CFStringRef format, ...);
bool SecPOSIXError(int error, CFErrorRef *cferror, CFStringRef format, ...);
#define kSecCoreCryptoDomain CFSTR("kSecCoreCryptoDomain")
bool SecCoreCryptoError(int error, CFErrorRef *cferror, CFStringRef format, ...);
#define kSecNotifyDomain CFSTR("kSecNotifyDomain")
bool SecNotifyError(uint32_t result, CFErrorRef *error, CFStringRef format, ...);
bool SecRequirementError(bool requirement, CFErrorRef *error, CFStringRef format, ...);
bool SecAllocationError(const void *allocated, CFErrorRef *error, CFStringRef format, ...);
bool SecCFCreateError(CFIndex errorCode, CFStringRef domain, CFStringRef descriptionString,
CFErrorRef previousError, CFErrorRef *newError);
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 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;
}
#endif