gio/
converter.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use std::{mem, ptr};
4
5use glib::{prelude::*, translate::*};
6
7use crate::{ffi, Converter, ConverterFlags, ConverterResult};
8
9pub trait ConverterExtManual: IsA<Converter> + 'static {
10    #[doc(alias = "g_converter_convert")]
11    fn convert<IN: AsRef<[u8]>, OUT: AsMut<[u8]>>(
12        &self,
13        inbuf: IN,
14        outbuf: OUT,
15        flags: ConverterFlags,
16    ) -> Result<(ConverterResult, usize, usize), glib::Error> {
17        let inbuf: Box<IN> = Box::new(inbuf);
18        let (inbuf_size, inbuf) = {
19            let slice = (*inbuf).as_ref();
20            (slice.len(), slice.as_ptr())
21        };
22        let mut outbuf: Box<OUT> = Box::new(outbuf);
23        let (outbuf_size, outbuf) = {
24            let slice = (*outbuf).as_mut();
25            (slice.len(), slice.as_mut_ptr())
26        };
27        unsafe {
28            let mut bytes_read = mem::MaybeUninit::uninit();
29            let mut bytes_written = mem::MaybeUninit::uninit();
30            let mut error = ptr::null_mut();
31            let ret = ffi::g_converter_convert(
32                self.as_ref().to_glib_none().0,
33                mut_override(inbuf),
34                inbuf_size,
35                outbuf,
36                outbuf_size,
37                flags.into_glib(),
38                bytes_read.as_mut_ptr(),
39                bytes_written.as_mut_ptr(),
40                &mut error,
41            );
42            if error.is_null() {
43                Ok((
44                    from_glib(ret),
45                    bytes_read.assume_init(),
46                    bytes_written.assume_init(),
47                ))
48            } else {
49                Err(from_glib_full(error))
50            }
51        }
52    }
53}
54
55impl<O: IsA<Converter>> ConverterExtManual for O {}