1package glib 2 3// #include <gio/gio.h> 4// #include <glib.h> 5// #include <glib-object.h> 6// #include "glib.go.h" 7import "C" 8import ( 9 "errors" 10 "unsafe" 11) 12 13// IAsyncResult is an interface representation of AsyncResult, 14// used to avoid duplication when embedding the type in a wrapper of another GObject-based type. 15type IAsyncResult interface { 16 GetUserData() uintptr 17 GetSourceObject() *Object 18 IsTagged(sourceTag uintptr) bool 19 LegacyPropagateError() error 20} 21 22// AsyncReadyCallback is a representation of GAsyncReadyCallback 23type AsyncReadyCallback func(object *Object, res *AsyncResult) 24 25// AsyncResult is a representation of GIO's GAsyncResult. 26type AsyncResult struct { 27 *Object 28} 29 30// native() returns a pointer to the underlying GAsyncResult. 31func (v *AsyncResult) native() *C.GAsyncResult { 32 if v == nil || v.GObject == nil { 33 return nil 34 } 35 return C.toGAsyncResult(unsafe.Pointer(v.GObject)) 36} 37 38func wrapAsyncResult(obj *Object) *AsyncResult { 39 return &AsyncResult{obj} 40} 41 42// GetUserData is a wrapper around g_async_result_get_user_data() 43func (v *AsyncResult) GetUserData() uintptr { 44 c := C.g_async_result_get_user_data(v.native()) 45 return uintptr(unsafe.Pointer(c)) 46} 47 48// GetSourceObject is a wrapper around g_async_result_get_source_object 49func (v *AsyncResult) GetSourceObject() *Object { 50 obj := C.g_async_result_get_source_object(v.native()) 51 if obj == nil { 52 return nil 53 } 54 return wrapObject(unsafe.Pointer(obj)) 55} 56 57// IsTagged is a wrapper around g_async_result_is_tagged 58func (v *AsyncResult) IsTagged(sourceTag uintptr) bool { 59 c := C.g_async_result_is_tagged(v.native(), C.gpointer(sourceTag)) 60 return gobool(c) 61} 62 63// LegacyPropagateError is a wrapper around g_async_result_legacy_propagate_error 64func (v *AsyncResult) LegacyPropagateError() error { 65 var err *C.GError 66 c := C.g_async_result_legacy_propagate_error(v.native(), &err) 67 isSimpleAsyncResult := gobool(c) 68 if isSimpleAsyncResult { 69 defer C.g_error_free(err) 70 return errors.New(C.GoString((*C.char)(err.message))) 71 } 72 return nil 73} 74