@@ -7,7 +7,8 @@ use glib::{prelude::*, translate::*};
77#[ cfg( feature = "v2_74" ) ]
88use crate :: FileIOStream ;
99use crate :: {
10- ffi, Cancellable , File , FileAttributeValue , FileCreateFlags , FileEnumerator , FileQueryInfoFlags ,
10+ ffi, Cancellable , File , FileAttributeValue , FileCopyFlags , FileCreateFlags , FileEnumerator ,
11+ FileQueryInfoFlags ,
1112} ;
1213
1314impl File {
@@ -357,6 +358,53 @@ pub trait FileExtManual: IsA<File> + Sized {
357358 ) )
358359 }
359360
361+ #[ doc( alias = "g_file_copy" ) ]
362+ fn copy (
363+ & self ,
364+ destination : & impl IsA < File > ,
365+ flags : FileCopyFlags ,
366+ cancellable : Option < & impl IsA < Cancellable > > ,
367+ progress_callback : Option < Box < dyn FnMut ( i64 , i64 ) + ' static > > ,
368+ ) -> Result < ( ) , glib:: Error > {
369+ let mut super_callback0 = progress_callback;
370+ let ( progress_callback, progress_callback_data) =
371+ super_callback0
372+ . as_mut ( )
373+ . map_or ( ( None , std:: ptr:: null_mut ( ) ) , |progress_callback| {
374+ unsafe extern "C" fn progress_callback_trampoline (
375+ current_num_bytes : i64 ,
376+ total_num_bytes : i64 ,
377+ user_data : glib:: ffi:: gpointer ,
378+ ) {
379+ let progress_callback: & mut Box < dyn FnMut ( i64 , i64 ) + ' static > =
380+ & mut * ( user_data as * mut _ ) ;
381+ progress_callback ( current_num_bytes, total_num_bytes) ;
382+ }
383+ (
384+ Some ( progress_callback_trampoline as _ ) ,
385+ progress_callback as * mut Box < dyn FnMut ( i64 , i64 ) + ' static > as * mut _ ,
386+ )
387+ } ) ;
388+ unsafe {
389+ let mut error = std:: ptr:: null_mut ( ) ;
390+ let is_ok = ffi:: g_file_copy (
391+ self . as_ref ( ) . to_glib_none ( ) . 0 ,
392+ destination. as_ref ( ) . to_glib_none ( ) . 0 ,
393+ flags. into_glib ( ) ,
394+ cancellable. map ( |p| p. as_ref ( ) ) . to_glib_none ( ) . 0 ,
395+ progress_callback,
396+ progress_callback_data,
397+ & mut error,
398+ ) ;
399+ debug_assert_eq ! ( is_ok == glib:: ffi:: GFALSE , !error. is_null( ) ) ;
400+ if error. is_null ( ) {
401+ Ok ( ( ) )
402+ } else {
403+ Err ( from_glib_full ( error) )
404+ }
405+ }
406+ }
407+
360408 #[ doc( alias = "g_file_copy_async" ) ]
361409 fn copy_async < Q : FnOnce ( Result < ( ) , glib:: Error > ) + ' static > (
362410 & self ,
@@ -704,32 +752,28 @@ pub trait FileExtManual: IsA<File> + Sized {
704752 cancellable : Option < & impl IsA < Cancellable > > ,
705753 progress_callback : Option < Box < dyn FnMut ( bool , u64 , u64 , u64 ) + ' static > > ,
706754 ) -> Result < ( u64 , u64 , u64 ) , glib:: Error > {
707- let progress_callback_data: Box <
708- Option < RefCell < Box < dyn FnMut ( bool , u64 , u64 , u64 ) + ' static > > > ,
709- > = Box :: new ( progress_callback. map ( RefCell :: new) ) ;
710- unsafe extern "C" fn progress_callback_func (
755+ let mut super_callback0 = progress_callback;
756+ unsafe extern "C" fn progress_callback_trampoline (
711757 reporting : glib:: ffi:: gboolean ,
712758 current_size : u64 ,
713759 num_dirs : u64 ,
714760 num_files : u64 ,
715761 user_data : glib:: ffi:: gpointer ,
716762 ) {
763+ let progress_callback: & mut Box < dyn FnMut ( bool , u64 , u64 , u64 ) + ' static > =
764+ & mut * ( user_data as * mut _ ) ;
717765 let reporting = from_glib ( reporting) ;
718- let callback: & Option < RefCell < Box < dyn Fn ( bool , u64 , u64 , u64 ) + ' static > > > =
719- & * ( user_data as * mut _ ) ;
720- if let Some ( ref callback) = * callback {
721- ( * callback. borrow_mut ( ) ) ( reporting, current_size, num_dirs, num_files)
722- } else {
723- panic ! ( "cannot get closure..." )
724- } ;
766+ progress_callback ( reporting, current_size, num_dirs, num_files) ;
725767 }
726- let progress_callback = if progress_callback_data . is_some ( ) {
727- Some ( progress_callback_func as _ )
768+ let progress_callback = if super_callback0 . is_some ( ) {
769+ Some ( progress_callback_trampoline as _ )
728770 } else {
729771 None
730772 } ;
731- let super_callback0: Box < Option < RefCell < Box < dyn FnMut ( bool , u64 , u64 , u64 ) + ' static > > > > =
732- progress_callback_data;
773+ let progress_callback_data = super_callback0
774+ . as_mut ( )
775+ . map_or ( std:: ptr:: null_mut ( ) , |data| data as * mut _ )
776+ as * mut _ ;
733777 unsafe {
734778 let mut disk_usage = mem:: MaybeUninit :: uninit ( ) ;
735779 let mut num_dirs = mem:: MaybeUninit :: uninit ( ) ;
@@ -740,7 +784,7 @@ pub trait FileExtManual: IsA<File> + Sized {
740784 flags. into_glib ( ) ,
741785 cancellable. map ( |p| p. as_ref ( ) ) . to_glib_none ( ) . 0 ,
742786 progress_callback,
743- Box :: into_raw ( super_callback0 ) as * mut _ ,
787+ progress_callback_data ,
744788 disk_usage. as_mut_ptr ( ) ,
745789 num_dirs. as_mut_ptr ( ) ,
746790 num_files. as_mut_ptr ( ) ,
@@ -910,6 +954,54 @@ pub trait FileExtManual: IsA<File> + Sized {
910954 ( fut, Box :: pin ( receiver) )
911955 }
912956
957+ #[ doc( alias = "g_file_move" ) ]
958+ #[ doc( alias = "move" ) ]
959+ fn move_ (
960+ & self ,
961+ destination : & impl IsA < File > ,
962+ flags : FileCopyFlags ,
963+ cancellable : Option < & impl IsA < Cancellable > > ,
964+ progress_callback : Option < Box < dyn FnMut ( i64 , i64 ) + ' static > > ,
965+ ) -> Result < ( ) , glib:: Error > {
966+ let mut super_callback0 = progress_callback;
967+ let ( progress_callback, progress_callback_data) =
968+ super_callback0
969+ . as_mut ( )
970+ . map_or ( ( None , std:: ptr:: null_mut ( ) ) , |progress_callback| {
971+ unsafe extern "C" fn progress_callback_trampoline (
972+ current_num_bytes : i64 ,
973+ total_num_bytes : i64 ,
974+ user_data : glib:: ffi:: gpointer ,
975+ ) {
976+ let progress_callback: & mut Box < dyn FnMut ( i64 , i64 ) + ' static > =
977+ & mut * ( user_data as * mut _ ) ;
978+ progress_callback ( current_num_bytes, total_num_bytes) ;
979+ }
980+ (
981+ Some ( progress_callback_trampoline as _ ) ,
982+ progress_callback as * mut Box < dyn FnMut ( i64 , i64 ) + ' static > as * mut _ ,
983+ )
984+ } ) ;
985+ unsafe {
986+ let mut error = std:: ptr:: null_mut ( ) ;
987+ let is_ok = ffi:: g_file_move (
988+ self . as_ref ( ) . to_glib_none ( ) . 0 ,
989+ destination. as_ref ( ) . to_glib_none ( ) . 0 ,
990+ flags. into_glib ( ) ,
991+ cancellable. map ( |p| p. as_ref ( ) ) . to_glib_none ( ) . 0 ,
992+ progress_callback,
993+ progress_callback_data,
994+ & mut error,
995+ ) ;
996+ debug_assert_eq ! ( is_ok == glib:: ffi:: GFALSE , !error. is_null( ) ) ;
997+ if error. is_null ( ) {
998+ Ok ( ( ) )
999+ } else {
1000+ Err ( from_glib_full ( error) )
1001+ }
1002+ }
1003+ }
1004+
9131005 #[ cfg( feature = "v2_72" ) ]
9141006 #[ cfg_attr( docsrs, doc( cfg( feature = "v2_72" ) ) ) ]
9151007 #[ doc( alias = "g_file_move_async" ) ]
0 commit comments