static pascal void PrintPropertyListCallback(CFTypeRef key, CFTypeRef node, void *context) // A callback routine used by PrintPropertyList to print // a property list in a nicely formatted way. { #pragma unused(key) int i; int depth; depth = (int)context; for (i = 0; i < depth; i++) { fprintf(stderr, " "); } { CFStringRef fullDesc; CFStringRef typeDesc; CFStringRef valueDesc; fullDesc = NULL; typeDesc = CFCopyTypeIDDescription(CFGetTypeID(node)); valueDesc = NULL; if ( CFQPropertyListIsLeaf(node) ) { if ( CFGetTypeID(node) == CFStringGetTypeID() ) { valueDesc = (CFStringRef) CFRetain(node); } else if ( CFGetTypeID(node) == CFNumberGetTypeID() ) { valueDesc = (CFStringRef) CFRetain(node); } else { valueDesc = CFCopyDescription(node); } fullDesc = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@ : %@ [%d] = %@"), key, typeDesc, CFGetRetainCount(node), valueDesc); } else { fullDesc = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@ : %@ [%d]"), key, typeDesc, CFGetRetainCount(node)); } CFShow(fullDesc); CFQRelease(fullDesc); CFQRelease(valueDesc); CFQRelease(typeDesc); } if ( ! CFQPropertyListIsLeaf(node) ) { CFQPropertyListShallowApplyFunction(node, PrintPropertyListCallback, (void *) (depth + 1) ); } }
void DigestTransform::AttributeChanged(CFStringRef name, CFTypeRef value) { if (CFStringCompare(name, kSecTransformInputAttributeName, 0) == kCFCompareEqualTo) { if (value == NULL) { // we are done, finalize the digest and send the result forward const void* result = mDigest->Finalize(); // send the result CFDataRef resultRef = CFDataCreate(NULL, (UInt8*) result, mDigest->DigestLength()); SendAttribute(kSecTransformOutputAttributeName, resultRef); CFRelease(resultRef); // send the EOS SendAttribute(kSecTransformOutputAttributeName, NULL); } else { // if we got an error, just pass it on CFTypeID valueType = CFGetTypeID(value); if (valueType == CFErrorGetTypeID()) { SendAttribute(kSecTransformOutputAttributeName, value); } else if (valueType != CFDataGetTypeID()) { CFStringRef idType = CFCopyTypeIDDescription(valueType); CFErrorRef result = CreateSecTransformErrorRef(kSecTransformErrorInvalidType, "value is not a CFDataRef -- it's a %@ instead", idType); CFRelease(idType); SetAttributeNoCallback(kSecTransformOutputAttributeName, result); } else { CFDataRef valueRef = (CFDataRef) value; mDigest->Update(CFDataGetBytePtr(valueRef), CFDataGetLength(valueRef)); } } } }
void PrintCFTypeInternalFormat(CFTypeRef value, uint32_t depth) { bool foundType = false; CFStringRef valueType = CFCopyTypeIDDescription(CFGetTypeID(value)); CFStringRef dictionaryType = CFCopyTypeIDDescription(CFDictionaryGetTypeID()); if (CFStringCompare(valueType, dictionaryType, 0x0) == kCFCompareEqualTo) { foundType = true; printf("{\n"); PrintCFDictionaryInternalFormatting(value, depth+0x1); PrintDepth(depth,"}\n"); } CFSafeRelease(dictionaryType); CFStringRef booleanType = CFCopyTypeIDDescription(CFBooleanGetTypeID()); if (CFStringCompare(valueType, booleanType, 0x0) == kCFCompareEqualTo) { foundType = true; printf("%s\n",(CFBooleanGetValue(value) ? "True" : "False")); } CFSafeRelease(booleanType); CFStringRef stringType = CFCopyTypeIDDescription(CFStringGetTypeID()); if (CFStringCompare(valueType, stringType, 0x0) == kCFCompareEqualTo) { foundType = true; printf("%s\n",(char*)CFStringGetCStringPtr(value,kCFStringEncodingUTF8)); } CFSafeRelease(stringType); CFStringRef numberType = CFCopyTypeIDDescription(CFNumberGetTypeID()); if (CFStringCompare(valueType, numberType, 0x0) == kCFCompareEqualTo) { foundType = true; CFIndex numberType = CFNumberGetType(value); switch (numberType) { case kCFNumberSInt8Type: { SInt8 number; CFNumberGetValue(value, numberType, &number); printf("%hhd\n",number); break; }; case kCFNumberSInt16Type: { SInt16 number; CFNumberGetValue(value, numberType, &number); printf("%hd\n",number); break; }; case kCFNumberSInt32Type: { SInt32 number; CFNumberGetValue(value, numberType, &number); printf("%d\n",(int32_t)number); break; }; case kCFNumberSInt64Type: { SInt64 number; CFNumberGetValue(value, numberType, &number); printf("%lld\n",number); break; }; case kCFNumberFloat32Type: { Float32 number; CFNumberGetValue(value, numberType, &number); printf("%.f\n",number); break; }; case kCFNumberFloat64Type: { Float64 number; CFNumberGetValue(value, numberType, &number); printf("%.f\n",number); break; }; case kCFNumberCharType: { char number; CFNumberGetValue(value, numberType, &number); printf("%c\n",number); break; }; case kCFNumberShortType: { short number; CFNumberGetValue(value, numberType, &number); printf("%hd\n",number); break; }; case kCFNumberIntType: { int number; CFNumberGetValue(value, numberType, &number); printf("%d\n",number); break; }; case kCFNumberLongType: { long number; CFNumberGetValue(value, numberType, &number); printf("%ld\n",number); break; }; case kCFNumberLongLongType: { long long number; CFNumberGetValue(value, numberType, &number); printf("%qd\n",number); break; }; case kCFNumberFloatType: { float number; CFNumberGetValue(value, numberType, &number); printf("%.f\n",number); break; }; case kCFNumberDoubleType: { double number; CFNumberGetValue(value, numberType, &number); printf("%.f\n",number); break; }; case kCFNumberCFIndexType: { CFIndex number; CFNumberGetValue(value, numberType, &number); printf("%ld\n",number); break; }; case kCFNumberNSIntegerType: { NSInteger number; CFNumberGetValue(value, numberType, &number); printf("%ld\n",(long)number); break; }; case kCFNumberCGFloatType: { CGFloat number; CFNumberGetValue(value, numberType, &number); printf("%.f\n",number); break; }; default: { break; }; } } CFSafeRelease(numberType); CFStringRef arrayType = CFCopyTypeIDDescription(CFArrayGetTypeID()); if (CFStringCompare(valueType, arrayType, 0x0) == kCFCompareEqualTo) { foundType = true; CFIndex count = CFArrayGetCount(value); printf("[\n"); for (CFIndex i = 0x0; i < count; i++) { CFTypeRef item = CFArrayGetValueAtIndex(value, i); PrintDepth(depth+0x1,""); PrintCFTypeInternalFormat(item, depth+0x1); } PrintDepth(depth,"]\n"); } CFSafeRelease(arrayType); if (!foundType) { CFStringRef description = CFCopyDescription(value); printf("%s\n",(char*)CFStringGetCStringPtr(description,kCFStringEncodingUTF8)); CFSafeRelease(description); } CFSafeRelease(valueType); }
void PrintCFDictionaryInternalFormatting(CFDictionaryRef dictionary, uint32_t depth) { CFIndex keyCount = CFDictionaryGetCount(dictionary); Pointer keys[keyCount]; Pointer values[keyCount]; CFDictionaryGetKeysAndValues(dictionary, PtrCast(keys,const void**), PtrCast(values,const void**)); for (uint32_t i = 0x0; i < keyCount; i++) { CFStringRef key = PtrCast(keys[i],CFStringRef); CFTypeRef value = PtrCast(values[i],CFTypeRef); PrintDepth(depth,"%s: ",(char*)CFStringGetCStringPtr(key,kCFStringEncodingUTF8)); CFStringRef valueType = CFCopyTypeIDDescription(CFGetTypeID(value)); if (CFStringCompare(valueType, CFCopyTypeIDDescription(CFDictionaryGetTypeID()), 0x0) == kCFCompareEqualTo) { printf("\n"); PrintCFDictionaryInternalFormatting(value, depth+0x1); printf("\n"); } if (CFStringCompare(valueType, CFCopyTypeIDDescription(CFBooleanGetTypeID()), 0x0) == kCFCompareEqualTo) { printf("%s\n",(CFBooleanGetValue(value) ? "True" : "False")); } if (CFStringCompare(valueType, CFCopyTypeIDDescription(CFStringGetTypeID()), 0x0) == kCFCompareEqualTo) { printf("%s\n",(char*)CFStringGetCStringPtr(value,kCFStringEncodingUTF8)); } if (CFStringCompare(valueType, CFCopyTypeIDDescription(CFNumberGetTypeID()), 0x0) == kCFCompareEqualTo) { CFIndex numberType = CFNumberGetType(value); switch (numberType) { case kCFNumberSInt8Type: { SInt8 number; CFNumberGetValue(value, numberType, &number); printf("%hhd\n",number); break; }; case kCFNumberSInt16Type: { SInt16 number; CFNumberGetValue(value, numberType, &number); printf("%hd\n",number); break; }; case kCFNumberSInt32Type: { SInt32 number; CFNumberGetValue(value, numberType, &number); printf("%dz\n",number); break; }; case kCFNumberSInt64Type: { SInt64 number; CFNumberGetValue(value, numberType, &number); printf("%lldz\n",number); break; }; case kCFNumberFloat32Type: { Float32 number; CFNumberGetValue(value, numberType, &number); printf("%.f\n",number); break; }; case kCFNumberFloat64Type: { Float64 number; CFNumberGetValue(value, numberType, &number); printf("%.f\n",number); break; }; case kCFNumberCharType: { char number; CFNumberGetValue(value, numberType, &number); printf("%c\n",number); break; }; case kCFNumberShortType: { short number; CFNumberGetValue(value, numberType, &number); printf("%hd\n",number); break; }; case kCFNumberIntType: { int number; CFNumberGetValue(value, numberType, &number); printf("%dz\n",number); break; }; case kCFNumberLongType: { long number; CFNumberGetValue(value, numberType, &number); printf("%ldz\n",number); break; }; case kCFNumberLongLongType: { long long number; CFNumberGetValue(value, numberType, &number); printf("%qdz\n",number); break; }; case kCFNumberFloatType: { float number; CFNumberGetValue(value, numberType, &number); printf("%.f\n",number); break; }; case kCFNumberDoubleType: { double number; CFNumberGetValue(value, numberType, &number); printf("%.f\n",number); break; }; case kCFNumberCFIndexType: { CFIndex number; CFNumberGetValue(value, numberType, &number); printf("%ldz\n",number); break; }; case kCFNumberNSIntegerType: { NSInteger number; CFNumberGetValue(value, numberType, &number); printf("%ldz\n",number); break; }; case kCFNumberCGFloatType: { CGFloat number; CFNumberGetValue(value, numberType, &number); printf("%.f\n",number); break; }; default: { break; }; } } } }