func (c *osxCollator) init(locale string) { l := C.CFStringCreateWithBytes( nil, osxUInt8P([]byte(locale)), C.CFIndex(len(locale)), C.kCFStringEncodingUTF8, C.Boolean(0), ) c.loc = C.CFLocaleCreate(nil, l) }
func (c osx8Collator) Compare(a, b Input) int { sa := C.CFStringCreateWithBytesNoCopy( nil, osxUInt8P(a.UTF8), C.CFIndex(len(a.UTF8)), C.kCFStringEncodingUTF8, C.Boolean(0), nil, ) sb := C.CFStringCreateWithBytesNoCopy( nil, osxUInt8P(b.UTF8), C.CFIndex(len(b.UTF8)), C.kCFStringEncodingUTF8, C.Boolean(0), nil, ) _range := C.CFRangeMake(0, C.CFStringGetLength(sa)) return int(C.CFStringCompareWithOptionsAndLocale(sa, sb, _range, c.opt, c.loc)) }
func getCFDictValueRef(dict C.CFDictionaryRef, key C.CFTypeRef) (C.CFTypeRef, error) { var retVal C.CFTypeRef exist := C.CFDictionaryGetValueIfPresent(dict, unsafe.Pointer(key), (*unsafe.Pointer)(retVal)) // log.Debugf("retVal: %#v", retVal) if exist == C.Boolean(0) { return nil, errors.New("getCFDictValueRef: Key doesn't exist") } // return retVal, nil return (C.CFTypeRef)(C.CFDictionaryGetValue(dict, unsafe.Pointer(key))), nil }
func getCFDictValueUTF8String(dict C.CFDictionaryRef, key C.CFTypeRef) (string, error) { valCFStringRef, err := getCFDictValueCFStringRef(dict, key) if err != nil { return "", err } log.Debugf("valCFStringRef: %#v", valCFStringRef) if valCFStringRef == nil { return "", errors.New("getCFDictValueUTF8String: Nil value") } strLen := C.CFStringGetLength(valCFStringRef) log.Debugf("strLen: %d", strLen) charUTF8Len := C.CFStringGetMaximumSizeForEncoding(strLen, C.kCFStringEncodingUTF8) + 1 log.Debugf("charUTF8Len: %d", charUTF8Len) cstrBytes := make([]byte, charUTF8Len, charUTF8Len) if C.Boolean(0) == C.CFStringGetCString(valCFStringRef, (*C.char)(unsafe.Pointer(&cstrBytes[0])), charUTF8Len, C.kCFStringEncodingUTF8) { return "", errors.New("getCFDictValueUTF8String: CFStringGetCString: failed to convert value to string") } return C.GoString((*C.char)(unsafe.Pointer(&cstrBytes[0]))), nil }
// Start creates a FSEventStream for the given path and schedules it with // global runloop. It's a nop if the stream was already started. func (s *stream) Start() error { if s.ref != nilstream { return nil } wg.Wait() p := C.CFStringCreateWithCStringNoCopy(nil, C.CString(s.path), C.kCFStringEncodingUTF8, nil) path := C.CFArrayCreate(nil, (*unsafe.Pointer)(unsafe.Pointer(&p)), 1, nil) ref := C.FSEventStreamCreate(nil, (C.FSEventStreamCallback)(C.gostream), &s.ctx, path, C.FSEventStreamEventId(atomic.LoadUint64(&since)), latency, flags) if ref == nilstream { return errCreate } C.FSEventStreamScheduleWithRunLoop(ref, runloop, C.kCFRunLoopDefaultMode) if C.FSEventStreamStart(ref) == C.Boolean(0) { C.FSEventStreamInvalidate(ref) return errStart } C.CFRunLoopWakeUp(runloop) s.ref = ref return nil }
// The returned SecKeychainRef, if non-nil, must be released via CFRelease. func createKeychain(path string, promptUser bool, password string) (C.SecKeychainRef, error) { pathName := C.CString(path) defer C.free(unsafe.Pointer(pathName)) var kref C.SecKeychainRef var errCode C.OSStatus if promptUser { errCode = C.SecKeychainCreate(pathName, C.UInt32(0), nil, C.Boolean(1), nil, &kref) } else { passwordRef := C.CString(password) defer C.free(unsafe.Pointer(passwordRef)) errCode = C.SecKeychainCreate(pathName, C.UInt32(len(password)), unsafe.Pointer(passwordRef), C.Boolean(0), nil, &kref) } if err := newKeychainError(errCode); err != nil { return nil, err } return kref, nil }
func newKeychain(path, password string, promptUser bool) (Keychain, error) { pathRef := C.CString(path) defer C.free(unsafe.Pointer(pathRef)) var errCode C.OSStatus var kref C.SecKeychainRef if promptUser { errCode = C.SecKeychainCreate(pathRef, C.UInt32(0), nil, C.Boolean(1), nil, &kref) } else { passwordRef := C.CString(password) defer C.free(unsafe.Pointer(passwordRef)) errCode = C.SecKeychainCreate(pathRef, C.UInt32(len(password)), unsafe.Pointer(passwordRef), C.Boolean(0), nil, &kref) } // TODO: Without passing in kref I get 'One or more parameters passed to the function were not valid (-50)' defer Release(C.CFTypeRef(kref)) if err := checkError(errCode); err != nil { return Keychain{}, err } return Keychain{path}, nil }
func NewCFString(s string) C.CFStringRef { s_ := C.CString(s) defer C.free(unsafe.Pointer(s_)) retval := C.CFStringCreateWithBytes( C.CFAllocatorRef(nil), (*C.UInt8)(unsafe.Pointer(s_)), C.CFIndex(len(s)), C.kCFStringEncodingUTF8, C.Boolean(0), ) return retval }