Serenity Operating System
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}