diff --git a/ChangeLog b/ChangeLog index f5b8264f..349bf321 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-12-07 Curtis Gedak + + * include/Utils.h, + src/Dialog_Partition_New.cc, + src.DialogFeatures.cc, + src/GParted_Core.cc, + src/Utils.cc, + src/Win_GParted.cc: Added lvm2 physical volume detection. + 2008-12-03 Curtis Gedak * src/Dialog_Partition_Info.cc, diff --git a/include/Utils.h b/include/Utils.h index 61041960..86d18ae0 100644 --- a/include/Utils.h +++ b/include/Utils.h @@ -65,7 +65,9 @@ enum FILESYSTEM FS_UFS = 16, FS_USED = 17, - FS_UNUSED = 18 + FS_UNUSED = 18, + + FS_LVM2 = 19 } ; enum SIZE_UNIT diff --git a/src/DialogFeatures.cc b/src/DialogFeatures.cc index b78488e4..4741eac1 100644 --- a/src/DialogFeatures.cc +++ b/src/DialogFeatures.cc @@ -100,9 +100,16 @@ DialogFeatures::DialogFeatures() void DialogFeatures::load_filesystems( const std::vector & FILESYSTEMS ) { liststore_filesystems ->clear() ; - - for ( unsigned short t = 0; t < FILESYSTEMS .size() -1 ; t++ ) + + //fill the features chart with valid file systems + for ( unsigned short t = 0; t < FILESYSTEMS .size() ; t++ ) + { + //Skip lvm2 and unknown because these are not file systems + if( FILESYSTEMS[ t ] .filesystem == GParted::FS_LVM2 || + FILESYSTEMS[ t ] .filesystem == GParted::FS_UNKNOWN ) + continue ; show_filesystem( FILESYSTEMS[ t ] ) ; + } } void DialogFeatures::show_filesystem( const FS & fs ) diff --git a/src/Dialog_Partition_New.cc b/src/Dialog_Partition_New.cc index 1949a1d5..97d2592a 100644 --- a/src/Dialog_Partition_New.cc +++ b/src/Dialog_Partition_New.cc @@ -41,13 +41,29 @@ void Dialog_Partition_New::Set_Data( const Partition & partition, this ->new_count = new_count; this ->selected_partition = partition; this ->cylinder_size = cylinder_size ; + + //copy GParted FILESYSTEMS this ->FILESYSTEMS = FILESYSTEMS ; - this ->FILESYSTEMS .back() .filesystem = GParted::FS_UNFORMATTED ; - this ->FILESYSTEMS .back() .create = GParted::FS::LIBPARTED ; - - FS fs_tmp ; - fs_tmp .filesystem = GParted::FS_EXTENDED ; - this ->FILESYSTEMS .push_back( fs_tmp ) ; + + //remove all non-valid file systems + for ( unsigned int t = this ->FILESYSTEMS .size( ) ; t > 0 ; t-- ) + { + if ( this ->FILESYSTEMS[ t ] .filesystem == GParted::FS_UNKNOWN || + this ->FILESYSTEMS[ t ] .filesystem == GParted::FS_LVM2 ) + this ->FILESYSTEMS .erase( this->FILESYSTEMS .begin() + t ) ; + } + + FS *fs_tmp ; + //add FS_UNFORMATTED + fs_tmp = new( FS ) ; + fs_tmp ->filesystem = GParted::FS_UNFORMATTED ; + fs_tmp ->create = GParted::FS::LIBPARTED ; + this ->FILESYSTEMS .push_back( * fs_tmp ) ; + + //add FS_EXTENDED + fs_tmp = new( FS ) ; + fs_tmp ->filesystem = GParted::FS_EXTENDED ; + this ->FILESYSTEMS .push_back( * fs_tmp ) ; //add table with selection menu's... table_create .set_border_width( 10 ) ; @@ -269,13 +285,16 @@ void Dialog_Partition_New::optionmenu_changed( bool type ) void Dialog_Partition_New::Build_Filesystems_Menu( bool only_unformatted ) { //fill the file system menu with the file systems (except for extended) - for ( unsigned int t = 0 ; t < FILESYSTEMS .size( ) -1 ; t++ ) + for ( unsigned int t = 0 ; t < FILESYSTEMS .size( ) ; t++ ) { + //skip extended (lvm2 and unknown removed in Set_Data()) + if( FILESYSTEMS[ t ] .filesystem == GParted::FS_EXTENDED ) + continue ; menu_filesystem .items() .push_back( Gtk::Menu_Helpers::MenuElem( Utils::get_filesystem_string( FILESYSTEMS[ t ] .filesystem ) ) ) ; - menu_filesystem .items()[ t ] .set_sensitive( + menu_filesystem .items() .back() .set_sensitive( ! only_unformatted && FILESYSTEMS[ t ] .create && - this ->selected_partition .get_length() >= FILESYSTEMS[ t ] .MIN ) ; + this ->selected_partition .get_length() >= FILESYSTEMS[ t ] .MIN ) ; } //unformatted is always available diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc index 3fd21e67..155bc198 100644 --- a/src/GParted_Core.cc +++ b/src/GParted_Core.cc @@ -105,7 +105,7 @@ void GParted_Core::find_supported_filesystems() linux_swap fs_linux_swap; FILESYSTEMS .push_back( fs_linux_swap .get_filesystem_support() ) ; - + ntfs fs_ntfs; FILESYSTEMS .push_back( fs_ntfs .get_filesystem_support() ) ; @@ -120,12 +120,19 @@ void GParted_Core::find_supported_filesystems() xfs fs_xfs; FILESYSTEMS .push_back( fs_xfs .get_filesystem_support() ) ; - + + FS *fs ; + //lvm2 physical volume -- not a file system + fs = new( FS ) ; + fs ->filesystem = GParted::FS_LVM2 ; + FILESYSTEMS .push_back( * fs ) ; + //unknown file system (default when no match is found) - FS fs ; fs .filesystem = GParted::FS_UNKNOWN ; - FILESYSTEMS .push_back( fs ) ; + fs = new( FS ) ; + fs ->filesystem = GParted::FS_UNKNOWN ; + FILESYSTEMS .push_back( * fs ) ; } - + void GParted_Core::set_user_devices( const std::vector & user_devices ) { this ->device_paths = user_devices ; @@ -757,6 +764,7 @@ GParted::FILESYSTEM GParted_Core::get_filesystem() //other file systems libparted couldn't detect (i've send patches for these file systems to the parted guys) + // - no patches sent to parted for lvm2 char buf[512] ; ped_device_open( lp_device ); @@ -767,7 +775,27 @@ GParted::FILESYSTEM GParted_Core::get_filesystem() if ( Glib::ustring( buf ) == "ReIsEr4" ) return GParted::FS_REISER4 ; - + + //lvm2 + //NOTE: lvm2 is not a file system but we do wish to recognize the Physical Volume + char magic1[16] ; + char magic2[16] ; + + ped_device_open( lp_device ); + ped_geometry_read( & lp_partition ->geom, buf, 1, 1 ) ; + strncpy(magic1, buf+0, 8) ; magic1[8] = '\0' ; //set and terminate string + strncpy(magic2, buf+24, 4) ; magic2[4] = '\0' ; //set and terminate string + ped_device_close( lp_device ); + + if ( Glib::ustring( magic1 ) == "LABELONE" + && Glib::ustring( magic2 ) == "LVM2" ) + { + temp = _( "Logical Volume Management is not yet supported." ) ; + temp += "\n" ; + partition_temp .messages .push_back( temp ) ; + return GParted::FS_LVM2 ; + } + //no file system found.... temp = _( "Unable to detect file system! Possible reasons are:" ) ; temp += "\n-"; @@ -856,7 +884,8 @@ void GParted_Core::set_mountpoints( std::vector & partitions ) { if ( ( partitions[ t ] .type == GParted::TYPE_PRIMARY || partitions[ t ] .type == GParted::TYPE_LOGICAL ) && - partitions[ t ] .filesystem != GParted::FS_LINUX_SWAP ) + partitions[ t ] .filesystem != GParted::FS_LINUX_SWAP && + partitions[ t ] .filesystem != GParted::FS_LVM2 ) { if ( partitions[ t ] .busy ) { @@ -896,6 +925,7 @@ void GParted_Core::set_used_sectors( std::vector & partitions ) for ( unsigned int t = 0 ; t < partitions .size() ; t++ ) { if ( partitions[ t ] .filesystem != GParted::FS_LINUX_SWAP && + partitions[ t ] .filesystem != GParted::FS_LVM2 && partitions[ t ] .filesystem != GParted::FS_UNKNOWN ) { if ( partitions[ t ] .type == GParted::TYPE_PRIMARY || diff --git a/src/Utils.cc b/src/Utils.cc index bfd744dd..a97f439d 100644 --- a/src/Utils.cc +++ b/src/Utils.cc @@ -67,27 +67,28 @@ Glib::ustring Utils::get_color( FILESYSTEM filesystem ) { switch( filesystem ) { - case FS_UNALLOCATED : return "#A9A9A9" ; - case FS_UNKNOWN : return "#000000" ; - case FS_UNFORMATTED : return "#000000" ; - case FS_EXTENDED : return "#7DFCFE" ; - case FS_EXT2 : return "#9DB8D2" ; - case FS_EXT3 : return "#7590AE" ; - case FS_LINUX_SWAP : return "#C1665A" ; - case FS_FAT16 : return "#00FF00" ; - case FS_FAT32 : return "#18D918" ; - case FS_NTFS : return "#42E5AC" ; - case FS_REISERFS : return "#ADA7C8" ; - case FS_REISER4 : return "#887FA3" ; - case FS_XFS : return "#EED680" ; - case FS_JFS : return "#E0C39E" ; - case FS_HFS : return "#E0B6AF" ; - case FS_HFSPLUS : return "#C0A39E" ; - case FS_UFS : return "#D1940C" ; - case FS_USED : return "#F8F8BA" ; - case FS_UNUSED : return "#FFFFFF" ; + case FS_UNALLOCATED : return "#A9A9A9" ; // ~ medium grey + case FS_UNKNOWN : return "#000000" ; //black + case FS_UNFORMATTED : return "#000000" ; //black + case FS_EXTENDED : return "#7DFCFE" ; // ~ light blue + case FS_EXT2 : return "#9DB8D2" ; //blue hilight + case FS_EXT3 : return "#7590AE" ; //blue medium + case FS_LINUX_SWAP : return "#C1665A" ; //red medium + case FS_FAT16 : return "#00FF00" ; //green + case FS_FAT32 : return "#18D918" ; // ~ medium green + case FS_NTFS : return "#42E5AC" ; // ~ light turquoise + case FS_REISERFS : return "#ADA7C8" ; //purple hilight + case FS_REISER4 : return "#887FA3" ; //purple medium + case FS_XFS : return "#EED680" ; //accent yellow + case FS_JFS : return "#E0C39E" ; //face skin medium + case FS_HFS : return "#E0B6AF" ; //red hilight + case FS_HFSPLUS : return "#C0A39E" ; // ~ serene red + case FS_UFS : return "#D1940C" ; //accent yellow dark + case FS_USED : return "#F8F8BA" ; // ~ light tan yellow + case FS_UNUSED : return "#FFFFFF" ; //white + case FS_LVM2 : return "#CC9966" ; // ~ medium brown - default : return "#000000" ; + default : return "#000000" ; } } @@ -130,6 +131,7 @@ Glib::ustring Utils::get_filesystem_string( FILESYSTEM filesystem ) case FS_UFS : return "ufs" ; case FS_USED : return _("used") ; case FS_UNUSED : return _("unused") ; + case FS_LVM2 : return "lvm2" ; default : return "" ; } diff --git a/src/Win_GParted.cc b/src/Win_GParted.cc index 318091e3..c97a5ead 100644 --- a/src/Win_GParted.cc +++ b/src/Win_GParted.cc @@ -380,8 +380,13 @@ Gtk::Menu * Win_GParted::create_format_menu() { menu = manage( new Gtk::Menu() ) ; - for ( unsigned int t =0; t < gparted_core .get_filesystems() .size() -1 ; t++ ) + for ( unsigned int t =0; t < gparted_core .get_filesystems() .size() ; t++ ) { + //Skip lvm2 and unknown because these are not file systems + if( gparted_core .get_filesystems()[ t ] .filesystem == GParted::FS_LVM2 || + gparted_core .get_filesystems()[ t ] .filesystem == GParted::FS_UNKNOWN ) + continue ; + hbox = manage( new Gtk::HBox() ); //the colored square