static int dictionary_set(st_data_t key, st_data_t value, CFMutableDictionaryRef dict) { CFStringRef keyRef = str_to_cfstr(key); CFTypeRef valueRef = NULL; if (TYPE(value) == T_HASH) { valueRef = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); rb_hash_foreach(value, dictionary_set, (st_data_t)valueRef); } else if (TYPE(value) == T_ARRAY) { long i, count = RARRAY_LEN(value); valueRef = CFArrayCreateMutable(NULL, count, &kCFTypeArrayCallBacks); for (i = 0; i < count; i++) { VALUE element = RARRAY_PTR(value)[i]; CFTypeRef elementRef = NULL; if (TYPE(element) == T_HASH) { elementRef = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); rb_hash_foreach(element, dictionary_set, (st_data_t)elementRef); } else { // otherwise coerce to string elementRef = str_to_cfstr(element); } CFArrayAppendValue((CFMutableArrayRef)valueRef, elementRef); CFRelease(elementRef); } } else if (value == Qtrue) { valueRef = kCFBooleanTrue; } else if (value == Qfalse) { valueRef = kCFBooleanFalse; } else { valueRef = str_to_cfstr(value); } if (valueRef == NULL) { rb_raise(rb_eTypeError, "Unable to convert value of key `%s'.", RSTRING_PTR(rb_inspect(key))); } CFDictionaryAddValue(dict, keyRef, valueRef); CFRelease(keyRef); CFRelease(valueRef); return ST_CONTINUE; }
static int dictionary_set(st_data_t key, st_data_t value, CFMutableDictionaryRef dict) { CFStringRef keyRef = str_to_cfstr(key); CFTypeRef valueRef = NULL; if (TYPE(value) == T_HASH) { valueRef = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); rb_hash_foreach(value, dictionary_set, (st_data_t)valueRef); } else if (TYPE(value) == T_ARRAY) { long i, count = RARRAY_LEN(value); valueRef = CFArrayCreateMutable(NULL, count, &kCFTypeArrayCallBacks); for (i = 0; i < count; i++) { VALUE element = RARRAY_PTR(value)[i]; CFTypeRef elementRef = NULL; if (TYPE(element) == T_HASH) { elementRef = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); rb_hash_foreach(element, dictionary_set, (st_data_t)elementRef); } else { // otherwise coerce to string elementRef = str_to_cfstr(element); } CFArrayAppendValue((CFMutableArrayRef)valueRef, elementRef); CFRelease(elementRef); } } else { valueRef = str_to_cfstr(value); } CFDictionaryAddValue(dict, keyRef, valueRef); CFRelease(keyRef); CFRelease(valueRef); return ST_CONTINUE; }