in wrap.go [105:136]
func cfStringToGoString(cfs C.CFStringRef) string {
if cfs == nullCFStringRef {
return ""
}
cfStr := copyCFString(cfs)
length := C.CFStringGetLength(cfStr)
if length == 0 {
// short-cut for empty strings
return ""
}
cfRange := C.CFRange{0, length}
enc := C.CFStringEncoding(C.kCFStringEncodingUTF8)
// first find the buffer size necessary
var usedBufLen C.CFIndex
if C.CFStringGetBytes(cfStr, cfRange, enc, 0, C.false, nil, 0, &usedBufLen) == 0 {
return ""
}
bs := make([]byte, usedBufLen)
buf := (*C.UInt8)(unsafe.Pointer(&bs[0]))
if C.CFStringGetBytes(cfStr, cfRange, enc, 0, C.false, buf, usedBufLen, nil) == 0 {
return ""
}
// Create a string (byte array) backed by C byte array
header := (*reflect.SliceHeader)(unsafe.Pointer(&bs))
strHeader := &reflect.StringHeader{
Data: header.Data,
Len: header.Len,
}
return *(*string)(unsafe.Pointer(strHeader))
}