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