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