gio/auto/
buffered_input_stream.rs

1// This file was generated by gir (https://github.com/gtk-rs/gir)
2// from gir-files (https://github.com/gtk-rs/gir-files)
3// DO NOT EDIT
4
5use crate::{ffi, AsyncResult, Cancellable, FilterInputStream, InputStream, Seekable};
6use glib::{
7    prelude::*,
8    signal::{connect_raw, SignalHandlerId},
9    translate::*,
10};
11use std::{boxed::Box as Box_, pin::Pin};
12
13glib::wrapper! {
14    #[doc(alias = "GBufferedInputStream")]
15    pub struct BufferedInputStream(Object<ffi::GBufferedInputStream, ffi::GBufferedInputStreamClass>) @extends FilterInputStream, InputStream, @implements Seekable;
16
17    match fn {
18        type_ => || ffi::g_buffered_input_stream_get_type(),
19    }
20}
21
22impl BufferedInputStream {
23    pub const NONE: Option<&'static BufferedInputStream> = None;
24
25    #[doc(alias = "g_buffered_input_stream_new")]
26    pub fn new(base_stream: &impl IsA<InputStream>) -> BufferedInputStream {
27        unsafe {
28            InputStream::from_glib_full(ffi::g_buffered_input_stream_new(
29                base_stream.as_ref().to_glib_none().0,
30            ))
31            .unsafe_cast()
32        }
33    }
34
35    #[doc(alias = "g_buffered_input_stream_new_sized")]
36    pub fn new_sized(base_stream: &impl IsA<InputStream>, size: usize) -> BufferedInputStream {
37        unsafe {
38            InputStream::from_glib_full(ffi::g_buffered_input_stream_new_sized(
39                base_stream.as_ref().to_glib_none().0,
40                size,
41            ))
42            .unsafe_cast()
43        }
44    }
45
46    // rustdoc-stripper-ignore-next
47    /// Creates a new builder-pattern struct instance to construct [`BufferedInputStream`] objects.
48    ///
49    /// This method returns an instance of [`BufferedInputStreamBuilder`](crate::builders::BufferedInputStreamBuilder) which can be used to create [`BufferedInputStream`] objects.
50    pub fn builder() -> BufferedInputStreamBuilder {
51        BufferedInputStreamBuilder::new()
52    }
53}
54
55impl Default for BufferedInputStream {
56    fn default() -> Self {
57        glib::object::Object::new::<Self>()
58    }
59}
60
61// rustdoc-stripper-ignore-next
62/// A [builder-pattern] type to construct [`BufferedInputStream`] objects.
63///
64/// [builder-pattern]: https://doc.rust-lang.org/1.0.0/style/ownership/builders.html
65#[must_use = "The builder must be built to be used"]
66pub struct BufferedInputStreamBuilder {
67    builder: glib::object::ObjectBuilder<'static, BufferedInputStream>,
68}
69
70impl BufferedInputStreamBuilder {
71    fn new() -> Self {
72        Self {
73            builder: glib::object::Object::builder(),
74        }
75    }
76
77    pub fn buffer_size(self, buffer_size: u32) -> Self {
78        Self {
79            builder: self.builder.property("buffer-size", buffer_size),
80        }
81    }
82
83    pub fn base_stream(self, base_stream: &impl IsA<InputStream>) -> Self {
84        Self {
85            builder: self
86                .builder
87                .property("base-stream", base_stream.clone().upcast()),
88        }
89    }
90
91    pub fn close_base_stream(self, close_base_stream: bool) -> Self {
92        Self {
93            builder: self
94                .builder
95                .property("close-base-stream", close_base_stream),
96        }
97    }
98
99    // rustdoc-stripper-ignore-next
100    /// Build the [`BufferedInputStream`].
101    #[must_use = "Building the object from the builder is usually expensive and is not expected to have side effects"]
102    pub fn build(self) -> BufferedInputStream {
103        self.builder.build()
104    }
105}
106
107pub trait BufferedInputStreamExt: IsA<BufferedInputStream> + 'static {
108    #[doc(alias = "g_buffered_input_stream_fill")]
109    fn fill(
110        &self,
111        count: isize,
112        cancellable: Option<&impl IsA<Cancellable>>,
113    ) -> Result<isize, glib::Error> {
114        unsafe {
115            let mut error = std::ptr::null_mut();
116            let ret = ffi::g_buffered_input_stream_fill(
117                self.as_ref().to_glib_none().0,
118                count,
119                cancellable.map(|p| p.as_ref()).to_glib_none().0,
120                &mut error,
121            );
122            if error.is_null() {
123                Ok(ret)
124            } else {
125                Err(from_glib_full(error))
126            }
127        }
128    }
129
130    #[doc(alias = "g_buffered_input_stream_fill_async")]
131    fn fill_async<P: FnOnce(Result<isize, glib::Error>) + 'static>(
132        &self,
133        count: isize,
134        io_priority: glib::Priority,
135        cancellable: Option<&impl IsA<Cancellable>>,
136        callback: P,
137    ) {
138        let main_context = glib::MainContext::ref_thread_default();
139        let is_main_context_owner = main_context.is_owner();
140        let has_acquired_main_context = (!is_main_context_owner)
141            .then(|| main_context.acquire().ok())
142            .flatten();
143        assert!(
144            is_main_context_owner || has_acquired_main_context.is_some(),
145            "Async operations only allowed if the thread is owning the MainContext"
146        );
147
148        let user_data: Box_<glib::thread_guard::ThreadGuard<P>> =
149            Box_::new(glib::thread_guard::ThreadGuard::new(callback));
150        unsafe extern "C" fn fill_async_trampoline<
151            P: FnOnce(Result<isize, glib::Error>) + 'static,
152        >(
153            _source_object: *mut glib::gobject_ffi::GObject,
154            res: *mut crate::ffi::GAsyncResult,
155            user_data: glib::ffi::gpointer,
156        ) {
157            let mut error = std::ptr::null_mut();
158            let ret =
159                ffi::g_buffered_input_stream_fill_finish(_source_object as *mut _, res, &mut error);
160            let result = if error.is_null() {
161                Ok(ret)
162            } else {
163                Err(from_glib_full(error))
164            };
165            let callback: Box_<glib::thread_guard::ThreadGuard<P>> =
166                Box_::from_raw(user_data as *mut _);
167            let callback: P = callback.into_inner();
168            callback(result);
169        }
170        let callback = fill_async_trampoline::<P>;
171        unsafe {
172            ffi::g_buffered_input_stream_fill_async(
173                self.as_ref().to_glib_none().0,
174                count,
175                io_priority.into_glib(),
176                cancellable.map(|p| p.as_ref()).to_glib_none().0,
177                Some(callback),
178                Box_::into_raw(user_data) as *mut _,
179            );
180        }
181    }
182
183    fn fill_future(
184        &self,
185        count: isize,
186        io_priority: glib::Priority,
187    ) -> Pin<Box_<dyn std::future::Future<Output = Result<isize, glib::Error>> + 'static>> {
188        Box_::pin(crate::GioFuture::new(
189            self,
190            move |obj, cancellable, send| {
191                obj.fill_async(count, io_priority, Some(cancellable), move |res| {
192                    send.resolve(res);
193                });
194            },
195        ))
196    }
197
198    #[doc(alias = "g_buffered_input_stream_get_available")]
199    #[doc(alias = "get_available")]
200    fn available(&self) -> usize {
201        unsafe { ffi::g_buffered_input_stream_get_available(self.as_ref().to_glib_none().0) }
202    }
203
204    #[doc(alias = "g_buffered_input_stream_get_buffer_size")]
205    #[doc(alias = "get_buffer_size")]
206    #[doc(alias = "buffer-size")]
207    fn buffer_size(&self) -> usize {
208        unsafe { ffi::g_buffered_input_stream_get_buffer_size(self.as_ref().to_glib_none().0) }
209    }
210
211    #[doc(alias = "g_buffered_input_stream_peek_buffer")]
212    fn peek_buffer(&self) -> Vec<u8> {
213        unsafe {
214            let mut count = std::mem::MaybeUninit::uninit();
215            let ret = FromGlibContainer::from_glib_none_num(
216                ffi::g_buffered_input_stream_peek_buffer(
217                    self.as_ref().to_glib_none().0,
218                    count.as_mut_ptr(),
219                ),
220                count.assume_init() as _,
221            );
222            ret
223        }
224    }
225
226    #[doc(alias = "g_buffered_input_stream_read_byte")]
227    fn read_byte(&self, cancellable: Option<&impl IsA<Cancellable>>) -> Result<i32, glib::Error> {
228        unsafe {
229            let mut error = std::ptr::null_mut();
230            let ret = ffi::g_buffered_input_stream_read_byte(
231                self.as_ref().to_glib_none().0,
232                cancellable.map(|p| p.as_ref()).to_glib_none().0,
233                &mut error,
234            );
235            if error.is_null() {
236                Ok(ret)
237            } else {
238                Err(from_glib_full(error))
239            }
240        }
241    }
242
243    #[doc(alias = "g_buffered_input_stream_set_buffer_size")]
244    #[doc(alias = "buffer-size")]
245    fn set_buffer_size(&self, size: usize) {
246        unsafe {
247            ffi::g_buffered_input_stream_set_buffer_size(self.as_ref().to_glib_none().0, size);
248        }
249    }
250
251    #[doc(alias = "buffer-size")]
252    fn connect_buffer_size_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
253        unsafe extern "C" fn notify_buffer_size_trampoline<
254            P: IsA<BufferedInputStream>,
255            F: Fn(&P) + 'static,
256        >(
257            this: *mut ffi::GBufferedInputStream,
258            _param_spec: glib::ffi::gpointer,
259            f: glib::ffi::gpointer,
260        ) {
261            let f: &F = &*(f as *const F);
262            f(BufferedInputStream::from_glib_borrow(this).unsafe_cast_ref())
263        }
264        unsafe {
265            let f: Box_<F> = Box_::new(f);
266            connect_raw(
267                self.as_ptr() as *mut _,
268                c"notify::buffer-size".as_ptr() as *const _,
269                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
270                    notify_buffer_size_trampoline::<Self, F> as *const (),
271                )),
272                Box_::into_raw(f),
273            )
274        }
275    }
276}
277
278impl<O: IsA<BufferedInputStream>> BufferedInputStreamExt for O {}