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