X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/5c19dc3ae3bd8e40a9c028b0deddd50ff337692c..6b200bc335dc93c5516ccb52f14bd896d8c7fad7:/OSX/utilities/src/SecCFError.h?ds=sidebyside diff --git a/OSX/utilities/src/SecCFError.h b/OSX/utilities/src/SecCFError.h index baf307e7..419c34a2 100644 --- a/OSX/utilities/src/SecCFError.h +++ b/OSX/utilities/src/SecCFError.h @@ -26,6 +26,7 @@ #define _SECCFERROR_H_ #include +#include // // Leaf error creation from other systems @@ -112,6 +113,69 @@ static inline bool asSetOptional(CFTypeRef cfType, CFSetRef *set, CFErrorRef *er // MARK: Required value type casting // +// +// MARK: Required value type casting +// + +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; +} + +// +// MARK: Analyzer confusing asXxx casting +// static inline CFArrayRef asArray(CFTypeRef cfType, CFErrorRef *error) { if (cfType && CFGetTypeID(cfType) == CFArrayGetTypeID()) return (CFArrayRef)cfType; @@ -161,4 +225,11 @@ static inline CFStringRef asString(CFTypeRef cfType, CFErrorRef *error) { 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 /* _SECCFERROR_H_ */