1use 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 {}