use super::{
CharSpec, DescriptorTag, EntityIdentifier, ExtentDescriptor, LongAllocationDescriptor,
TagIdentifier,
};
use crate::error::UdfResult;
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct LogicalVolumeDescriptor {
pub tag: DescriptorTag,
pub vds_number: u32,
pub descriptor_char_set: CharSpec,
pub logical_volume_identifier: [u8; 128],
pub logical_block_size: u32,
pub domain_identifier: EntityIdentifier,
pub logical_volume_contents_use: [u8; 16],
pub map_table_length: u32,
pub num_partition_maps: u32,
pub implementation_identifier: EntityIdentifier,
pub implementation_use: [u8; 128],
pub integrity_sequence_extent: ExtentDescriptor,
pub partition_maps: [u8; 72],
}
unsafe impl bytemuck::Zeroable for LogicalVolumeDescriptor {}
unsafe impl bytemuck::Pod for LogicalVolumeDescriptor {}
impl LogicalVolumeDescriptor {
pub fn validate(&self, location: u32) -> UdfResult<()> {
self.tag
.validate(TagIdentifier::LogicalVolumeDescriptor, location)
}
pub fn file_set_location(&self) -> LongAllocationDescriptor {
*bytemuck::from_bytes(&self.logical_volume_contents_use)
}
#[cfg(feature = "alloc")]
pub fn volume_id(&self) -> alloc::string::String {
super::primary::decode_dstring(&self.logical_volume_identifier)
}
pub fn is_udf_domain(&self) -> bool {
self.domain_identifier.is(b"*OSTA UDF Compliant")
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy, bytemuck::Zeroable, bytemuck::Pod)]
pub struct Type1PartitionMap {
pub partition_map_type: u8,
pub partition_map_length: u8,
pub volume_sequence_number: u16,
pub partition_number: u16,
}
#[cfg(test)]
mod tests {
use super::*;
static_assertions::const_assert_eq!(size_of::<LogicalVolumeDescriptor>(), 512);
static_assertions::const_assert_eq!(size_of::<Type1PartitionMap>(), 6);
}