DiskPartitionMetadata.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*
  2. * Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibPartition/DiskPartitionMetadata.h>
  7. namespace Partition {
  8. DiskPartitionMetadata::PartitionType::PartitionType(u8 partition_type)
  9. {
  10. m_partition_type[0] = partition_type;
  11. }
  12. DiskPartitionMetadata::PartitionType::PartitionType(Array<u8, 16> partition_type)
  13. : m_partition_type_is_uuid(true)
  14. {
  15. m_partition_type.span().overwrite(0, partition_type.data(), partition_type.size());
  16. }
  17. UUID DiskPartitionMetadata::PartitionType::to_uuid() const
  18. {
  19. VERIFY(is_uuid());
  20. return m_partition_type;
  21. }
  22. u8 DiskPartitionMetadata::PartitionType::to_byte_indicator() const
  23. {
  24. VERIFY(!is_uuid());
  25. return m_partition_type[0];
  26. }
  27. bool DiskPartitionMetadata::PartitionType::is_uuid() const
  28. {
  29. return m_partition_type_is_uuid;
  30. }
  31. bool DiskPartitionMetadata::PartitionType::is_valid() const
  32. {
  33. return !all_of(m_partition_type, [](auto const octet) { return octet == 0; });
  34. }
  35. DiskPartitionMetadata::DiskPartitionMetadata(u64 start_block, u64 end_block, u8 partition_type)
  36. : m_start_block(start_block)
  37. , m_end_block(end_block)
  38. , m_type(partition_type)
  39. {
  40. VERIFY(m_type.is_valid());
  41. }
  42. DiskPartitionMetadata::DiskPartitionMetadata(u64 start_block, u64 end_block, Array<u8, 16> partition_type)
  43. : m_start_block(start_block)
  44. , m_end_block(end_block)
  45. , m_type(partition_type)
  46. {
  47. VERIFY(m_type.is_valid());
  48. }
  49. DiskPartitionMetadata::DiskPartitionMetadata(u64 start_block, u64 end_block, Array<u8, 16> partition_type, UUID unique_guid, u64 special_attributes)
  50. : m_start_block(start_block)
  51. , m_end_block(end_block)
  52. , m_type(partition_type)
  53. , m_unique_guid(unique_guid)
  54. , m_attributes(special_attributes)
  55. {
  56. VERIFY(m_type.is_valid());
  57. VERIFY(!m_unique_guid.is_zero());
  58. }
  59. DiskPartitionMetadata DiskPartitionMetadata::offset(u64 blocks_count) const
  60. {
  61. return { blocks_count + m_start_block, blocks_count + m_end_block, m_type.m_partition_type };
  62. }
  63. u64 DiskPartitionMetadata::start_block() const
  64. {
  65. return m_start_block;
  66. }
  67. u64 DiskPartitionMetadata::end_block() const
  68. {
  69. return m_end_block;
  70. }
  71. Optional<u64> DiskPartitionMetadata::special_attributes() const
  72. {
  73. if (m_attributes == 0)
  74. return {};
  75. return m_attributes;
  76. }
  77. DiskPartitionMetadata::PartitionType const& DiskPartitionMetadata::type() const
  78. {
  79. return m_type;
  80. }
  81. const UUID& DiskPartitionMetadata::unique_guid() const
  82. {
  83. return m_unique_guid;
  84. }
  85. }