// CFDictionaryToMap converts CFDictionaryRef to a map. func CFDictionaryToMap(cfDict C.CFDictionaryRef) (m map[C.CFTypeRef]C.CFTypeRef) { count := C.CFDictionaryGetCount(cfDict) if count > 0 { keys := make([]C.CFTypeRef, count) values := make([]C.CFTypeRef, count) C.CFDictionaryGetKeysAndValues(cfDict, (*unsafe.Pointer)(&keys[0]), (*unsafe.Pointer)(&values[0])) m = make(map[C.CFTypeRef]C.CFTypeRef, count) for i := C.CFIndex(0); i < count; i++ { m[keys[i]] = values[i] } } return }
func convertCFDictionaryToMapHelper(cfDict C.CFDictionaryRef, helper func(key string, value cfTypeRef, count int) error) error { count := int(C.CFDictionaryGetCount(cfDict)) if count == 0 { return nil } cfKeys := make([]cfTypeRef, count) cfVals := make([]cfTypeRef, count) C.CFDictionaryGetKeysAndValues(cfDict, (*unsafe.Pointer)(&cfKeys[0]), (*unsafe.Pointer)(&cfVals[0])) for i := 0; i < count; i++ { cfKey := cfKeys[i] typeId := C.CFGetTypeID(C.CFTypeRef(cfKey)) if typeId != C.CFStringGetTypeID() { return &UnsupportedKeyTypeError{int(typeId)} } key := convertCFStringToString(C.CFStringRef(cfKey)) if err := helper(key, cfVals[i], count); err != nil { return err } } return nil }