Add the ability to (re)create partition tables

main
Aurélien Gâteau 11 years ago
parent 2e3f1c655c
commit 83a56a6bd3

@ -18,6 +18,7 @@ calamares_add_plugin( partition
SOURCES
CreatePartitionDialog.cpp
CreatePartitionJob.cpp
CreatePartitionTableJob.cpp
DeletePartitionJob.cpp
DeviceModel.cpp
PartitionCoreModule.cpp
@ -40,6 +41,7 @@ calamares_add_plugin( partition
set( partview_SRCS
CreatePartitionDialog.cpp
CreatePartitionJob.cpp
CreatePartitionTableJob.cpp
DeletePartitionJob.cpp
DeviceModel.cpp
PartitionCoreModule.cpp

@ -0,0 +1,96 @@
/* === This file is part of Calamares - <http://github.com/calamares> ===
*
* Copyright 2014, Aurélien Gâteau <agateau@kde.org>
*
* Calamares is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Calamares is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
*/
#include <CreatePartitionTableJob.h>
#include <utils/Logger.h>
// CalaPM
#include <backend/corebackend.h>
#include <backend/corebackendmanager.h>
#include <backend/corebackenddevice.h>
#include <backend/corebackendpartition.h>
#include <backend/corebackendpartitiontable.h>
#include <core/device.h>
#include <core/partition.h>
#include <core/partitiontable.h>
#include <fs/filesystem.h>
#include <util/report.h>
// Qt
#include <QScopedPointer>
CreatePartitionTableJob::CreatePartitionTableJob( Device* device )
: m_device( device )
{
}
QString
CreatePartitionTableJob::prettyName() const
{
return tr( "Create partition table" ); // FIXME
}
Calamares::JobResult
CreatePartitionTableJob::exec()
{
Report report( 0 );
QString message = tr( "The installer failed to create a partition table on %1." ).arg( m_device->name() );
CoreBackend* backend = CoreBackendManager::self()->backend();
QScopedPointer< CoreBackendDevice > backendDevice( backend->openDevice( m_device->deviceNode() ) );
if ( !backendDevice.data() )
{
return Calamares::JobResult::error(
message,
tr( "Could not open device %1." ).arg( m_device->deviceNode() )
);
}
QScopedPointer< PartitionTable > table( createTable() );
bool ok = backendDevice->createPartitionTable( report, *table );
if ( !ok )
{
return Calamares::JobResult::error(
message,
report.toText()
);
}
return Calamares::JobResult::ok();
}
void
CreatePartitionTableJob::updatePreview()
{
// Device takes ownership of its table, but does not destroy the current
// one when setPartitionTable() is called, so do it ourself
delete m_device->partitionTable();
m_device->setPartitionTable( createTable() );
m_device->partitionTable()->updateUnallocated( *m_device );
}
PartitionTable*
CreatePartitionTableJob::createTable()
{
PartitionTable::TableType type = PartitionTable::msdos;
return new PartitionTable(type,
PartitionTable::defaultFirstUsable( *m_device, type ),
PartitionTable::defaultLastUsable( *m_device, type )
);
}

@ -0,0 +1,46 @@
/* === This file is part of Calamares - <http://github.com/calamares> ===
*
* Copyright 2014, Aurélien Gâteau <agateau@kde.org>
*
* Calamares is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Calamares is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CREATEPARTITIONTABLEJOB_H
#define CREATEPARTITIONTABLEJOB_H
#include <Job.h>
class Device;
class PartitionTable;
class CreatePartitionTableJob : public Calamares::Job
{
Q_OBJECT
public:
CreatePartitionTableJob( Device* device );
QString prettyName() const override;
Calamares::JobResult exec() override;
void updatePreview();
Device* device() const
{
return m_device;
}
private:
Device* m_device;
PartitionTable* createTable();
};
#endif /* CREATEPARTITIONTABLEJOB_H */

@ -19,6 +19,7 @@
#include <PartitionCoreModule.h>
#include <CreatePartitionJob.h>
#include <CreatePartitionTableJob.h>
#include <DeletePartitionJob.h>
#include <DeviceModel.h>
#include <PartitionModel.h>
@ -73,6 +74,19 @@ PartitionCoreModule::partitionModelForDevice( Device* device ) const
return m_partitionModelForDeviceHash[ device ];
}
void
PartitionCoreModule::createPartitionTable( Device* device )
{
CreatePartitionTableJob* job = new CreatePartitionTableJob( device );
job->updatePreview();
refreshPartitionModel( device );
// FIXME: Remove all jobs queued for this device, as well as all partition
// info
m_jobs << Calamares::job_ptr( job );
updateHasRootMountPoint();
}
void
PartitionCoreModule::createPartition( Device* device, PartitionInfo* partitionInfo )
{

@ -50,6 +50,8 @@ public:
PartitionModel* partitionModelForDevice( Device* device ) const;
void createPartitionTable( Device* device );
void createPartition( Device* device, PartitionInfo* partitionInfo );
void deletePartition( Device* device, Partition* partition );

@ -26,10 +26,14 @@
#include <PMUtils.h>
#include <ui_PartitionPage.h>
// CalaPM
#include <core/device.h>
// Qt
#include <QDebug>
#include <QHeaderView>
#include <QItemSelectionModel>
#include <QMessageBox>
#include <QPointer>
PartitionPage::PartitionPage( PartitionCoreModule* core, QWidget* parent )
@ -65,6 +69,7 @@ PartitionPage::PartitionPage( PartitionCoreModule* core, QWidget* parent )
connect( model, &QAbstractItemModel::modelReset, this, &PartitionPage::updateButtons );
} );
connect( m_ui->newPartitionTableButton, &QAbstractButton::clicked, this, &PartitionPage::onNewPartitionTableClicked );
connect( m_ui->createButton, &QAbstractButton::clicked, this, &PartitionPage::onCreateClicked );
connect( m_ui->deleteButton, &QAbstractButton::clicked, this, &PartitionPage::onDeleteClicked );
}
@ -92,6 +97,31 @@ PartitionPage::updateButtons()
m_ui->createButton->setEnabled( create );
m_ui->editButton->setEnabled( edit );
m_ui->deleteButton->setEnabled( del );
m_ui->newPartitionTableButton->setEnabled( m_ui->deviceListView->currentIndex().isValid() );
}
void
PartitionPage::onNewPartitionTableClicked()
{
QModelIndex index = m_ui->deviceListView->currentIndex();
Q_ASSERT( index.isValid() );
Device* device = m_core->deviceModel()->deviceForIndex( index );
auto answer = QMessageBox::warning( this,
tr( "New Partition Table" ),
tr( "Are you sure you want to create a new partition table on %1?\n"
"Creating a new partition table will delete all existing data on the disk.")
.arg( device->name() ),
QMessageBox::Ok | QMessageBox::Cancel,
QMessageBox::Cancel
);
if (answer != QMessageBox::Ok )
{
return;
}
m_core->createPartitionTable( device );
}
void

@ -42,6 +42,7 @@ private:
QScopedPointer< Ui_PartitionPage > m_ui;
PartitionCoreModule* m_core;
void updateButtons();
void onNewPartitionTableClicked();
void onCreateClicked();
void onDeleteClicked();
};

@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>568</width>
<width>655</width>
<height>304</height>
</rect>
</property>
@ -23,6 +23,13 @@
</item>
<item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="newPartitionTableButton">
<property name="text">
<string>New Partition Table</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">

Loading…
Cancel
Save