1 use gio_sys;
2 use glib::object::IsA;
3 use glib::translate::*;
4 use std::mem;
5 use std::ptr;
6 use Converter;
7 use ConverterFlags;
8 use ConverterResult;
9 
10 pub trait ConverterExtManual {
convert<IN: AsRef<[u8]>, OUT: AsMut<[u8]>>( &self, inbuf: IN, outbuf: OUT, flags: ConverterFlags, ) -> Result<(ConverterResult, usize, usize), glib::Error>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 }
18 
19 impl<O: IsA<Converter>> ConverterExtManual for O {
convert<IN: AsRef<[u8]>, OUT: AsMut<[u8]>>( &self, inbuf: IN, outbuf: OUT, flags: ConverterFlags, ) -> Result<(ConverterResult, usize, usize), glib::Error>20     fn convert<IN: AsRef<[u8]>, OUT: AsMut<[u8]>>(
21         &self,
22         inbuf: IN,
23         outbuf: OUT,
24         flags: ConverterFlags,
25     ) -> Result<(ConverterResult, usize, usize), glib::Error> {
26         let inbuf: Box<IN> = Box::new(inbuf);
27         let (inbuf_size, inbuf) = {
28             let slice = (*inbuf).as_ref();
29             (slice.len(), slice.as_ptr())
30         };
31         let mut outbuf: Box<OUT> = Box::new(outbuf);
32         let (outbuf_size, outbuf) = {
33             let slice = (*outbuf).as_mut();
34             (slice.len(), slice.as_mut_ptr())
35         };
36         unsafe {
37             let mut bytes_read = mem::MaybeUninit::uninit();
38             let mut bytes_written = mem::MaybeUninit::uninit();
39             let mut error = ptr::null_mut();
40             let ret = gio_sys::g_converter_convert(
41                 self.as_ref().to_glib_none().0,
42                 mut_override(inbuf),
43                 inbuf_size,
44                 outbuf,
45                 outbuf_size,
46                 flags.to_glib(),
47                 bytes_read.as_mut_ptr(),
48                 bytes_written.as_mut_ptr(),
49                 &mut error,
50             );
51             if error.is_null() {
52                 Ok((
53                     from_glib(ret),
54                     bytes_read.assume_init(),
55                     bytes_written.assume_init(),
56                 ))
57             } else {
58                 Err(from_glib_full(error))
59             }
60         }
61     }
62 }
63