From 4d8578646c7deed70cbc1c7192128af172c9c4c3 Mon Sep 17 00:00:00 2001 From: Mike Fleetwood Date: Sun, 13 Dec 2015 13:20:21 +0000 Subject: [PATCH] Change methods to use Partition pointers locally (#759726) A number of methods in GParted_Core and Win_GParted were using local Partition objects. Change them into pointers so that Partition object polymorphism can be implemented. Bug 759726 - Implement Partition object polymorphism --- src/GParted_Core.cc | 72 ++++++++++++++++++++++++---------------- src/Win_GParted.cc | 81 +++++++++++++++++++++++++++------------------ 2 files changed, 93 insertions(+), 60 deletions(-) diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc index c3b43e60..e76951be 100644 --- a/src/GParted_Core.cc +++ b/src/GParted_Core.cc @@ -2399,29 +2399,34 @@ bool GParted_Core::resize_move( const Partition & partition_old, return resize( partition_old, partition_new, operationdetail ) ; if ( partition_new .get_sector_length() == partition_old .get_sector_length() ) + { return move( partition_old, partition_new, operationdetail ); - - Partition temp ; + } + Partition * temp = NULL; if ( partition_new .get_sector_length() > partition_old .get_sector_length() ) { //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_sector_length() -1 ; + temp = new Partition( partition_new ); + temp->sector_end = temp->sector_start + partition_old.get_sector_length() - 1; } - - if ( partition_new .get_sector_length() < partition_old .get_sector_length() ) + else // ( partition_new.get_sector_length() < partition_old.get_sector_length() ) { //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_sector_length() -1 ; + temp = new Partition( partition_old ); + temp->sector_end = partition_old.sector_start + partition_new.get_sector_length() - 1; } - PartitionAlignment previous_alignment = temp .alignment ; - temp .alignment = ALIGN_STRICT ; - bool succes = resize_move( partition_old, temp, operationdetail ); - temp .alignment = previous_alignment ; + PartitionAlignment previous_alignment = temp->alignment; + temp->alignment = ALIGN_STRICT; + bool success = resize_move( partition_old, *temp, operationdetail ); + temp->alignment = previous_alignment; + if ( success ) + success = resize_move( *temp, partition_new, operationdetail ); - return succes && resize_move( temp, partition_new, operationdetail ); + delete temp; + temp = NULL; + + return success; } return false ; @@ -3191,32 +3196,43 @@ void GParted_Core::rollback_transaction( const Partition & partition_src, if ( total_done > 0 ) { //find out exactly which part of the file system was copied (and to where it was copied).. - Partition temp_src = partition_src ; - Partition temp_dst = partition_dst ; + Partition * temp_src = new Partition( partition_src ); + Partition * temp_dst = new Partition( partition_dst ); + bool rollback_needed = true; if ( partition_dst .sector_start > partition_src .sector_start ) { Sector distance = partition_dst.sector_start - partition_src.sector_start; - temp_src.sector_start = temp_src.sector_end - ( (total_done / temp_src.sector_size) - 1 ) + distance; - temp_dst.sector_start = temp_dst.sector_end - ( (total_done / temp_dst.sector_size) - 1 ) + distance; - if (temp_src.sector_start > temp_src.sector_end) - return; /* nothing has been overwritten yet, so nothing to roll back */ - + temp_src->sector_start = temp_src->sector_end - ( (total_done / temp_src->sector_size) - 1 ) + distance; + temp_dst->sector_start = temp_dst->sector_end - ( (total_done / temp_dst->sector_size) - 1 ) + distance; + if ( temp_src->sector_start > temp_src->sector_end ) + // Nothing has been overwritten yet, so nothing to roll back + rollback_needed = false; } else { Sector distance = partition_src.sector_start - partition_dst.sector_start; - temp_src.sector_end = temp_src.sector_start + ( (total_done / temp_src.sector_size) - 1 ) - distance; - temp_dst.sector_end = temp_dst.sector_start + ( (total_done / temp_dst.sector_size) - 1 ) - distance; - if (temp_src.sector_start > temp_src.sector_end) - return; /* nothing has been overwritten yet, so nothing to roll back */ + temp_src->sector_end = temp_src->sector_start + ( (total_done / temp_src->sector_size) - 1 ) - distance; + temp_dst->sector_end = temp_dst->sector_start + ( (total_done / temp_dst->sector_size) - 1 ) - distance; + if ( temp_src->sector_start > temp_src->sector_end ) + // Nothing has been overwritten yet, so nothing to roll back + rollback_needed = false; } - operationdetail.add_child( OperationDetail( _("roll back last transaction") ) ); - //and copy it back (NOTE the reversed dst and src) - bool succes = copy_filesystem( temp_dst, temp_src, operationdetail .get_last_child(), false ) ; + if ( rollback_needed ) + { + operationdetail.add_child( OperationDetail( _("roll back last transaction") ) ); - operationdetail .get_last_child() .set_status( succes ? STATUS_SUCCES : STATUS_ERROR ) ; + //and copy it back (NOTE the reversed dst and src) + bool success = copy_filesystem( *temp_dst, *temp_src, operationdetail.get_last_child(), false ); + + operationdetail.get_last_child().set_status( success ? STATUS_SUCCES : STATUS_ERROR ); + } + + delete temp_src; + delete temp_dst; + temp_src = NULL; + temp_dst = NULL; } } diff --git a/src/Win_GParted.cc b/src/Win_GParted.cc index ac65f465..08705581 100644 --- a/src/Win_GParted.cc +++ b/src/Win_GParted.cc @@ -1741,7 +1741,8 @@ void Win_GParted::activate_resize() { dialog .hide() ; - Partition part_temp = dialog.Get_New_Partition( devices[current_device].sector_size ); + Partition * part_temp = new Partition( dialog.Get_New_Partition( devices[current_device].sector_size ) ); + // When resizing/moving a partition which already exists on the disk all // possible operations could be pending so only try merging with the // previous operation. @@ -1751,7 +1752,7 @@ void Win_GParted::activate_resize() // it again with the new size and position ( unless it's an EXTENDED ) if ( selected_partition_ptr->status == STAT_NEW && selected_partition_ptr->type != TYPE_EXTENDED ) { - part_temp.status = STAT_NEW; + part_temp->status = STAT_NEW; // On a partition which is pending creation only resize/move and // format operations are possible. These operations are always // mergeable with the pending operation which will create the @@ -1762,9 +1763,12 @@ void Win_GParted::activate_resize() Operation * operation = new OperationResizeMove( devices[current_device], *selected_partition_ptr, - part_temp ); + *part_temp ); operation->icon = render_icon( Gtk::Stock::GOTO_LAST, Gtk::ICON_SIZE_MENU ); + delete part_temp; + part_temp = NULL; + // Display warning if moving a non-extended partition which already exists // on the disk. if ( operation->get_partition_original().status != STAT_NEW && @@ -1828,14 +1832,16 @@ void Win_GParted::activate_paste() { // We don't want the messages, mount points or name of the source // partition for the new partition being created. - Partition part_temp = *copied_partition; - part_temp.messages.clear(); - part_temp.clear_mountpoints(); - part_temp.name.clear(); + Partition * part_temp = new Partition( *copied_partition ); + part_temp->messages.clear(); + part_temp->clear_mountpoints(); + part_temp->name.clear(); Dialog_Partition_Copy dialog( gparted_core.get_fs( copied_partition->filesystem ), *selected_partition_ptr, - part_temp ); + *part_temp ); + delete part_temp; + part_temp = NULL; dialog .set_transient_for( *this ); if ( dialog .run() == Gtk::RESPONSE_OK ) @@ -1864,19 +1870,19 @@ void Win_GParted::activate_paste() shown_dialog = true ; } - Partition partition_new = *selected_partition_ptr; - partition_new .alignment = ALIGN_STRICT ; - partition_new.filesystem = copied_partition->filesystem; - partition_new.set_filesystem_label( copied_partition->get_filesystem_label() ); - partition_new.uuid = copied_partition->uuid; - partition_new.color = copied_partition->color; - Sector new_size = partition_new .get_sector_length() ; + Partition * partition_new = new Partition( *selected_partition_ptr ); + partition_new->alignment = ALIGN_STRICT; + partition_new->filesystem = copied_partition->filesystem; + partition_new->set_filesystem_label( copied_partition->get_filesystem_label() ); + partition_new->uuid = copied_partition->uuid; + partition_new->color = copied_partition->color; + Sector new_size = partition_new->get_sector_length(); if ( copied_partition->get_sector_length() == new_size ) { // Pasting into same size existing partition, therefore only block // copy operation will be performed maintaining the file system // size. - partition_new .set_sector_usage( + partition_new->set_sector_usage( copied_partition->sectors_used + copied_partition->sectors_unused, copied_partition->sectors_unused ); } @@ -1885,18 +1891,21 @@ void Win_GParted::activate_paste() // Pasting into larger existing partition, therefore block copy // followed by file system grow operations (if supported) will be // performed making the file system fill the partition. - partition_new .set_sector_usage( + partition_new->set_sector_usage( new_size, new_size - copied_partition->sectors_used ); } - partition_new .messages .clear() ; + partition_new->messages.clear(); Operation * operation = new OperationCopy( devices[current_device], *selected_partition_ptr, - partition_new, + *partition_new, *copied_partition ); operation ->icon = render_icon( Gtk::Stock::COPY, Gtk::ICON_SIZE_MENU ); + delete partition_new; + partition_new = NULL; + Add_Operation( operation ) ; if ( ! shown_dialog ) @@ -1913,7 +1922,7 @@ void Win_GParted::activate_paste() /*TO TRANSLATORS: looks like The data in /dev/sda3 will be lost if you apply this operation. */ dialog .set_secondary_text( String::ucompose( _( "The data in %1 will be lost if you apply this operation." ), - partition_new .get_path() ) ) ; + selected_partition_ptr->get_path() ) ); dialog .run() ; } } @@ -2646,14 +2655,17 @@ void Win_GParted::activate_label_filesystem() { dialog .hide() ; // Make a duplicate of the selected partition (used in UNDO) - Partition part_temp = *selected_partition_ptr; + Partition * part_temp = new Partition( *selected_partition_ptr ); - part_temp.set_filesystem_label( dialog.get_new_label() ); + part_temp->set_filesystem_label( dialog.get_new_label() ); Operation * operation = new OperationLabelFileSystem( devices[current_device], - *selected_partition_ptr, part_temp ); + *selected_partition_ptr, *part_temp ); operation ->icon = render_icon( Gtk::Stock::EXECUTE, Gtk::ICON_SIZE_MENU ); + delete part_temp; + part_temp = NULL; + Add_Operation( operation ) ; // Try to merge this label file system operation with all previous // operations. @@ -2677,14 +2689,17 @@ void Win_GParted::activate_name_partition() { dialog.hide(); // Make a duplicate of the selected partition (used in UNDO) - Partition part_temp = *selected_partition_ptr; + Partition * part_temp = new Partition( *selected_partition_ptr ); - part_temp.name = dialog.get_new_name(); + part_temp->name = dialog.get_new_name(); Operation * operation = new OperationNamePartition( devices[current_device], - *selected_partition_ptr, part_temp ); + *selected_partition_ptr, *part_temp ); operation->icon = render_icon( Gtk::Stock::EXECUTE, Gtk::ICON_SIZE_MENU ); + delete part_temp; + part_temp = NULL; + Add_Operation( operation ); // Try to merge this name partition operation with all previous // operations. @@ -2721,20 +2736,22 @@ void Win_GParted::activate_change_uuid() } // Make a duplicate of the selected partition (used in UNDO) - Partition part_temp = *selected_partition_ptr; + Partition * part_temp = new Partition( *selected_partition_ptr ); - if ( part_temp .filesystem == GParted::FS_NTFS ) + if ( part_temp->filesystem == FS_NTFS ) //Explicitly ask for half, so that the user will be aware of it //Also, keep this kind of policy out of the NTFS code. - part_temp .uuid = UUID_RANDOM_NTFS_HALF ; + part_temp->uuid = UUID_RANDOM_NTFS_HALF; else - part_temp .uuid = UUID_RANDOM ; - + part_temp->uuid = UUID_RANDOM; Operation * operation = new OperationChangeUUID( devices[current_device], - *selected_partition_ptr, part_temp ); + *selected_partition_ptr, *part_temp ); operation ->icon = render_icon( Gtk::Stock::EXECUTE, Gtk::ICON_SIZE_MENU ); + delete part_temp; + part_temp = NULL; + Add_Operation( operation ) ; // Try to merge this change UUID operation with all previous operations. merge_operations( MERGE_LAST_WITH_ANY );