File indexing completed on 2024-05-19 09:41:58
0001 /* 0002 SPDX-FileCopyrightText: 2020 Gaƫl PORTAY <gael.portay@collabora.com> 0003 0004 SPDX-License-Identifier: GPL-3.0-or-later 0005 */ 0006 0007 #include "jobs/setpartitionattributesjob.h" 0008 0009 #include "backend/corebackend.h" 0010 #include "backend/corebackendmanager.h" 0011 #include "backend/corebackenddevice.h" 0012 #include "backend/corebackendpartitiontable.h" 0013 0014 #include "core/partition.h" 0015 #include "core/device.h" 0016 0017 #include "util/report.h" 0018 0019 #include <KLocalizedString> 0020 #include <memory> 0021 0022 /** Creates a new SetPartitionAttributesJob (GPT only) 0023 @param d the Device the Partition to be created will be on 0024 @param p the Partition whose attributes is to be set is on 0025 @param newAttrs the new attributes 0026 */ 0027 SetPartitionAttributesJob::SetPartitionAttributesJob(Device& d, Partition& p, quint64 newAttrs) : 0028 Job(), 0029 m_Device(d), 0030 m_Partition(p), 0031 m_Attributes(newAttrs) 0032 { 0033 } 0034 0035 bool SetPartitionAttributesJob::run(Report& parent) 0036 { 0037 Q_ASSERT(partition().devicePath() == device().deviceNode()); 0038 0039 bool rval = true; 0040 0041 Report* report = jobStarted(parent); 0042 0043 // The attributes are supported by GPT only, if the partition table is not GPT, just ignore the 0044 // request and say all is well. This helps in operations because we don't have to check for 0045 // support to avoid having a failed job. 0046 if (m_Device.partitionTable()->type() != PartitionTable::gpt) 0047 report->line() << xi18nc("@info:progress", "Partition table of partition <filename>%1</filename> does not support setting attributes. Job ignored.", partition().deviceNode()); 0048 else { 0049 std::unique_ptr<CoreBackendDevice> backendDevice = CoreBackendManager::self()->backend()->openDevice(m_Device); 0050 if (backendDevice) { 0051 std::unique_ptr<CoreBackendPartitionTable> backendPartitionTable = backendDevice->openPartitionTable(); 0052 0053 if (backendPartitionTable) { 0054 if (backendPartitionTable->setPartitionAttributes(*report, partition(), m_Attributes)) { 0055 rval = true; 0056 partition().setAttributes(m_Attributes); 0057 backendPartitionTable->commit(); 0058 } else 0059 report->line() << xi18nc("@info:progress", "Failed to set the attributes for the partition <filename>%1</filename>.", partition().deviceNode()); 0060 } else 0061 report->line() << xi18nc("@info:progress", "Could not open partition table on device <filename>%1</filename> to set the attributes for the partition <filename>%2</filename>.", device().deviceNode(), partition().deviceNode()); 0062 } else 0063 report->line() << xi18nc("@info:progress", "Could not open device <filename>%1</filename> to set the attributes for partition <filename>%2</filename>.", device().deviceNode(), partition().deviceNode()); 0064 0065 } 0066 0067 jobFinished(*report, rval); 0068 0069 return rval; 0070 } 0071 0072 QString SetPartitionAttributesJob::description() const 0073 { 0074 return xi18nc("@info:progress", "Set the attributes on partition <filename>%1</filename> to \"%2\"", partition().deviceNode(), QString::number(attributes(), 0x10)); 0075 }