From d23ca9d8ea1c538835cc9f7bcd2ccc319e6fa82f Mon Sep 17 00:00:00 2001 From: Bart Hakvoort Date: Sun, 27 Aug 2006 08:41:25 +0000 Subject: [PATCH] ^) restructured resize_move() to be more robust. This will hopefully * happy 24th birthday Johannes! :^) * include/GParted_Core.h, src/GParted_Core.cc: restructured resize_move() to be more robust. This will hopefully tackle a couple of issues which came up during the public testing. --- ChangeLog | 10 +++++- include/GParted_Core.h | 3 +- src/GParted_Core.cc | 77 ++++++++++++++++++++++-------------------- 3 files changed, 51 insertions(+), 39 deletions(-) diff --git a/ChangeLog b/ChangeLog index c6385950..14bcdabc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,12 @@ -2006-08-24 Bart Hakvoort +2006-08-27 Bart Hakvoort + + * happy 24th birthday Johannes! :^) + * include/GParted_Core.h, + src/GParted_Core.cc: restructured resize_move() to be more robust. + This will hopefully tackle a couple of issues which came up during + the public testing. + +2006-08-25 Bart Hakvoort * include/GParted_Core.h, src/GParted_Core.cc: improvements to probe and copy stuff. diff --git a/include/GParted_Core.h b/include/GParted_Core.h index 080ec671..b40b2df3 100644 --- a/include/GParted_Core.h +++ b/include/GParted_Core.h @@ -151,8 +151,7 @@ private: Glib::ustring & error_message ) ; bool calculate_exact_geom( const Partition & partition_old, Partition & partition_new, - OperationDetail & operationdetail, - Sector min_size = -1 ) ; + OperationDetail & operationdetail ) ; bool set_proper_filesystem( const FILESYSTEM & filesystem ) ; bool wait_for_node( const Glib::ustring & node ) ; bool erase_filesystem_signatures( const Partition & partition ) ; diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc index 4b103b64..052355d6 100644 --- a/src/GParted_Core.cc +++ b/src/GParted_Core.cc @@ -1074,40 +1074,37 @@ bool GParted_Core::resize_move( const Device & device, Partition & partition_new, OperationDetail & operationdetail ) { - if ( calculate_exact_geom( partition_old, partition_new, operationdetail ) ) + if ( partition_new .strict || calculate_exact_geom( partition_old, partition_new, operationdetail ) ) { - //extended is a special case.. - if ( partition_old .type == GParted::TYPE_EXTENDED ) + if ( partition_old .type == TYPE_EXTENDED ) return resize_move_partition( partition_old, partition_new, operationdetail ) ; - - //see if we need move or resize.. + if ( partition_new .sector_start == partition_old .sector_start ) return resize( partition_old, partition_new, operationdetail ) ; - else if ( partition_new .get_length() > partition_old .get_length() ) + + if ( partition_new .get_length() == partition_old .get_length() ) + return move( device, partition_old, partition_new, operationdetail ) ; + + Partition temp ; + if ( partition_new .get_length() > partition_old .get_length() ) { - //first move, then grow... - Partition temp = partition_new ; + //first move, then grow. Since old.length < new.length and new.start is valid, temp is valid. + temp = partition_new ; temp .sector_end = temp .sector_start + partition_old .get_length() -1 ; - - return calculate_exact_geom( partition_old, temp, operationdetail, temp .get_length() ) && - move( device, partition_old, temp, operationdetail ) && - resize( temp, partition_new, operationdetail ) ; } - else if ( partition_new .get_length() < partition_old .get_length() ) + + if ( partition_new .get_length() < partition_old .get_length() ) { - //first shrink, then move.. - Partition temp = partition_old ; + //first shrink, then move. Since new.length < old.length and old.start is valid, temp is valid. + temp = partition_old ; temp .sector_end = partition_old .sector_start + partition_new .get_length() -1 ; - - return calculate_exact_geom( partition_old, temp, operationdetail ) && - resize( partition_old, temp, operationdetail ) && - calculate_exact_geom( temp, partition_new, operationdetail, temp .get_length() ) && - move( device, temp, partition_new, operationdetail ) ; } - else - return calculate_exact_geom( - partition_old, partition_new, operationdetail, partition_old .get_length() ) && - move( device, partition_old, partition_new, operationdetail ) ; + + temp .strict = true ; + bool succes = resize_move( device, partition_old, temp, operationdetail ) ; + temp .strict = false ; + + return succes && resize_move( device, temp, partition_new, operationdetail ) ; } return false ; @@ -1118,6 +1115,14 @@ bool GParted_Core::move( const Device & device, const Partition & partition_new, OperationDetail & operationdetail ) { + if ( partition_old .get_length() != partition_new .get_length() ) + { + operationdetail .add_child( OperationDetail( + _("moving requires old and new length to be the same"), STATUS_ERROR, FONT_ITALIC ) ) ; + + return false ; + } + return check_repair_filesystem( partition_old, operationdetail ) && move_filesystem( partition_old, partition_new, operationdetail ) && resize_move_partition( partition_old, partition_new, operationdetail ) && @@ -1230,6 +1235,14 @@ bool GParted_Core::resize( const Partition & partition_old, const Partition & partition_new, OperationDetail & operationdetail ) { + if ( partition_old .sector_start != partition_new .sector_start ) + { + operationdetail .add_child( OperationDetail( + _("resizing requires old and new start to be the same"), STATUS_ERROR, FONT_ITALIC ) ) ; + + return false ; + } + bool succes = false ; if ( check_repair_filesystem( partition_new, operationdetail ) ) { @@ -1401,7 +1414,7 @@ bool GParted_Core::resize_move_partition( const Partition & partition_old, FONT_ITALIC ) ) ; } - operationdetail .get_last_child() .set_status( return_value ? STATUS_SUCCES : STATUS_ERROR ) ; + operationdetail .get_last_child() .set_status( return_value ? STATUS_SUCCES : STATUS_ERROR ) ; return return_value ; } @@ -1454,7 +1467,7 @@ bool GParted_Core::resize_filesystem( const Partition & partition_old, break ; } - operationdetail .get_last_child() .set_status( succes ? STATUS_SUCCES : STATUS_ERROR ) ; + operationdetail .get_last_child() .set_status( succes ? STATUS_SUCCES : STATUS_ERROR ) ; return succes ; } @@ -1519,7 +1532,7 @@ bool GParted_Core::copy( const Partition & partition_src, break ; } - operationdetail .get_last_child() .set_status( succes ? STATUS_SUCCES : STATUS_ERROR ) ; + operationdetail .get_last_child() .set_status( succes ? STATUS_SUCCES : STATUS_ERROR ) ; return ( succes && check_repair_filesystem( partition_dest, operationdetail ) && @@ -1864,16 +1877,11 @@ bool GParted_Core::copy_block( PedDevice * lp_device_src, bool GParted_Core::calculate_exact_geom( const Partition & partition_old, Partition & partition_new, - OperationDetail & operationdetail, - Sector min_size ) + OperationDetail & operationdetail ) { operationdetail .add_child( OperationDetail( String::ucompose( _("calculate new size and position of %1"), partition_new .get_path() ) ) ) ; - if ( min_size >= 0 ) - operationdetail .get_last_child() .add_child( - OperationDetail( String::ucompose( _("minimum size: %1"), min_size ), STATUS_NONE ) ) ; - operationdetail .get_last_child() .add_child( OperationDetail( String::ucompose( _("requested start: %1"), partition_new .sector_start ) + "\n" + @@ -1901,9 +1909,6 @@ bool GParted_Core::calculate_exact_geom( const Partition & partition_old, if ( constraint ) { - if ( min_size >= 0 ) - constraint ->min_size = min_size ; - //FIXME: if we insert a weird partitionnew geom here (e.g. start > end) //ped_disk_set_partition_geom() will still return true (althoug an lp exception is written //to stdout.. see if this also affect create_partition and resize_move_partition