From 6d8b169e734e1ecb191d5164689f24400010a7b4 Mon Sep 17 00:00:00 2001 From: Bart Hakvoort Date: Tue, 14 Mar 2006 21:37:47 +0000 Subject: [PATCH] changed the way devices and partitions store their devicepaths. Instead of * changed the way devices and partitions store their devicepaths. Instead of holding a 'realpath' and a symbolic path we store paths in a list. This allows for improved detection of mountpoins, free space, etc.. Also fixed a nasty bug which showed up when you copy a partition from one device to another. (thanks to mario for the report) --- ChangeLog | 10 +++ include/Device.h | 14 ++- include/GParted_Core.h | 5 +- include/Partition.h | 22 +++-- src/Device.cc | 51 ++++++++++- src/Dialog_Partition_Copy.cc | 3 +- src/Dialog_Partition_Info.cc | 38 ++++---- src/Dialog_Partition_Resize_Move.cc | 4 +- src/DrawingAreaVisualDisk.cc | 4 +- src/GParted_Core.cc | 129 +++++++++++++++------------- src/Operation.cc | 62 ++++++++----- src/Partition.cc | 90 ++++++++++++++++--- src/TreeView_Detail.cc | 2 +- src/Utils.cc | 14 +-- src/Win_GParted.cc | 85 +++++++++--------- src/ext2.cc | 12 ++- src/ext3.cc | 14 ++- src/fat16.cc | 11 +-- src/fat32.cc | 10 +-- src/hfs.cc | 2 +- src/jfs.cc | 22 +++-- src/linux_swap.cc | 2 +- src/ntfs.cc | 12 ++- src/reiser4.cc | 6 +- src/reiserfs.cc | 13 ++- src/xfs.cc | 17 ++-- 26 files changed, 408 insertions(+), 246 deletions(-) diff --git a/ChangeLog b/ChangeLog index e9144b49..169a5536 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2006-03-14 Bart Hakvoort + + * changed the way devices and partitions store their devicepaths. + Instead of holding a 'realpath' and a symbolic path we store paths + in a list. This allows for improved detection of mountpoins, free + space, etc.. + + Also fixed a nasty bug which showed up when you copy a partition + from one device to another. (thanks to mario for the report) + 2006-03-09 Bart Hakvoort * include/Makefile.am, diff --git a/include/Device.h b/include/Device.h index 6637e9e0..c8b18cc6 100644 --- a/include/Device.h +++ b/include/Device.h @@ -29,9 +29,13 @@ class Device public: Device() ; ~Device() ; + + void add_path( const Glib::ustring & path, bool clear_paths = false ) ; + void add_paths( const std::vector & paths, bool clear_paths = false ) ; + Glib::ustring get_path() ; + std::vector get_paths() ; void Reset() ; - std::vector partitions ; Sector length; long heads ; @@ -39,16 +43,18 @@ public: long cylinders ; Sector cylsize ; Glib::ustring model; - Glib::ustring path; - Glib::ustring realpath; Glib::ustring disktype; int max_prims ; int highest_busy ; bool readonly ; private: - + void sort_paths_and_remove_duplicates() ; + static bool compare_paths( const Glib::ustring & A, const Glib::ustring & B ) ; + + std::vector paths ; + }; } //GParted diff --git a/include/GParted_Core.h b/include/GParted_Core.h index 0afc5d97..39adc22b 100644 --- a/include/GParted_Core.h +++ b/include/GParted_Core.h @@ -77,14 +77,13 @@ private: std::map< Glib::ustring, std::vector > & map ) ; void init_maps() ; void set_mountpoints( std::vector & partitions ) ; - void set_short_paths( std::vector & partitions ) ; void set_used_sectors( std::vector & partitions ) ; void insert_unallocated( const Glib::ustring & device_path, std::vector & partitions, Sector start, Sector end, bool inside_extended ) ; - Glib::ustring get_short_path( const Glib::ustring & real_path ) ; + std::vector get_alternate_paths( const Glib::ustring & path ) ; void LP_Set_Used_Sectors( Partition & partition ); void set_flags( Partition & partition ) ; int create_empty_partition( Partition & new_partition, @@ -122,7 +121,7 @@ private: std::map< Glib::ustring, std::vector > mount_info ; std::map< Glib::ustring, std::vector > fstab_info ; - std::map< Glib::ustring, Glib::ustring > short_paths ; + std::map< Glib::ustring, Glib::ustring > alternate_paths ; std::map< Glib::ustring, Glib::ustring >::iterator iter ; std::map< Glib::ustring, std::vector >::iterator iter_mp ; diff --git a/include/Partition.h b/include/Partition.h index 446d14cf..454b286c 100644 --- a/include/Partition.h +++ b/include/Partition.h @@ -47,6 +47,7 @@ class Partition { public: Partition() ; + Partition( const Glib::ustring & path ) ; ~Partition() ; void Reset() ; @@ -64,18 +65,23 @@ public: void Set_Unused( Sector sectors_unused ) ; - void Set_Unallocated( const Glib::ustring & device_path, Sector sector_start, Sector sector_end, bool inside_extended ); + void Set_Unallocated( const Glib::ustring & device_path, + Sector sector_start, + Sector sector_end, + bool inside_extended ); //update partition number (used when a logical partition is deleted) void Update_Number( int new_number ); - Sector get_length() const ; + void add_path( const Glib::ustring & path, bool clear_paths = false ) ; + void add_paths( const std::vector & paths, bool clear_paths = false ) ; + Sector get_length() const ; + Glib::ustring get_path() const ; + std::vector get_paths() const ; bool operator==( const Partition & partition ) const ; //some public members - Glib::ustring partition;//the symbolic path (e.g. /dev/hda1 ) - Glib::ustring realpath ; Glib::ustring device_path ; int partition_number; PartitionType type;// UNALLOCATED, PRIMARY, LOGICAL, etc... @@ -90,15 +96,19 @@ public: bool busy; Glib::ustring error; std::vector flags ; - std::vector mountpoints ; + std::vector mountpoints ;//FIXME: it's better to make this one private as well to prevent segfaults + //when callong mountpoints .front() on an empty list. std::vector logicals ; bool strict ; private: - + void sort_paths_and_remove_duplicates() ; + static bool compare_paths( const Glib::ustring & A, const Glib::ustring & B ) ; + + std::vector paths ; }; }//GParted diff --git a/src/Device.cc b/src/Device.cc index 3c1a2e53..c71f56ae 100644 --- a/src/Device.cc +++ b/src/Device.cc @@ -27,13 +27,62 @@ Device::Device() void Device::Reset() { + paths .clear() ; partitions .clear() ; length = cylsize = 0 ; heads = sectors = cylinders = 0 ; - model = path = realpath = disktype = "" ; + model = disktype = "" ; max_prims = highest_busy = 0 ; readonly = false ; } + +void Device::add_path( const Glib::ustring & path, bool clear_paths ) +{ + if ( clear_paths ) + paths .clear() ; + + paths .push_back( path ) ; + + sort_paths_and_remove_duplicates() ; +} + +void Device::add_paths( const std::vector & paths, bool clear_paths ) +{ + if ( clear_paths ) + this ->paths .clear() ; + + this ->paths .insert( this ->paths .end(), paths .begin(), paths .end() ) ; + + sort_paths_and_remove_duplicates() ; +} + +Glib::ustring Device::get_path() +{ + if ( paths .size() > 0 ) + return paths .front() ; + + return "" ; +} + +std::vector Device::get_paths() +{ + return paths ; +} + +void Device::sort_paths_and_remove_duplicates() +{ + //remove duplicates + std::sort( paths .begin(), paths .end() ) ; + paths .erase( std::unique( paths .begin(), paths .end() ), paths .end() ) ; + + //sort on length + std::sort( paths .begin(), paths .end(), compare_paths ) ; +} + +bool Device::compare_paths( const Glib::ustring & A, const Glib::ustring & B ) +{ + return A .length() < B .length() ; +} Device::~Device() { diff --git a/src/Dialog_Partition_Copy.cc b/src/Dialog_Partition_Copy.cc index 5ca60c3d..ce802d9b 100644 --- a/src/Dialog_Partition_Copy.cc +++ b/src/Dialog_Partition_Copy.cc @@ -32,7 +32,7 @@ Dialog_Partition_Copy::Dialog_Partition_Copy( const FS & fs, Sector cylinder_siz void Dialog_Partition_Copy::Set_Data( const Partition & selected_partition, const Partition & copied_partition ) { - this ->set_title( String::ucompose( _("Paste %1"), copied_partition .partition ) ) ; + this ->set_title( String::ucompose( _("Paste %1"), copied_partition .get_path() ) ) ; //set partition color frame_resizer_base ->set_rgb_partition_color( copied_partition .color ) ; @@ -86,6 +86,7 @@ void Dialog_Partition_Copy::Set_Data( const Partition & selected_partition, cons //set global selected_partition (see Dialog_Base_Partition::Get_New_Partition ) this ->selected_partition = copied_partition ; + this ->selected_partition .device_path = selected_partition .device_path ; this ->selected_partition .inside_extended = selected_partition .inside_extended ; this ->selected_partition .type = selected_partition .inside_extended ? GParted::TYPE_LOGICAL : GParted::TYPE_PRIMARY ; diff --git a/src/Dialog_Partition_Info.cc b/src/Dialog_Partition_Info.cc index d85850d9..f6b3bcfc 100644 --- a/src/Dialog_Partition_Info.cc +++ b/src/Dialog_Partition_Info.cc @@ -28,7 +28,7 @@ Dialog_Partition_Info::Dialog_Partition_Info( const Partition & partition ) this ->set_has_separator( false ) ; /*TO TRANSLATORS: dialogtitle, looks like Information about /dev/hda3 */ - this ->set_title( String::ucompose( _( "Information about %1"), partition .partition ) ); + this ->set_title( String::ucompose( _( "Information about %1"), partition .get_path() ) ); init_drawingarea( ) ; @@ -102,6 +102,7 @@ void Dialog_Partition_Info::init_drawingarea( ) //calculate proportional width of used and unused used = unused = 0 ; + //FIXME: use Partition::get_length().. used = Utils::Round( (400 - BORDER *2) / ( static_cast(partition .sector_end - partition .sector_start) / partition .sectors_used ) ) ; unused = 400 - used - BORDER *2 ; @@ -120,7 +121,7 @@ void Dialog_Partition_Info::init_drawingarea( ) //set text of pangolayout pango_layout = drawingarea .create_pango_layout( - partition .partition + "\n" + Utils::format_size( partition .get_length() ) ) ; + partition .get_path() + "\n" + Utils::format_size( partition .get_length() ) ) ; } void Dialog_Partition_Info::Display_Info( ) @@ -173,19 +174,21 @@ void Dialog_Partition_Info::Display_Info( ) if ( partition .type != GParted::TYPE_UNALLOCATED && partition .status != GParted::STAT_NEW ) { //path - table ->attach( * Utils::mk_label( "" + (Glib::ustring) _( "Path:" ) + "" ), 0, 1, top, bottom, Gtk::FILL ) ; - table ->attach( * Utils::mk_label( partition .partition ), 1, 2, top++, bottom++, Gtk::FILL ) ; - - //only show realpath if it's diffent from the short path... - if ( partition .partition != partition .realpath ) - { - table ->attach( * Utils::mk_label( "" + (Glib::ustring) _( "Real Path:" ) + "" ), 0, 1, top, bottom, Gtk::FILL ) ; - table ->attach( * Utils::mk_label( partition .realpath ), 1, 2, top++, bottom++, Gtk::FILL ) ; - } + table ->attach( * Utils::mk_label( "" + (Glib::ustring) _( "Path:" ) + "" ), + 0, 1, + top, bottom, + Gtk::FILL ) ; + table ->attach( * Utils::mk_label( Glib::build_path( "\n", partition .get_paths() ) ), + 1, 2, + top++, bottom++, + Gtk::FILL ) ; //status Glib::ustring str_temp ; - table ->attach( * Utils::mk_label( "" + (Glib::ustring) _( "Status:" ) + "" ), 0,1, top, bottom, Gtk::FILL) ; + table ->attach( * Utils::mk_label( "" + (Glib::ustring) _( "Status:" ) + "" ), + 0, 1, + top, bottom, + Gtk::FILL) ; if ( partition .busy ) { if ( partition .type == GParted::TYPE_EXTENDED ) @@ -219,15 +222,16 @@ void Dialog_Partition_Info::Display_Info( ) //total sectors table ->attach( * Utils::mk_label( "" + (Glib::ustring) _( "Total Sectors:" ) + "" ), 0, 1, top, bottom, Gtk::FILL ) ; + //FIXME: use Partition::get_length() here.. table ->attach( * Utils::mk_label( Utils::num_to_str( partition .sector_end - partition .sector_start ) ), 1, 2, top++, bottom++, Gtk::FILL ) ; } -Dialog_Partition_Info::~Dialog_Partition_Info( ) +Dialog_Partition_Info::~Dialog_Partition_Info() { - this ->get_colormap( ) ->free_colors( color_used, 1 ) ; - this ->get_colormap( ) ->free_colors( color_unused, 1 ) ; - this ->get_colormap( ) ->free_colors( color_text, 1 ) ; - this ->get_colormap( ) ->free_colors( color_partition, 1 ) ; + this ->get_colormap() ->free_colors( color_used, 1 ) ; + this ->get_colormap() ->free_colors( color_unused, 1 ) ; + this ->get_colormap() ->free_colors( color_text, 1 ) ; + this ->get_colormap() ->free_colors( color_partition, 1 ) ; } } //GParted diff --git a/src/Dialog_Partition_Resize_Move.cc b/src/Dialog_Partition_Resize_Move.cc index 279b6c76..2ec54519 100644 --- a/src/Dialog_Partition_Resize_Move.cc +++ b/src/Dialog_Partition_Resize_Move.cc @@ -66,12 +66,12 @@ void Dialog_Partition_Resize_Move::Resize_Move_Normal( const std::vectorset_title( String::ucompose( _("Resize/Move %1"), selected_partition .partition ) ) ; + set_title( String::ucompose( _("Resize/Move %1"), selected_partition .get_path() ) ) ; frame_resizer_base ->set_fixed_start( false ) ; } else { - this ->set_title( String::ucompose( _("Resize %1"), selected_partition .partition) ) ; + set_title( String::ucompose( _("Resize %1"), selected_partition .get_path() ) ) ; this ->fixed_start = true; frame_resizer_base ->set_fixed_start( true ) ; spinbutton_before .set_sensitive( false ) ; diff --git a/src/DrawingAreaVisualDisk.cc b/src/DrawingAreaVisualDisk.cc index cefa737e..6525da22 100644 --- a/src/DrawingAreaVisualDisk.cc +++ b/src/DrawingAreaVisualDisk.cc @@ -84,6 +84,8 @@ void DrawingAreaVisualDisk::set_static_data( const std::vector & part { Sector p_length ; visual_partition vp ; +//FIXME: any particular reason why Partition::get_length() isn't used in this function? +//i'm also not sure why we use 'vp' this way.. Lets either use it or drop it :) for ( unsigned int t = 0 ; t < partitions .size() ; t++ ) { @@ -109,7 +111,7 @@ void DrawingAreaVisualDisk::set_static_data( const std::vector & part partitions[ t ] .sector_end - partitions[ t ] .sector_start ) ; else visual_partitions .back() .pango_layout = create_pango_layout( - partitions[ t ] .partition + "\n" + Utils::format_size( partitions[ t ] .get_length() ) ) ; + partitions[ t ] .get_path() + "\n" + Utils::format_size( partitions[ t ] .get_length() ) ) ; } } diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc index 19f61e05..533768a7 100644 --- a/src/GParted_Core.cc +++ b/src/GParted_Core.cc @@ -7,7 +7,7 @@ Glib::ustring ped_error ; //see e.g. ped_exception_handler() namespace GParted { - + GParted_Core::GParted_Core() { lp_device = NULL ; @@ -17,7 +17,6 @@ GParted_Core::GParted_Core() ped_exception_set_handler( ped_exception_handler ) ; - //get valid flags ... for ( PedPartitionFlag flag = ped_partition_flag_next( static_cast( NULL ) ) ; flag ; @@ -128,8 +127,9 @@ void GParted_Core::get_devices( std::vector & devices ) temp_device .Reset() ; //device info.. - temp_device .path = get_short_path( device_paths[ t ] ) ; - temp_device .realpath = lp_device ->path ; + temp_device .add_path( device_paths[ t ] ) ; + temp_device .add_paths( get_alternate_paths( temp_device .get_path() ) ) ; + temp_device .model = lp_device ->model ; temp_device .heads = lp_device ->bios_geom .heads ; temp_device .sectors = lp_device ->bios_geom .sectors ; @@ -148,7 +148,6 @@ void GParted_Core::get_devices( std::vector & devices ) temp_device .max_prims = ped_disk_get_max_primary_partition_count( lp_disk ) ; set_device_partitions( temp_device ) ; - set_short_paths( temp_device .partitions ) ; set_mountpoints( temp_device .partitions ) ; set_used_sectors( temp_device .partitions ) ; @@ -162,7 +161,10 @@ void GParted_Core::get_devices( std::vector & devices ) temp_device .max_prims = -1 ; Partition partition_temp ; - partition_temp .Set_Unallocated( temp_device .path, 0, temp_device .length, false ); + partition_temp .Set_Unallocated( temp_device .get_path(), + 0, + temp_device .length, + false ); temp_device .partitions .push_back( partition_temp ); } @@ -174,7 +176,7 @@ void GParted_Core::get_devices( std::vector & devices ) //clear leftover information... //NOTE that we cannot clear mountinfo since it might be needed in get_all_mountpoints() - short_paths .clear() ; + alternate_paths .clear() ; fstab_info .clear() ; } @@ -208,7 +210,7 @@ void GParted_Core::read_mountpoints_from_file( const Glib::ustring & filename, void GParted_Core::init_maps() { - short_paths .clear() ; + alternate_paths .clear() ; mount_info .clear() ; fstab_info .clear() ; @@ -226,7 +228,7 @@ void GParted_Core::init_maps() iter_mp ->second .end() ) ; } - //initialize shortpaths... + //initialize alternate_paths... std::string line ; std::ifstream proc_partitions( "/proc/partitions" ) ; if ( proc_partitions ) @@ -238,9 +240,14 @@ void GParted_Core::init_maps() { line = "/dev/" ; line += c_str ; - - if ( realpath( line .c_str(), c_str ) ) - short_paths[ c_str ] = line ; + + if ( realpath( line .c_str(), c_str ) && line != c_str ) + { + //because we can make no assumption about which path libparted will detect + //we add all combinations. + alternate_paths[ c_str ] = line ; + alternate_paths[ line ] = c_str ; + } } proc_partitions .close() ; @@ -320,35 +327,39 @@ void GParted_Core::set_device_partitions( Device & device ) { case PED_PARTITION_NORMAL: case PED_PARTITION_LOGICAL: - partition_temp .Set( device .path, + partition_temp .Set( device .get_path(), ped_partition_get_path( lp_partition ), lp_partition ->num, - lp_partition ->type == 0 ? GParted::TYPE_PRIMARY : GParted::TYPE_LOGICAL, + lp_partition ->type == 0 ? + GParted::TYPE_PRIMARY : GParted::TYPE_LOGICAL, get_filesystem(), lp_partition ->geom .start, lp_partition ->geom .end, lp_partition ->type, ped_partition_is_busy( lp_partition ) ); + partition_temp .add_paths( get_alternate_paths( partition_temp .get_path() ) ) ; set_flags( partition_temp ) ; if ( partition_temp .busy && partition_temp .partition_number > device .highest_busy ) device .highest_busy = partition_temp .partition_number ; break ; - + case PED_PARTITION_EXTENDED: - partition_temp.Set( device .path, - ped_partition_get_path( lp_partition ), - lp_partition ->num, - GParted::TYPE_EXTENDED, - GParted::FS_EXTENDED, - lp_partition ->geom .start, - lp_partition ->geom .end, - false, - ped_partition_is_busy( lp_partition ) ); + partition_temp .Set( device .get_path(), + ped_partition_get_path( lp_partition ), + lp_partition ->num, + GParted::TYPE_EXTENDED, + GParted::FS_EXTENDED, + lp_partition ->geom .start, + lp_partition ->geom .end, + false, + ped_partition_is_busy( lp_partition ) ); + partition_temp .add_paths( get_alternate_paths( partition_temp .get_path() ) ) ; set_flags( partition_temp ) ; + EXT_INDEX = device .partitions .size() ; break ; @@ -370,13 +381,13 @@ void GParted_Core::set_device_partitions( Device & device ) } if ( EXT_INDEX > -1 ) - insert_unallocated( device .path, + insert_unallocated( device .get_path(), device .partitions[ EXT_INDEX ] .logicals, device .partitions[ EXT_INDEX ] .sector_start, device .partitions[ EXT_INDEX ] .sector_end, true ) ; - insert_unallocated( device .path, device .partitions, 0, device .length -1, false ) ; + insert_unallocated( device .get_path(), device .partitions, 0, device .length -1, false ) ; } void GParted_Core::set_mountpoints( std::vector & partitions ) @@ -389,15 +400,22 @@ void GParted_Core::set_mountpoints( std::vector & partitions ) { if ( partitions[ t ] .busy ) { - iter_mp = mount_info .find( partitions[ t ] .partition ); - if ( iter_mp != mount_info .end() ) - partitions[ t ] .mountpoints = iter_mp ->second ; - else + for ( unsigned int i = 0 ; i < partitions[ t ] .get_paths() .size() ; i++ ) + { + iter_mp = mount_info .find( partitions[ t ] .get_paths()[ i ] ) ; + if ( iter_mp != mount_info .end() ) + { + partitions[ t ] .mountpoints = iter_mp ->second ; + break ; + } + } + + if ( partitions[ t ] .mountpoints .empty() ) partitions[ t ] .error = _("Unable to find mountpoint") ; } else { - iter_mp = fstab_info .find( partitions[ t ] .partition ); + iter_mp = fstab_info .find( partitions[ t ] .get_path() ); if ( iter_mp != fstab_info .end() ) partitions[ t ] .mountpoints = iter_mp ->second ; } @@ -406,27 +424,18 @@ void GParted_Core::set_mountpoints( std::vector & partitions ) set_mountpoints( partitions[ t ] .logicals ) ; } } - -void GParted_Core::set_short_paths( std::vector & partitions ) + +std::vector GParted_Core::get_alternate_paths( const Glib::ustring & path ) { - for ( unsigned int t =0 ; t < partitions .size() ; t++ ) - { - partitions[ t ] .partition = get_short_path( partitions[ t ] .partition ) ; + std::vector paths ; + + iter = alternate_paths .find( path ) ; + if ( iter != alternate_paths .end() ) + paths .push_back( iter ->second ) ; - if ( partitions[ t ] .type == GParted::TYPE_EXTENDED ) - set_short_paths( partitions[ t ] .logicals ) ; - } + return paths ; } -Glib::ustring GParted_Core::get_short_path( const Glib::ustring & real_path ) -{ - iter = short_paths .find( real_path ); - if ( iter != short_paths .end() ) - return iter ->second ; - - return real_path ; -} - void GParted_Core::set_used_sectors( std::vector & partitions ) { struct statvfs sfs ; @@ -686,15 +695,13 @@ bool GParted_Core::copy( const Glib::ustring & src_part_path, std::vector & operation_details ) { set_proper_filesystem( partition_dest .filesystem ) ; - - Partition src_partition ; - src_partition .partition = src_part_path ; + Partition src_partition( src_part_path ) ; return ( p_filesystem && p_filesystem ->Check_Repair( src_partition, operation_details ) && create_empty_partition( partition_dest, operation_details, true ) > 0 && set_partition_type( partition_dest, operation_details ) && - p_filesystem ->Copy( src_part_path, partition_dest .partition, operation_details ) && + p_filesystem ->Copy( src_part_path, partition_dest .get_path(), operation_details ) && p_filesystem ->Check_Repair( partition_dest, operation_details ) ) ; } @@ -827,6 +834,7 @@ int GParted_Core::create_empty_partition( Partition & new_partition, NULL, new_partition .sector_start, new_partition .sector_end ) ; + if ( lp_partition ) { if ( new_partition .strict ) @@ -843,12 +851,14 @@ int GParted_Core::create_empty_partition( Partition & new_partition, if ( constraint ) { + //FIXME: i should use the length of the copied partition as min_size + //maybe we can set the used from new_partition to this size? if ( copy ) constraint ->min_size = new_partition .get_length() ; - + if ( ped_disk_add_partition( lp_disk, lp_partition, constraint ) && commit() ) { - new_partition .partition = ped_partition_get_path( lp_partition ) ; + new_partition .add_path( ped_partition_get_path( lp_partition ), true ) ; new_partition .partition_number = lp_partition ->num ; Sector start = lp_partition ->geom .start ; @@ -857,7 +867,7 @@ int GParted_Core::create_empty_partition( Partition & new_partition, operation_details .back() .sub_details .push_back( OperationDetails( "" + - String::ucompose( _("path: %1"), new_partition .partition ) + "\n" + + String::ucompose( _("path: %1"), new_partition .get_path() ) + "\n" + String::ucompose( _("start: %1"), start ) + "\n" + String::ucompose( _("end: %1"), end ) + "\n" + String::ucompose( _("size: %1"), Utils::format_size( end - start + 1 ) ) + @@ -877,7 +887,7 @@ int GParted_Core::create_empty_partition( Partition & new_partition, ( new_partition .type == GParted::TYPE_EXTENDED || ( - wait_for_node( new_partition .partition ) && + wait_for_node( new_partition .get_path() ) && erase_filesystem_signatures( new_partition ) ) ) @@ -992,7 +1002,7 @@ bool GParted_Core::resize_container_partition( const Partition & partition_old, } else { - return_value &= wait_for_node( partition_new .partition ) ; + return_value &= wait_for_node( partition_new .get_path() ) ; operation_details .back() .status = return_value ? OperationDetails::SUCCES : OperationDetails::ERROR ; return return_value ; @@ -1108,7 +1118,7 @@ bool GParted_Core::set_partition_type( const Partition & partition, (partition .sector_end + partition .sector_start) / 2 ) ; if ( lp_partition && ped_partition_set_system( lp_partition, fs_type ) && commit() ) - return_value = wait_for_node( partition .partition ) ; + return_value = wait_for_node( partition .get_path() ) ; } close_device_and_disk() ; @@ -1216,6 +1226,5 @@ PedExceptionOption GParted_Core::ped_exception_handler( PedException * e ) return PED_EXCEPTION_UNHANDLED ; } - - + } //GParted diff --git a/src/Operation.cc b/src/Operation.cc index b1745b6f..f57768ad 100644 --- a/src/Operation.cc +++ b/src/Operation.cc @@ -23,7 +23,10 @@ Operation::Operation() { } -Operation::Operation( const Device & device, const Partition & partition_original, const Partition & partition_new, OperationType operationtype ) +Operation::Operation( const Device & device, + const Partition & partition_original, + const Partition & partition_new, + OperationType operationtype ) { this ->device = device ; this ->partition_original = partition_original; @@ -34,8 +37,10 @@ Operation::Operation( const Device & device, const Partition & partition_origina if ( operationtype == COPY ) { - copied_partition_path = partition_new .partition ; - this ->partition_new .partition = String::ucompose( _("copy of %1"), this ->partition_new .partition ); + copied_partition_path = partition_new .get_path() ; + this ->partition_new .add_path( + String::ucompose( _("copy of %1"), this ->partition_new .get_path() ), + true ) ; } } @@ -50,14 +55,14 @@ Glib::ustring Operation::Get_String( ) if (partition_original.type == GParted::TYPE_LOGICAL) temp = _("Logical Partition") ; else - temp = partition_original .partition ; + temp = partition_original .get_path() ; /*TO TRANSLATORS: looks like Delete /dev/hda2 (ntfs, 345 MiB) from /dev/hda */ return String::ucompose( _("Delete %1 (%2, %3) from %4"), temp, Utils::Get_Filesystem_String( partition_original .filesystem ), Utils::format_size( partition_original .get_length() ), - device .path ) ; + device .get_path() ) ; case CREATE : switch( partition_new.type ) @@ -78,10 +83,10 @@ Glib::ustring Operation::Get_String( ) /*TO TRANSLATORS: looks like Create Logical Partition #1 (ntfs, 345 MiB) on /dev/hda */ return String::ucompose( _("Create %1 #%2 (%3, %4) on %5"), temp, - partition_new.partition_number, - Utils::Get_Filesystem_String( partition_new.filesystem ), + partition_new .partition_number, + Utils::Get_Filesystem_String( partition_new .filesystem ), Utils::format_size( partition_new .get_length() ), - device .path ) ; + device .get_path() ) ; case RESIZE_MOVE: //if startsector has changed we consider it a move @@ -90,11 +95,11 @@ Glib::ustring Operation::Get_String( ) { if ( partition_new .sector_start > partition_original .sector_start ) temp = String::ucompose( _("Move %1 forward by %2"), - partition_new .partition, + partition_new .get_path(), Utils::format_size( diff ) ) ; else temp = String::ucompose( _("Move %1 backward by %2"), - partition_new .partition, + partition_new .get_path(), Utils::format_size( diff ) ) ; } @@ -104,12 +109,12 @@ Glib::ustring Operation::Get_String( ) { if ( temp .empty() ) temp = String::ucompose( _("Resize %1 from %2 to %3"), - partition_new.partition, + partition_new .get_path(), Utils::format_size( partition_original .get_length() ), Utils::format_size( partition_new .get_length() ) ) ; else temp += " " + String::ucompose( _("and Resize %1 from %2 to %3"), - partition_new.partition, + partition_new .get_path(), Utils::format_size( partition_original .get_length() ), Utils::format_size( partition_new .get_length() ) ) ; } @@ -119,14 +124,14 @@ Glib::ustring Operation::Get_String( ) case FORMAT : /*TO TRANSLATORS: looks like Format /dev/hda4 as linux-swap */ return String::ucompose( _("Format %1 as %2"), - partition_original .partition, + partition_original .get_path(), Utils::Get_Filesystem_String( partition_new .filesystem ) ) ; case COPY : /*TO TRANSLATORS: looks like Copy /dev/hda4 to /dev/hdd (start at 250 MiB) */ return String::ucompose( _("Copy %1 to %2 (start at %3)"), - partition_new .partition, - device .path, + partition_new .get_path(), + device .get_path(), Utils::format_size( partition_new .sector_start ) ) ; default : @@ -153,7 +158,7 @@ void Operation::Apply_Operation_To_Visual( std::vector & partitions ) void Operation::Insert_Unallocated( std::vector & partitions, Sector start, Sector end, bool inside_extended ) { Partition UNALLOCATED ; - UNALLOCATED .Set_Unallocated( device .path, 0, 0, inside_extended ) ; + UNALLOCATED .Set_Unallocated( device .get_path(), 0, 0, inside_extended ) ; //if there are no partitions at all.. if ( partitions .empty( ) ) @@ -244,7 +249,10 @@ void Operation::Apply_Delete_To_Visual( std::vector & partitions ) partitions[ ext ] .logicals[ t ] .Update_Number( partitions[ ext ] .logicals[ t ] .partition_number -1 ); - Insert_Unallocated( partitions[ ext ] .logicals, partitions[ ext ] .sector_start, partitions[ ext ] .sector_end, true ) ; + Insert_Unallocated( partitions[ ext ] .logicals, + partitions[ ext ] .sector_start, + partitions[ ext ] .sector_end, + true ) ; } } @@ -261,7 +269,10 @@ void Operation::Apply_Create_To_Visual( std::vector & partitions ) unsigned int ext = get_index_extended( partitions ) ; partitions[ ext ] .logicals[ Get_Index_Original( partitions[ ext ] .logicals ) ] = partition_new ; - Insert_Unallocated( partitions[ ext ] .logicals, partitions[ ext ] .sector_start, partitions[ ext ] .sector_end, true ) ; + Insert_Unallocated( partitions[ ext ] .logicals, + partitions[ ext ] .sector_start, + partitions[ ext ] .sector_end, + true ) ; } } @@ -285,13 +296,18 @@ void Operation::Apply_Resize_Move_Extended_To_Visual( std::vector & p //stuff INSIDE extended partition ext = get_index_extended( partitions ) ; - if ( partitions[ ext ] .logicals .size( ) && partitions[ ext ] .logicals .front( ) .type == GParted::TYPE_UNALLOCATED ) - partitions[ ext ] .logicals .erase( partitions[ ext ] .logicals .begin( ) ) ; + if ( partitions[ ext ] .logicals .size() && + partitions[ ext ] .logicals .front() .type == GParted::TYPE_UNALLOCATED ) + partitions[ ext ] .logicals .erase( partitions[ ext ] .logicals .begin() ) ; - if ( partitions[ ext ] .logicals .size( ) && partitions[ ext ] .logicals .back( ) .type == GParted::TYPE_UNALLOCATED ) - partitions[ ext ] .logicals .erase( partitions[ ext ] .logicals .end( ) -1 ) ; + if ( partitions[ ext ] .logicals .size() && + partitions[ ext ] .logicals .back() .type == GParted::TYPE_UNALLOCATED ) + partitions[ ext ] .logicals .erase( partitions[ ext ] .logicals .end() -1 ) ; - Insert_Unallocated( partitions[ ext ] .logicals, partitions[ ext ] .sector_start, partitions[ ext ] .sector_end, true ) ; + Insert_Unallocated( partitions[ ext ] .logicals, + partitions[ ext ] .sector_start, + partitions[ ext ] .sector_end, + true ) ; } } //GParted diff --git a/src/Partition.cc b/src/Partition.cc index 67c5a047..f44aced5 100644 --- a/src/Partition.cc +++ b/src/Partition.cc @@ -24,10 +24,18 @@ Partition::Partition() { Reset() ; } + +Partition::Partition( const Glib::ustring & path ) +{ + Reset() ; + + paths .push_back( path ) ; +} void Partition::Reset() { - partition = realpath = error = "" ; + paths .clear() ; + error .clear() ; status = GParted::STAT_REAL ; type = GParted::TYPE_UNALLOCATED ; filesystem = GParted::FS_UNALLOCATED ; @@ -50,7 +58,9 @@ void Partition::Set( const Glib::ustring & device_path, bool busy ) { this ->device_path = device_path ; - this ->partition = realpath = partition; + + paths .push_back( partition ) ; + this ->partition_number = partition_number; this ->type = type; this ->filesystem = filesystem; @@ -59,7 +69,7 @@ void Partition::Set( const Glib::ustring & device_path, this ->inside_extended = inside_extended; this ->busy = busy; - this ->color.set( Utils::Get_Color( filesystem ) ); + this ->color .set( Utils::Get_Color( filesystem ) ); } void Partition::Set_Unused( Sector sectors_unused ) @@ -71,10 +81,13 @@ void Partition::Set_Unused( Sector sectors_unused ) } } -void Partition::Set_Unallocated( const Glib::ustring & device_path, Sector sector_start, Sector sector_end, bool inside_extended ) +void Partition::Set_Unallocated( const Glib::ustring & device_path, + Sector sector_start, + Sector sector_end, + bool inside_extended ) { Reset() ; - + Set( device_path, Utils::Get_Filesystem_String( GParted::FS_UNALLOCATED ), -1, @@ -89,19 +102,59 @@ void Partition::Set_Unallocated( const Glib::ustring & device_path, Sector secto } void Partition::Update_Number( int new_number ) -{ - this ->partition = - partition .substr( 0, partition .find( Utils::num_to_str( partition_number ) ) ) + - Utils::num_to_str( new_number ) ; +{ + unsigned int index ; + for ( unsigned int t = 0 ; t < paths .size() ; t++ ) + { + index = paths[ t ] .rfind( Utils::num_to_str( partition_number ) ) ; + + if ( index < paths[ t ] .length() ) + paths[ t ] .replace( index, + Utils::num_to_str( partition_number ) .length(), + Utils::num_to_str( new_number ) ) ; + } + + partition_number = new_number; +} - this ->partition_number = new_number; +void Partition::add_path( const Glib::ustring & path, bool clear_paths ) +{ + if ( clear_paths ) + paths .clear() ; + + paths .push_back( path ) ; + + sort_paths_and_remove_duplicates() ; +} + +void Partition::add_paths( const std::vector & paths, bool clear_paths ) +{ + if ( clear_paths ) + this ->paths .clear() ; + + this ->paths .insert( this ->paths .end(), paths .begin(), paths .end() ) ; + + sort_paths_and_remove_duplicates() ; } -Sector Partition::get_length() const +Sector Partition::get_length() const { return sector_end - sector_start + 1 ; } +Glib::ustring Partition::get_path() const +{ + if ( paths .size() > 0 ) + return paths .front() ; + + return "" ; +} + +std::vector Partition::get_paths() const +{ + return paths ; +} + bool Partition::operator==( const Partition & partition ) const { return this ->partition_number == partition .partition_number && @@ -109,6 +162,21 @@ bool Partition::operator==( const Partition & partition ) const this ->type == partition .type ; } +void Partition::sort_paths_and_remove_duplicates() +{ + //remove duplicates + std::sort( paths .begin(), paths .end() ) ; + paths .erase( std::unique( paths .begin(), paths .end() ), paths .end() ) ; + + //sort on length + std::sort( paths .begin(), paths .end(), compare_paths ) ; +} + +bool Partition::compare_paths( const Glib::ustring & A, const Glib::ustring & B ) +{ + return A .length() < B .length() ; +} + Partition::~Partition() { } diff --git a/src/TreeView_Detail.cc b/src/TreeView_Detail.cc index 5018cac1..f5f8af34 100644 --- a/src/TreeView_Detail.cc +++ b/src/TreeView_Detail.cc @@ -156,7 +156,7 @@ void TreeView_Detail::create_row( const Gtk::TreeRow & treerow, const Partition treerow[ treeview_detail_columns .error_icon ] = render_icon( Gtk::Stock::DIALOG_WARNING, Gtk::ICON_SIZE_BUTTON ); - treerow[ treeview_detail_columns .path ] = partition .partition ; + treerow[ treeview_detail_columns .path ] = partition .get_path() ; //this fixes a weird issue (see #169683 for more info) if ( partition .type == GParted::TYPE_EXTENDED && partition .busy ) diff --git a/src/Utils.cc b/src/Utils.cc index 551cbed6..0e9115f2 100644 --- a/src/Utils.cc +++ b/src/Utils.cc @@ -28,15 +28,17 @@ Sector Utils::Round( double double_value ) return static_cast( double_value + 0.5 ) ; } -Gtk::Label * Utils::mk_label( const Glib::ustring & text, bool use_markup, bool align_left, bool wrap, const Glib::ustring & text_color ) +Gtk::Label * Utils::mk_label( const Glib::ustring & text, + bool use_markup, + bool align_left, + bool wrap, + const Glib::ustring & text_color ) { - Gtk::Label * label = manage( new Gtk::Label( text ) ) ; + Gtk::Label * label = manage( new Gtk::Label( text, + align_left ? Gtk::ALIGN_LEFT : Gtk::ALIGN_CENTER, + Gtk::ALIGN_TOP ) ) ; label ->set_use_markup( use_markup ) ; - - if ( align_left ) - label ->set_alignment( Gtk::ALIGN_LEFT ) ; - label ->set_line_wrap( wrap ) ; if ( text_color != "black" ) diff --git a/src/Win_GParted.cc b/src/Win_GParted.cc index 4e128168..6205d01e 100644 --- a/src/Win_GParted.cc +++ b/src/Win_GParted.cc @@ -321,11 +321,6 @@ void Win_GParted::init_device_info() device_info .push_back( Utils::mk_label( "" ) ) ; table ->attach( * device_info .back(), 1,2, top++, bottom++, Gtk::FILL); - //real path - table ->attach( * Utils::mk_label( " " + (Glib::ustring) _( "Real Path:" ) + "" ) , 0,1,top, bottom ,Gtk::FILL); - device_info .push_back( Utils::mk_label( "" ) ) ; - table ->attach( * device_info .back(), 1,2, top++, bottom++, Gtk::FILL); - vbox_info .pack_start( *table, Gtk::PACK_SHRINK ); //DETAILED DEVICE INFO @@ -441,13 +436,13 @@ void Win_GParted::refresh_combo_devices() treerow = *( liststore_devices ->append() ) ; treerow[ treeview_devices_columns .icon ] = render_icon( Gtk::Stock::HARDDISK, Gtk::ICON_SIZE_LARGE_TOOLBAR ) ; - treerow[ treeview_devices_columns .device ] = devices[ i ] .path ; + treerow[ treeview_devices_columns .device ] = devices[ i ] .get_path() ; treerow[ treeview_devices_columns .size ] = "(" + Utils::format_size( devices[ i ] .length ) + ")" ; //devices submenu.... menu ->items() .push_back( Gtk::Menu_Helpers::RadioMenuElem( radio_group, - devices[ i ] .path + "\t(" + Utils::format_size( devices[ i ] .length ) + ")", + devices[ i ] .get_path() + "\t(" + Utils::format_size( devices[ i ] .length ) + ")", sigc::bind( sigc::mem_fun(*this, &Win_GParted::radio_devices_changed), i ) ) ) ; } @@ -510,8 +505,7 @@ void Win_GParted::Fill_Label_Device_Info( bool clear ) //global info... device_info[ t++ ] ->set_text( devices[ current_device ] .model ) ; device_info[ t++ ] ->set_text( Utils::format_size( devices[ current_device ] .length ) ) ; - device_info[ t++ ] ->set_text( devices[ current_device ] .path ) ; - device_info[ t++ ] ->set_text( devices[ current_device ] .realpath ) ; + device_info[ t++ ] ->set_text( Glib::build_path( "\n", devices[ current_device ] .get_paths() ) ) ; //detailed info device_info[ t++ ] ->set_text( devices[ current_device ] .disktype ) ; @@ -578,8 +572,8 @@ void Win_GParted::Refresh_Visual() //make all operations visible for ( unsigned int t = 0 ; t < operations .size(); t++ ) - { - if ( operations[ t ] .device .path == devices[ current_device ] .path ) + { //FIXME: overload == operator for Device and use that instead of this.. + if ( operations[ t ] .device .get_path() == devices[ current_device ] .get_path() ) operations[ t ] .Apply_Operation_To_Visual( partitions ) ; treerow = *( liststore_operations ->append() ); @@ -605,7 +599,7 @@ void Win_GParted::Refresh_Visual() primary_count = 0; for ( unsigned int t = 0 ; t < partitions .size() ; t++ ) { - if ( partitions[ t ] .partition == copied_partition .partition ) + if ( partitions[ t ] .get_path() == copied_partition .get_path() ) copied_partition = partitions[ t ] ; switch ( partitions[ t ] .type ) @@ -673,7 +667,7 @@ void Win_GParted::set_valid_operations() dynamic_cast(menu_partition .items()[ 10 ] .get_child() ) ->set_label( _("unmount") ) ; //no partition selected... - if ( selected_partition .partition .empty() ) + if ( ! selected_partition .get_paths() .size() ) return ; //if there's something, there's some info ;) @@ -717,7 +711,7 @@ void Win_GParted::set_valid_operations() allow_new( true ); //find out if there is a copied partition and if it fits inside this unallocated space - if ( ! copied_partition .partition .empty() && ! devices[ current_device ] .readonly ) + if ( ! copied_partition .get_path() .empty() && ! devices[ current_device ] .readonly ) { Sector required_size ; if ( copied_partition .filesystem == GParted::FS_XFS ) @@ -824,7 +818,7 @@ void Win_GParted::combo_devices_changed() { //set new current device current_device = combo_devices .get_active_row_number() ; - this ->set_title( String::ucompose( _("%1 - GParted"), devices[ current_device ] .path ) ); + set_title( String::ucompose( _("%1 - GParted"), devices[ current_device ] .get_path() ) ); //refresh label_device_info Fill_Label_Device_Info(); @@ -876,10 +870,10 @@ void Win_GParted::menu_gparted_refresh_devices( ) //show read-only warning if necessary Glib::ustring readonly_paths ; - + //FIXME: push relevant devices in vector en construct error using Glib::build_path for ( unsigned int t = 0 ; t < devices .size() ; t++ ) if ( devices[ t ] .readonly ) - readonly_paths += "\n- " + devices[ t ] .path ; + readonly_paths += "\n- " + devices[ t ] .get_path() ; if ( ! readonly_paths .empty() ) { @@ -901,8 +895,8 @@ void Win_GParted::menu_gparted_refresh_devices( ) //but anyone who removes the sourcedevice before applying the operations gets what he/she deserves :-) unsigned int i ; for ( unsigned int t = 0 ; t < operations .size() ; t++ ) - { - for ( i = 0 ; i < devices .size() && devices[ i ] .path != operations[ t ] .device .path ; i++ ) {} + {//FIXME same as above, use Device::== + for ( i = 0 ; i < devices .size() && devices[ i ] .get_path() != operations[ t ] .device .get_path() ; i++ ) {} if ( i >= devices .size() ) operations .erase( operations .begin() + t-- ) ;//decrease t bij one.. @@ -1111,10 +1105,10 @@ bool Win_GParted::max_amount_prim_reached() void Win_GParted::activate_resize() { std::vector partitions = devices[ current_device ] .partitions ; - +//FIXME use DEvice::== if ( operations .size() ) for (unsigned int t = 0 ; t < operations .size() ; t++ ) - if ( operations[ t ] .device .path == devices[ current_device ] .path ) + if ( operations[ t ] .device .get_path() == devices[ current_device ] .get_path() ) operations[ t ] .Apply_Operation_To_Visual( partitions ) ; Dialog_Partition_Resize_Move dialog( gparted_core .get_fs( selected_partition .filesystem ), @@ -1142,7 +1136,7 @@ void Win_GParted::activate_resize() //remove operation which creates this partition for ( unsigned int t = 0 ; t < operations .size() ; t++ ) { - if ( operations[ t ] .partition_new .partition == selected_partition .partition ) + if ( operations[ t ] .partition_new == selected_partition ) { operations.erase( operations .begin() + t ) ; @@ -1225,7 +1219,7 @@ void Win_GParted::activate_delete() selected_partition .partition_number < devices[ current_device ] .highest_busy ) { Gtk::MessageDialog dialog( *this, - String::ucompose( _( "Unable to delete %1!"), selected_partition .partition ), + String::ucompose( _( "Unable to delete %1!"), selected_partition .get_path() ), false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, @@ -1239,12 +1233,12 @@ void Win_GParted::activate_delete() return; } - //if partition is on the clipboard... - if ( selected_partition .partition == copied_partition .partition ) + //if partition is on the clipboard...(NOTE: we can't use Partition::== here..) + if ( selected_partition .get_path() == copied_partition .get_path() ) { Gtk::MessageDialog dialog( *this, String::ucompose( _( "Are you sure you want to delete %1?"), - selected_partition .partition ), + selected_partition .get_path() ), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE, @@ -1254,7 +1248,7 @@ void Win_GParted::activate_delete() /*TO TRANSLATORS: dialogtitle, looks like Delete /dev/hda2 (ntfs, 2345 MiB) */ dialog .set_title( String::ucompose( _("Delete %1 (%2, %3)"), - selected_partition .partition, + selected_partition .get_path(), Utils::Get_Filesystem_String( selected_partition .filesystem ), Utils::format_size( selected_partition .get_length() ) ) ); dialog .add_button( Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL ); @@ -1267,7 +1261,7 @@ void Win_GParted::activate_delete() } //if deleted partition was on the clipboard we erase it... - if ( selected_partition .partition == copied_partition .partition ) + if ( selected_partition .get_path() == copied_partition .get_path() ) copied_partition .Reset() ; /* if deleted one is NEW, it doesn't make sense to add it to the operationslist, @@ -1277,7 +1271,7 @@ void Win_GParted::activate_delete() { //remove all operations done on this new partition (this includes creation) for ( int t = 0 ; t < static_cast( operations .size() ) ; t++ ) - if ( operations[ t ] .partition_new .partition == selected_partition .partition ) + if ( operations[ t ] .partition_new .get_path() == selected_partition .get_path() ) operations.erase( operations .begin() + t-- ) ; //determine lowest possible new_count @@ -1337,9 +1331,9 @@ 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 ] .path, - selected_partition .partition, + 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, @@ -1355,7 +1349,7 @@ void Win_GParted::activate_format( GParted::FILESYSTEM new_fs ) //remove operation which creates this partition for ( unsigned int t = 0 ; t < operations .size() ; t++ ) { - if ( operations[ t ] .partition_new .partition == selected_partition .partition ) + if ( operations[ t ] .partition_new == selected_partition ) { operations .erase( operations .begin() +t ) ; @@ -1413,7 +1407,7 @@ void Win_GParted::thread_mount_partition( bool * succes, Glib::ustring * error ) *succes = true ; for ( unsigned int t = 0 ; t < selected_partition .mountpoints .size() ; t++ ) - if ( Utils::execute_command( "mount -v " + selected_partition .partition + " " + selected_partition .mountpoints[ t ], + if ( Utils::execute_command( "mount -v " + selected_partition .get_path() + " " + selected_partition .mountpoints[ t ], dummy, *error ) ) { @@ -1432,9 +1426,9 @@ void Win_GParted::thread_toggle_swap( bool * succes, Glib::ustring * error ) Glib::ustring dummy ; if ( selected_partition .busy ) - *succes = ! Utils::execute_command( "swapoff -v " + selected_partition .partition + " && sync", dummy, *error ) ; + *succes = ! Utils::execute_command( "swapoff -v " + selected_partition .get_path() + " && sync", dummy, *error ) ; else - *succes = ! Utils::execute_command( "swapon -v " + selected_partition .partition + " && sync", dummy, *error ) ; + *succes = ! Utils::execute_command( "swapon -v " + selected_partition .get_path() + " && sync", dummy, *error ) ; pulse = false ; } @@ -1452,8 +1446,9 @@ void Win_GParted::toggle_swap_mount_state() sigc::mem_fun( *this, &Win_GParted::thread_toggle_swap ), &succes, &error ), true ) ; show_pulsebar( - String::ucompose( selected_partition .busy ? _("Deactivating swap on %1") : _("Activating swap on %1"), - selected_partition .partition ) ) ; + String::ucompose( + selected_partition .busy ? _("Deactivating swap on %1") : _("Activating swap on %1"), + selected_partition .get_path() ) ) ; if ( ! succes ) { @@ -1477,14 +1472,14 @@ void Win_GParted::toggle_swap_mount_state() thread = Glib::Thread::create( sigc::bind( sigc::mem_fun( *this, &Win_GParted::thread_unmount_partition ), &succes, &error ), true ) ; - show_pulsebar( String::ucompose( _("Unmounting %1"), selected_partition .partition ) ) ; + show_pulsebar( String::ucompose( _("Unmounting %1"), selected_partition .get_path() ) ) ; } else { thread = Glib::Thread::create( sigc::bind( sigc::mem_fun( *this, &Win_GParted::thread_mount_partition ), &succes, &error ), true ) ; - show_pulsebar( String::ucompose( _("mounting %1"), selected_partition .partition ) ) ; + show_pulsebar( String::ucompose( _("mounting %1"), selected_partition .get_path() ) ) ; } @@ -1492,7 +1487,7 @@ void Win_GParted::toggle_swap_mount_state() { Gtk::MessageDialog dialog( *this, String::ucompose( selected_partition .busy ? _("Could not unmount %1") : _("Could not mount %1"), - selected_partition .partition ), + selected_partition .get_path() ), false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, @@ -1509,7 +1504,7 @@ void Win_GParted::toggle_swap_mount_state() void Win_GParted::activate_disklabel() { - Dialog_Disklabel dialog( devices[ current_device ] .path, gparted_core .get_disklabeltypes() ) ; + Dialog_Disklabel dialog( devices[ current_device ] .get_path(), gparted_core .get_disklabeltypes() ) ; dialog .set_transient_for( *this ); if ( dialog .run() == Gtk::RESPONSE_OK ) @@ -1517,19 +1512,19 @@ void Win_GParted::activate_disklabel() Gtk::MessageDialog m_dialog( *this, String::ucompose( _("Are you sure you want to create a %1 disklabel on %2?"), dialog .Get_Disklabel(), - devices[ current_device ] .path ), + devices[ current_device ] .get_path() ), false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_CANCEL, true ) ; m_dialog .set_secondary_text( String::ucompose( _("This operation will destroy all data on %1!"), - devices[ current_device ] .path ) ) ; + devices[ current_device ] .get_path() ) ) ; m_dialog .add_button( _("Create"), Gtk::RESPONSE_OK ); if ( m_dialog .run() == Gtk::RESPONSE_OK && - ! gparted_core .Set_Disklabel( devices[ current_device ] .path, dialog .Get_Disklabel() ) ) + ! gparted_core .Set_Disklabel( devices[ current_device ] .get_path(), dialog .Get_Disklabel() ) ) { Gtk::MessageDialog dialog( *this, _("Error while setting new disklabel"), diff --git a/src/ext2.cc b/src/ext2.cc index 00346839..27f6b91d 100644 --- a/src/ext2.cc +++ b/src/ext2.cc @@ -51,7 +51,7 @@ FS ext2::get_filesystem_support() void ext2::Set_Used_Sectors( Partition & partition ) { - if ( ! Utils::execute_command( "dumpe2fs -h " + partition .partition, output, error, true ) ) + if ( ! Utils::execute_command( "dumpe2fs -h " + partition .get_path(), output, error, true ) ) { index = output .find( "Free blocks:" ) ; if ( index >= output .length() || @@ -76,7 +76,7 @@ bool ext2::Create( const Partition & new_partition, std::vector= execute_command( "e2fsck -f -y -v " + partition .partition, + if ( 1 >= execute_command( "e2fsck -f -y -v " + partition .get_path(), operation_details .back() .sub_details ) >= 0 ) { operation_details .back() .status = OperationDetails::SUCCES ; diff --git a/src/ext3.cc b/src/ext3.cc index af8f816b..d44dfc00 100644 --- a/src/ext3.cc +++ b/src/ext3.cc @@ -52,7 +52,7 @@ FS ext3::get_filesystem_support() void ext3::Set_Used_Sectors( Partition & partition ) { - if ( ! Utils::execute_command( "dumpe2fs -h " + partition .partition, output, error, true ) ) + if ( ! Utils::execute_command( "dumpe2fs -h " + partition .get_path(), output, error, true ) ) { index = output .find( "Free blocks:" ) ; if ( index >= output .length() || @@ -77,7 +77,7 @@ bool ext3::Create( const Partition & new_partition, std::vector & operation_details ) { operation_details .push_back( OperationDetails( _("check filesystem for errors and (if possible) fix them") ) ) ; + //FIXME: i still need to check if the 1 >= x >= 0 structure actually works! - - if ( 1 >= execute_command( "e2fsck -f -y -v " + partition .partition, + if ( 1 >= execute_command( "e2fsck -f -y -v " + partition .get_path(), operation_details .back() .sub_details ) >= 0 ) { operation_details .back() .status = OperationDetails::SUCCES ; diff --git a/src/fat16.cc b/src/fat16.cc index d9079b78..9a0398e0 100644 --- a/src/fat16.cc +++ b/src/fat16.cc @@ -52,11 +52,12 @@ FS fat16::get_filesystem_support() void fat16::Set_Used_Sectors( Partition & partition ) { - exit_status = Utils::execute_command( "dosfsck -a -v " + partition .partition, output, error, true ) ; + exit_status = Utils::execute_command( "dosfsck -a -v " + partition .get_path(), output, error, true ) ; if ( exit_status == 0 || exit_status == 1 ) - { + {//FIXME: does the output of these commands always display the path we've used for the input? + //if not, we need to check for all paths in the output.. //free clusters - index = output .find( ",", output .find( partition .partition ) + partition .partition .length() ) +1 ; + index = output .find( ",", output .find( partition .get_path() ) + partition .get_path() .length() ) +1 ; if ( index < output .length() && sscanf( output .substr( index ) .c_str(), "%Ld/%Ld", &S, &N ) == 2 ) N -= S ; else @@ -80,7 +81,7 @@ bool fat16::Create( const Partition & new_partition, std::vector _("create new %1 filesystem"), Utils::Get_Filesystem_String( GParted::FS_HFS ) ) ) ) ; - if ( ! execute_command( "hformat " + new_partition .partition, operation_details .back() .sub_details ) ) + if ( ! execute_command( "hformat " + new_partition .get_path(), operation_details .back() .sub_details ) ) { operation_details .back() .status = OperationDetails::SUCCES ; return true ; diff --git a/src/jfs.cc b/src/jfs.cc index 8c16abf6..e56e681a 100644 --- a/src/jfs.cc +++ b/src/jfs.cc @@ -68,7 +68,7 @@ FS jfs::get_filesystem_support() void jfs::Set_Used_Sectors( Partition & partition ) { - if ( ! Utils::execute_command( "echo dm | jfs_debugfs " + partition .partition, output, error, true ) ) + if ( ! Utils::execute_command( "echo dm | jfs_debugfs " + partition .get_path(), output, error, true ) ) { //blocksize index = output .find( "Block Size:" ) ; @@ -95,7 +95,7 @@ bool jfs::Create( const Partition & new_partition, std::vector _("create new %1 filesystem"), Utils::Get_Filesystem_String( GParted::FS_JFS ) ) ) ) ; - if ( ! execute_command( "mkfs.jfs -q " + new_partition .partition, operation_details .back() .sub_details ) ) + if ( ! execute_command( "mkfs.jfs -q " + new_partition .get_path(), operation_details .back() .sub_details ) ) { operation_details .back() .status = OperationDetails::SUCCES ; return true ; @@ -129,9 +129,9 @@ bool jfs::Resize( const Partition & partition_new, //mount partition operation_details .back() .sub_details .push_back( - OperationDetails( String::ucompose( _("mount %1 on %2"), partition_new .partition, TEMP_MP ) ) ) ; + OperationDetails( String::ucompose( _("mount %1 on %2"), partition_new .get_path(), TEMP_MP ) ) ) ; - if ( ! execute_command( "mount -v -t jfs " + partition_new .partition + " " + TEMP_MP, + if ( ! execute_command( "mount -v -t jfs " + partition_new .get_path() + " " + TEMP_MP, operation_details .back() .sub_details .back() .sub_details ) ) { operation_details .back() .sub_details .back() .status = OperationDetails::SUCCES ; @@ -139,9 +139,9 @@ bool jfs::Resize( const Partition & partition_new, //remount the partition to resize the filesystem operation_details .back() .sub_details .push_back( OperationDetails( String::ucompose( _("remount %1 on %2 with the 'resize' flag enabled"), - partition_new .partition, TEMP_MP ) ) ) ; + partition_new .get_path(), TEMP_MP ) ) ) ; - if ( ! execute_command( "mount -v -t jfs -o remount,resize " + partition_new .partition + " " + TEMP_MP, + if ( ! execute_command( "mount -v -t jfs -o remount,resize " + partition_new .get_path() + " " + TEMP_MP, operation_details .back() .sub_details .back() .sub_details ) ) { operation_details .back() .sub_details .back() .status = OperationDetails::SUCCES ; @@ -154,9 +154,9 @@ bool jfs::Resize( const Partition & partition_new, //and unmount it... operation_details .back() .sub_details .push_back( - OperationDetails( String::ucompose( _("unmount %1"), partition_new .partition ) ) ) ; + OperationDetails( String::ucompose( _("unmount %1"), partition_new .get_path() ) ) ) ; - if ( ! execute_command( "umount -v " + partition_new .partition, + if ( ! execute_command( "umount -v " + partition_new .get_path(), operation_details .back() .sub_details .back() .sub_details ) ) { operation_details .back() .sub_details .back() .status = OperationDetails::SUCCES ; @@ -211,9 +211,7 @@ bool jfs::Copy( const Glib::ustring & src_part_path, { operation_details .back() .status = OperationDetails::SUCCES ; - Partition partition ; - partition .partition = dest_part_path ; - return Resize( partition, operation_details, true ) ; + return Resize( Partition( dest_part_path ), operation_details, true ) ; } operation_details .back() .status = OperationDetails::ERROR ; @@ -224,7 +222,7 @@ bool jfs::Check_Repair( const Partition & partition, std::vector= output .length() || @@ -73,7 +73,7 @@ bool ntfs::Create( const Partition & new_partition, std::vector= output .length() || @@ -70,7 +70,7 @@ bool reiser4::Create( const Partition & new_partition, std::vector= output .length() || @@ -80,7 +80,7 @@ bool reiserfs::Create( const Partition & new_partition, std::vector & operation_details ) { + //FIXME: change this description to 'check filesystem on /dev/blabla for er.. etc..' operation_details .push_back( OperationDetails( _("check filesystem for errors and (if possible) fix them") ) ) ; - exit_status = execute_command( "reiserfsck --y --fix-fixable " + partition .partition, + exit_status = execute_command( "reiserfsck --y --fix-fixable " + partition .get_path(), operation_details .back() .sub_details ) ; if ( exit_status == 0 || exit_status == 1 || exit_status == 256 ) { diff --git a/src/xfs.cc b/src/xfs.cc index b5113fb3..cbb1743d 100644 --- a/src/xfs.cc +++ b/src/xfs.cc @@ -70,7 +70,7 @@ FS xfs::get_filesystem_support() void xfs::Set_Used_Sectors( Partition & partition ) { if ( ! Utils::execute_command( - "xfs_db -c 'sb 0' -c 'print blocksize' -c 'print fdblocks' -r " + partition .partition, + "xfs_db -c 'sb 0' -c 'print blocksize' -c 'print fdblocks' -r " + partition .get_path(), output, error, true ) ) @@ -97,7 +97,7 @@ bool xfs::Create( const Partition & new_partition, std::vector _("create new %1 filesystem"), Utils::Get_Filesystem_String( GParted::FS_XFS ) ) ) ) ; - if ( ! execute_command( "mkfs.xfs -f " + new_partition .partition, operation_details .back() .sub_details ) ) + if ( ! execute_command( "mkfs.xfs -f " + new_partition .get_path(), operation_details .back() .sub_details ) ) { operation_details .back() .status = OperationDetails::SUCCES ; return true ; @@ -131,9 +131,9 @@ bool xfs::Resize( const Partition & partition_new, //mount partition operation_details .back() .sub_details .push_back( - OperationDetails( String::ucompose( _("mount %1 on %2"), partition_new .partition, TEMP_MP ) ) ) ; + OperationDetails( String::ucompose( _("mount %1 on %2"), partition_new .get_path(), TEMP_MP ) ) ) ; - if ( ! execute_command( "mount -v -t xfs " + partition_new .partition + " " + TEMP_MP, + if ( ! execute_command( "mount -v -t xfs " + partition_new .get_path() + " " + TEMP_MP, operation_details .back() .sub_details .back() .sub_details ) ) { operation_details .back() .sub_details .back() .status = OperationDetails::SUCCES ; @@ -154,9 +154,9 @@ bool xfs::Resize( const Partition & partition_new, //and unmount it... operation_details .back() .sub_details .push_back( - OperationDetails( String::ucompose( _("unmount %1"), partition_new .partition ) ) ) ; + OperationDetails( String::ucompose( _("unmount %1"), partition_new .get_path() ) ) ) ; - if ( ! execute_command( "umount -v " + partition_new .partition, + if ( ! execute_command( "umount -v " + partition_new .get_path(), operation_details .back() .sub_details .back() .sub_details ) ) { operation_details .back() .sub_details .back() .status = OperationDetails::SUCCES ; @@ -212,8 +212,7 @@ bool xfs::Copy( const Glib::ustring & src_part_path, Glib::ustring DST = Glib::get_tmp_dir() + "/gparted_tmp_xfs_dest_mountpoint" ; //create xfs filesystem on destination.. - Partition partition ; - partition .partition = dest_part_path ; + Partition partition( dest_part_path ) ; if ( Create( partition, operation_details .back() .sub_details ) ) { //create source mountpoint... @@ -358,7 +357,7 @@ bool xfs::Check_Repair( const Partition & partition, std::vector