use super::{DescriptorTag, EntityIdentifier, TagIdentifier};
use crate::error::UdfResult;
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct PartitionDescriptor {
pub tag: DescriptorTag,
pub vds_number: u32,
pub partition_flags: u16,
pub partition_number: u16,
pub partition_contents: EntityIdentifier,
pub partition_contents_use: [u8; 128],
pub access_type: u32,
pub partition_starting_location: u32,
pub partition_length: u32,
pub implementation_identifier: EntityIdentifier,
pub implementation_use: [u8; 128],
reserved: [u8; 156],
}
unsafe impl bytemuck::Zeroable for PartitionDescriptor {}
unsafe impl bytemuck::Pod for PartitionDescriptor {}
impl PartitionDescriptor {
pub fn validate(&self, location: u32) -> UdfResult<()> {
self.tag
.validate(TagIdentifier::PartitionDescriptor, location)
}
pub fn contents_type(&self) -> PartitionContents {
if self.partition_contents.is(b"+NSR02") {
PartitionContents::Nsr02
} else if self.partition_contents.is(b"+NSR03") {
PartitionContents::Nsr03
} else if self.partition_contents.is(b"+FDC01") {
PartitionContents::Fdc01
} else if self.partition_contents.is(b"+CD001") {
PartitionContents::Cd001
} else {
PartitionContents::Unknown
}
}
pub fn is_allocated(&self) -> bool {
self.partition_flags & 0x0001 != 0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PartitionContents {
Nsr02,
Nsr03,
Fdc01,
Cd001,
Unknown,
}
#[cfg(test)]
mod tests {
use super::*;
static_assertions::const_assert_eq!(size_of::<PartitionDescriptor>(), 512);
}