#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 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;
}
if(error) {
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;
}
if(error) {
SecError(-50, error, CFSTR("object %@ is not an data"), cfType);
}
return false;
}
static inline CFDataRef copyIfData(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFDataGetTypeID()) {
return (CFDataRef)CFRetainSafe(cfType);
}
if(error) {
SecError(-50, error, CFSTR("object %@ is not a data"), cfType);
}
return NULL;
}
static inline CFSetRef copyIfSet(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFSetGetTypeID()) {
return (CFSetRef)CFRetainSafe(cfType);
}
if(error) {
SecError(-50, error, CFSTR("object %@ is not a set"), cfType);
}
return NULL;
}
static inline CFArrayRef asArray(CFTypeRef cfType, CFErrorRef *error) {
if (cfType && CFGetTypeID(cfType) == CFArrayGetTypeID()) {
return (CFArrayRef)cfType;
}
if(error) {
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;
}
if(error) {
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;
}
if(error) {
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;
}
if(error) {
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;
}
if(error) {
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;
}
if(error) {
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;
}
if(error) {
SecError(-50, error, CFSTR("object %@ is not a string"), cfType);
}
return NULL;
}
#endif