Serenity Operating System
at master 95 lines 2.9 kB view raw
1/* 2 * Copyright (c) 2022, Samuel Bowman <sam@sambowman.tech> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <AK/NumberFormat.h> 8#include <Applications/PartitionEditor/PartitionModel.h> 9#include <LibCore/DeprecatedFile.h> 10#include <LibPartition/EBRPartitionTable.h> 11#include <LibPartition/GUIDPartitionTable.h> 12#include <LibPartition/MBRPartitionTable.h> 13 14namespace PartitionEditor { 15 16DeprecatedString PartitionModel::column_name(int column) const 17{ 18 switch (column) { 19 case Column::Partition: 20 return "Partition"; 21 case Column::StartBlock: 22 return "Start Block"; 23 case Column::EndBlock: 24 return "End Block"; 25 case Column::TotalBlocks: 26 return "Total Blocks"; 27 case Column::Size: 28 return "Size"; 29 default: 30 VERIFY_NOT_REACHED(); 31 } 32} 33 34GUI::Variant PartitionModel::data(GUI::ModelIndex const& index, GUI::ModelRole role) const 35{ 36 if (role != GUI::ModelRole::Display) 37 return {}; 38 if (!m_partition_table) 39 return {}; 40 41 auto optional_partition = m_partition_table->partition(index.row()); 42 if (optional_partition.has_value()) { 43 auto partition = optional_partition.release_value(); 44 45 switch (index.column()) { 46 case Column::Partition: 47 return index.row() + 1; 48 case Column::StartBlock: 49 return partition.start_block(); 50 case Column::EndBlock: 51 return partition.end_block(); 52 case Column::TotalBlocks: 53 return partition.end_block() - partition.start_block() + 1; 54 case Column::Size: 55 return human_readable_size((partition.end_block() - partition.start_block() + 1) * m_partition_table->block_size()); 56 default: 57 VERIFY_NOT_REACHED(); 58 } 59 } 60 61 return {}; 62} 63 64ErrorOr<void> PartitionModel::set_device_path(DeprecatedString const& path) 65{ 66 auto file = TRY(Core::DeprecatedFile::open(path, Core::OpenMode::ReadOnly)); 67 68 auto mbr_table_or_error = Partition::MBRPartitionTable::try_to_initialize(file); 69 if (!mbr_table_or_error.is_error()) { 70 dbgln("Found MBR partition table on {}", path); 71 m_partition_table = move(mbr_table_or_error.value()); 72 invalidate(); 73 return {}; 74 } 75 76 auto ebr_table_or_error = Partition::EBRPartitionTable::try_to_initialize(file); 77 if (!ebr_table_or_error.is_error()) { 78 dbgln("Found EBR partition table on {}", path); 79 m_partition_table = move(ebr_table_or_error.value()); 80 invalidate(); 81 return {}; 82 } 83 84 auto guid_table_or_error = Partition::GUIDPartitionTable::try_to_initialize(file); 85 if (!guid_table_or_error.is_error()) { 86 dbgln("Found GUID partition table on {}", path); 87 m_partition_table = move(guid_table_or_error.value()); 88 invalidate(); 89 return {}; 90 } 91 92 return Error::from_errno(ENOTSUP); 93} 94 95}