1use crate::{ffi, InputStream, ResourceLookupFlags};
6use glib::translate::*;
7
8glib::wrapper! {
9 #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
10 pub struct Resource(Shared<ffi::GResource>);
11
12 match fn {
13 ref => |ptr| ffi::g_resource_ref(ptr),
14 unref => |ptr| ffi::g_resource_unref(ptr),
15 type_ => || ffi::g_resource_get_type(),
16 }
17}
18
19impl Resource {
20 #[doc(alias = "g_resource_enumerate_children")]
21 pub fn enumerate_children(
22 &self,
23 path: &str,
24 lookup_flags: ResourceLookupFlags,
25 ) -> Result<Vec<glib::GString>, glib::Error> {
26 unsafe {
27 let mut error = std::ptr::null_mut();
28 let ret = ffi::g_resource_enumerate_children(
29 self.to_glib_none().0,
30 path.to_glib_none().0,
31 lookup_flags.into_glib(),
32 &mut error,
33 );
34 if error.is_null() {
35 Ok(FromGlibPtrContainer::from_glib_full(ret))
36 } else {
37 Err(from_glib_full(error))
38 }
39 }
40 }
41
42 #[doc(alias = "g_resource_get_info")]
43 #[doc(alias = "get_info")]
44 pub fn info(
45 &self,
46 path: &str,
47 lookup_flags: ResourceLookupFlags,
48 ) -> Result<(usize, u32), glib::Error> {
49 unsafe {
50 let mut size = std::mem::MaybeUninit::uninit();
51 let mut flags = std::mem::MaybeUninit::uninit();
52 let mut error = std::ptr::null_mut();
53 let is_ok = ffi::g_resource_get_info(
54 self.to_glib_none().0,
55 path.to_glib_none().0,
56 lookup_flags.into_glib(),
57 size.as_mut_ptr(),
58 flags.as_mut_ptr(),
59 &mut error,
60 );
61 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
62 if error.is_null() {
63 Ok((size.assume_init(), flags.assume_init()))
64 } else {
65 Err(from_glib_full(error))
66 }
67 }
68 }
69
70 #[cfg(feature = "v2_84")]
71 #[cfg_attr(docsrs, doc(cfg(feature = "v2_84")))]
72 #[doc(alias = "g_resource_has_children")]
73 pub fn has_children(&self, path: &str) -> bool {
74 unsafe {
75 from_glib(ffi::g_resource_has_children(
76 self.to_glib_none().0,
77 path.to_glib_none().0,
78 ))
79 }
80 }
81
82 #[doc(alias = "g_resource_lookup_data")]
83 pub fn lookup_data(
84 &self,
85 path: &str,
86 lookup_flags: ResourceLookupFlags,
87 ) -> Result<glib::Bytes, glib::Error> {
88 unsafe {
89 let mut error = std::ptr::null_mut();
90 let ret = ffi::g_resource_lookup_data(
91 self.to_glib_none().0,
92 path.to_glib_none().0,
93 lookup_flags.into_glib(),
94 &mut error,
95 );
96 if error.is_null() {
97 Ok(from_glib_full(ret))
98 } else {
99 Err(from_glib_full(error))
100 }
101 }
102 }
103
104 #[doc(alias = "g_resource_open_stream")]
105 pub fn open_stream(
106 &self,
107 path: &str,
108 lookup_flags: ResourceLookupFlags,
109 ) -> Result<InputStream, glib::Error> {
110 unsafe {
111 let mut error = std::ptr::null_mut();
112 let ret = ffi::g_resource_open_stream(
113 self.to_glib_none().0,
114 path.to_glib_none().0,
115 lookup_flags.into_glib(),
116 &mut error,
117 );
118 if error.is_null() {
119 Ok(from_glib_full(ret))
120 } else {
121 Err(from_glib_full(error))
122 }
123 }
124 }
125
126 #[doc(alias = "g_resource_load")]
127 pub fn load(filename: impl AsRef<std::path::Path>) -> Result<Resource, glib::Error> {
128 unsafe {
129 let mut error = std::ptr::null_mut();
130 let ret = ffi::g_resource_load(filename.as_ref().to_glib_none().0, &mut error);
131 if error.is_null() {
132 Ok(from_glib_full(ret))
133 } else {
134 Err(from_glib_full(error))
135 }
136 }
137 }
138}