Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- fn extract<P: IsA<gio::File>, Q: IsA<gio::Cancellable>>(
- &self,
- path: Option<&P>,
- file_callback: Option<&mut dyn (FnMut(&File) -> bool)>,
- progress_callback: Option<&mut dyn (FnMut(i64, i64))>,
- cancellable: Option<&Q>,
- ) -> Result<(), Error> {
- let file_callback_data: &Option<&mut dyn (FnMut(&File) -> bool)> = &file_callback;
- unsafe extern "C" fn file_callback_func<P: IsA<gio::File>, Q: IsA<gio::Cancellable>>(file: *mut gcab_sys::GCabFile, user_data: glib_sys::gpointer) -> glib_sys::gboolean {
- let file = from_glib_borrow(file);
- let callback: Box_<(Option<&mut dyn (FnMut(&File) -> bool)>, Option<&mut dyn (FnMut(i64, i64))>)> = *(user_data as *mut _);
- let res = if let Some(ref mut callback) = (*callback).0 {
- callback(&file)
- } else {
- panic!("cannot get closure...")
- };
- res.to_glib()
- }
- let file_callback = if file_callback_data.is_some() { Some(file_callback_func::<P, Q> as _) } else { None };
- let progress_callback_data: &Option<&mut dyn (FnMut(i64, i64))> = &progress_callback;
- unsafe extern "C" fn progress_callback_func<P: IsA<gio::File>, Q: IsA<gio::Cancellable>>(current_num_bytes: i64, total_num_bytes: i64, user_data: glib_sys::gpointer) {
- let callback: Box_<(Option<&mut dyn (FnMut(&File) -> bool)>, Option<&mut dyn (FnMut(i64, i64))>)> = *(user_data as *mut _);
- if let Some(ref mut callback) = (*callback).1 {
- callback(current_num_bytes, total_num_bytes)
- } else {
- panic!("cannot get closure...")
- };
- }
- let progress_callback = if progress_callback_data.is_some() { Some(progress_callback_func::<P, Q> as _) } else { None };
- let super_callback0: Box_<(Option<&mut dyn (FnMut(&File) -> bool)>, Option<&mut dyn (FnMut(i64, i64))>)> = Box_::new(Box_::new((file_callback_data, progress_callback_data)));
- unsafe {
- let mut error = ptr::null_mut();
- let _ = gcab_sys::gcab_cabinet_extract(self.as_ref().to_glib_none().0, path.map(|p| p.as_ref()).to_glib_none().0, file_callback, progress_callback, super_callback0 as *const _ a\
- s usize as *mut _, cancellable.map(|p| p.as_ref()).to_glib_none().0, &mut error);
- if error.is_null() { Ok(()) } else { Err(from_glib_full(error)) }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement