diff --git a/src/modules/partition/CMakeLists.txt b/src/modules/partition/CMakeLists.txt index fffcc264f..01fd705a0 100644 --- a/src/modules/partition/CMakeLists.txt +++ b/src/modules/partition/CMakeLists.txt @@ -26,8 +26,9 @@ calamares_add_plugin( partition CreatePartitionJob.cpp CreatePartitionTableJob.cpp DeletePartitionJob.cpp - EditExistingPartitionDialog.cpp DeviceModel.cpp + EditExistingPartitionDialog.cpp + FormatPartitionJob.cpp PartitionCoreModule.cpp PartitionInfo.cpp PartitionJob.cpp diff --git a/src/modules/partition/FormatPartitionJob.cpp b/src/modules/partition/FormatPartitionJob.cpp new file mode 100644 index 000000000..2abcc2fa7 --- /dev/null +++ b/src/modules/partition/FormatPartitionJob.cpp @@ -0,0 +1,99 @@ +/* === This file is part of Calamares - === + * + * Copyright 2014, Aurélien Gâteau + * + * 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 . + */ + +#include + +#include + +// CalaPM +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Qt +#include + +FormatPartitionJob::FormatPartitionJob( Device* device, Partition* partition ) + : PartitionJob( partition ) + , m_device( device ) +{ +} + +QString +FormatPartitionJob::prettyName() const +{ + return tr( "Format partition %1 (file system: %2, size: %3 MB) on %4." ) + .arg( m_partition->partitionPath() ) + .arg( m_partition->fileSystem().name() ) + .arg( m_partition->capacity() / 1024 / 1024 ) + .arg( m_device->name() ); +} + +Calamares::JobResult +FormatPartitionJob::exec() +{ + Report report( 0 ); + QString partitionPath = m_partition->partitionPath(); + QString message = tr( "The installer failed to format partition %1 on disk '%2'." ).arg( partitionPath, m_device->name() ); + + CoreBackend* backend = CoreBackendManager::self()->backend(); + QScopedPointer 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 backendPartitionTable( backendDevice->openPartitionTable() ); + if ( !backendPartitionTable.data() ) + { + return Calamares::JobResult::error( + message, + tr( "Could not open partition table." ) + ); + } + + FileSystem& fs = m_partition->fileSystem(); + if ( !fs.create( report, partitionPath ) ) + { + return Calamares::JobResult::error( + tr( "The installer failed to create file system on partition %1." ).arg( partitionPath ), + report.toText() + ); + } + + if ( !backendPartitionTable->setPartitionSystemType( report, *m_partition ) ) + { + return Calamares::JobResult::error( + tr( "The installer failed to update partition table on disk '%1'." ).arg( m_device->name() ), + report.toText() + ); + } + + backendPartitionTable->commit(); + return Calamares::JobResult::ok(); +} diff --git a/src/modules/partition/FormatPartitionJob.h b/src/modules/partition/FormatPartitionJob.h new file mode 100644 index 000000000..d5b62a788 --- /dev/null +++ b/src/modules/partition/FormatPartitionJob.h @@ -0,0 +1,45 @@ +/* === This file is part of Calamares - === + * + * Copyright 2014, Aurélien Gâteau + * + * 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 . + */ + +#ifndef FORMATPARTITIONJOB_H +#define FORMATPARTITIONJOB_H + +#include + +class Device; +class Partition; +class FileSystem; + +class FormatPartitionJob : public PartitionJob +{ + Q_OBJECT +public: + FormatPartitionJob( Device* device, Partition* partition ); + QString prettyName() const override; + Calamares::JobResult exec() override; + + Device* device() const + { + return m_device; + } + +private: + Device* m_device; +}; + +#endif /* FORMATPARTITIONJOB_H */ diff --git a/src/modules/partition/PartitionCoreModule.cpp b/src/modules/partition/PartitionCoreModule.cpp index 1a91d60e8..46e435539 100644 --- a/src/modules/partition/PartitionCoreModule.cpp +++ b/src/modules/partition/PartitionCoreModule.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -277,6 +278,13 @@ PartitionCoreModule::deletePartition( Device* device, Partition* partition ) void PartitionCoreModule::formatPartition( Device* device, Partition* partition ) { + auto deviceInfo = infoForDevice( device ); + Q_ASSERT( deviceInfo ); + + FormatPartitionJob* job = new FormatPartitionJob( device, partition ); + deviceInfo->jobs << Calamares::job_ptr( job ); + + refresh( device ); } QList< Calamares::job_ptr >