1// package resource wraps operations over GResource 2package gio 3 4// #cgo pkg-config: gio-2.0 glib-2.0 gobject-2.0 5// #include <gio/gio.h> 6// #include <stdlib.h> 7// #include "gresource.go.h" 8import "C" 9import ( 10 "errors" 11 "unsafe" 12) 13 14// ResourceLookupFlags is a representation of GTK's GResourceLookupFlags 15type ResourceLookupFlags int 16 17func (f ResourceLookupFlags) native() C.GResourceLookupFlags { 18 return (C.GResourceLookupFlags)(f) 19} 20 21const ( 22 G_RESOURCE_LOOKUP_FLAGS_NONE ResourceLookupFlags = C.G_RESOURCE_LOOKUP_FLAGS_NONE 23) 24 25// GResource wraps native GResource object 26// 27// See: https://developer.gnome.org/gio/stable/GResource.html 28type GResource *C.GResource 29 30// LoadGResource is a wrapper around g_resource_load() 31// 32// See: https://developer.gnome.org/gio/stable/GResource.html#g-resource-load 33func LoadGResource(path string) (GResource, error) { 34 cpath := C.CString(path) 35 defer C.free(unsafe.Pointer(cpath)) 36 var gerr *C.GError 37 38 resPtr := C.g_resource_load((*C.gchar)(unsafe.Pointer(cpath)), &gerr) 39 if gerr != nil { 40 defer C.g_error_free(gerr) 41 return nil, errors.New(goString(gerr.message)) 42 } 43 44 res := wrapGResource(resPtr) 45 return res, nil 46} 47 48// NewGResourceFromData is a wrapper around g_resource_new_from_data() 49// 50// See: https://developer.gnome.org/gio/stable/GResource.html#g-resource-new-from-data 51func NewGResourceFromData(data []byte) (GResource, error) { 52 arrayPtr := (*C.GBytes)(unsafe.Pointer(&data[0])) 53 var gerr *C.GError 54 resPtr := C.g_resource_new_from_data(arrayPtr, &gerr) 55 if gerr != nil { 56 defer C.g_error_free(gerr) 57 return nil, errors.New(goString(gerr.message)) 58 } 59 60 res := wrapGResource(resPtr) 61 return res, nil 62} 63 64// Register wraps g_resources_register() 65// 66// See: https://developer.gnome.org/gio/stable/GResource.html#g-resources-register 67func RegisterGResource(res GResource) { 68 C.g_resources_register(res) 69} 70 71// Unregister wraps g_resources_unregister() 72// 73// See: https://developer.gnome.org/gio/stable/GResource.html#g-resources-unregister 74func UnregisterGResource(res GResource) { 75 C.g_resources_unregister(res) 76} 77 78// GResourceEnumerateChildren wraps g_resources_enumerate_children() 79// 80// See: https://developer.gnome.org/gio/stable/GResource.html#g-resources-enumerate-children 81func GResourceEnumerateChildren(path string, flags ResourceLookupFlags) ([]string, error) { 82 cpath := C.CString(path) 83 defer C.free(unsafe.Pointer(cpath)) 84 var gerr *C.GError 85 arrChildren := C.g_resources_enumerate_children(cpath, flags.native(), &gerr) 86 if gerr != nil { 87 defer C.g_error_free(gerr) 88 return nil, errors.New(goString(gerr.message)) 89 } 90 91 if arrChildren == nil { 92 return nil, errors.New("unexpected nil pointer from g_resources_enumerate_children") 93 } 94 95 arr := toGoStringArray(arrChildren) 96 return arr, nil 97} 98 99func wrapGResource(resPtr *C.GResource) GResource { 100 res := GResource(resPtr) 101 return res 102} 103