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