PartitionModel.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*
  2. * Copyright (c) 2022, Samuel Bowman <sam@sambowman.tech>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Applications/PartitionEditor/PartitionModel.h>
  7. #include <LibPartition/EBRPartitionTable.h>
  8. #include <LibPartition/GUIDPartitionTable.h>
  9. #include <LibPartition/MBRPartitionTable.h>
  10. namespace PartitionEditor {
  11. String PartitionModel::column_name(int column) const
  12. {
  13. switch (column) {
  14. case Column::Partition:
  15. return "Partition";
  16. case Column::StartBlock:
  17. return "Start Block";
  18. case Column::EndBlock:
  19. return "End Block";
  20. default:
  21. VERIFY_NOT_REACHED();
  22. }
  23. }
  24. GUI::Variant PartitionModel::data(GUI::ModelIndex const& index, GUI::ModelRole role) const
  25. {
  26. if (role != GUI::ModelRole::Display)
  27. return {};
  28. if (!m_partition_table)
  29. return {};
  30. auto optional_partition = m_partition_table->partition(index.row());
  31. if (optional_partition.has_value()) {
  32. auto partition = optional_partition.release_value();
  33. switch (index.column()) {
  34. case Column::Partition:
  35. return index.row() + 1;
  36. case Column::StartBlock:
  37. return partition.start_block();
  38. case Column::EndBlock:
  39. return partition.end_block();
  40. default:
  41. VERIFY_NOT_REACHED();
  42. }
  43. }
  44. return {};
  45. }
  46. ErrorOr<void> PartitionModel::set_device_path(String const& path)
  47. {
  48. auto file = TRY(Core::File::open(path, Core::OpenMode::ReadOnly));
  49. auto mbr_table_or_error = Partition::MBRPartitionTable::try_to_initialize(file);
  50. if (!mbr_table_or_error.is_error()) {
  51. dbgln("Found MBR partition table on {}", path);
  52. m_partition_table = move(mbr_table_or_error.value());
  53. invalidate();
  54. return {};
  55. }
  56. auto ebr_table_or_error = Partition::EBRPartitionTable::try_to_initialize(file);
  57. if (!ebr_table_or_error.is_error()) {
  58. dbgln("Found EBR partition table on {}", path);
  59. m_partition_table = move(ebr_table_or_error.value());
  60. invalidate();
  61. return {};
  62. }
  63. auto guid_table_or_error = Partition::GUIDPartitionTable::try_to_initialize(file);
  64. if (!guid_table_or_error.is_error()) {
  65. dbgln("Found GUID partition table on {}", path);
  66. m_partition_table = move(guid_table_or_error.value());
  67. invalidate();
  68. return {};
  69. }
  70. return Error::from_errno(ENOTSUP);
  71. }
  72. }