@@ -7,7 +7,8 @@ use glib::{prelude::*, translate::*};
7
7
#[ cfg( feature = "v2_74" ) ]
8
8
use crate :: FileIOStream ;
9
9
use crate :: {
10
- ffi, Cancellable , File , FileAttributeValue , FileCreateFlags , FileEnumerator , FileQueryInfoFlags ,
10
+ ffi, Cancellable , File , FileAttributeValue , FileCopyFlags , FileCreateFlags , FileEnumerator ,
11
+ FileQueryInfoFlags ,
11
12
} ;
12
13
13
14
impl File {
@@ -357,6 +358,53 @@ pub trait FileExtManual: IsA<File> + Sized {
357
358
) )
358
359
}
359
360
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
+
360
408
#[ doc( alias = "g_file_copy_async" ) ]
361
409
fn copy_async < Q : FnOnce ( Result < ( ) , glib:: Error > ) + ' static > (
362
410
& self ,
@@ -704,32 +752,28 @@ pub trait FileExtManual: IsA<File> + Sized {
704
752
cancellable : Option < & impl IsA < Cancellable > > ,
705
753
progress_callback : Option < Box < dyn FnMut ( bool , u64 , u64 , u64 ) + ' static > > ,
706
754
) -> 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 (
711
757
reporting : glib:: ffi:: gboolean ,
712
758
current_size : u64 ,
713
759
num_dirs : u64 ,
714
760
num_files : u64 ,
715
761
user_data : glib:: ffi:: gpointer ,
716
762
) {
763
+ let progress_callback: & mut Box < dyn FnMut ( bool , u64 , u64 , u64 ) + ' static > =
764
+ & mut * ( user_data as * mut _ ) ;
717
765
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) ;
725
767
}
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 _ )
728
770
} else {
729
771
None
730
772
} ;
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 _ ;
733
777
unsafe {
734
778
let mut disk_usage = mem:: MaybeUninit :: uninit ( ) ;
735
779
let mut num_dirs = mem:: MaybeUninit :: uninit ( ) ;
@@ -740,7 +784,7 @@ pub trait FileExtManual: IsA<File> + Sized {
740
784
flags. into_glib ( ) ,
741
785
cancellable. map ( |p| p. as_ref ( ) ) . to_glib_none ( ) . 0 ,
742
786
progress_callback,
743
- Box :: into_raw ( super_callback0 ) as * mut _ ,
787
+ progress_callback_data ,
744
788
disk_usage. as_mut_ptr ( ) ,
745
789
num_dirs. as_mut_ptr ( ) ,
746
790
num_files. as_mut_ptr ( ) ,
@@ -910,6 +954,54 @@ pub trait FileExtManual: IsA<File> + Sized {
910
954
( fut, Box :: pin ( receiver) )
911
955
}
912
956
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
+
913
1005
#[ cfg( feature = "v2_72" ) ]
914
1006
#[ cfg_attr( docsrs, doc( cfg( feature = "v2_72" ) ) ) ]
915
1007
#[ doc( alias = "g_file_move_async" ) ]
0 commit comments