made blocksize settable by the user.
* include/Dialog_Partition_Copy.h, include/GParted_Core.h, include/OperationCopy.h, include/Win_GParted.h, src/Dialog_Partition_Copy.cc, src/GParted_Core.cc, src/OperationCopy.cc, src/Win_GParted.cc: made blocksize settable by the user.
This commit is contained in:
parent
7b56107ce9
commit
7ff0609962
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
2006-05-27 Bart Hakvoort <hakvoort@cvs.gnome.org>
|
||||||
|
|
||||||
|
* include/Dialog_Partition_Copy.h,
|
||||||
|
include/GParted_Core.h,
|
||||||
|
include/OperationCopy.h,
|
||||||
|
include/Win_GParted.h,
|
||||||
|
src/Dialog_Partition_Copy.cc,
|
||||||
|
src/GParted_Core.cc,
|
||||||
|
src/OperationCopy.cc,
|
||||||
|
src/Win_GParted.cc: made blocksize settable by the user.
|
||||||
|
|
||||||
2006-05-26 Bart Hakvoort <hakvoort@cvs.gnome.org>
|
2006-05-26 Bart Hakvoort <hakvoort@cvs.gnome.org>
|
||||||
|
|
||||||
* src/GParted_Core.cc: fixed typo (#343015)
|
* src/GParted_Core.cc: fixed typo (#343015)
|
||||||
|
|
|
@ -28,10 +28,13 @@ class Dialog_Partition_Copy : public Dialog_Base_Partition
|
||||||
public:
|
public:
|
||||||
Dialog_Partition_Copy( const FS & fs, Sector cylinder_size ) ;
|
Dialog_Partition_Copy( const FS & fs, Sector cylinder_size ) ;
|
||||||
void Set_Data( const Partition & selected_partition, const Partition & copied_partition );
|
void Set_Data( const Partition & selected_partition, const Partition & copied_partition );
|
||||||
Partition Get_New_Partition( ) ;
|
|
||||||
|
Partition Get_New_Partition() ;
|
||||||
|
Sector get_block_size() ;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Gtk::HBox hbox_block_size ;
|
||||||
|
Gtk::SpinButton spinbutton_block_size ;
|
||||||
};
|
};
|
||||||
|
|
||||||
}//GParted
|
}//GParted
|
||||||
|
|
|
@ -51,6 +51,7 @@ public:
|
||||||
bool copy( const Partition & partition_src,
|
bool copy( const Partition & partition_src,
|
||||||
Partition & partition_dest,
|
Partition & partition_dest,
|
||||||
Sector min_size,
|
Sector min_size,
|
||||||
|
Sector block_size,
|
||||||
std::vector<OperationDetails> & operation_details ) ;
|
std::vector<OperationDetails> & operation_details ) ;
|
||||||
|
|
||||||
bool Set_Disklabel( const Glib::ustring & device_path, const Glib::ustring & disklabel ) ;
|
bool Set_Disklabel( const Glib::ustring & device_path, const Glib::ustring & disklabel ) ;
|
||||||
|
@ -93,7 +94,8 @@ private:
|
||||||
|
|
||||||
bool copy_filesystem( const Partition & partition_src,
|
bool copy_filesystem( const Partition & partition_src,
|
||||||
const Partition & partition_dest,
|
const Partition & partition_dest,
|
||||||
std::vector<OperationDetails> & operation_details ) ;
|
std::vector<OperationDetails> & operation_details,
|
||||||
|
Sector block_size ) ;
|
||||||
|
|
||||||
void set_proper_filesystem( const FILESYSTEM & filesystem ) ;
|
void set_proper_filesystem( const FILESYSTEM & filesystem ) ;
|
||||||
bool set_partition_type( const Partition & partition,
|
bool set_partition_type( const Partition & partition,
|
||||||
|
|
|
@ -29,11 +29,13 @@ public:
|
||||||
OperationCopy( const Device & device,
|
OperationCopy( const Device & device,
|
||||||
const Partition & partition_orig,
|
const Partition & partition_orig,
|
||||||
const Partition & partition_new,
|
const Partition & partition_new,
|
||||||
const Partition & partition_copied) ;
|
const Partition & partition_copied,
|
||||||
|
Sector block_size ) ;
|
||||||
|
|
||||||
void apply_to_visual( std::vector<Partition> & partitions ) ;
|
void apply_to_visual( std::vector<Partition> & partitions ) ;
|
||||||
|
|
||||||
Partition partition_copied ;
|
Partition partition_copied ;
|
||||||
|
Sector block_size ;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void create_description() ;
|
void create_description() ;
|
||||||
|
|
|
@ -63,7 +63,10 @@ private:
|
||||||
//Fill txtview_device_info_buffer with some information about the selected device
|
//Fill txtview_device_info_buffer with some information about the selected device
|
||||||
void Fill_Label_Device_Info( bool clear = false );
|
void Fill_Label_Device_Info( bool clear = false );
|
||||||
|
|
||||||
void Add_Operation( OperationType operationtype, const Partition & new_partition, int index = -1 ) ;
|
void Add_Operation( OperationType operationtype,
|
||||||
|
const Partition & new_partition,
|
||||||
|
Sector block_size = -1,
|
||||||
|
int index = -1 ) ;
|
||||||
void Refresh_Visual();
|
void Refresh_Visual();
|
||||||
bool Quit_Check_Operations();
|
bool Quit_Check_Operations();
|
||||||
void set_valid_operations() ;
|
void set_valid_operations() ;
|
||||||
|
|
|
@ -87,13 +87,27 @@ void Dialog_Partition_Copy::Set_Data( const Partition & selected_partition, cons
|
||||||
Set_MinMax_Text(
|
Set_MinMax_Text(
|
||||||
Utils::round( Utils::sector_to_unit( fs .MIN, GParted::UNIT_MIB ) ),
|
Utils::round( Utils::sector_to_unit( fs .MIN, GParted::UNIT_MIB ) ),
|
||||||
Utils::round( Utils::sector_to_unit( fs .MAX, GParted::UNIT_MIB ) ) ) ;
|
Utils::round( Utils::sector_to_unit( fs .MAX, GParted::UNIT_MIB ) ) ) ;
|
||||||
|
|
||||||
|
|
||||||
|
//allow the user to set the size of the blocks which will be copied at once
|
||||||
|
hbox_block_size .set_spacing( 10 ) ;
|
||||||
|
this ->get_vbox() ->pack_start( hbox_block_size ) ;
|
||||||
|
hbox_block_size .pack_start( * Utils::mk_label( _("Blocksize (sectors):") ), Gtk::PACK_SHRINK ) ;
|
||||||
|
|
||||||
|
spinbutton_block_size .set_numeric( true ) ;
|
||||||
|
spinbutton_block_size .set_increments( 1, 10 ) ;
|
||||||
|
spinbutton_block_size .set_range( 1, MEBIBYTE ) ;
|
||||||
|
spinbutton_block_size .set_value( 32 ) ;
|
||||||
|
hbox_block_size .pack_start( spinbutton_block_size, Gtk::PACK_SHRINK ) ;
|
||||||
|
|
||||||
//set global selected_partition (see Dialog_Base_Partition::Get_New_Partition )
|
//set global selected_partition (see Dialog_Base_Partition::Get_New_Partition )
|
||||||
this ->selected_partition = copied_partition ;
|
this ->selected_partition = copied_partition ;
|
||||||
this ->selected_partition .device_path = selected_partition .device_path ;
|
this ->selected_partition .device_path = selected_partition .device_path ;
|
||||||
this ->selected_partition .inside_extended = selected_partition .inside_extended ;
|
this ->selected_partition .inside_extended = selected_partition .inside_extended ;
|
||||||
this ->selected_partition .type =
|
this ->selected_partition .type =
|
||||||
selected_partition .inside_extended ? GParted::TYPE_LOGICAL : GParted::TYPE_PRIMARY ;
|
selected_partition .inside_extended ? GParted::TYPE_LOGICAL : GParted::TYPE_PRIMARY ;
|
||||||
|
|
||||||
|
this ->show_all_children() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
Partition Dialog_Partition_Copy::Get_New_Partition()
|
Partition Dialog_Partition_Copy::Get_New_Partition()
|
||||||
|
@ -106,5 +120,9 @@ Partition Dialog_Partition_Copy::Get_New_Partition()
|
||||||
|
|
||||||
return selected_partition ;
|
return selected_partition ;
|
||||||
}
|
}
|
||||||
|
Sector Dialog_Partition_Copy::get_block_size()
|
||||||
|
{
|
||||||
|
return spinbutton_block_size .get_value_as_int() ;
|
||||||
|
}
|
||||||
|
|
||||||
} //GParted
|
} //GParted
|
||||||
|
|
|
@ -654,6 +654,7 @@ bool GParted_Core::apply_operation_to_disk( Operation * operation )
|
||||||
return copy( static_cast<OperationCopy*>( operation ) ->partition_copied,
|
return copy( static_cast<OperationCopy*>( operation ) ->partition_copied,
|
||||||
operation ->partition_new,
|
operation ->partition_new,
|
||||||
static_cast<OperationCopy*>( operation ) ->partition_copied .get_length(),
|
static_cast<OperationCopy*>( operation ) ->partition_copied .get_length(),
|
||||||
|
static_cast<OperationCopy*>( operation ) ->block_size,
|
||||||
operation ->operation_details .sub_details ) ;
|
operation ->operation_details .sub_details ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -785,6 +786,7 @@ bool GParted_Core::resize( const Device & device,
|
||||||
bool GParted_Core::copy( const Partition & partition_src,
|
bool GParted_Core::copy( const Partition & partition_src,
|
||||||
Partition & partition_dest,
|
Partition & partition_dest,
|
||||||
Sector min_size,
|
Sector min_size,
|
||||||
|
Sector block_size,
|
||||||
std::vector<OperationDetails> & operation_details )
|
std::vector<OperationDetails> & operation_details )
|
||||||
{
|
{
|
||||||
set_proper_filesystem( partition_dest .filesystem ) ;
|
set_proper_filesystem( partition_dest .filesystem ) ;
|
||||||
|
@ -806,7 +808,8 @@ bool GParted_Core::copy( const Partition & partition_src,
|
||||||
case GParted::FS::GPARTED :
|
case GParted::FS::GPARTED :
|
||||||
succes = copy_filesystem( partition_src,
|
succes = copy_filesystem( partition_src,
|
||||||
partition_dest,
|
partition_dest,
|
||||||
operation_details ) ;
|
operation_details,
|
||||||
|
block_size ) ;
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
case GParted::FS::LIBPARTED :
|
case GParted::FS::LIBPARTED :
|
||||||
|
@ -1258,11 +1261,17 @@ bool GParted_Core::resize_normal_using_libparted( const Partition & partition_ol
|
||||||
|
|
||||||
bool GParted_Core::copy_filesystem( const Partition & partition_src,
|
bool GParted_Core::copy_filesystem( const Partition & partition_src,
|
||||||
const Partition & partition_dest,
|
const Partition & partition_dest,
|
||||||
std::vector<OperationDetails> & operation_details )
|
std::vector<OperationDetails> & operation_details,
|
||||||
{//FIXME: try to increase speed by copying more sectors at once, this should probably become a userspace setting
|
Sector block_size )
|
||||||
|
{
|
||||||
|
operation_details .back() .sub_details .push_back( OperationDetails(
|
||||||
|
"<i>" + String::ucompose( _("Use a blocksize of %1 (%2 sectors)"),
|
||||||
|
Utils::format_size( block_size ),
|
||||||
|
block_size ) + "</i>",
|
||||||
|
OperationDetails::NONE ) ) ;
|
||||||
|
|
||||||
bool succes = false ;
|
bool succes = false ;
|
||||||
|
char buf[block_size * 512] ;
|
||||||
char buf[1024] ;
|
|
||||||
PedDevice *lp_device_src, *lp_device_dest ;
|
PedDevice *lp_device_src, *lp_device_dest ;
|
||||||
//FIXME: adapt open_device() so we don't have to call ped_device_get() here
|
//FIXME: adapt open_device() so we don't have to call ped_device_get() here
|
||||||
//(same goes for close_device() and ped_device_destroy()
|
//(same goes for close_device() and ped_device_destroy()
|
||||||
|
@ -1283,25 +1292,25 @@ bool GParted_Core::copy_filesystem( const Partition & partition_src,
|
||||||
|
|
||||||
Glib::ustring error_message ;
|
Glib::ustring error_message ;
|
||||||
Sector t = 0 ;
|
Sector t = 0 ;
|
||||||
for ( ; t < partition_src .get_length() ; t++ )
|
for ( ; t < partition_src .get_length() - block_size ; t+=block_size )
|
||||||
{
|
{
|
||||||
if ( ! ped_device_read( lp_device_src, buf, partition_src .sector_start + t, 1 ) )
|
if ( ! ped_device_read( lp_device_src, buf, partition_src .sector_start + t, block_size ) )
|
||||||
{
|
{
|
||||||
error_message = "<i>" + String::ucompose( _("Error while reading sector %1"),
|
error_message = "<i>" + String::ucompose( _("Error while reading block at sector %1"),
|
||||||
partition_src .sector_start + t ) + "</i>" ;
|
partition_src .sector_start + t ) + "</i>" ;
|
||||||
|
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! ped_device_write( lp_device_dest, buf, partition_dest .sector_start + t, 1 ) )
|
if ( ! ped_device_write( lp_device_dest, buf, partition_dest .sector_start + t, block_size ) )
|
||||||
{
|
{
|
||||||
error_message = "<i>" + String::ucompose( _("Error while writing sector %1"),
|
error_message = "<i>" + String::ucompose( _("Error while writing block at sector %1"),
|
||||||
partition_src .sector_start + t ) + "</i>" ;
|
partition_src .sector_start + t ) + "</i>" ;
|
||||||
|
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( t % MEBIBYTE == 0 )
|
if ( t % ( block_size * 100 ) == 0 )
|
||||||
{
|
{
|
||||||
operation_details .back() .sub_details .back() .progress_text =
|
operation_details .back() .sub_details .back() .progress_text =
|
||||||
String::ucompose( _("%1 of %2 copied"),
|
String::ucompose( _("%1 of %2 copied"),
|
||||||
|
@ -1316,13 +1325,27 @@ bool GParted_Core::copy_filesystem( const Partition & partition_src,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//copy the last couple of sectors..
|
||||||
|
Sector last_sectors = partition_src .get_length() - t ;
|
||||||
|
if ( ped_device_read( lp_device_src, buf, partition_src .sector_start + t, last_sectors ) )
|
||||||
|
{
|
||||||
|
if ( ped_device_write( lp_device_dest, buf, partition_dest .sector_start + t , last_sectors ) )
|
||||||
|
t += last_sectors ;
|
||||||
|
else
|
||||||
|
error_message = "<i>" + String::ucompose( _("Error while writing block at sector %1"),
|
||||||
|
partition_src .sector_start + t ) + "</i>" ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
error_message = "<i>" + String::ucompose( _("Error while reading block at sector %1"),
|
||||||
|
partition_src .sector_start + t ) + "</i>" ;
|
||||||
|
|
||||||
//final description
|
//final description
|
||||||
operation_details .back() .sub_details .back() .description =
|
operation_details .back() .sub_details .back() .description =
|
||||||
"<i>" +
|
"<i>" +
|
||||||
String::ucompose( _("%1 of %2 copied"),
|
String::ucompose( _("%1 of %2 copied"),
|
||||||
Utils::format_size( t +1 ),
|
Utils::format_size( t +1 ),
|
||||||
Utils::format_size( partition_src .get_length() ) ) +
|
Utils::format_size( partition_src .get_length() ) ) +
|
||||||
"</i>" ;
|
"</i>" ;
|
||||||
//reset fraction to -1 to make room for a new one (or a pulsebar)
|
//reset fraction to -1 to make room for a new one (or a pulsebar)
|
||||||
operation_details .back() .sub_details .back() .fraction = -1 ;
|
operation_details .back() .sub_details .back() .fraction = -1 ;
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,8 @@ namespace GParted
|
||||||
OperationCopy::OperationCopy( const Device & device,
|
OperationCopy::OperationCopy( const Device & device,
|
||||||
const Partition & partition_orig,
|
const Partition & partition_orig,
|
||||||
const Partition & partition_new,
|
const Partition & partition_new,
|
||||||
const Partition & partition_copied )
|
const Partition & partition_copied,
|
||||||
|
Sector block_size )
|
||||||
{
|
{
|
||||||
type = GParted::COPY ;
|
type = GParted::COPY ;
|
||||||
|
|
||||||
|
@ -31,6 +32,7 @@ OperationCopy::OperationCopy( const Device & device,
|
||||||
this ->partition_original = partition_orig ;
|
this ->partition_original = partition_orig ;
|
||||||
this ->partition_new = partition_new ;
|
this ->partition_new = partition_new ;
|
||||||
this ->partition_copied = partition_copied ;
|
this ->partition_copied = partition_copied ;
|
||||||
|
this ->block_size = block_size ;
|
||||||
|
|
||||||
create_description() ;
|
create_description() ;
|
||||||
|
|
||||||
|
@ -89,7 +91,6 @@ void OperationCopy::create_description()
|
||||||
partition_copied .get_path(),
|
partition_copied .get_path(),
|
||||||
partition_original .get_path() ) ;
|
partition_original .get_path() ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} //GParted
|
} //GParted
|
||||||
|
|
|
@ -573,7 +573,13 @@ bool Win_GParted::on_delete_event( GdkEventAny *event )
|
||||||
return ! Quit_Check_Operations();
|
return ! Quit_Check_Operations();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Win_GParted::Add_Operation( OperationType operationtype, const Partition & new_partition, int index )
|
//FIXME: i guess it's better if we just create the operations in the activate_* functions instead
|
||||||
|
//of doing it here. now we're adding more and more functionality (e.g. blocksize) to the operations
|
||||||
|
//the current approach doesn't suffice anymore.
|
||||||
|
void Win_GParted::Add_Operation( OperationType operationtype,
|
||||||
|
const Partition & new_partition,
|
||||||
|
Sector block_size,
|
||||||
|
int index )
|
||||||
{
|
{
|
||||||
Operation * operation ;
|
Operation * operation ;
|
||||||
switch ( operationtype )
|
switch ( operationtype )
|
||||||
|
@ -604,7 +610,8 @@ void Win_GParted::Add_Operation( OperationType operationtype, const Partition &
|
||||||
operation = new OperationCopy( devices[ current_device ],
|
operation = new OperationCopy( devices[ current_device ],
|
||||||
selected_partition,
|
selected_partition,
|
||||||
new_partition,
|
new_partition,
|
||||||
copied_partition ) ;
|
copied_partition,
|
||||||
|
block_size ) ;
|
||||||
operation ->icon = render_icon( Gtk::Stock::COPY, Gtk::ICON_SIZE_MENU );
|
operation ->icon = render_icon( Gtk::Stock::COPY, Gtk::ICON_SIZE_MENU );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1269,7 +1276,7 @@ void Win_GParted::activate_paste()
|
||||||
if ( dialog .run() == Gtk::RESPONSE_OK )
|
if ( dialog .run() == Gtk::RESPONSE_OK )
|
||||||
{
|
{
|
||||||
dialog .hide() ;
|
dialog .hide() ;
|
||||||
Add_Operation( GParted::COPY, dialog .Get_New_Partition() );
|
Add_Operation( GParted::COPY, dialog .Get_New_Partition(), dialog .get_block_size() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1281,8 +1288,11 @@ void Win_GParted::activate_paste()
|
||||||
partition_new .set_used( copied_partition .sectors_used ) ;
|
partition_new .set_used( copied_partition .sectors_used ) ;
|
||||||
partition_new .error .clear() ;
|
partition_new .error .clear() ;
|
||||||
partition_new .status = GParted::STAT_COPY ;
|
partition_new .status = GParted::STAT_COPY ;
|
||||||
|
|
||||||
Add_Operation( GParted::COPY, partition_new ) ;
|
//FIXME: in this case there's no window presented to the user, so he cannot choose the blocksize
|
||||||
|
//i guess this means we have to present a window with the choice (maybe the copydialog, with everything
|
||||||
|
//except the blocksize disabled?
|
||||||
|
Add_Operation( GParted::COPY, partition_new, 32 ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1469,7 +1479,7 @@ void Win_GParted::activate_format( GParted::FILESYSTEM new_fs )
|
||||||
//(NOTE: in this case we set status to STAT_NEW)
|
//(NOTE: in this case we set status to STAT_NEW)
|
||||||
part_temp .status = STAT_NEW ;
|
part_temp .status = STAT_NEW ;
|
||||||
|
|
||||||
Add_Operation( GParted::CREATE, part_temp, t );
|
Add_Operation( GParted::CREATE, part_temp, -1, t );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue