From c9409ba6b2921de0ebfd9d6908efd44e19b1362f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20G=C3=A2teau?= Date: Mon, 30 Jun 2014 16:17:28 +0200 Subject: [PATCH] Start implementing support for creating partitions --- src/modules/partition/PartitionCoreModule.cpp | 45 +++++++++++++++++++ src/modules/partition/PartitionCoreModule.h | 9 ++++ src/modules/partition/PartitionModel.cpp | 10 ++++- src/modules/partition/PartitionModel.h | 5 +++ src/modules/partition/PartitionPage.cpp | 28 ++++++++++++ src/modules/partition/PartitionPage.h | 1 + 6 files changed, 96 insertions(+), 2 deletions(-) diff --git a/src/modules/partition/PartitionCoreModule.cpp b/src/modules/partition/PartitionCoreModule.cpp index 578c2b122..189f5ac49 100644 --- a/src/modules/partition/PartitionCoreModule.cpp +++ b/src/modules/partition/PartitionCoreModule.cpp @@ -25,6 +25,9 @@ #include #include #include +#include +#include +#include //- DeviceInfo -------------------------------------------- @@ -84,3 +87,45 @@ PartitionCoreModule::partitionModelForDevice( Device* device ) const } return nullptr; } + +void +PartitionCoreModule::createPartition( Partition* freeSpacePartition, FileSystem* fs, const QString& mountPoint, PartitionTable::Flags flags ) +{ + DeviceInfo* info = deviceInfoForPath( freeSpacePartition->devicePath() ); + Q_ASSERT( info ); + + PartitionNode* parent = freeSpacePartition->parent(); + + // Create a Partition object + Partition* partition = new Partition( + parent, + *info->device, + PartitionRole( PartitionRole::Primary ), // FIXME: Support extended partitions + fs, fs->firstSector(), fs->lastSector(), + QString() /* path */ + ); + + // Add Partition object + info->device->partitionTable()->removeUnallocated(); + parent->insert( partition ); + info->device->partitionTable()->updateUnallocated( *info->device ); + + // Update model + info->partitionModel->reload(); + + // Create a CreatePartitionJob + // Enqueue job +} + +PartitionCoreModule::DeviceInfo* +PartitionCoreModule::deviceInfoForPath( const QString& path ) const +{ + for ( auto info : m_devices ) + { + if ( info->device->deviceNode() == path ) + { + return info; + } + } + return nullptr; +} diff --git a/src/modules/partition/PartitionCoreModule.h b/src/modules/partition/PartitionCoreModule.h index ae7f6e780..f363b9056 100644 --- a/src/modules/partition/PartitionCoreModule.h +++ b/src/modules/partition/PartitionCoreModule.h @@ -22,8 +22,13 @@ #include #include +// CalaPM +#include + class Device; class DeviceModel; +class FileSystem; +class Partition; class PartitionModel; /** @@ -39,6 +44,8 @@ public: PartitionModel* partitionModelForDevice( Device* device ) const; + void createPartition( Partition* freeSpacePartition, FileSystem* fs, const QString& mountPoint, PartitionTable::Flags flags ); + private: struct DeviceInfo { @@ -51,6 +58,8 @@ private: DeviceModel* m_deviceModel; void listDevices(); + + DeviceInfo* deviceInfoForPath( const QString& path ) const; }; #endif /* PARTITIONCOREMODULE_H */ diff --git a/src/modules/partition/PartitionModel.cpp b/src/modules/partition/PartitionModel.cpp index 3d5384643..3884d9eaa 100644 --- a/src/modules/partition/PartitionModel.cpp +++ b/src/modules/partition/PartitionModel.cpp @@ -33,10 +33,16 @@ PartitionModel::PartitionModel( QObject* parent ) void PartitionModel::init( Device* device ) { - beginResetModel(); m_device = device; + reload(); +} + +void +PartitionModel::reload() +{ + beginResetModel(); m_partitionList.clear(); - if ( device ) + if ( m_device ) { fillPartitionList( m_device->partitionTable() ); } diff --git a/src/modules/partition/PartitionModel.h b/src/modules/partition/PartitionModel.h index 384d7cbb1..98cc61a1f 100644 --- a/src/modules/partition/PartitionModel.h +++ b/src/modules/partition/PartitionModel.h @@ -35,6 +35,11 @@ public: Partition* partitionForIndex( const QModelIndex& index ) const; + /** + * Reload model from m_device new content + */ + void reload(); + private: Device* m_device; QList< Partition* > m_partitionList; diff --git a/src/modules/partition/PartitionPage.cpp b/src/modules/partition/PartitionPage.cpp index 4dfe074eb..c1282d4a8 100644 --- a/src/modules/partition/PartitionPage.cpp +++ b/src/modules/partition/PartitionPage.cpp @@ -25,6 +25,11 @@ #include #include +// CalaPM +#include +#include +#include + // Qt #include #include @@ -52,7 +57,10 @@ PartitionPage::PartitionPage( QWidget* parent ) { updateButtons(); } ); + connect( model, &QAbstractItemModel::modelReset, this, &PartitionPage::updateButtons ); } ); + + connect( m_ui->createButton, &QAbstractButton::clicked, this, &PartitionPage::onCreateClicked ); } PartitionPage::~PartitionPage() @@ -78,3 +86,23 @@ void PartitionPage::updateButtons() m_ui->editButton->setEnabled( edit ); m_ui->deleteButton->setEnabled( del ); } + +void PartitionPage::onCreateClicked() +{ + QModelIndex index = m_ui->partitionListView->currentIndex(); + Q_ASSERT( index.isValid() ); + + const PartitionModel* model = static_cast< const PartitionModel* >( index.model() ); + Q_ASSERT( model ); + Partition* partition = model->partitionForIndex( index ); + Q_ASSERT( partition ); + + // FIXME: Ask user partition details here + qint64 start = partition->firstSector(); + qint64 end = partition->lastSector(); + FileSystem* fs = new FS::ext4( start, end, 0, "Calamares" ); + PartitionTable::Flags flags = PartitionTable::FlagNone; + QString mountPoint; + + m_core->createPartition( partition, fs, mountPoint, flags ); +} diff --git a/src/modules/partition/PartitionPage.h b/src/modules/partition/PartitionPage.h index 7ecbab28c..e4d9cf714 100644 --- a/src/modules/partition/PartitionPage.h +++ b/src/modules/partition/PartitionPage.h @@ -43,6 +43,7 @@ private: QScopedPointer< Ui_PartitionPage > m_ui; PartitionCoreModule* m_core; void updateButtons(); + void onCreateClicked(); }; #endif // PARTITIONPAGE_H