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