From 5098744f9aa958ba18d2a4657ea4345e275c885b Mon Sep 17 00:00:00 2001 From: Mike Fleetwood Date: Sun, 4 Jan 2015 11:29:01 +0000 Subject: [PATCH] Add whole_device flag to the partition object (#743181) Need to be able to take different actions in the GParted_Core partition manipulation methods and in Win_GParted UI methods to deal with libparted supported partitions or whole disk devices without a partition table. Add boolean whole_device to the partition object and set appropriately to allow for this. Bug 743181 - Add unpartitioned drive read-write support --- include/Partition.h | 33 ++++++++++++++------------ src/Dialog_Partition_New.cc | 25 ++++++++++---------- src/Dialog_Rescue_Data.cc | 2 +- src/GParted_Core.cc | 46 ++++++++++++++++++++----------------- src/Operation.cc | 2 +- src/Partition.cc | 39 +++++++++++++++++-------------- src/Win_GParted.cc | 32 ++++++++++++++------------ 7 files changed, 97 insertions(+), 82 deletions(-) diff --git a/include/Partition.h b/include/Partition.h index 132b709b..4419b237 100644 --- a/include/Partition.h +++ b/include/Partition.h @@ -60,16 +60,17 @@ public: void Reset() ; //simple Set-functions. only for convenience, since most members are public - void Set( const Glib::ustring & device_path, - const Glib::ustring & partition, - int partition_number, - PartitionType type, - FILESYSTEM filesystem, - Sector sector_start, - Sector sector_end, - Byte_Value sector_size, - bool inside_extended, - bool busy ) ; + void Set( const Glib::ustring & device_path, + const Glib::ustring & partition, + int partition_number, + PartitionType type, + bool whole_device, + FILESYSTEM filesystem, + Sector sector_start, + Sector sector_end, + Byte_Value sector_size, + bool inside_extended, + bool busy ); void set_sector_usage( Sector sectors_fs_size, Sector sectors_fs_unused ) ; bool sector_usage_known() const ; @@ -79,11 +80,12 @@ public: Sector get_sectors_unallocated() const ; void get_usage_triple( int imax, int & i1, int & i2, int & i3 ) const ; - void Set_Unallocated( const Glib::ustring & device_path, - Sector sector_start, - Sector sector_end, - Byte_Value sector_size, - bool inside_extended ); + void Set_Unallocated( const Glib::ustring & device_path, + bool whole_device, + Sector sector_start, + Sector sector_end, + Byte_Value sector_size, + bool inside_extended ); //update partition number (used when a logical partition is deleted) void Update_Number( int new_number ); @@ -112,6 +114,7 @@ public: Glib::ustring device_path ; int partition_number; PartitionType type;// UNALLOCATED, PRIMARY, LOGICAL, etc... + bool whole_device; // Is this a virtual partition spanning a whole unpartitioned disk device? PartitionStatus status; //STAT_REAL, STAT_NEW, etc.. PartitionAlignment alignment; //ALIGN_CYLINDER, ALIGN_STRICT, etc FILESYSTEM filesystem ; diff --git a/src/Dialog_Partition_New.cc b/src/Dialog_Partition_New.cc index 3f66abf4..cd124078 100644 --- a/src/Dialog_Partition_New.cc +++ b/src/Dialog_Partition_New.cc @@ -193,13 +193,13 @@ Partition Dialog_Partition_New::Get_New_Partition( Byte_Value sector_size ) new_end = selected_partition.sector_end ; part_temp .status = GParted::STAT_NEW ; - part_temp .Set( selected_partition .device_path, - String::ucompose( _("New Partition #%1"), new_count ), - new_count, part_type, - FILESYSTEMS[ optionmenu_filesystem .get_history() ] .filesystem, - new_start, new_end, - sector_size, - selected_partition .inside_extended, false ) ; + part_temp.Set( selected_partition.device_path, + String::ucompose( _("New Partition #%1"), new_count ), + new_count, part_type, selected_partition.whole_device, + FILESYSTEMS[optionmenu_filesystem.get_history()].filesystem, + new_start, new_end, + sector_size, + selected_partition.inside_extended, false ); //Retrieve Label info part_temp.set_filesystem_label( Utils::trim( entry.get_text() ) ); @@ -214,11 +214,12 @@ Partition Dialog_Partition_New::Get_New_Partition( Byte_Value sector_size ) if ( part_temp .type == GParted::TYPE_EXTENDED ) { Partition UNALLOCATED ; - UNALLOCATED .Set_Unallocated( part_temp .device_path, - part_temp .sector_start, - part_temp .sector_end, - sector_size, - true ) ; + UNALLOCATED.Set_Unallocated( part_temp.device_path, + part_temp.whole_device, + part_temp.sector_start, + part_temp.sector_end, + sector_size, + true ); part_temp .logicals .push_back( UNALLOCATED ) ; } diff --git a/src/Dialog_Rescue_Data.cc b/src/Dialog_Rescue_Data.cc index 97542702..956fe958 100644 --- a/src/Dialog_Rescue_Data.cc +++ b/src/Dialog_Rescue_Data.cc @@ -429,7 +429,7 @@ void Dialog_Rescue_Data::read_partitions_from_buffer() } part.Set(dev_path, part_path, part_num, - type, fs, sec_start, sec_end, sec_size, false, false); + type, false, fs, sec_start, sec_end, sec_size, false, false); this->partitions.push_back(part); } diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc index eba8526a..d52ead21 100644 --- a/src/GParted_Core.cc +++ b/src/GParted_Core.cc @@ -363,6 +363,7 @@ void GParted_Core::set_devices_thread( std::vector * pdevices ) Partition partition_temp; partition_temp.Set_Unallocated( temp_device .get_path(), + true, 0LL, temp_device .length - 1LL, temp_device .sector_size, @@ -1152,16 +1153,17 @@ void GParted_Core::set_device_partitions( Device & device, PedDevice* lp_device, partition_is_busy = is_busy( filesystem, partition_path ) ; } - partition_temp .Set( device .get_path(), - partition_path, - lp_partition ->num, - lp_partition ->type == 0 ? GParted::TYPE_PRIMARY : GParted::TYPE_LOGICAL, - filesystem, - lp_partition ->geom .start, - lp_partition ->geom .end, - device .sector_size, - lp_partition ->type, - partition_is_busy ) ; + partition_temp.Set( device .get_path(), + partition_path, + lp_partition->num, + ( lp_partition->type == 0 ) ? TYPE_PRIMARY : TYPE_LOGICAL, + false, + filesystem, + lp_partition->geom.start, + lp_partition->geom.end, + device.sector_size, + lp_partition->type, + partition_is_busy ); partition_temp .add_paths( pp_info .get_alternate_paths( partition_temp .get_path() ) ) ; set_flags( partition_temp, lp_partition ) ; @@ -1172,16 +1174,17 @@ void GParted_Core::set_device_partitions( Device & device, PedDevice* lp_device, break ; case PED_PARTITION_EXTENDED: - partition_temp .Set( device .get_path(), - partition_path, - lp_partition ->num, - GParted::TYPE_EXTENDED, - GParted::FS_EXTENDED, - lp_partition ->geom .start, - lp_partition ->geom .end, - device .sector_size, - false, - false ) ; + partition_temp.Set( device.get_path(), + partition_path, + lp_partition->num, + TYPE_EXTENDED, + false, + FS_EXTENDED, + lp_partition->geom.start, + lp_partition->geom.end, + device.sector_size, + false, + false ); partition_temp .add_paths( pp_info .get_alternate_paths( partition_temp .get_path() ) ) ; set_flags( partition_temp, lp_partition ) ; @@ -1261,6 +1264,7 @@ void GParted_Core::set_device_one_partition( Device & device, PedDevice * lp_dev path, 1, TYPE_PRIMARY, + true, fstype, 0LL, device.length - 1LL, @@ -1556,7 +1560,7 @@ void GParted_Core::insert_unallocated( const Glib::ustring & device_path, bool inside_extended ) { Partition partition_temp ; - partition_temp .Set_Unallocated( device_path, 0, 0, sector_size, inside_extended ) ; + partition_temp.Set_Unallocated( device_path, false, 0LL, 0LL, sector_size, inside_extended ); //if there are no partitions at all.. if ( partitions .empty() ) diff --git a/src/Operation.cc b/src/Operation.cc index 21e244dc..b6484a3a 100644 --- a/src/Operation.cc +++ b/src/Operation.cc @@ -45,7 +45,7 @@ int Operation::find_index_extended( const std::vector & partitions ) void Operation::insert_unallocated( std::vector & partitions, Sector start, Sector end, Byte_Value sector_size, bool inside_extended ) { Partition UNALLOCATED ; - UNALLOCATED .Set_Unallocated( device .get_path(), 0, 0, sector_size, inside_extended ) ; + UNALLOCATED.Set_Unallocated( device.get_path(), false, 0LL, 0LL, sector_size, inside_extended ); //if there are no partitions at all.. if ( partitions .empty() ) diff --git a/src/Partition.cc b/src/Partition.cc index c51a73b5..403f9ece 100644 --- a/src/Partition.cc +++ b/src/Partition.cc @@ -38,6 +38,7 @@ void Partition::Reset() messages .clear() ; status = GParted::STAT_REAL ; type = GParted::TYPE_UNALLOCATED ; + whole_device = false; alignment = ALIGN_STRICT ; filesystem = GParted::FS_UNALLOCATED ; have_filesystem_label = false; @@ -55,16 +56,17 @@ void Partition::Reset() mountpoints .clear() ; } -void Partition::Set( const Glib::ustring & device_path, - const Glib::ustring & partition, - int partition_number, - PartitionType type, - FILESYSTEM filesystem, - Sector sector_start, - Sector sector_end, - Byte_Value sector_size, - bool inside_extended, - bool busy ) +void Partition::Set( const Glib::ustring & device_path, + const Glib::ustring & partition, + int partition_number, + PartitionType type, + bool whole_device, + FILESYSTEM filesystem, + Sector sector_start, + Sector sector_end, + Byte_Value sector_size, + bool inside_extended, + bool busy ) { this ->device_path = device_path ; @@ -72,6 +74,7 @@ void Partition::Set( const Glib::ustring & device_path, this ->partition_number = partition_number; this ->type = type; + this->whole_device = whole_device; this ->filesystem = filesystem; this ->sector_start = sector_start; this ->sector_end = sector_end; @@ -163,18 +166,20 @@ Sector Partition::get_sectors_unallocated() const } void Partition::Set_Unallocated( const Glib::ustring & device_path, - Sector sector_start, - Sector sector_end, - Byte_Value sector_size, - bool inside_extended ) + bool whole_device, + Sector sector_start, + Sector sector_end, + Byte_Value sector_size, + bool inside_extended ) { Reset() ; Set( device_path, - Utils::get_filesystem_string( GParted::FS_UNALLOCATED ), + Utils::get_filesystem_string( FS_UNALLOCATED ), -1, - GParted::TYPE_UNALLOCATED, - GParted::FS_UNALLOCATED, + TYPE_UNALLOCATED, + whole_device, + FS_UNALLOCATED, sector_start, sector_end, sector_size, diff --git a/src/Win_GParted.cc b/src/Win_GParted.cc index 057e5307..8e5def12 100644 --- a/src/Win_GParted.cc +++ b/src/Win_GParted.cc @@ -1644,11 +1644,12 @@ void Win_GParted::activate_resize() //And add the new partition to the end of the operations list //change 'selected_partition' into a suitable 'partition_original') - selected_partition .Set_Unallocated( devices[ current_device ] .get_path(), - selected_partition .sector_start, - selected_partition .sector_end, - devices[current_device] .sector_size, - selected_partition .inside_extended ) ; + selected_partition.Set_Unallocated( devices[current_device].get_path(), + selected_partition.whole_device, + selected_partition.sector_start, + selected_partition.sector_end, + devices[current_device].sector_size, + selected_partition.inside_extended ); Operation * operation = new OperationCreate( devices[ current_device ], selected_partition, @@ -2020,16 +2021,17 @@ void Win_GParted::activate_format( GParted::FILESYSTEM new_fs ) //ok we made it. lets create an fitting partition object Partition part_temp ; - part_temp .Set( devices[ current_device ] .get_path(), - selected_partition .get_path(), - selected_partition .partition_number, - selected_partition .type, - new_fs, - selected_partition .sector_start, - selected_partition .sector_end, - devices[ current_device ] .sector_size, - selected_partition .inside_extended, - false ) ; + part_temp.Set( devices[current_device].get_path(), + selected_partition.get_path(), + selected_partition.partition_number, + selected_partition.type, + selected_partition.whole_device, + new_fs, + selected_partition.sector_start, + selected_partition.sector_end, + devices[current_device].sector_size, + selected_partition.inside_extended, + false ); //Leave sector usage figures to new Partition object defaults of // -1, -1, 0 (_used, _unused, _unallocated) representing unknown.